瀏覽代碼

去掉学习中心表;考生中的学习中心字段改为可选;去掉所有与学习中心ID的关联 增加签到表上传接口 增加file server配置保护措施,强制加上 结尾 扫描客户端接口增加题卡信息字

luoshi 4 年之前
父節點
當前提交
a051a71b18
共有 100 個文件被更改,包括 4043 次插入12439 次删除
  1. 337 331
      pom.xml
  2. 72 67
      stmms-biz/pom.xml
  3. 0 16
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/dao/CampusDao.java
  4. 0 137
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/model/Campus.java
  5. 0 58
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/query/CampusSearchQuery.java
  6. 0 27
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/CampusService.java
  7. 0 117
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/impl/CampusServiceImp.java
  8. 0 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  9. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  10. 78 31
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java
  11. 0 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  12. 0 39
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  13. 46 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FileType.java
  14. 22 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FormatType.java
  15. 55 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java
  16. 235 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java
  17. 12 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/FileStore.java
  18. 72 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/DiskStore.java
  19. 91 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/OssStore.java
  20. 0 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkLibrary.java
  21. 0 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrialLibrary.java
  22. 41 73
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java
  23. 2 13
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  24. 58 54
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  25. 9 17
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java
  26. 40 67
      stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/Md5EncryptUtils.java
  27. 82 89
      stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/PictureUrlBuilder.java
  28. 42 50
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java
  29. 17 22
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java
  30. 27 25
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java
  31. 23 32
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java
  32. 23 39
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java
  33. 9 13
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java
  34. 27 42
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  35. 5 7
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java
  36. 6 16
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  37. 10 17
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java
  38. 35 49
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java
  39. 9 6
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  40. 11 14
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java
  41. 13 26
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  42. 7 23
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java
  43. 8 15
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java
  44. 26 47
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java
  45. 33 77
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ImageCheckThread.java
  46. 25 45
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ExamSubjectVO.java
  47. 145 157
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ScoreDetailVO.java
  48. 105 117
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ScoreVO.java
  49. 9 3
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/BaseApiController.java
  50. 28 17
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java
  51. 6 10
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java
  52. 264 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/FileController.java
  53. 4 8
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/LoginController.java
  54. 0 161
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/PictureController.java
  55. 13 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/exception/ApiException.java
  56. 0 87
      stmms-web/src/main/java/cn/com/qmth/stmms/api/utils/SheetDownloadThread.java
  57. 26 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java
  58. 0 135
      stmms-web/src/main/java/cn/com/qmth/stmms/file/controller/FileController.java
  59. 5 15
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  60. 0 157
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkLeaderController.java
  61. 131 130
      stmms-web/src/main/webapp/WEB-INF/views/include/trialDetail.jsp
  62. 82 85
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcess.jsp
  63. 77 79
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcessJson.jsp
  64. 79 82
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcess.jsp
  65. 74 76
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcessJson.jsp
  66. 231 228
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkAnswerEdit.jsp
  67. 217 215
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkStudentEdit.jsp
  68. 7 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspected.jsp
  69. 106 105
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/jsonView.jsp
  70. 177 166
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperList.jsp
  71. 66 69
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcess.jsp
  72. 64 66
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcessJson.jsp
  73. 79 74
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scanPackage.jsp
  74. 102 98
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreDetail.jsp
  75. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp
  76. 3 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentList.jsp
  77. 90 90
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentTrack.jsp
  78. 30 30
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/mark.jsp
  79. 13 13
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markJson.jsp
  80. 0 97
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markLeader.jsp
  81. 5 5
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp
  82. 9 9
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp
  83. 172 172
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/picConfig.jsp
  84. 0 6443
      stmms-web/src/main/webapp/static/mark-leader/css/bootstrap.css
  85. 0 1168
      stmms-web/src/main/webapp/static/mark-leader/css/style.css
  86. 0 21
      stmms-web/src/main/webapp/static/mark-leader/image-popover.html
  87. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/00001_F.jpg
  88. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/background.jpg
  89. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/button.png
  90. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/close.png
  91. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/down.png
  92. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/hp-close.png
  93. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/images-close.png
  94. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/off.png
  95. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/on.png
  96. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/up.png
  97. 二進制
      stmms-web/src/main/webapp/static/mark-leader/images/未标题-2.psd
  98. 二進制
      stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings-white.png
  99. 二進制
      stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings.png
  100. 0 308
      stmms-web/src/main/webapp/static/mark-leader/index-select.html

+ 337 - 331
pom.xml

@@ -1,340 +1,346 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
 
 
-    <groupId>cn.com.qmth.stmms</groupId>
-    <artifactId>stmms-parent</artifactId>
-    <packaging>pom</packaging>
-    <version>1.0-SNAPSHOT</version>
+	<groupId>cn.com.qmth.stmms</groupId>
+	<artifactId>stmms-parent</artifactId>
+	<packaging>pom</packaging>
+	<version>1.0-SNAPSHOT</version>
 
 
-    <name>stmms-parent</name>
-    <url>http://maven.apache.org</url>
+	<name>stmms-parent</name>
+	<url>http://maven.apache.org</url>
 
 
-    <modules>
-        <module>stmms-common</module>
-        <module>stmms-biz</module>
-        <module>stmms-web</module>
-    </modules>
+	<modules>
+		<module>stmms-common</module>
+		<module>stmms-biz</module>
+		<module>stmms-web</module>
+	</modules>
 
 
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <spring.version>3.2.14.RELEASE</spring.version>
-        <hibernate.version>4.2.1.Final</hibernate.version>
-        <log4j.version>1.2.17</log4j.version>
-        <aspectj.version>1.6.5</aspectj.version>
-        <junit.version>4.11</junit.version>
-        <java.version>1.8</java.version>
-        <spring-data-redis.version>1.2.1.RELEASE</spring-data-redis.version>
-        <poi.version>3.9</poi.version>
-        <guava.version>29.0-jre</guava.version>
-        <commons-lang3.version>3.1</commons-lang3.version>
-    </properties>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<spring.version>3.2.14.RELEASE</spring.version>
+		<hibernate.version>4.2.1.Final</hibernate.version>
+		<log4j.version>1.2.17</log4j.version>
+		<aspectj.version>1.6.5</aspectj.version>
+		<junit.version>4.11</junit.version>
+		<java.version>1.8</java.version>
+		<spring-data-redis.version>1.2.1.RELEASE</spring-data-redis.version>
+		<poi.version>3.9</poi.version>
+		<guava.version>14.0.1</guava.version>
+		<commons-lang3.version>3.1</commons-lang3.version>
+	</properties>
 
 
-    <dependencyManagement>
-        <dependencies>
-            <!-- ======================================== -->
-            <!-- 子项目依赖 -->
-            <!-- ======================================== -->
-            <dependency>
-                <groupId>cn.com.qmth.stmms</groupId>
-                <artifactId>stmms-common</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>cn.com.qmth.stmms</groupId>
-                <artifactId>stmms-orm</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>cn.com.qmth.stmms</groupId>
-                <artifactId>stmms-biz</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>cn.com.qmth.stmms</groupId>
-                <artifactId>stmms-web</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>cn.com.qmth.stmms</groupId>
-                <artifactId>remote-interface</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>cn.com.qmth.stmms</groupId>
-                <artifactId>remote-service</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <!-- ================================================= -->
-            <!-- 日志及相关依赖(用slf4j+logback代替jcl+log4j) -->
-            <!-- ================================================= -->
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>1.6.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>jcl-over-slf4j</artifactId>
-                <version>1.6.1</version>
-            </dependency>
-            <dependency>
-                <groupId>ch.qos.logback</groupId>
-                <artifactId>logback-classic</artifactId>
-                <version>0.9.29</version>
-                <scope>runtime</scope>
-            </dependency>
-            <dependency>
-                <groupId>com.caucho</groupId>
-                <artifactId>hessian</artifactId>
-                <version>4.0.7</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-logging</groupId>
-                <artifactId>commons-logging</artifactId>
-                <version>1.1.1</version>
-                <scope>provided</scope>
-            </dependency>
-            <!-- ================================================= -->
-            <!-- Spring框架 -->
-            <!-- ================================================= -->
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-core</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-beans</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-aop</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-aspects</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context-support</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-tx</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-jdbc</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-orm</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-web</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-webmvc</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-test</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-instrument</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.data</groupId>
-                <artifactId>spring-data-jpa</artifactId>
-                <version>1.6.6.RELEASE</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.data</groupId>
-                <artifactId>spring-data-redis</artifactId>
-                <version>${spring-data-redis.version}</version>
-            </dependency>
-            <!-- ======================================== -->
-            <!-- 其它第三方依赖 -->
-            <!-- ======================================== -->
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>javax.servlet-api</artifactId>
-                <version>3.0.1</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.mortbay.jetty</groupId>
-                <artifactId>jetty</artifactId>
-                <version>6.1.26</version>
-            </dependency>
-            <dependency>
-                <groupId>jstl</groupId>
-                <artifactId>jstl</artifactId>
-                <version>1.2</version>
-            </dependency>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>${junit.version}</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>commons-fileupload</groupId>
-                <artifactId>commons-fileupload</artifactId>
-                <version>1.2.2</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>2.1</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-net</groupId>
-                <artifactId>commons-net</artifactId>
-                <version>2.0</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-collections</groupId>
-                <artifactId>commons-collections</artifactId>
-                <version>20040616</version>
-            </dependency>
-            <dependency>
-                <groupId>org.hibernate</groupId>
-                <artifactId>hibernate-entitymanager</artifactId>
-                <version>${hibernate.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.hibernate</groupId>
-                <artifactId>hibernate-ehcache</artifactId>
-                <version>${hibernate.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.hibernate.javax.persistence</groupId>
-                <artifactId>hibernate-jpa-2.0-api</artifactId>
-                <version>1.0.1.Final</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.persistence</groupId>
-                <artifactId>javax.persistence</artifactId>
-                <version>2.1.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>1.7.5</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-dbcp</groupId>
-                <artifactId>commons-dbcp</artifactId>
-                <version>1.4</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-pool</groupId>
-                <artifactId>commons-pool</artifactId>
-                <version>20030825.183949</version>
-            </dependency>
-            <dependency>
-                <groupId>mysql</groupId>
-                <artifactId>mysql-connector-java</artifactId>
-                <version>5.1.21</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-mapper-asl</artifactId>
-                <version>1.9.12</version>
-            </dependency>
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-core-asl</artifactId>
-                <version>1.9.12</version>
-            </dependency>
-            <dependency>
-                <groupId>com.fasterxml.jackson.core</groupId>
-                <artifactId>jackson-databind</artifactId>
-                <version>2.8.8</version>
-            </dependency>
-            <dependency>
-                <groupId>log4j</groupId>
-                <artifactId>log4j</artifactId>
-                <version>${log4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>net.sourceforge.jexcelapi</groupId>
-                <artifactId>jxl</artifactId>
-                <version>2.6.12</version>
-            </dependency>
-            <dependency>
-                <groupId>net.sf.json-lib</groupId>
-                <artifactId>json-lib-ext-spring</artifactId>
-                <version>1.0.2</version>
-            </dependency>
-            <dependency>
-                <groupId>redis.clients</groupId>
-                <artifactId>jedis</artifactId>
-                <version>2.4.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.aspectj</groupId>
-                <artifactId>aspectjweaver</artifactId>
-                <version>1.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>${guava.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.12</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
+	<dependencyManagement>
+		<dependencies>
+			<!-- ======================================== -->
+			<!-- 子项目依赖 -->
+			<!-- ======================================== -->
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-common</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-orm</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-biz</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-web</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>remote-interface</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>remote-service</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<!-- ================================================= -->
+			<!-- 日志及相关依赖(用slf4j+logback代替jcl+log4j) -->
+			<!-- ================================================= -->
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-api</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>jcl-over-slf4j</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>ch.qos.logback</groupId>
+				<artifactId>logback-classic</artifactId>
+				<version>0.9.29</version>
+				<scope>runtime</scope>
+			</dependency>
+			<dependency>
+				<groupId>com.caucho</groupId>
+				<artifactId>hessian</artifactId>
+				<version>4.0.7</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-logging</groupId>
+				<artifactId>commons-logging</artifactId>
+				<version>1.1.1</version>
+				<scope>provided</scope>
+			</dependency>
+			<!-- ================================================= -->
+			<!-- Spring框架 -->
+			<!-- ================================================= -->
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-core</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-beans</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-aop</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-aspects</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-context</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-context-support</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-tx</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-jdbc</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-orm</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-web</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-webmvc</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-test</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-instrument</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework.data</groupId>
+				<artifactId>spring-data-jpa</artifactId>
+				<version>1.6.6.RELEASE</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework.data</groupId>
+				<artifactId>spring-data-redis</artifactId>
+				<version>${spring-data-redis.version}</version>
+			</dependency>
+			<!-- ======================================== -->
+			<!-- 其它第三方依赖 -->
+			<!-- ======================================== -->
+			<dependency>
+				<groupId>javax.servlet</groupId>
+				<artifactId>javax.servlet-api</artifactId>
+				<version>3.0.1</version>
+				<scope>provided</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.mortbay.jetty</groupId>
+				<artifactId>jetty</artifactId>
+				<version>6.1.26</version>
+			</dependency>
+			<dependency>
+				<groupId>jstl</groupId>
+				<artifactId>jstl</artifactId>
+				<version>1.2</version>
+			</dependency>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>${junit.version}</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>commons-fileupload</groupId>
+				<artifactId>commons-fileupload</artifactId>
+				<version>1.2.2</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-io</groupId>
+				<artifactId>commons-io</artifactId>
+				<version>2.1</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-net</groupId>
+				<artifactId>commons-net</artifactId>
+				<version>2.0</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-collections</groupId>
+				<artifactId>commons-collections</artifactId>
+				<version>20040616</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate</groupId>
+				<artifactId>hibernate-entitymanager</artifactId>
+				<version>${hibernate.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate</groupId>
+				<artifactId>hibernate-ehcache</artifactId>
+				<version>${hibernate.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate.javax.persistence</groupId>
+				<artifactId>hibernate-jpa-2.0-api</artifactId>
+				<version>1.0.1.Final</version>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse.persistence</groupId>
+				<artifactId>javax.persistence</artifactId>
+				<version>2.1.0</version>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-api</artifactId>
+				<version>1.7.5</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-dbcp</groupId>
+				<artifactId>commons-dbcp</artifactId>
+				<version>1.4</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-pool</groupId>
+				<artifactId>commons-pool</artifactId>
+				<version>20030825.183949</version>
+			</dependency>
+			<dependency>
+				<groupId>mysql</groupId>
+				<artifactId>mysql-connector-java</artifactId>
+				<version>5.1.21</version>
+			</dependency>
+			<dependency>
+				<groupId>org.codehaus.jackson</groupId>
+				<artifactId>jackson-mapper-asl</artifactId>
+				<version>1.9.12</version>
+			</dependency>
+			<dependency>
+				<groupId>org.codehaus.jackson</groupId>
+				<artifactId>jackson-core-asl</artifactId>
+				<version>1.9.12</version>
+			</dependency>
+			<dependency>
+				<groupId>com.fasterxml.jackson.core</groupId>
+				<artifactId>jackson-databind</artifactId>
+				<version>2.8.8</version>
+			</dependency>
+			<dependency>
+				<groupId>log4j</groupId>
+				<artifactId>log4j</artifactId>
+				<version>${log4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>net.sourceforge.jexcelapi</groupId>
+				<artifactId>jxl</artifactId>
+				<version>2.6.12</version>
+			</dependency>
+			<dependency>
+				<groupId>net.sf.json-lib</groupId>
+				<artifactId>json-lib-ext-spring</artifactId>
+				<version>1.0.2</version>
+			</dependency>
+			<dependency>
+				<groupId>redis.clients</groupId>
+				<artifactId>jedis</artifactId>
+				<version>2.4.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.aspectj</groupId>
+				<artifactId>aspectjweaver</artifactId>
+				<version>1.8.0</version>
+			</dependency>
+			<dependency>
+				<groupId>com.google.guava</groupId>
+				<artifactId>guava</artifactId>
+				<version>18.0</version>
+			</dependency>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>4.12</version>
+			</dependency>
+			<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
+			<dependency>
+				<groupId>com.aliyun.oss</groupId>
+				<artifactId>aliyun-sdk-oss</artifactId>
+				<version>3.10.2</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
 
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.3.2</version>
-                <configuration>
-                    <source>${java.version}</source>
-                    <target>${java.version}</target>
-                    <encoding>UTF-8</encoding>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.14.1</version>
-                <configuration>
-                    <skipTests>true</skipTests>
-                    <additionalClasspathElements>
-                        <additionalClasspathElement>src/main/resources</additionalClasspathElement>
-                    </additionalClasspathElements>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>${java.version}</source>
+					<target>${java.version}</target>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>2.14.1</version>
+				<configuration>
+					<skipTests>true</skipTests>
+					<additionalClasspathElements>
+						<additionalClasspathElement>src/main/resources</additionalClasspathElement>
+					</additionalClasspathElements>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
 </project>
 </project>

+ 72 - 67
stmms-biz/pom.xml

@@ -1,67 +1,72 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>cn.com.qmth.stmms</groupId>
-		<artifactId>stmms-parent</artifactId>
-		<version>1.0-SNAPSHOT</version>
-	</parent>
-	<groupId>cn.com.qmth.stmms</groupId>
-	<artifactId>stmms-biz</artifactId>
-	<version>1.0-SNAPSHOT</version>
-	<packaging>jar</packaging>
-	<name>stmms-biz</name>
-	<url>http://maven.apache.org</url>
-
-	<dependencies>
-		<dependency>
-			<groupId>cn.com.qmth.stmms</groupId>
-			<artifactId>stmms-common</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>mysql</groupId>
-			<artifactId>mysql-connector-java</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.data</groupId>
-			<artifactId>spring-data-jpa</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-entitymanager</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-ehcache</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.persistence</groupId>
-			<artifactId>javax.persistence</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.hibernate.javax.persistence</groupId>
-			<artifactId>hibernate-jpa-2.0-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-dbcp</groupId>
-			<artifactId>commons-dbcp</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-pool</groupId>
-			<artifactId>commons-pool</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>net.sf.json-lib</groupId>
-			<artifactId>json-lib-ext-spring</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-</project>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.com.qmth.stmms</groupId>
+        <artifactId>stmms-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <groupId>cn.com.qmth.stmms</groupId>
+    <artifactId>stmms-biz</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>stmms-biz</name>
+    <url>http://maven.apache.org</url>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.com.qmth.stmms</groupId>
+            <artifactId>stmms-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-entitymanager</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-ehcache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.persistence</groupId>
+            <artifactId>javax.persistence</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.javax.persistence</groupId>
+            <artifactId>hibernate-jpa-2.0-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-dbcp</groupId>
+            <artifactId>commons-dbcp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-pool</groupId>
+            <artifactId>commons-pool</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib-ext-spring</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 0 - 16
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/dao/CampusDao.java

@@ -1,16 +0,0 @@
-package cn.com.qmth.stmms.biz.campus.dao;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.repository.PagingAndSortingRepository;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-
-public interface CampusDao extends PagingAndSortingRepository<Campus, Integer>, JpaSpecificationExecutor<Campus> {
-
-    public List<Campus> findBySchoolId(int schoolId);
-
-    public List<Campus> findBySchoolIdAndName(int schoolId, String name);
-
-}

+ 0 - 137
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/model/Campus.java

@@ -1,137 +0,0 @@
-package cn.com.qmth.stmms.biz.campus.model;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "b_campus")
-public class Campus implements Serializable {
-
-    private static final long serialVersionUID = -1056886453298677825L;
-
-    /**
-     * 主键
-     */
-    @Id
-    @GeneratedValue
-    private Integer id;
-
-    /**
-     * 所属学校ID
-     */
-    @Column(name = "school_id")
-    private Integer schoolId;
-
-    /**
-     * 学习中心名称
-     */
-    private String name;
-
-    /**
-     * 省份
-     */
-    private String province;
-
-    /**
-     * 城市
-     */
-    private String city;
-
-    /**
-     * 地区
-     */
-    private String district;
-
-    /**
-     * 地址
-     */
-    private String address;
-
-    /**
-     * 电话
-     */
-    private String phone;
-
-    /**
-     * 描述
-     */
-    private String description;
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getProvince() {
-        return province;
-    }
-
-    public void setProvince(String province) {
-        this.province = province;
-    }
-
-    public String getCity() {
-        return city;
-    }
-
-    public void setCity(String city) {
-        this.city = city;
-    }
-
-    public String getDistrict() {
-        return district;
-    }
-
-    public void setDistrict(String district) {
-        this.district = district;
-    }
-
-    public String getAddress() {
-        return address;
-    }
-
-    public void setAddress(String address) {
-        this.address = address;
-    }
-
-    public String getPhone() {
-        return phone;
-    }
-
-    public void setPhone(String phone) {
-        this.phone = phone;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public Integer getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
-    }
-
-}

+ 0 - 58
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/query/CampusSearchQuery.java

@@ -1,58 +0,0 @@
-package cn.com.qmth.stmms.biz.campus.query;
-
-import cn.com.qmth.stmms.biz.common.BaseQuery;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-
-public class CampusSearchQuery extends BaseQuery<Campus> {
-
-    private Integer schoolId;
-
-    private String name;
-
-    private String province;
-
-    private String city;
-
-    private String district;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getProvince() {
-        return province;
-    }
-
-    public void setProvince(String province) {
-        this.province = province;
-    }
-
-    public String getCity() {
-        return city;
-    }
-
-    public void setCity(String city) {
-        this.city = city;
-    }
-
-    public String getDistrict() {
-        return district;
-    }
-
-    public void setDistrict(String district) {
-        this.district = district;
-    }
-
-    public Integer getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
-    }
-
-}

+ 0 - 27
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/CampusService.java

@@ -1,27 +0,0 @@
-package cn.com.qmth.stmms.biz.campus.service;
-
-import java.util.List;
-import java.util.Map;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.query.CampusSearchQuery;
-
-public interface CampusService {
-
-    Campus save(Campus campus);
-
-    Campus findById(Integer id);
-
-    public Map<String, Campus> findBySchool(int schoolId);
-
-    List<Campus> findBySchoolId(int schoolId);
-
-    Campus findBySchoolAndName(int schoolId, String name);
-
-    public CampusSearchQuery findByQuery(final CampusSearchQuery query);
-
-    void deleteById(Integer id);
-
-    void delete(Campus campus);
-
-}

+ 0 - 117
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/impl/CampusServiceImp.java

@@ -1,117 +0,0 @@
-package cn.com.qmth.stmms.biz.campus.service.impl;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import cn.com.qmth.stmms.biz.campus.dao.CampusDao;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.query.CampusSearchQuery;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-
-@Service("campusService")
-public class CampusServiceImp extends BaseQueryService<Campus> implements CampusService {
-
-    protected static Logger logger = LoggerFactory.getLogger(CampusServiceImp.class);
-
-    @Autowired
-    public CampusDao campusDao;
-
-    @Override
-    public Campus findById(Integer id) {
-        return campusDao.findOne(id);
-    }
-
-    public List<Campus> findBySchoolId(int schoolId) {
-        return campusDao.findBySchoolId(schoolId);
-    }
-
-    public Map<String, Campus> findBySchool(int schoolId) {
-        Map<String, Campus> map = new HashMap<String, Campus>();
-        List<Campus> list = findBySchoolId(schoolId);
-        if (list != null) {
-            for (Campus campus : list) {
-                map.put(campus.getName(), campus);
-            }
-        }
-        return map;
-    }
-
-    // @Cacheable(value = "campus_cache", key =
-    // "T(String).valueOf(#schoolId)+'-'+#name", condition = "#schoolId>0 &&
-    // #name!=null")
-    public Campus findBySchoolAndName(int schoolId, String name) {
-        List<Campus> list = campusDao.findBySchoolIdAndName(schoolId, name);
-        return list != null && list.size() > 0 ? list.get(0) : null;
-    }
-
-    public CampusSearchQuery findByQuery(final CampusSearchQuery query) {
-        checkQuery(query);
-        Page<Campus> result = campusDao.findAll(new Specification<Campus>() {
-
-            @Override
-            public Predicate toPredicate(Root<Campus> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
-                List<Predicate> predicates = new LinkedList<Predicate>();
-                if (query.getSchoolId() != null) {
-                    predicates.add(cb.equal(root.get("schoolId"), query.getSchoolId()));
-                }
-                if (StringUtils.isNotBlank(query.getName())) {
-                    predicates.add(cb.like(root.get("name").as(String.class), query.getName() + "%"));
-                }
-                if (StringUtils.isNotBlank(query.getProvince())) {
-                    predicates.add(cb.equal(root.get("province"), query.getProvince()));
-                }
-                if (StringUtils.isNotBlank(query.getCity())) {
-                    predicates.add(cb.equal(root.get("city"), query.getCity()));
-                }
-                if (StringUtils.isNotBlank(query.getDistrict())) {
-                    predicates.add(cb.equal(root.get("district"), query.getDistrict()));
-                }
-                return predicates.isEmpty() ? cb.conjunction()
-                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
-            }
-
-        }, query);
-
-        fillResult(result, query);
-        return query;
-    }
-
-    @Transactional
-    // @CachePut(value = "campus_cache", key =
-    // "T(String).valueOf(#campus.schoolId)+'-'+#campus.name", condition =
-    // "#campus!=null && #campus.schoolId!=null && #campus.name!=null")
-    public Campus save(Campus campus) {
-        return campusDao.save(campus);
-    }
-
-    @Transactional
-    // @CacheEvict(value = "campus_cache", allEntries = true, beforeInvocation =
-    // true)
-    public void deleteById(Integer id) {
-        campusDao.delete(id);
-    }
-
-    @Transactional
-    // @CacheEvict(value = "campus_cache", allEntries = true, beforeInvocation =
-    // true)
-    public void delete(Campus campus) {
-        campusDao.delete(campus);
-    }
-}

+ 0 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -53,10 +53,6 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     @Query("select s from ExamStudent s where s.examId=?1 group by s.campusName")
     @Query("select s from ExamStudent s where s.examId=?1 group by s.campusName")
     public List<ExamStudent> findDistinctCampusName(int examId, Pageable pageable);
     public List<ExamStudent> findDistinctCampusName(int examId, Pageable pageable);
 
 
-    @Query("select count(c) from Campus c where exists (select s.id from ExamStudent s where "
-            + "c.schoolId=s.schoolId and c.name=s.campusName and s.examId=?1)")
-    public long countDistinctCampusName(int examId);
-
     @Query("select s.packageCode from ExamStudent s where s.examId=?1 group by s.packageCode")
     @Query("select s.packageCode from ExamStudent s where s.examId=?1 group by s.packageCode")
     public List<String> findDistinctPackageCode(int examId);
     public List<String> findDistinctPackageCode(int examId);
 
 

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -94,6 +94,13 @@ public class Exam implements Serializable {
     @Column(name = "type", length = 16, nullable = false)
     @Column(name = "type", length = 16, nullable = false)
     private ExamType type;
     private ExamType type;
 
 
+    /**
+     * 题卡类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "card_type", length = 16, nullable = true)
+    private FormatType cardType;
+
     public Integer getId() {
     public Integer getId() {
         return id;
         return id;
     }
     }
@@ -238,4 +245,11 @@ public class Exam implements Serializable {
         this.code = code;
         this.code = code;
     }
     }
 
 
+    public FormatType getCardType() {
+        return cardType;
+    }
+
+    public void setCardType(FormatType cardType) {
+        this.cardType = cardType;
+    }
 }
 }

+ 78 - 31
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java

@@ -1,7 +1,8 @@
 package cn.com.qmth.stmms.biz.exam.model;
 package cn.com.qmth.stmms.biz.exam.model;
 
 
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
@@ -41,12 +42,6 @@ public class ExamSubject implements Serializable {
     @Column(name = "upload_count")
     @Column(name = "upload_count")
     private Integer uploadCount;
     private Integer uploadCount;
 
 
-    @Column(name = "has_paper")
-    private boolean hasPaper;
-
-    @Column(name = "has_answer")
-    private boolean hasAnswer;
-
     @Column(name = "remark")
     @Column(name = "remark")
     private String remark;
     private String remark;
 
 
@@ -74,12 +69,39 @@ public class ExamSubject implements Serializable {
     @Column(name = "sheet_config", nullable = true)
     @Column(name = "sheet_config", nullable = true)
     private String sheetConfig;
     private String sheetConfig;
 
 
+    /**
+     * 题卡类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "card_type", length = 16, nullable = true)
+    private FormatType cardType;
+
+    /**
+     * 试卷文件类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "paper_file_type", length = 16, nullable = true)
+    private FormatType paperFileType;
+
+    /**
+     * 标答文件类型
+     */
+    @Enumerated(EnumType.STRING)
+    @Column(name = "answer_file_type", length = 16, nullable = true)
+    private FormatType answerFileType;
+
     /**
     /**
      * 大题数量
      * 大题数量
      */
      */
     @Transient
     @Transient
     private long groupCount;
     private long groupCount;
 
 
+    @Transient
+    private String paperUrl;
+
+    @Transient
+    private String answerUrl;
+
     public ExamSubject() {
     public ExamSubject() {
         this.pk = new ExamSubjectPK();
         this.pk = new ExamSubjectPK();
     }
     }
@@ -157,14 +179,6 @@ public class ExamSubject implements Serializable {
         return sb.toString();
         return sb.toString();
     }
     }
 
 
-    public String getPaperUrl() {
-        return PictureUrlBuilder.getPaperUrl(getExamId(), getCode());
-    }
-
-    public String getAnswerUrl() {
-        return PictureUrlBuilder.getAnswerUrl(getExamId(), getCode());
-    }
-
     public String getLevel() {
     public String getLevel() {
         return level;
         return level;
     }
     }
@@ -197,22 +211,6 @@ public class ExamSubject implements Serializable {
         this.groupCount = groupCount;
         this.groupCount = groupCount;
     }
     }
 
 
-    public boolean isHasPaper() {
-        return hasPaper;
-    }
-
-    public void setHasPaper(boolean hasPaper) {
-        this.hasPaper = hasPaper;
-    }
-
-    public boolean isHasAnswer() {
-        return hasAnswer;
-    }
-
-    public void setHasAnswer(boolean hasAnswer) {
-        this.hasAnswer = hasAnswer;
-    }
-
     public boolean isNeedCalculate() {
     public boolean isNeedCalculate() {
         return needCalculate;
         return needCalculate;
     }
     }
@@ -252,4 +250,53 @@ public class ExamSubject implements Serializable {
     public void setCalculateProgress(Double calculateProgress) {
     public void setCalculateProgress(Double calculateProgress) {
         this.calculateProgress = calculateProgress;
         this.calculateProgress = calculateProgress;
     }
     }
+
+    public FormatType getCardType() {
+        return cardType;
+    }
+
+    public void setCardType(FormatType cardType) {
+        this.cardType = cardType;
+    }
+
+    public FormatType getPaperFileType() {
+        return paperFileType;
+    }
+
+    public void setPaperFileType(FormatType paperFileType) {
+        this.paperFileType = paperFileType;
+    }
+
+    public FormatType getAnswerFileType() {
+        return answerFileType;
+    }
+
+    public void setAnswerFileType(FormatType answerFileType) {
+        this.answerFileType = answerFileType;
+    }
+
+    public String getPaperUrl() {
+        return paperUrl;
+    }
+
+    public void setPaperUrl(String paperUrl) {
+        this.paperUrl = paperUrl;
+    }
+
+    public String getAnswerUrl() {
+        return answerUrl;
+    }
+
+    public void setAnswerUrl(String answerUrl) {
+        this.answerUrl = answerUrl;
+    }
+
+    public void setPaperAnswerUrl(FileService fileService) {
+        if (paperFileType != null) {
+            paperUrl = fileService.getPaperUri(getExamId(), getCode(), paperFileType);
+        }
+        if (answerFileType != null) {
+            answerUrl = fileService.getAnswerUri(getExamId(), getCode(), answerFileType);
+        }
+    }
 }
 }

+ 0 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -46,8 +46,6 @@ public interface ExamStudentService {
 
 
     List<String> findDistinctCampusName(int examId);
     List<String> findDistinctCampusName(int examId);
 
 
-    ExamStudentSearchQuery findDistinctCampusName(ExamStudentSearchQuery query);
-
     List<ExamStudent> findByExamIdAndCampusName(int examId, String campusCode, int pageNumber, int pageSize);
     List<ExamStudent> findByExamIdAndCampusName(int examId, String campusCode, int pageNumber, int pageSize);
 
 
     List<String> findDistinctPackageCode(int examId);
     List<String> findDistinctPackageCode(int examId);

+ 0 - 39
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -1,7 +1,5 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
 
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
 import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.model.*;
@@ -40,9 +38,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Autowired
     @Autowired
     private ExamStudentDao studentDao;
     private ExamStudentDao studentDao;
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private ExamPackageService packageService;
     private ExamPackageService packageService;
 
 
@@ -93,7 +88,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         int examId = list.get(0).getExamId();
         int examId = list.get(0).getExamId();
         int schoolId = list.get(0).getSchoolId();
         int schoolId = list.get(0).getSchoolId();
         Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
         Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
-        Set<String> campusSet = new HashSet<String>();
         Set<String> packageSet = new HashSet<String>();
         Set<String> packageSet = new HashSet<String>();
 
 
         for (ExamStudent student : list) {
         for (ExamStudent student : list) {
@@ -115,7 +109,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
                 subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
             }
             }
             subjectMap.put(subject.getCode(), subject);
             subjectMap.put(subject.getCode(), subject);
-            campusSet.add(student.getCampusName());
             if (StringUtils.isNotBlank(student.getPackageCode())) {
             if (StringUtils.isNotBlank(student.getPackageCode())) {
                 packageSet.add(student.getPackageCode());
                 packageSet.add(student.getPackageCode());
             }
             }
@@ -135,8 +128,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 subject.setSubjectiveScore(0d);
                 subject.setSubjectiveScore(0d);
                 subject.setTotalScore(0d);
                 subject.setTotalScore(0d);
                 subject.setUploadCount(0);
                 subject.setUploadCount(0);
-                subject.setHasAnswer(false);
-                subject.setHasPaper(false);
                 subject.setRemark(es.getRemark());
                 subject.setRemark(es.getRemark());
             } else {
             } else {
                 subject.setLevel(es.getLevel());
                 subject.setLevel(es.getLevel());
@@ -146,16 +137,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             subjectService.save(subject);
             subjectService.save(subject);
         }
         }
 
 
-        for (String name : campusSet) {
-            Campus campus = campusService.findBySchoolAndName(schoolId, name);
-            if (campus == null) {
-                campus = new Campus();
-                campus.setSchoolId(schoolId);
-                campus.setName(name);
-                campusService.save(campus);
-            }
-        }
-
         for (String code : packageSet) {
         for (String code : packageSet) {
             ExamPackage examPackage = packageService.find(examId, code);
             ExamPackage examPackage = packageService.find(examId, code);
             if (examPackage == null) {
             if (examPackage == null) {
@@ -194,8 +175,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             subject.setSubjectiveScore(0d);
             subject.setSubjectiveScore(0d);
             subject.setTotalScore(0d);
             subject.setTotalScore(0d);
             subject.setUploadCount(0);
             subject.setUploadCount(0);
-            subject.setHasAnswer(false);
-            subject.setHasPaper(false);
             subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
             subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
             subjectService.save(subject);
             subjectService.save(subject);
         } else {
         } else {
@@ -204,14 +183,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             student.setSubjectCategory(subject.getCategory());
             student.setSubjectCategory(subject.getCategory());
         }
         }
 
 
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        if (campus == null) {
-            campus = new Campus();
-            campus.setSchoolId(student.getSchoolId());
-            campus.setName(student.getCampusName());
-            campusService.save(campus);
-        }
-
         if (StringUtils.isNotBlank(student.getPackageCode())) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage examPackage = packageService.find(student.getExamId(), student.getPackageCode());
             ExamPackage examPackage = packageService.find(student.getExamId(), student.getPackageCode());
             if (examPackage == null) {
             if (examPackage == null) {
@@ -382,16 +353,6 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return studentDao.findDistinctCampusName(examId);
         return studentDao.findDistinctCampusName(examId);
     }
     }
 
 
-    @Override
-    public ExamStudentSearchQuery findDistinctCampusName(ExamStudentSearchQuery query) {
-        checkQuery(query);
-        query.setResult(studentDao.findDistinctCampusName(query.getExamId(), query));
-        query.setCurrentCount(query.getResult().size());
-        query.setTotalCount(studentDao.countDistinctCampusName(query.getExamId()));
-        query.setTotalPage((int) query.getTotalCount() / query.getPageSize());
-        return query;
-    }
-
     @Override
     @Override
     public List<String> findDistinctPackageCode(int examId) {
     public List<String> findDistinctPackageCode(int examId) {
         return studentDao.findDistinctPackageCode(examId);
         return studentDao.findDistinctPackageCode(examId);

+ 46 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FileType.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.stmms.biz.file.enums;
+
+/**
+ * 所有管理的文件类型
+ */
+public enum FileType {
+
+    SHEET("原图", "sheet/%d/%s/%s-%d.%s"), SLICE("裁切图", "slice/%d/%s/%s-%d.%s"), JSON("作答内容",
+            "json/%d/%s/%s.%s"), PACKAGE("签到表", "package/%d/%s/%d.%s"), PAPER("试卷", "paper/%d/%s.%s"), ANSWER("标答",
+            "answer/%d/%s.%s"), CARD("题卡", "card/%d/%s.%s");
+
+    private String name;
+
+    private String pattern;
+
+    private FileType(String name, String pattern) {
+        this.name = name;
+        this.pattern = pattern;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public boolean equals(String type) {
+        return toString().equalsIgnoreCase(type);
+    }
+
+    public static FileType findByText(String text) {
+        for (FileType type : values()) {
+            if (type.equals(text)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public String getPath(Object... param) {
+        return String.format(pattern, param);
+    }
+
+}

+ 22 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FormatType.java

@@ -0,0 +1,22 @@
+package cn.com.qmth.stmms.biz.file.enums;
+
+/**
+ * 文件管理支持的格式类型
+ */
+public enum FormatType {
+
+    JPG, JSON, PDF, ZIP;
+
+    public String getExtName() {
+        return toString().toLowerCase();
+    }
+
+    public static FormatType findByText(String text) {
+        for (FormatType type : values()) {
+            if (type.toString().equalsIgnoreCase(text)) {
+                return type;
+            }
+        }
+        return null;
+    }
+}

+ 55 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java

@@ -0,0 +1,55 @@
+package cn.com.qmth.stmms.biz.file.service;
+
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+
+import java.io.InputStream;
+import java.util.List;
+
+public interface FileService {
+
+    String getFileServer();
+
+    void uploadSheet(InputStream ins, String md5, int examId, String examNumber, int index) throws Exception;
+
+    void uploadSlice(InputStream ins, String md5, int examId, String secretNumber, int index) throws Exception;
+
+    void uploadJson(InputStream ins, String md5, int examId, String secretNumber) throws Exception;
+
+    void uploadPackage(InputStream ins, String md5, int examId, String packageCode, int index) throws Exception;
+
+    void uploadPaper(InputStream ins, String md5, int examId, String subjectCode, FormatType type) throws Exception;
+
+    void uploadAnswer(InputStream ins, String md5, int examId, String subjectCode, FormatType type) throws Exception;
+
+    void uploadCard(InputStream ins, String md5, int examId, FormatType type) throws Exception;
+
+    void uploadCard(InputStream ins, String md5, int examId, String subjectCode, FormatType type) throws Exception;
+
+    String getSheetUri(int examId, String examNumber, int index);
+
+    List<String> getSheetUris(int examId, String examNumber, int start, int end);
+
+    String getSliceUri(int examId, String secretNumber, int index);
+
+    List<String> getSliceUris(int examId, String secretNumber, int start, int end);
+
+    String getJsonUri(int examId, String secretNumber);
+
+    String getPackageUri(int examId, String packageCode, int index);
+
+    List<String> getPackageUris(int examId, String packageCode, int start, int end);
+
+    String getPaperUri(int examId, String subjectCode, FormatType type);
+
+    String getAnswerUri(int examId, String subjectCode, FormatType type);
+
+    String getCardUri(int examId, FormatType type);
+
+    String getCardUri(int examId, String subjectCode, FormatType type);
+
+    boolean sheetExist(int examId, String examNumber, int index);
+
+    boolean sliceExist(int examId, String secreNumber, int index);
+
+    boolean jsonExist(int examId, String secreNumber);
+}

+ 235 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java

@@ -0,0 +1,235 @@
+package cn.com.qmth.stmms.biz.file.service.impl;
+
+import cn.com.qmth.stmms.biz.file.enums.FileType;
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.biz.file.store.FileStore;
+import cn.com.qmth.stmms.biz.file.store.impl.DiskStore;
+import cn.com.qmth.stmms.biz.file.store.impl.OssStore;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+
+@Service("fileService")
+public class FileServiceImpl implements FileService, InitializingBean {
+
+    private static final String COMMON_PLACEHOLDER = "common";
+
+    private static final int DEFAULT_SUFFIX_LENGTH = 3;
+
+    @Value("${file.server}")
+    private String fileServer;
+
+    @Value("${file.store}")
+    private String fileStore;
+
+    private FileStore store;
+
+    private String getSuffix(String input) {
+        return StringUtils.trimToEmpty(input).substring(Math.max(0, input.length() - DEFAULT_SUFFIX_LENGTH));
+    }
+
+    private boolean checkFormat(FormatType input, FormatType... types) {
+        for (FormatType type : types) {
+            if (type.equals(input)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String getFileServer() {
+        return fileServer;
+    }
+
+    public void setFileServer(String fileServer) {
+        this.fileServer = fileServer;
+    }
+
+    public String getFileStore() {
+        return fileStore;
+    }
+
+    public void setFileStore(String fileStore) {
+        this.fileStore = fileStore;
+    }
+
+    @Override
+    public void uploadSheet(InputStream ins, String md5, int examId, String examNumber, int index) throws Exception {
+        store.write(getSheetUri(examId, examNumber, index), ins, md5);
+    }
+
+    @Override
+    public void uploadSlice(InputStream ins, String md5, int examId, String secretNumber, int index) throws Exception {
+        store.write(getSliceUri(examId, secretNumber, index), ins, md5);
+    }
+
+    @Override
+    public void uploadJson(InputStream ins, String md5, int examId, String secretNumber) throws Exception {
+        store.write(getJsonUri(examId, secretNumber), ins, md5);
+    }
+
+    @Override
+    public void uploadPackage(InputStream ins, String md5, int examId, String packageCode, int index) throws Exception {
+        store.write(getPackageUri(examId, packageCode, index), ins, md5);
+    }
+
+    @Override
+    public void uploadPaper(InputStream ins, String md5, int examId, String subjectCode, FormatType type)
+            throws Exception {
+        if (!checkFormat(type, FormatType.PDF, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getPaperUri(examId, subjectCode, type), ins, md5);
+
+    }
+
+    @Override
+    public void uploadAnswer(InputStream ins, String md5, int examId, String subjectCode, FormatType type)
+            throws Exception {
+        if (!checkFormat(type, FormatType.PDF, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getAnswerUri(examId, subjectCode, type), ins, md5);
+    }
+
+    @Override
+    public void uploadCard(InputStream ins, String md5, int examId, FormatType type) throws Exception {
+        if (!checkFormat(type, FormatType.ZIP, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getCardUri(examId, COMMON_PLACEHOLDER, type), ins, md5);
+    }
+
+    @Override
+    public void uploadCard(InputStream ins, String md5, int examId, String subjectCode, FormatType type)
+            throws Exception {
+        if (!checkFormat(type, FormatType.ZIP, FormatType.JSON)) {
+            throw new RuntimeException("format type invalid");
+        }
+        store.write(getCardUri(examId, subjectCode, type), ins, md5);
+    }
+
+    @Override
+    public String getSheetUri(int examId, String examNumber, int index) {
+        return FileType.SHEET.getPath(examId, getSuffix(examNumber), examNumber, index, FormatType.JPG.getExtName());
+    }
+
+    @Override
+    public List<String> getSheetUris(int examId, String examNumber, int start, int end) {
+        List<String> list = new LinkedList<>();
+        for (int i = start; i <= end; i++) {
+            list.add(getSheetUri(examId, examNumber, i));
+        }
+        return list;
+    }
+
+    @Override
+    public String getSliceUri(int examId, String secretNumber, int index) {
+        return FileType.SLICE
+                .getPath(examId, getSuffix(secretNumber), secretNumber, index, FormatType.JPG.getExtName());
+    }
+
+    @Override
+    public List<String> getSliceUris(int examId, String secretNumber, int start, int end) {
+        List<String> list = new LinkedList<>();
+        for (int i = start; i <= end; i++) {
+            list.add(getSliceUri(examId, secretNumber, i));
+        }
+        return list;
+    }
+
+    @Override
+    public String getJsonUri(int examId, String secretNumber) {
+        return FileType.JSON.getPath(examId, getSuffix(secretNumber), secretNumber, FormatType.JSON.getExtName());
+    }
+
+    @Override
+    public String getPackageUri(int examId, String packageCode, int index) {
+        return FileType.PACKAGE.getPath(examId, packageCode, index, FormatType.JPG.getExtName());
+    }
+
+    @Override
+    public List<String> getPackageUris(int examId, String packageCode, int start, int end) {
+        List<String> list = new LinkedList<>();
+        for (int i = start; i <= end; i++) {
+            list.add(getPackageUri(examId, packageCode, i));
+        }
+        return list;
+    }
+
+    @Override
+    public String getPaperUri(int examId, String subjectCode, FormatType type) {
+        return FileType.PAPER.getPath(examId, subjectCode, type.getExtName());
+    }
+
+    @Override
+    public String getAnswerUri(int examId, String subjectCode, FormatType type) {
+        return FileType.ANSWER.getPath(examId, subjectCode, type.getExtName());
+    }
+
+    @Override
+    public String getCardUri(int examId, String subjectCode, FormatType type) {
+        return FileType.ANSWER.getPath(examId, subjectCode, type.getExtName());
+    }
+
+    @Override
+    public String getCardUri(int examId, FormatType type) {
+        return FileType.ANSWER.getPath(examId, COMMON_PLACEHOLDER, type.getExtName());
+    }
+
+    @Override
+    public boolean sheetExist(int examId, String examNumber, int index) {
+        return store.exist(getSheetUri(examId, examNumber, index));
+    }
+
+    @Override
+    public boolean sliceExist(int examId, String secretNumber, int index) {
+        return store.exist(getSliceUri(examId, secretNumber, index));
+    }
+
+    @Override
+    public boolean jsonExist(int examId, String secretNumber) {
+        return store.exist(getJsonUri(examId, secretNumber));
+    }
+
+    @Override
+    public void afterPropertiesSet() {
+        fileServer = StringUtils.trimToNull(fileServer);
+        fileStore = StringUtils.trimToNull(fileStore);
+        if (fileServer == null) {
+            throw new RuntimeException("invald property: ${file.server} should not be empty");
+        }
+        if (fileStore == null) {
+            throw new RuntimeException("invald property: ${file.store} should not be empty");
+        }
+        if (!fileServer.endsWith("/")) {
+            fileServer = fileServer.concat("/");
+        }
+        if (fileStore.startsWith("oss")) {
+            store = new OssStore(fileStore);
+        } else {
+            store = new DiskStore(fileStore);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        FileServiceImpl service = new FileServiceImpl();
+        service.fileServer = "123";
+        service.fileStore = "oss://LTAI4FnJ2pgV6aGceYcCkeEi:ktrMEVE7PfoxRPeJUPDFeygOIH4aU7@qmth-test.oss-cn-shenzhen.aliyuncs.com";
+        service.afterPropertiesSet();
+
+        //DiskStore ds = new DiskStore("/Users/luoshi/Downloads");
+        //String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(ds.read("123456.jpg")));
+        service.uploadSheet(new FileInputStream("/Users/luoshi/Downloads/123456.jpg"),
+                "7e9b368ff5da88ff2413c2c9083c481d", 1, "123456", 1);
+        System.out.println("success");
+    }
+}

+ 12 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/FileStore.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.stmms.biz.file.store;
+
+import java.io.InputStream;
+
+public interface FileStore {
+
+    void write(String path, InputStream ins, String md5) throws Exception;
+
+    byte[] read(String path) throws Exception;
+
+    boolean exist(String path);
+}

+ 72 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/DiskStore.java

@@ -0,0 +1,72 @@
+package cn.com.qmth.stmms.biz.file.store.impl;
+
+import cn.com.qmth.stmms.biz.file.store.FileStore;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+/**
+ * 本地磁盘文件管理工具
+ */
+public class DiskStore implements FileStore {
+
+    private static final Logger log = LoggerFactory.getLogger(DiskStore.class);
+
+    private File rootDir;
+
+    public DiskStore(String path) {
+        rootDir = new File(path);
+        if (!rootDir.exists() && !rootDir.mkdirs()) {
+            //自动创建目录失败
+            throw new IllegalArgumentException("[file.store]" + path + ": auto mkdir faile");
+        } else if (rootDir.isFile()) {
+            //判断是否不是目录
+            throw new IllegalArgumentException("[file.store]" + path + ": is a file");
+        }
+    }
+
+    @Override
+    public void write(String path, InputStream ins, String md5) throws Exception {
+        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+        IOUtils.copy(ins, buffer);
+        byte[] data = buffer.toByteArray();
+        if (!BinaryUtil.encodeMD5(data).equalsIgnoreCase(md5)) {
+            throw new RuntimeException("md5 validate faile");
+        }
+        File target = new File(rootDir, path);
+        target.getParentFile().mkdirs();
+        FileOutputStream ous = new FileOutputStream(target);
+        ous.write(data);
+        IOUtils.closeQuietly(ous);
+    }
+
+    @Override
+    public byte[] read(String path) throws Exception {
+        File file = new File(rootDir, path);
+        if (file.exists() && file.isFile()) {
+            FileInputStream ins = new FileInputStream(file);
+            FileChannel channel = ins.getChannel();
+            ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
+            while ((channel.read(byteBuffer)) > 0) {
+                //
+            }
+            IOUtils.closeQuietly(ins);
+            IOUtils.closeQuietly(channel);
+            return byteBuffer.array();
+        } else {
+            throw new RuntimeException("read file unexist:" + path);
+        }
+    }
+
+    @Override
+    public boolean exist(String path) {
+        File file = new File(rootDir, path);
+        return file.exists() && file.isFile();
+    }
+
+}

+ 91 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/store/impl/OssStore.java

@@ -0,0 +1,91 @@
+package cn.com.qmth.stmms.biz.file.store.impl;
+
+import cn.com.qmth.stmms.biz.file.store.FileStore;
+import cn.com.qmth.stmms.common.utils.Encodes;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.ObjectMetadata;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.Assert;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * OSS文件管理工具
+ */
+public class OssStore implements FileStore {
+
+    private static final Logger log = LoggerFactory.getLogger(OssStore.class);
+
+    private static final String ENDPOINT_PREFIX = "https://";
+
+    private static final Pattern CONFIG_PATTERN = Pattern.compile("^oss://([\\w]+):([\\w]+)@([\\w-]+).([\\w-.]+)$");
+
+    private String endpoint;
+
+    private String bucket;
+
+    private String accessKey;
+
+    private String accessSecret;
+
+    public OssStore(String config) {
+        String message = "[file.store]" + config + ": pattern error";
+        Matcher m = CONFIG_PATTERN.matcher(config);
+        if (m.find()) {
+            accessKey = StringUtils.trimToNull(m.group(1));
+            accessSecret = StringUtils.trimToNull(m.group(2));
+            bucket = StringUtils.trimToNull(m.group(3));
+            endpoint = StringUtils.trimToNull(m.group(4));
+
+            Assert.notNull(accessKey, message);
+            Assert.notNull(accessSecret, message);
+            Assert.notNull(bucket, message);
+            Assert.notNull(endpoint, message);
+
+            endpoint = ENDPOINT_PREFIX.concat(endpoint);
+        } else {
+            throw new IllegalArgumentException(message);
+        }
+    }
+
+    @Override
+    public void write(String path, InputStream ins, String md5) throws Exception {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessSecret);
+        ObjectMetadata metadata = new ObjectMetadata();
+        metadata.setContentMD5(BinaryUtil.toBase64String(Encodes.decodeHex(md5)));
+        ossClient.putObject(bucket, path, ins, metadata);
+        ossClient.shutdown();
+    }
+
+    @Override
+    public byte[] read(String path) throws Exception {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKey);
+        OSSObject ossObject = ossClient.getObject(bucket, path);
+        ByteArrayOutputStream ous = new ByteArrayOutputStream();
+        IOUtils.copy(ossObject.getObjectContent(), ous);
+        ossClient.shutdown();
+        return ous.toByteArray();
+    }
+
+    @Override
+    public boolean exist(String path) {
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKey);
+        try {
+            return ossClient.doesObjectExist(bucket, path);
+        } catch (Exception e) {
+            log.error("oss exist operate error", e);
+            return false;
+        } finally {
+            ossClient.shutdown();
+        }
+    }
+}

+ 0 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkLibrary.java

@@ -39,12 +39,6 @@ public class MarkLibrary implements Serializable {
     @Column(name = "group_number")
     @Column(name = "group_number")
     private Integer groupNumber;
     private Integer groupNumber;
 
 
-    /**
-     * 学习中心
-     */
-    @Column(name = "campus_id")
-    private Integer campusId;
-
     /**
     /**
      * 考生编号
      * 考生编号
      */
      */
@@ -244,14 +238,6 @@ public class MarkLibrary implements Serializable {
         return list;
         return list;
     }
     }
 
 
-    public Integer getCampusId() {
-        return campusId;
-    }
-
-    public void setCampusId(Integer campusId) {
-        this.campusId = campusId;
-    }
-
     public Integer getGroupNumber() {
     public Integer getGroupNumber() {
         return groupNumber;
         return groupNumber;
     }
     }

+ 0 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrialLibrary.java

@@ -36,12 +36,6 @@ public class TrialLibrary implements Serializable {
     @Column(name = "group_number")
     @Column(name = "group_number")
     private Integer groupNumber;
     private Integer groupNumber;
 
 
-    /**
-     * 学习中心
-     */
-    @Column(name = "campus_id")
-    private Integer campusId;
-
     /**
     /**
      * 考生编号
      * 考生编号
      */
      */
@@ -114,14 +108,6 @@ public class TrialLibrary implements Serializable {
         this.secretNumber = secretNumber;
         this.secretNumber = secretNumber;
     }
     }
 
 
-    public Integer getCampusId() {
-        return campusId;
-    }
-
-    public void setCampusId(Integer campusId) {
-        this.campusId = campusId;
-    }
-
     public Integer getGroupNumber() {
     public Integer getGroupNumber() {
         return groupNumber;
         return groupNumber;
     }
     }

+ 41 - 73
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java

@@ -1,19 +1,5 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -28,6 +14,15 @@ import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
 import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
 import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
 
 
 /**
 /**
  * 与评卷相关的所有定时任务
  * 与评卷相关的所有定时任务
@@ -39,9 +34,6 @@ public class MarkCronService {
 
 
     protected static final Logger log = LoggerFactory.getLogger(MarkCronService.class);
     protected static final Logger log = LoggerFactory.getLogger(MarkCronService.class);
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private ExamStudentService studentService;
     private ExamStudentService studentService;
 
 
@@ -98,10 +90,9 @@ public class MarkCronService {
     public void buildLibrary() {
     public void buildLibrary() {
         log.info("start auto-create library");
         log.info("start auto-create library");
         try {
         try {
-            Map<String, Campus> campusMap = new HashMap<>();
             List<Integer> examIds = groupService.findExamIdByStatus(MarkStatus.TRIAL, MarkStatus.FORMAL);
             List<Integer> examIds = groupService.findExamIdByStatus(MarkStatus.TRIAL, MarkStatus.FORMAL);
             for (Integer examId : examIds) {
             for (Integer examId : examIds) {
-                buildLibraryByExam(examId, campusMap);
+                buildLibraryByExam(examId);
             }
             }
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("auto-create library error", e);
             log.error("auto-create library error", e);
@@ -132,11 +123,11 @@ public class MarkCronService {
         // 获取主观题总分大于0的科目
         // 获取主观题总分大于0的科目
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         for (ExamSubject subject : subjects) {
         for (ExamSubject subject : subjects) {
-            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subject.getCode(),
-                    MarkStatus.FORMAL);
+            List<MarkGroup> groups = groupService
+                    .findByExamAndSubjectAndStatus(examId, subject.getCode(), MarkStatus.FORMAL);
             for (MarkGroup markGroup : groups) {
             for (MarkGroup markGroup : groups) {
-                List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(),
-                        markGroup.getNumber());
+                List<Marker> markers = markerService
+                        .findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber());
                 for (Marker marker : markers) {
                 for (Marker marker : markers) {
                     try {
                     try {
                         if (markService.needUpdateQuality(marker, markerActiveExpireMinute)) {
                         if (markService.needUpdateQuality(marker, markerActiveExpireMinute)) {
@@ -151,13 +142,13 @@ public class MarkCronService {
         }
         }
     }
     }
 
 
-    private void buildLibraryByExam(Integer examId, Map<String, Campus> campusMap) {
+    private void buildLibraryByExam(Integer examId) {
         // 获取主观题总分大于0的科目
         // 获取主观题总分大于0的科目
         List<ExamSubject> subjects = subjectService.listSubjectiveScore(examId, 0d);
         List<ExamSubject> subjects = subjectService.listSubjectiveScore(examId, 0d);
         for (ExamSubject subject : subjects) {
         for (ExamSubject subject : subjects) {
             // 清除缺考考生和违纪考生
             // 清除缺考考生和违纪考生
-            List<ExamStudent> list = studentService.findAbsentOrBreachLibraryStudent(subject.getExamId(),
-                    subject.getCode());
+            List<ExamStudent> list = studentService
+                    .findAbsentOrBreachLibraryStudent(subject.getExamId(), subject.getCode());
             if (list != null) {
             if (list != null) {
                 for (ExamStudent student : list) {
                 for (ExamStudent student : list) {
                     try {
                     try {
@@ -172,59 +163,54 @@ public class MarkCronService {
             }
             }
             // 处理正常考生
             // 处理正常考生
             // 生成试评任务
             // 生成试评任务
-            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
-                    MarkStatus.TRIAL);
+            List<MarkGroup> groups = groupService
+                    .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.TRIAL);
             for (MarkGroup group : groups) {
             for (MarkGroup group : groups) {
-                buildTrialLibrary(campusMap, group);
+                buildTrialLibrary(group);
             }
             }
             // 生成正评任务
             // 生成正评任务
             // 试评状态的分组也提前生成
             // 试评状态的分组也提前生成
-            groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
-                    MarkStatus.FORMAL, MarkStatus.TRIAL);
+            groups = groupService
+                    .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.FORMAL,
+                            MarkStatus.TRIAL);
             for (MarkGroup group : groups) {
             for (MarkGroup group : groups) {
-                buildFormalLibrary(subject, campusMap, group);
+                buildFormalLibrary(subject, group);
             }
             }
         }
         }
     }
     }
 
 
-    private void buildFormalLibrary(ExamSubject subject, Map<String, Campus> campusMap, MarkGroup group) {
+    private void buildFormalLibrary(ExamSubject subject, MarkGroup group) {
         Date lastBuildTime = group.getBuildTime();
         Date lastBuildTime = group.getBuildTime();
         int count = 0;
         int count = 0;
-        ExamStudent student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(),
-                group.getNumber(), lastBuildTime);
+        ExamStudent student = studentService
+                .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), lastBuildTime);
         while (student != null) {
         while (student != null) {
-            // 补充学习中心集合
-            Campus campus = getCampus(student, campusMap);
-            if (campus == null) {
-                log.error("campus unexist for student id=" + student.getId());
-                continue;
-            }
             // 尝试构造评卷任务
             // 尝试构造评卷任务
             try {
             try {
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.watch(LockType.STUDENT, student.getId());
                 lockService.watch(LockType.STUDENT, student.getId());
                 // 上锁后重复验证分组状态
                 // 上锁后重复验证分组状态
-                if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                        MarkStatus.FORMAL, MarkStatus.TRIAL)) {
+                if (!groupService
+                        .validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), MarkStatus.FORMAL,
+                                MarkStatus.TRIAL)) {
                     break;
                     break;
                 }
                 }
                 // 上锁后重复验证考生状态
                 // 上锁后重复验证考生状态
                 if (studentService.validateStatus(student.getId())) {
                 if (studentService.validateStatus(student.getId())) {
-                    markService.buildFormalLibrary(student, campus, group, subject);
+                    markService.buildFormalLibrary(student, group, subject);
                     lastBuildTime = student.getUploadTime();
                     lastBuildTime = student.getUploadTime();
                     count++;
                     count++;
                 }
                 }
             } catch (Exception e) {
             } catch (Exception e) {
-                log.error(
-                        "build formal library error for studentId=" + student.getId() + ", groupNumber="
-                                + group.getNumber(), e);
+                log.error("build formal library error for studentId=" + student.getId() + ", groupNumber=" + group
+                        .getNumber(), e);
             } finally {
             } finally {
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
             }
             }
             // 取下一个考生
             // 取下一个考生
-            student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    lastBuildTime);
+            student = studentService
+                    .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), lastBuildTime);
         }
         }
         // 有新任务创建,同时正评状态,此时才需要更新任务数量
         // 有新任务创建,同时正评状态,此时才需要更新任务数量
         if (count > 0) {
         if (count > 0) {
@@ -236,20 +222,14 @@ public class MarkCronService {
         }
         }
     }
     }
 
 
-    private void buildTrialLibrary(Map<String, Campus> campusMap, MarkGroup group) {
+    private void buildTrialLibrary(MarkGroup group) {
         while (group.getTrialCount() > group.getLibraryCount()) {
         while (group.getTrialCount() > group.getLibraryCount()) {
             // 随机取一个未生成试评任务的考生
             // 随机取一个未生成试评任务的考生
-            ExamStudent student = studentService.randomUnTrialStudent(group.getExamId(), group.getSubjectCode(),
-                    group.getNumber());
+            ExamStudent student = studentService
+                    .randomUnTrialStudent(group.getExamId(), group.getSubjectCode(), group.getNumber());
             if (student == null) {
             if (student == null) {
                 return;
                 return;
             }
             }
-            // 补充学习中心集合
-            Campus campus = getCampus(student, campusMap);
-            if (campus == null) {
-                log.error("campus unexist for student id=" + student.getId());
-                continue;
-            }
             // 尝试构造试评任务
             // 尝试构造试评任务
             try {
             try {
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -261,14 +241,13 @@ public class MarkCronService {
                 }
                 }
                 // 上锁后重复验证考生状态
                 // 上锁后重复验证考生状态
                 if (studentService.validateStatus(student.getId())) {
                 if (studentService.validateStatus(student.getId())) {
-                    markService.buildTrialLibrary(student, campus, group);
+                    markService.buildTrialLibrary(student, group);
                     markService.updateLibraryCount(group);
                     markService.updateLibraryCount(group);
                     markService.updateMarkedCount(group);
                     markService.updateMarkedCount(group);
                 }
                 }
             } catch (Exception e) {
             } catch (Exception e) {
-                log.error(
-                        "build trial library error for studentId=" + student.getId() + ", groupNumber="
-                                + group.getNumber(), e);
+                log.error("build trial library error for studentId=" + student.getId() + ", groupNumber=" + group
+                        .getNumber(), e);
             } finally {
             } finally {
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -276,15 +255,4 @@ public class MarkCronService {
         }
         }
     }
     }
 
 
-    private Campus getCampus(ExamStudent student, Map<String, Campus> campusMap) {
-        // 补充学习中心集合
-        Campus campus = campusMap.get(student.getSchoolId() + "_" + student.getCampusName());
-        if (campus == null) {
-            campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-            if (campus != null) {
-                campusMap.put(student.getSchoolId() + "_" + student.getCampusName(), campus);
-            }
-        }
-        return campus;
-    }
 }
 }

+ 2 - 13
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -1,11 +1,9 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 
-import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
 import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.model.*;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.mark.dao.*;
 import cn.com.qmth.stmms.biz.mark.dao.*;
@@ -77,9 +75,6 @@ public class MarkServiceImpl implements MarkService {
     @Autowired
     @Autowired
     private TrialTagDao trialTagDao;
     private TrialTagDao trialTagDao;
 
 
-    @Autowired
-    private ExamService examService;
-
     @Autowired
     @Autowired
     private ProblemHistoryService problemHistoryService;
     private ProblemHistoryService problemHistoryService;
 
 
@@ -601,7 +596,6 @@ public class MarkServiceImpl implements MarkService {
         library.setExamId(markLibrary.getExamId());
         library.setExamId(markLibrary.getExamId());
         library.setSubjectCode(markLibrary.getSubjectCode());
         library.setSubjectCode(markLibrary.getSubjectCode());
         library.setGroupNumber(group.getNumber());
         library.setGroupNumber(group.getNumber());
-        library.setCampusId(markLibrary.getCampusId());
         library.setStudentId(markLibrary.getStudentId());
         library.setStudentId(markLibrary.getStudentId());
         library.setExamNumber(markLibrary.getExamNumber());
         library.setExamNumber(markLibrary.getExamNumber());
         library.setSecretNumber(markLibrary.getSecretNumber());
         library.setSecretNumber(markLibrary.getSecretNumber());
@@ -874,20 +868,18 @@ public class MarkServiceImpl implements MarkService {
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      *
      *
      * @param student - 考生
      * @param student - 考生
-     * @param campus  - 学习中心
      * @param group   - 评卷分组
      * @param group   - 评卷分组
      * @param subject - 科目
      * @param subject - 科目
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
-    public void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group, ExamSubject subject) {
+    public void buildFormalLibrary(ExamStudent student, MarkGroup group, ExamSubject subject) {
         // 查询是否已创建评卷任务
         // 查询是否已创建评卷任务
         if (libraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
         if (libraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
             MarkLibrary library = new MarkLibrary();
             MarkLibrary library = new MarkLibrary();
             library.setExamId(student.getExamId());
             library.setExamId(student.getExamId());
             library.setSubjectCode(student.getSubjectCode());
             library.setSubjectCode(student.getSubjectCode());
             library.setGroupNumber(group.getNumber());
             library.setGroupNumber(group.getNumber());
-            library.setCampusId(campus.getId());
             library.setStudentId(student.getId());
             library.setStudentId(student.getId());
             library.setExamNumber(student.getExamNumber());
             library.setExamNumber(student.getExamNumber());
             library.setSecretNumber(student.getSecretNumber());
             library.setSecretNumber(student.getSecretNumber());
@@ -918,7 +910,6 @@ public class MarkServiceImpl implements MarkService {
                     library.setExamId(student.getExamId());
                     library.setExamId(student.getExamId());
                     library.setSubjectCode(student.getSubjectCode());
                     library.setSubjectCode(student.getSubjectCode());
                     library.setGroupNumber(group.getNumber());
                     library.setGroupNumber(group.getNumber());
-                    library.setCampusId(campus.getId());
                     library.setStudentId(student.getId());
                     library.setStudentId(student.getId());
                     library.setExamNumber(student.getExamNumber());
                     library.setExamNumber(student.getExamNumber());
                     library.setSecretNumber(student.getSecretNumber());
                     library.setSecretNumber(student.getSecretNumber());
@@ -938,19 +929,17 @@ public class MarkServiceImpl implements MarkService {
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      *
      *
      * @param student - 考生
      * @param student - 考生
-     * @param campus  - 学习中心
      * @param group   - 评卷分组
      * @param group   - 评卷分组
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
-    public void buildTrialLibrary(ExamStudent student, Campus campus, MarkGroup group) {
+    public void buildTrialLibrary(ExamStudent student, MarkGroup group) {
         // 查询是否已创建评卷任务
         // 查询是否已创建评卷任务
         if (trialLibraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
         if (trialLibraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
             TrialLibrary library = new TrialLibrary();
             TrialLibrary library = new TrialLibrary();
             library.setExamId(student.getExamId());
             library.setExamId(student.getExamId());
             library.setSubjectCode(student.getSubjectCode());
             library.setSubjectCode(student.getSubjectCode());
             library.setGroupNumber(group.getNumber());
             library.setGroupNumber(group.getNumber());
-            library.setCampusId(campus.getId());
             library.setStudentId(student.getId());
             library.setStudentId(student.getId());
             library.setExamNumber(student.getExamNumber());
             library.setExamNumber(student.getExamNumber());
             library.setSecretNumber(student.getSecretNumber());
             library.setSecretNumber(student.getSecretNumber());

+ 58 - 54
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java

@@ -47,9 +47,6 @@ public class TaskServiceImpl implements TaskService {
     @Autowired
     @Autowired
     private MarkSpecialTagService markSpecialTagService;
     private MarkSpecialTagService markSpecialTagService;
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private MarkerService markerService;
     private MarkerService markerService;
 
 
@@ -57,11 +54,14 @@ public class TaskServiceImpl implements TaskService {
     private TrialService trialService;
     private TrialService trialService;
 
 
     @Autowired
     @Autowired
-    private ExamService examService;
+    private ExamSubjectService subjectService;
 
 
     @Autowired
     @Autowired
     private UserService userService;
     private UserService userService;
 
 
+    @Autowired
+    private FileService fileService;
+
     @Override
     @Override
     public List<Task> findByQuery(MarkLibrarySearchQuery query) {
     public List<Task> findByQuery(MarkLibrarySearchQuery query) {
         List<Task> list = new LinkedList<Task>();
         List<Task> list = new LinkedList<Task>();
@@ -76,28 +76,27 @@ public class TaskServiceImpl implements TaskService {
 
 
     @Override
     @Override
     public Task build(ArbitrateHistory history, MarkGroup group) {
     public Task build(ArbitrateHistory history, MarkGroup group) {
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
         ExamStudent student = studentService.findByExamIdAndExamNumber(history.getExamId(), history.getExamNumber());
         ExamStudent student = studentService.findByExamIdAndExamNumber(history.getExamId(), history.getExamNumber());
         List<MarkLibrary> libraryList = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());
         List<MarkLibrary> libraryList = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());
-        Integer campusId = libraryList.get(0).getCampusId();
-
         Task task = new Task();
         Task task = new Task();
         task.setExist(true);
         task.setExist(true);
         task.setStudentId(history.getStudentId());
         task.setStudentId(history.getStudentId());
         task.setLibraryId(history.getId());
         task.setLibraryId(history.getId());
         task.setStudentNumber(history.getSecretNumber());
         task.setStudentNumber(history.getSecretNumber());
         task.setMarkStepList(buildMarkStep(group, null));
         task.setMarkStepList(buildMarkStep(group, null));
-        task.setPictureUrls(PictureUrlBuilder
-                .getSliceUrls(student.getExamId(), campusId, student.getSubjectCode(), student.getExamNumber(),
-                        student.getSliceCount()));
+        task.setPictureUrls(
+                fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount()));
         task.setPictureConfig(group.getPictureConfigList());
         task.setPictureConfig(group.getPictureConfigList());
-        task.setSheetUrls(PictureUrlBuilder
-                .getSheetUrls(student.getExamId(), campusId, student.getSubjectCode(), student.getExamNumber(),
-                        student.getSheetCount()));
-        task.setJsonUrl(PictureUrlBuilder
-                .getAnswerJson(student.getExamId(), student.getSubjectCode(), student.getPaperType(),
-                        student.getExamNumber()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(student.getExamId(), student.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(student.getExamId(), student.getSubjectCode()));
+        task.setJsonUrl(fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
         task.setObjectiveScore(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0);
         task.setObjectiveScore(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0);
         task.setMarkTime(history.getUpdateTime());
         task.setMarkTime(history.getUpdateTime());
         // 构造仲裁信息
         // 构造仲裁信息
@@ -122,8 +121,10 @@ public class TaskServiceImpl implements TaskService {
 
 
     @Override
     @Override
     public Task build(MarkLibrary library) {
     public Task build(MarkLibrary library) {
+        ExamSubject subject = subjectService.find(library.getExamId(), library.getSubjectCode());
         ExamStudent student = studentService.findByExamIdAndExamNumber(library.getExamId(), library.getExamNumber());
         ExamStudent student = studentService.findByExamIdAndExamNumber(library.getExamId(), library.getExamNumber());
         MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
         MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
+
         Task task = new Task();
         Task task = new Task();
         task.setExist(true);
         task.setExist(true);
         task.setStatusValue(MarkStatus.FORMAL.getValue());
         task.setStatusValue(MarkStatus.FORMAL.getValue());
@@ -132,19 +133,19 @@ public class TaskServiceImpl implements TaskService {
         // 正评显示考生密号
         // 正评显示考生密号
         task.setStudentNumber(library.getSecretNumber());
         task.setStudentNumber(library.getSecretNumber());
         task.setMarkStepList(buildMarkStep(group, library.getId()));
         task.setMarkStepList(buildMarkStep(group, library.getId()));
-        task.setPictureUrls(PictureUrlBuilder
-                .getSliceUrls(library.getExamId(), library.getCampusId(), library.getSubjectCode(),
-                        library.getExamNumber(), student.getSliceCount()));
+        task.setPictureUrls(
+                fileService.getSliceUris(library.getExamId(), library.getSecretNumber(), 1, student.getSliceCount()));
         task.setPictureConfig(group.getPictureConfigList());
         task.setPictureConfig(group.getPictureConfigList());
-        task.setSheetUrls(PictureUrlBuilder
-                .getSheetUrls(library.getExamId(), library.getCampusId(), library.getSubjectCode(),
-                        library.getExamNumber(), student.getSheetCount()));
-        task.setJsonUrl(PictureUrlBuilder
-                .getAnswerJson(library.getExamId(), library.getSubjectCode(), student.getPaperType(),
-                        student.getExamNumber()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(library.getExamId(), library.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(library.getExamId(), library.getSubjectCode()));
-        task.setObjectiveScore(student != null ? student.getObjectiveScore() : 0);
+        task.setJsonUrl(fileService.getJsonUri(library.getExamId(), library.getSecretNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
+        task.setObjectiveScore(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0);
         task.setMarkTime(library.getMarkerTime());
         task.setMarkTime(library.getMarkerTime());
         task.setTagList(getMarkSpecialTagList(library.getId()));
         task.setTagList(getMarkSpecialTagList(library.getId()));
         if (library.getMarkerScore() != null) {
         if (library.getMarkerScore() != null) {
@@ -162,8 +163,10 @@ public class TaskServiceImpl implements TaskService {
 
 
     @Override
     @Override
     public Task build(TrialLibrary library, TrialHistory history) {
     public Task build(TrialLibrary library, TrialHistory history) {
-        ExamStudent student = studentService.findById(library.getStudentId());
+        ExamSubject subject = subjectService.find(library.getExamId(), library.getSubjectCode());
+        ExamStudent student = studentService.findByExamIdAndExamNumber(library.getExamId(), library.getExamNumber());
         MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
         MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
+
         Task task = new Task();
         Task task = new Task();
         task.setExist(true);
         task.setExist(true);
         task.setStatusValue(MarkStatus.TRIAL.getValue());
         task.setStatusValue(MarkStatus.TRIAL.getValue());
@@ -173,19 +176,19 @@ public class TaskServiceImpl implements TaskService {
         task.setStudentId(library.getStudentId());
         task.setStudentId(library.getStudentId());
         task.setLibraryId(library.getId());
         task.setLibraryId(library.getId());
         task.setMarkStepList(buildTrialStep(group, history));
         task.setMarkStepList(buildTrialStep(group, history));
-        task.setPictureUrls(PictureUrlBuilder
-                .getSliceUrls(library.getExamId(), library.getCampusId(), library.getSubjectCode(),
-                        library.getExamNumber(), student.getSliceCount()));
+        task.setPictureUrls(
+                fileService.getSliceUris(library.getExamId(), library.getSecretNumber(), 1, student.getSliceCount()));
         task.setPictureConfig(group.getPictureConfigList());
         task.setPictureConfig(group.getPictureConfigList());
-        task.setSheetUrls(PictureUrlBuilder
-                .getSheetUrls(library.getExamId(), library.getCampusId(), library.getSubjectCode(),
-                        library.getExamNumber(), student.getSheetCount()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(library.getExamId(), library.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(library.getExamId(), library.getSubjectCode()));
-        task.setJsonUrl(PictureUrlBuilder
-                .getAnswerJson(library.getExamId(), library.getSubjectCode(), student.getPaperType(),
-                        student.getExamNumber()));
-        task.setObjectiveScore(student != null ? student.getObjectiveScore() : 0);
+        task.setJsonUrl(fileService.getJsonUri(library.getExamId(), library.getSecretNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
+        task.setObjectiveScore(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0);
         if (history != null) {
         if (history != null) {
             task.setMarkTime(history.getMarkerTime());
             task.setMarkTime(history.getMarkerTime());
             task.setTotalScore(history.getMarkerScore());
             task.setTotalScore(history.getMarkerScore());
@@ -296,24 +299,25 @@ public class TaskServiceImpl implements TaskService {
     @Override
     @Override
     public Task build(Integer studentId) {
     public Task build(Integer studentId) {
         ExamStudent student = studentService.findById(studentId);
         ExamStudent student = studentService.findById(studentId);
+        ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
         Task task = new Task();
         Task task = new Task();
         task.setExist(true);
         task.setExist(true);
         task.setStudentId(studentId);
         task.setStudentId(studentId);
         task.setStudentNumber(student.getSecretNumber());
         task.setStudentNumber(student.getSecretNumber());
         task.setMarkStepList(buildMarkStep(student));
         task.setMarkStepList(buildMarkStep(student));
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        task.setPictureUrls(PictureUrlBuilder
-                .getSliceUrls(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(),
-                        student.getSliceCount()));
-        task.setPictureConfig(buildPictureConfig(student.getSliceCount()));
-        task.setSheetUrls(PictureUrlBuilder
-                .getSheetUrls(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(),
-                        student.getSheetCount()));
-        task.setAnswerUrl(PictureUrlBuilder.getAnswerUrl(student.getExamId(), student.getSubjectCode()));
-        task.setPaperUrl(PictureUrlBuilder.getPaperUrl(student.getExamId(), student.getSubjectCode()));
-        task.setObjectiveScore(student != null ? student.getObjectiveScore() : 0);
+        task.setPictureUrls(
+                fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount()));
+        task.setJsonUrl(fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
+        if (subject.getPaperFileType() != null) {
+            task.setPaperUrl(
+                    fileService.getPaperUri(subject.getExamId(), subject.getCode(), subject.getPaperFileType()));
+        }
+        if (subject.getAnswerFileType() != null) {
+            task.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
+        task.setObjectiveScore(student.getObjectiveScore());
         task.setBack(true);
         task.setBack(true);
-
         return task;
         return task;
     }
     }
 
 

+ 9 - 17
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -1,13 +1,6 @@
 package cn.com.qmth.stmms.biz.mark.service;
 package cn.com.qmth.stmms.biz.mark.service;
 
 
-import java.util.List;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkResult;
 import cn.com.qmth.stmms.biz.mark.model.MarkResult;
@@ -15,6 +8,8 @@ import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 
+import java.util.List;
+
 public interface MarkService {
 public interface MarkService {
 
 
     /**
     /**
@@ -101,7 +96,6 @@ public interface MarkService {
      * 释放某个评卷员的所有锁定任务
      * 释放某个评卷员的所有锁定任务
      *
      *
      * @param marker
      * @param marker
-     * @param group
      */
      */
     void releaseByMarker(Marker marker);
     void releaseByMarker(Marker marker);
 
 
@@ -181,28 +175,26 @@ public interface MarkService {
     int applyCount(Marker marker);
     int applyCount(Marker marker);
 
 
     /**
     /**
-     * 根据考生、学习中心、大题构造正式评卷任务
+     * 根据考生、大题构造正式评卷任务
      *
      *
      * @param student
      * @param student
-     * @param campus
      * @param group
      * @param group
      * @param subject
      * @param subject
      */
      */
-    void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group, ExamSubject subject);
+    void buildFormalLibrary(ExamStudent student, MarkGroup group, ExamSubject subject);
 
 
     /**
     /**
-     * 根据考生、学习中心、大题构造试评评卷任务
+     * 根据考生、大题构造试评评卷任务
      *
      *
      * @param student
      * @param student
-     * @param campus
      * @param group
      * @param group
      */
      */
-    void buildTrialLibrary(ExamStudent student, Campus campus, MarkGroup group);
+    void buildTrialLibrary(ExamStudent student, MarkGroup group);
 
 
     /**
     /**
      * 评卷员提交评卷任务
      * 评卷员提交评卷任务
      *
      *
-     * @param task
+     * @param result
      * @param marker
      * @param marker
      * @return
      * @return
      */
      */
@@ -236,7 +228,7 @@ public interface MarkService {
      *
      *
      * @param marker
      * @param marker
      * @param expireMinutes
      * @param expireMinutes
-     * @return
+     * @return boolean
      */
      */
     boolean needUpdateQuality(Marker marker, long expireMinutes);
     boolean needUpdateQuality(Marker marker, long expireMinutes);
 
 

+ 40 - 67
stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/Md5EncryptUtils.java

@@ -1,67 +1,40 @@
-package cn.com.qmth.stmms.common.utils;
-
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-public class Md5EncryptUtils {
-
-    private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
-            'b', 'c', 'd', 'e', 'f' };
-
-    // 页面编码
-    private static final String CharSet = "utf-8";
-
-    /**
-     * 
-     * @param 明文
-     * @return 密文
-     */
-    public static String md5(String text) {
-        MessageDigest msgDigest = null;
-
-        try {
-            msgDigest = MessageDigest.getInstance("MD5");
-        } catch (NoSuchAlgorithmException e) {
-            throw new IllegalStateException("System doesn't support MD5 algorithm.");
-        }
-
-        try {
-            msgDigest.update(text.getBytes(CharSet)); // 按照utf-8编码形式加密
-
-            byte[] bytes = msgDigest.digest();
-
-            String md5Str = new String(encodeHex(bytes));
-
-            msgDigest.update(md5Str.getBytes(CharSet)); // 按照utf-8编码形式加密
-
-            byte[] bytes1 = msgDigest.digest();
-
-            String str = new String(encodeHex(bytes1));
-
-            return str;
-
-        } catch (UnsupportedEncodingException e) {
-
-            throw new IllegalStateException("System doesn't support your  EncodingException.");
-        } catch (Exception e) {
-
-            throw new IllegalStateException("Exception when Md5 make");
-        }
-    }
-
-    public static char[] encodeHex(byte[] data) {
-
-        int l = data.length;
-
-        char[] out = new char[l << 1];
-
-        // two characters form the hex value.
-        for (int i = 0, j = 0; i < l; i++) {
-            out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
-            out[j++] = DIGITS[0x0F & data[i]];
-        }
-
-        return out;
-    }
-}
+package cn.com.qmth.stmms.common.utils;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class Md5EncryptUtils {
+
+    /**
+     * @param text - 明文
+     * @return 密文
+     */
+    public static String md5(String text) {
+        MessageDigest msgDigest = null;
+
+        try {
+            msgDigest = MessageDigest.getInstance("MD5");
+        } catch (NoSuchAlgorithmException e) {
+            throw new IllegalStateException("System doesn't support MD5 algorithm.");
+        }
+
+        try {
+            msgDigest.update(text.getBytes(StandardCharsets.UTF_8)); // 按照utf-8编码形式加密
+
+            byte[] bytes = msgDigest.digest();
+
+            String md5Str = Encodes.encodeHex(bytes);
+
+            msgDigest.update(md5Str.getBytes(StandardCharsets.UTF_8)); // 按照utf-8编码形式加密
+
+            byte[] bytes1 = msgDigest.digest();
+
+            return Encodes.encodeHex(bytes1);
+
+        } catch (Exception e) {
+            throw new IllegalStateException("Exception when Md5 make");
+        }
+    }
+
+}

+ 82 - 89
stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/PictureUrlBuilder.java

@@ -1,16 +1,9 @@
 package cn.com.qmth.stmms.common.utils;
 package cn.com.qmth.stmms.common.utils;
 
 
-import java.text.MessageFormat;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
 /**
 /**
  * 答题卡扫描大图URL构造工具类
  * 答题卡扫描大图URL构造工具类
- * 
+ *
  * @author LS
  * @author LS
- * 
  */
  */
 public class PictureUrlBuilder {
 public class PictureUrlBuilder {
 
 
@@ -36,85 +29,85 @@ public class PictureUrlBuilder {
 
 
     private static final String JSON_SUFFIX = "json";
     private static final String JSON_SUFFIX = "json";
 
 
-    public static List<String> getInnerSheetUrls(int examId, String examNumber, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotBlank(examNumber) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(INNER_SHEET_URL_TEMPLATE, String.valueOf(examId), examNumber,
-                        String.valueOf(i)));
-            }
-        }
-        return list;
-    }
-
-    public static List<String> getSheetUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
-                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static String getSheetUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
-        return MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
-                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
-    }
-
-    public static String getSliceUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
-        return MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
-                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
-    }
-
-    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
-                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber,
-            List<String> picNumbers) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(subjectCode) && picNumbers != null) {
-            for (String picNumber : picNumbers) {
-                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
-                        subjectCode, examNumber, String.valueOf(picNumber), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static String getAnswerUrl(int examId, String subjectCode) {
-        return MessageFormat.format(ANSWER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
-    }
-
-    public static String getPaperUrl(int examId, String subjectCode) {
-        return MessageFormat.format(PAPER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
-    }
-
-    public static List<String> getPackageUrls(int examId, String packageCode, int count) {
-        List<String> list = new LinkedList<String>();
-        if (StringUtils.isNotEmpty(packageCode) && count > 0) {
-            for (int i = 1; i <= count; i++) {
-                list.add(MessageFormat.format(PACKAGE_URL_TEMPLATE, String.valueOf(examId), packageCode,
-                        String.valueOf(i), DEFAULT_SUFFIX));
-            }
-        }
-        return list;
-    }
-
-    public static String getAnswerJson(Integer examId, String subjectCode, String paperType, String examNumber) {
-        if (StringUtils.isNotEmpty(paperType)) {
-            return MessageFormat.format(JSON_PAPER_TYPE_URL_TEMPLATE, String.valueOf(examId), subjectCode, paperType,
-                    examNumber, JSON_SUFFIX);
-        }
-        return MessageFormat.format(JSON_URL_TEMPLATE, String.valueOf(examId), subjectCode, examNumber, JSON_SUFFIX);
-    }
+    //    public static List<String> getInnerSheetUrls(int examId, String examNumber, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotBlank(examNumber) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(INNER_SHEET_URL_TEMPLATE, String.valueOf(examId), examNumber,
+    //                        String.valueOf(i)));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static List<String> getSheetUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
+    //                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static String getSheetUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
+    //        return MessageFormat.format(SHEET_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
+    //                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
+    //    }
+    //
+    //    public static String getSliceUrl(int examId, int campusId, String subjectCode, String examNumber, int index) {
+    //        return MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId), subjectCode,
+    //                examNumber, String.valueOf(index), DEFAULT_SUFFIX);
+    //    }
+    //
+    //    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(subjectCode) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
+    //                        subjectCode, examNumber, String.valueOf(i), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static List<String> getSliceUrls(int examId, int campusId, String subjectCode, String examNumber,
+    //            List<String> picNumbers) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(subjectCode) && picNumbers != null) {
+    //            for (String picNumber : picNumbers) {
+    //                list.add(MessageFormat.format(SLICE_URL_TEMPLATE, String.valueOf(examId), String.valueOf(campusId),
+    //                        subjectCode, examNumber, String.valueOf(picNumber), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static String getAnswerUrl(int examId, String subjectCode) {
+    //        return MessageFormat.format(ANSWER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
+    //    }
+    //
+    //    public static String getPaperUrl(int examId, String subjectCode) {
+    //        return MessageFormat.format(PAPER_URL_TEMPLATE, String.valueOf(examId), subjectCode, DOCUMENT_SUFFIX);
+    //    }
+    //
+    //    public static List<String> getPackageUrls(int examId, String packageCode, int count) {
+    //        List<String> list = new LinkedList<String>();
+    //        if (StringUtils.isNotEmpty(packageCode) && count > 0) {
+    //            for (int i = 1; i <= count; i++) {
+    //                list.add(MessageFormat.format(PACKAGE_URL_TEMPLATE, String.valueOf(examId), packageCode,
+    //                        String.valueOf(i), DEFAULT_SUFFIX));
+    //            }
+    //        }
+    //        return list;
+    //    }
+    //
+    //    public static String getAnswerJson(Integer examId, String subjectCode, String paperType, String examNumber) {
+    //        if (StringUtils.isNotEmpty(paperType)) {
+    //            return MessageFormat.format(JSON_PAPER_TYPE_URL_TEMPLATE, String.valueOf(examId), subjectCode, paperType,
+    //                    examNumber, JSON_SUFFIX);
+    //        }
+    //        return MessageFormat.format(JSON_URL_TEMPLATE, String.valueOf(examId), subjectCode, examNumber, JSON_SUFFIX);
+    //    }
 }
 }

+ 42 - 50
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java

@@ -1,26 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
@@ -28,10 +7,25 @@ import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 
 @Controller
 @Controller
 @RequestMapping("/admin/exam/check/answer")
 @RequestMapping("/admin/exam/check/answer")
@@ -43,14 +37,11 @@ public class AnswerCheckController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamQuestionService questionService;
     private ExamQuestionService questionService;
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
-    @Value("${sheet.image.server}")
-    private String sheetServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "识别结果检查", type = LogType.QUERY)
     @Logging(menu = "识别结果检查", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -82,23 +73,27 @@ public class AnswerCheckController extends BaseExamController {
     @ResponseBody
     @ResponseBody
     public ModelAndView start(HttpServletRequest request, ExamStudentSearchQuery query) {
     public ModelAndView start(HttpServletRequest request, ExamStudentSearchQuery query) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
-        ModelAndView view = new ModelAndView("modules/exam/checkAnswerEdit");
-        List<Integer> ids = new ArrayList<Integer>();
-        query.setExamId(examId);
-        query.setUpload(true);
-        query.setPageNumber(1);
-        query.setPageSize(1000);
-        query = studentService.findByQuery(query);
-        while (query.getCurrentCount() > 0) {
-            for (ExamStudent student : query.getResult()) {
-                ids.add(student.getId());
-            }
-            query.setPageNumber(query.getPageNumber() + 1);
+        if (examId > 0) {
+            ModelAndView view = new ModelAndView("modules/exam/checkAnswerEdit");
+            List<Integer> ids = new ArrayList<Integer>();
+            query.setExamId(examId);
+            query.setUpload(true);
+            query.setPageNumber(1);
+            query.setPageSize(1000);
             query = studentService.findByQuery(query);
             query = studentService.findByQuery(query);
+            while (query.getCurrentCount() > 0) {
+                for (ExamStudent student : query.getResult()) {
+                    ids.add(student.getId());
+                }
+                query.setPageNumber(query.getPageNumber() + 1);
+                query = studentService.findByQuery(query);
+            }
+            view.addObject("fileServer", fileService.getFileServer());
+            view.addObject("ids", StringUtils.join(ids, ","));
+            return view;
+        } else {
+            return new ModelAndView("redirect:/admin/exam/list");
         }
         }
-        view.addObject("sheetServer", sheetServer);
-        view.addObject("ids", StringUtils.join(ids, ","));
-        return view;
     }
     }
 
 
     @Logging(menu = "识别结果修改", type = LogType.UPDATE)
     @Logging(menu = "识别结果修改", type = LogType.UPDATE)
@@ -135,17 +130,14 @@ public class AnswerCheckController extends BaseExamController {
         result.accumulate("subjectiveScore", student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0);
         result.accumulate("subjectiveScore", student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0);
         result.accumulate("upload", student.isUpload());
         result.accumulate("upload", student.isUpload());
         result.accumulate("absent", student.isAbsent());
         result.accumulate("absent", student.isAbsent());
-
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        result.accumulate(
-                "sheetUrls",
-                PictureUrlBuilder.getSheetUrls(student.getExamId(), campus.getId(), student.getSubjectCode(),
-                        student.getExamNumber(), student.getSheetCount()));
+        result.accumulate("sheetUrls",
+                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
 
 
         JSONArray array = new JSONArray();
         JSONArray array = new JSONArray();
         Map<Integer, String> titles = new HashMap<Integer, String>();
         Map<Integer, String> titles = new HashMap<Integer, String>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(
-                student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
+                        student.getPaperType());
         List<String> answers = student.getAnswerList();
         List<String> answers = student.getAnswerList();
         if (questions.isEmpty()) {
         if (questions.isEmpty()) {
             // 未设置客观题或无客观题
             // 未设置客观题或无客观题

+ 17 - 22
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java

@@ -7,6 +7,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
@@ -24,7 +25,6 @@ import net.sf.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
@@ -67,17 +67,8 @@ public class ArbitrateController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
 
     // 并发处理互斥锁
     // 并发处理互斥锁
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
@@ -131,14 +122,16 @@ public class ArbitrateController extends BaseExamController {
         if (group == null) {
         if (group == null) {
             return "redirect:/admin/exam/arbitrate";
             return "redirect:/admin/exam/arbitrate";
         }
         }
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        if (subject == null) {
+            return "redirect:/admin/exam/arbitrate";
+        }
         releaseByUser(wu.getUser().getId());
         releaseByUser(wu.getUser().getId());
-        model.addAttribute("sheetServer", sheetServer);
-        model.addAttribute("sliceServer", sliceServer);
-        model.addAttribute("cardServer", cardServer);
-        model.addAttribute("subject", subjectService.find(group.getExamId(), group.getSubjectCode()));
+        subject.setPaperAnswerUrl(fileService);
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("subject", subject);
         model.addAttribute("group", group);
         model.addAttribute("group", group);
         model.addAttribute("history", history);
         model.addAttribute("history", history);
-        model.addAttribute("jsonServer", jsonServer);
         Exam exam = examService.findById(examId);
         Exam exam = examService.findById(examId);
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
             return "modules/exam/arbitrateSingleProcessJson";
             return "modules/exam/arbitrateSingleProcessJson";
@@ -159,13 +152,15 @@ public class ArbitrateController extends BaseExamController {
         if (group == null) {
         if (group == null) {
             return "redirect:/admin/exam/arbitrate";
             return "redirect:/admin/exam/arbitrate";
         }
         }
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        if (subject == null) {
+            return "redirect:/admin/exam/arbitrate";
+        }
         releaseByUser(wu.getUser().getId());
         releaseByUser(wu.getUser().getId());
-        model.addAttribute("sheetServer", sheetServer);
-        model.addAttribute("sliceServer", sliceServer);
-        model.addAttribute("cardServer", cardServer);
-        model.addAttribute("subject", subjectService.find(group.getExamId(), group.getSubjectCode()));
+        subject.setPaperAnswerUrl(fileService);
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("subject", subject);
         model.addAttribute("group", group);
         model.addAttribute("group", group);
-        model.addAttribute("jsonServer", jsonServer);
         Exam exam = examService.findById(examId);
         Exam exam = examService.findById(examId);
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
             return "modules/exam/arbitrateBatchProcessJson";
             return "modules/exam/arbitrateBatchProcessJson";

+ 27 - 25
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -1,14 +1,16 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
+import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.enums.CheckType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -16,14 +18,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.ModelAndView;
 
 
-import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.enums.CheckType;
-import cn.com.qmth.stmms.common.enums.LogType;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 
 @Controller
 @Controller
 @RequestMapping("/admin/exam/check/student")
 @RequestMapping("/admin/exam/check/student")
@@ -35,8 +33,8 @@ public class CheckStudentController extends BaseExamController {
     @Autowired
     @Autowired
     private CheckStudentService checkStudentService;
     private CheckStudentService checkStudentService;
 
 
-    @Value("${sheet.image.server}")
-    private String sheetServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "人工确认查询", type = LogType.QUERY)
     @Logging(menu = "人工确认查询", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -62,15 +60,19 @@ public class CheckStudentController extends BaseExamController {
     @ResponseBody
     @ResponseBody
     public ModelAndView start(HttpServletRequest request, @RequestParam CheckType type) {
     public ModelAndView start(HttpServletRequest request, @RequestParam CheckType type) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
-        ModelAndView view = new ModelAndView("modules/exam/checkStudentEdit");
-        List<Integer> ids = new ArrayList<Integer>();
-        List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, type);
-        for (CheckStudent student : list) {
-            ids.add(student.getStudentId());
+        if (examId > 0) {
+            ModelAndView view = new ModelAndView("modules/exam/checkStudentEdit");
+            List<Integer> ids = new ArrayList<Integer>();
+            List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, type);
+            for (CheckStudent student : list) {
+                ids.add(student.getStudentId());
+            }
+            view.addObject("fileServer", fileService.getFileServer());
+            view.addObject("ids", StringUtils.join(ids, ","));
+            return view;
+        } else {
+            return new ModelAndView("redirect:/admin/exam/list");
         }
         }
-        view.addObject("sheetServer", sheetServer);
-        view.addObject("ids", StringUtils.join(ids, ","));
-        return view;
     }
     }
 
 
     @Logging(menu = "人工确认考生", type = LogType.UPDATE)
     @Logging(menu = "人工确认考生", type = LogType.UPDATE)

+ 23 - 32
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java

@@ -1,14 +1,21 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import cn.com.qmth.stmms.admin.dto.SubjectiveQuestionDTO;
+import cn.com.qmth.stmms.admin.thread.DataSyncThread;
+import cn.com.qmth.stmms.admin.utils.HttpUtil;
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
+import cn.com.qmth.stmms.biz.exam.model.DataSync;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
-
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,23 +29,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 
-import cn.com.qmth.stmms.admin.dto.SubjectiveQuestionDTO;
-import cn.com.qmth.stmms.admin.thread.DataSyncThread;
-import cn.com.qmth.stmms.admin.utils.HttpUtil;
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.biz.exam.model.DataSync;
-import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.ExportExcel;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
 
 
 @Controller
 @Controller
 @RequestMapping("/admin/exam/data/sync")
 @RequestMapping("/admin/exam/data/sync")
@@ -68,6 +62,9 @@ public class DataSyncController extends BaseExamController {
     @Autowired
     @Autowired
     private DataSyncService dataSyncService;
     private DataSyncService dataSyncService;
 
 
+    @Autowired
+    private FileService fileService;
+
     @Value("${qmth.examcloud.host}")
     @Value("${qmth.examcloud.host}")
     private String host;
     private String host;
 
 
@@ -95,12 +92,6 @@ public class DataSyncController extends BaseExamController {
     @Value("${qmth.examcloud.pageSize}")
     @Value("${qmth.examcloud.pageSize}")
     private Integer pageSize;
     private Integer pageSize;
 
 
-    @Value("${file.root}")
-    private String baseDir;
-
-    @Autowired
-    private UpyunConfig config;
-
     @RequestMapping()
     @RequestMapping()
     public ModelAndView index(HttpServletRequest request, @RequestParam Integer examId) {
     public ModelAndView index(HttpServletRequest request, @RequestParam Integer examId) {
         examId = getSessionExamId(request);
         examId = getSessionExamId(request);
@@ -128,8 +119,8 @@ public class DataSyncController extends BaseExamController {
     public String save(HttpServletRequest request, DataSync dataSync, RedirectAttributes redirectAttributes) {
     public String save(HttpServletRequest request, DataSync dataSync, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         if (lockService.trylock(LockType.DATA_SYNC, examId)) {
         if (lockService.trylock(LockType.DATA_SYNC, examId)) {
-            DataSyncThread thread = new DataSyncThread(dataSync, pageSize, baseDir, config, lockService,
-                    dataSyncService, examService, studentService, subjectService);
+            DataSyncThread thread = new DataSyncThread(dataSync, pageSize, lockService, dataSyncService, examService,
+                    studentService, subjectService, fileService);
             taskExecutor.submit(thread);
             taskExecutor.submit(thread);
         }
         }
         dataSync = dataSyncService.findByExamId(examId);
         dataSync = dataSyncService.findByExamId(examId);

+ 23 - 39
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java

@@ -1,31 +1,7 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JsonConfig;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.admin.vo.ExamInfoVO;
 import cn.com.qmth.stmms.admin.vo.ExamInfoVO;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
@@ -35,6 +11,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
@@ -43,9 +20,25 @@ import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.session.service.SessionService;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JsonConfig;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
 
 
 @Controller
 @Controller
 @RequestMapping("/admin/exam")
 @RequestMapping("/admin/exam")
@@ -66,13 +59,7 @@ public class ExamController extends BaseExamController {
     private ExamSubjectService examSubjectService;
     private ExamSubjectService examSubjectService;
 
 
     @Autowired
     @Autowired
-    private CampusService campusService;
-
-    @Autowired
-    private SessionService sessionService;
-
-    @Value("${sheet.image.server}")
-    private String imageServer;
+    private FileService fileService;
 
 
     @Logging(menu = "查询考试", type = LogType.QUERY)
     @Logging(menu = "查询考试", type = LogType.QUERY)
     @RoleRequire(Role.SCHOOL_ADMIN)
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -221,7 +208,7 @@ public class ExamController extends BaseExamController {
             model.addAttribute("picUrls", buildPicUrl(examStudents.get(0)));
             model.addAttribute("picUrls", buildPicUrl(examStudents.get(0)));
             String sheetConfig = subject != null ? subject.getSheetConfig() : exam.getSheetConfig();
             String sheetConfig = subject != null ? subject.getSheetConfig() : exam.getSheetConfig();
             model.addAttribute("pictureConfig", buildPictureConfig(sheetConfig));
             model.addAttribute("pictureConfig", buildPictureConfig(sheetConfig));
-            model.addAttribute("imageServer", imageServer);
+            model.addAttribute("fileServer", fileService.getFileServer());
             return "modules/mark/picConfig";
             return "modules/mark/picConfig";
         } else {
         } else {
             model.addAttribute("message", "参数有误");
             model.addAttribute("message", "参数有误");
@@ -229,11 +216,8 @@ public class ExamController extends BaseExamController {
         }
         }
     }
     }
 
 
-    private List<String> buildPicUrl(ExamStudent examStudent) {
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
-        List<String> picUrls = PictureUrlBuilder.getSheetUrls(examStudent.getExamId(), campus.getId(),
-                examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSheetCount());
-        return picUrls;
+    private List<String> buildPicUrl(ExamStudent student) {
+        return fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount());
     }
     }
 
 
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })

+ 9 - 13
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java

@@ -2,12 +2,13 @@ package cn.com.qmth.stmms.admin.exam;
 
 
 import cn.com.qmth.stmms.admin.dto.ExceptionStudentDTO;
 import cn.com.qmth.stmms.admin.dto.ExceptionStudentDTO;
 import cn.com.qmth.stmms.admin.thread.ImageCheckThread;
 import cn.com.qmth.stmms.admin.thread.ImageCheckThread;
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
@@ -17,7 +18,6 @@ import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -35,21 +35,18 @@ import java.util.concurrent.atomic.AtomicBoolean;
 public class ImageCheckController extends BaseExamController {
 public class ImageCheckController extends BaseExamController {
 
 
     @Autowired
     @Autowired
-    private CampusService campusService;
+    private ExamStudentService studentService;
 
 
     @Autowired
     @Autowired
-    private ExamStudentService studentService;
+    private FileService fileService;
 
 
     @Autowired
     @Autowired
-    private UpyunConfig config;
+    private ExamService examService;
 
 
     @Qualifier("task-executor")
     @Qualifier("task-executor")
     @Autowired
     @Autowired
     private AsyncTaskExecutor taskExecutor;
     private AsyncTaskExecutor taskExecutor;
 
 
-    @Value("${file.root}")
-    private String baseDir;
-
     private AtomicBoolean running = new AtomicBoolean(false);
     private AtomicBoolean running = new AtomicBoolean(false);
 
 
     @Logging(menu = "图片检查", type = LogType.QUERY)
     @Logging(menu = "图片检查", type = LogType.QUERY)
@@ -79,10 +76,9 @@ public class ImageCheckController extends BaseExamController {
     @RequestMapping("/run")
     @RequestMapping("/run")
     @RoleRequire(Role.SCHOOL_ADMIN)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public ModelAndView checkImage(HttpServletRequest request) {
     public ModelAndView checkImage(HttpServletRequest request) {
-        int examId = getSessionExamId(request);
-        if (running.compareAndSet(false, true) == true) {
-            ImageCheckThread thread = new ImageCheckThread(examId, running, config, baseDir, studentService,
-                    campusService);
+        Exam exam = examService.findById(getSessionExamId(request));
+        if (running.compareAndSet(false, true)) {
+            ImageCheckThread thread = new ImageCheckThread(exam, studentService, fileService, running);
             taskExecutor.submit(thread);
             taskExecutor.submit(thread);
         }
         }
         return new ModelAndView("redirect:/admin/exam/check/image");
         return new ModelAndView("redirect:/admin/exam/check/image");

+ 27 - 42
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -1,32 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -35,6 +8,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
@@ -52,8 +26,22 @@ import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 
 
 @Controller("inspectedController")
 @Controller("inspectedController")
 @RequestMapping("/admin/exam/inspected")
 @RequestMapping("/admin/exam/inspected")
@@ -70,9 +58,6 @@ public class InspectedController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamStudentService studentService;
     private ExamStudentService studentService;
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private ExamQuestionService questionService;
     private ExamQuestionService questionService;
 
 
@@ -88,12 +73,12 @@ public class InspectedController extends BaseExamController {
     @Autowired
     @Autowired
     private UserService userService;
     private UserService userService;
 
 
+    @Autowired
+    private FileService fileService;
+
     // 并发处理互斥锁
     // 并发处理互斥锁
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
 
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
     @Logging(menu = "开始复核", type = LogType.QUERY)
     @Logging(menu = "开始复核", type = LogType.QUERY)
     @RequestMapping("/start")
     @RequestMapping("/start")
     @ResponseBody
     @ResponseBody
@@ -131,7 +116,7 @@ public class InspectedController extends BaseExamController {
                 query.setPageNumber(query.getPageNumber() + 1);
                 query.setPageNumber(query.getPageNumber() + 1);
                 query = libraryService.findByQuery(query);
                 query = libraryService.findByQuery(query);
             }
             }
-            view.addObject("sliceServer", sliceServer);
+            view.addObject("fileServer", fileService.getFileServer());
             view.addObject("ids", StringUtils.join(ids, ","));
             view.addObject("ids", StringUtils.join(ids, ","));
             return view;
             return view;
         }
         }
@@ -155,8 +140,9 @@ public class InspectedController extends BaseExamController {
             result.accumulate("markerScore", library.getMarkerScore());
             result.accumulate("markerScore", library.getMarkerScore());
 
 
             JSONArray array = new JSONArray();
             JSONArray array = new JSONArray();
-            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
+            List<ExamQuestion> questions = questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(), library.getSubjectCode(),
+                            false, library.getGroupNumber());
             List<ScoreItem> scores = library.getScoreList();
             List<ScoreItem> scores = library.getScoreList();
             for (int i = 0; i < questions.size(); i++) {
             for (int i = 0; i < questions.size(); i++) {
                 ExamQuestion question = questions.get(i);
                 ExamQuestion question = questions.get(i);
@@ -167,11 +153,10 @@ public class InspectedController extends BaseExamController {
             }
             }
             result.accumulate("questions", array);
             result.accumulate("questions", array);
 
 
-            MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(),
-                    library.getGroupNumber());
-            Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-            List<String> picUrls = PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
-                    student.getSubjectCode(), student.getExamNumber(), student.getSliceCount());
+            MarkGroup group = groupService
+                    .findOne(student.getExamId(), student.getSubjectCode(), library.getGroupNumber());
+            List<String> picUrls = fileService
+                    .getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount());
             List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
             List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
             List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
             List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
             result.accumulate("picUrls", picUrls);
             result.accumulate("picUrls", picUrls);

+ 5 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.admin.exam;
 
 
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -11,13 +12,11 @@ import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.enums.*;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -59,8 +58,8 @@ public class LibraryController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "评卷任务查询", type = LogType.QUERY)
     @Logging(menu = "评卷任务查询", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -176,9 +175,8 @@ public class LibraryController extends BaseExamController {
             String questionNumbers = String.join(",", strings);
             String questionNumbers = String.join(",", strings);
             model.addAttribute("questionNumbers", questionNumbers);
             model.addAttribute("questionNumbers", questionNumbers);
         }
         }
-        model.addAttribute("jsonServer", jsonServer);
-        model.addAttribute("answerUrl", PictureUrlBuilder
-                .getAnswerJson(examId, student.getSubjectCode(), student.getPaperType(), student.getExamNumber()));
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("answerUrl", fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
         return "modules/exam/jsonView";
         return "modules/exam/jsonView";
     }
     }
 }
 }

+ 6 - 16
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -1,11 +1,10 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
 import cn.com.qmth.stmms.admin.dto.ExamQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.ExamQuestionDTO;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
@@ -13,7 +12,6 @@ import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.enums.*;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -25,7 +23,6 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
@@ -59,9 +56,6 @@ public class MarkGroupController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamStudentService studentService;
     private ExamStudentService studentService;
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private MarkService markService;
     private MarkService markService;
 
 
@@ -71,8 +65,8 @@ public class MarkGroupController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
-    @Value("${slice.image.server}")
-    private String imageServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "大题管理查询", type = LogType.QUERY)
     @Logging(menu = "大题管理查询", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -570,7 +564,7 @@ public class MarkGroupController extends BaseExamController {
         if (examStudents.size() > 0) {
         if (examStudents.size() > 0) {
             model.addAttribute("picUrls", buildPicUrl(examStudents.get(0)));
             model.addAttribute("picUrls", buildPicUrl(examStudents.get(0)));
             model.addAttribute("pictureConfig", buildPictureConfig(group));
             model.addAttribute("pictureConfig", buildPictureConfig(group));
-            model.addAttribute("imageServer", imageServer);
+            model.addAttribute("fileServer", fileService.getFileServer());
             return "modules/mark/picConfig";
             return "modules/mark/picConfig";
         } else {
         } else {
             addMessage(redirectAttributes, "参数有误");
             addMessage(redirectAttributes, "参数有误");
@@ -592,12 +586,8 @@ public class MarkGroupController extends BaseExamController {
         return json;
         return json;
     }
     }
 
 
-    private List<String> buildPicUrl(ExamStudent examStudent) {
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
-        List<String> picUrls = PictureUrlBuilder
-                .getSliceUrls(examStudent.getExamId(), campus.getId(), examStudent.getSubjectCode(),
-                        examStudent.getExamNumber(), examStudent.getSliceCount());
-        return picUrls;
+    private List<String> buildPicUrl(ExamStudent student) {
+        return fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount());
     }
     }
 
 
     private List<ExamQuestion> buildQuestionList(MarkGroup group, List<ExamQuestionDTO> detailList) {
     private List<ExamQuestion> buildQuestionList(MarkGroup group, List<ExamQuestionDTO> detailList) {

+ 10 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java

@@ -7,6 +7,7 @@ import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
@@ -27,7 +28,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
@@ -86,17 +86,8 @@ public class MarkQualityController extends BaseExamController {
     @Autowired
     @Autowired
     private UserService userService;
     private UserService userService;
 
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "质量监控查询", type = LogType.QUERY)
     @Logging(menu = "质量监控查询", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -242,11 +233,13 @@ public class MarkQualityController extends BaseExamController {
         if (group == null) {
         if (group == null) {
             return "redirect:/admin/exam/mark";
             return "redirect:/admin/exam/mark";
         }
         }
-        model.addAttribute("sheetServer", sheetServer);
-        model.addAttribute("sliceServer", sliceServer);
-        model.addAttribute("cardServer", cardServer);
-        model.addAttribute("jsonServer", jsonServer);
-        model.addAttribute("subject", subjectService.find(group.getExamId(), group.getSubjectCode()));
+        ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        if (subject == null) {
+            return "redirect:/admin/exam/mark";
+        }
+        subject.setPaperAnswerUrl(fileService);
+        model.addAttribute("fileServer", fileService.getFileServer());
+        model.addAttribute("subject", subject);
         model.addAttribute("group", group);
         model.addAttribute("group", group);
         model.addAttribute("markerId", markerId);
         model.addAttribute("markerId", markerId);
         model.addAttribute("markerScore", markerScore);
         model.addAttribute("markerScore", markerScore);

+ 35 - 49
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java

@@ -1,29 +1,11 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
@@ -31,9 +13,23 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.utils.OriginTag;
 import cn.com.qmth.stmms.biz.utils.OriginTag;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 
 @Controller("trackController")
 @Controller("trackController")
 @RequestMapping("/admin/exam/track")
 @RequestMapping("/admin/exam/track")
@@ -41,9 +37,6 @@ public class MarkTrackController extends BaseExamController {
 
 
     protected static Logger log = LoggerFactory.getLogger(MarkTrackController.class);
     protected static Logger log = LoggerFactory.getLogger(MarkTrackController.class);
 
 
-    @Value("${slice.image.server}")
-    private String imageServer;
-
     @Autowired
     @Autowired
     private MarkTrackService markTrackService;
     private MarkTrackService markTrackService;
 
 
@@ -53,27 +46,26 @@ public class MarkTrackController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamStudentService studentService;
     private ExamStudentService studentService;
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private MarkLibraryService libraryService;
     private MarkLibraryService libraryService;
 
 
     @Autowired
     @Autowired
     private MarkSpecialTagService markSpecialTagService;
     private MarkSpecialTagService markSpecialTagService;
-    
+
     @Autowired
     @Autowired
     private ExamQuestionService questionService;
     private ExamQuestionService questionService;
 
 
+    @Autowired
+    private FileService fileService;
+
     @RequestMapping("/student/{studentId}")
     @RequestMapping("/student/{studentId}")
     public ModelAndView view(@PathVariable Integer studentId) {
     public ModelAndView view(@PathVariable Integer studentId) {
         ModelAndView view = new ModelAndView("modules/exam/studentTrack");
         ModelAndView view = new ModelAndView("modules/exam/studentTrack");
-        view.addObject("imageServer", imageServer);
+        view.addObject("fileServer", fileService.getFileServer());
         ExamStudent student = studentService.findById(studentId);
         ExamStudent student = studentService.findById(studentId);
         if (student != null && student.isUpload()) {
         if (student != null && student.isUpload()) {
-            Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-            List<String> sliceUrls = PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
-                    student.getSubjectCode(), student.getExamNumber(), student.getSliceCount());
+            List<String> sliceUrls = fileService
+                    .getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount());
             view.addObject("urls", StringUtils.join(sliceUrls, ","));
             view.addObject("urls", StringUtils.join(sliceUrls, ","));
 
 
             JSONArray result = new JSONArray();
             JSONArray result = new JSONArray();
@@ -91,29 +83,24 @@ public class MarkTrackController extends BaseExamController {
     }
     }
 
 
     /**
     /**
-     * 
-     * @param request
-     * @param model
-     * @param query
-     * @return
+     *
      */
      */
     @ResponseBody
     @ResponseBody
     @RequestMapping
     @RequestMapping
     public HashMap<String, Object> list(Integer studentId) {
     public HashMap<String, Object> list(Integer studentId) {
         List<MarkLibrary> librarys = libraryService.findByStudentId(studentId);
         List<MarkLibrary> librarys = libraryService.findByStudentId(studentId);
         ExamStudent examStudent = studentService.findById(studentId);
         ExamStudent examStudent = studentService.findById(studentId);
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
         List<Object> list = new ArrayList<Object>();
         List<Object> list = new ArrayList<Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
         for (MarkLibrary library : librarys) {
         for (MarkLibrary library : librarys) {
             if (null != library.getTaskNumber() && library.getTaskNumber() == 2) {
             if (null != library.getTaskNumber() && library.getTaskNumber() == 2) {
                 continue;
                 continue;
             }
             }
-            HashMap<String, Object> groups = set(library, examStudent, campus);
+            HashMap<String, Object> groups = set(library, examStudent);
             list.add(groups);
             list.add(groups);
         }
         }
         map.put("list", list);
         map.put("list", list);
-        map.put("imageServer", imageServer);
+        map.put("fileServer", fileService.getFileServer());
         return map;
         return map;
     }
     }
 
 
@@ -122,24 +109,23 @@ public class MarkTrackController extends BaseExamController {
     public HashMap<String, Object> byLibrary(Integer libraryId) {
     public HashMap<String, Object> byLibrary(Integer libraryId) {
         MarkLibrary library = libraryService.findById(libraryId);
         MarkLibrary library = libraryService.findById(libraryId);
         ExamStudent examStudent = studentService.findById(library.getStudentId());
         ExamStudent examStudent = studentService.findById(library.getStudentId());
-        Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
         List<Object> list = new ArrayList<Object>();
         List<Object> list = new ArrayList<Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
-        HashMap<String, Object> groups = set(library, examStudent, campus);
+        HashMap<String, Object> groups = set(library, examStudent);
         list.add(groups);
         list.add(groups);
         map.put("list", list);
         map.put("list", list);
-        map.put("imageServer", imageServer);
+        map.put("fileServer", fileService.getFileServer());
         return map;
         return map;
     }
     }
 
 
-    private HashMap<String, Object> set(MarkLibrary library, ExamStudent examStudent, Campus campus) {
+    private HashMap<String, Object> set(MarkLibrary library, ExamStudent student) {
         HashMap<String, Object> groups = new HashMap<String, Object>();
         HashMap<String, Object> groups = new HashMap<String, Object>();
-        MarkGroup group = groupService.findOne(examStudent.getExamId(), examStudent.getSubjectCode(),
-                library.getGroupNumber());
-        group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examStudent.getExamId(), examStudent.getSubjectCode(),
-                    false, group.getNumber()));
-        List<String> picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
-                examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSliceCount());
+        MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(), library.getGroupNumber());
+        group.setQuestionList(questionService
+                .findByExamAndSubjectAndObjectiveAndGroupNumber(student.getExamId(), student.getSubjectCode(), false,
+                        group.getNumber()));
+        List<String> picUrls = fileService
+                .getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount());
         List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
         List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
         List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
         List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
         groups.put("picUrls", picUrls);
         groups.put("picUrls", picUrls);

+ 9 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -14,6 +14,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
@@ -27,7 +28,6 @@ import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
@@ -60,8 +60,8 @@ public class PaperController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
-    @Value("${card.server}")
-    private String cardServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "试卷管理查询", type = LogType.QUERY)
     @Logging(menu = "试卷管理查询", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -78,12 +78,15 @@ public class PaperController extends BaseExamController {
             }
             }
         }
         }
         query = subjectService.findByQuery(query);
         query = subjectService.findByQuery(query);
+        for (ExamSubject subject : query.getResult()) {
+            subject.setPaperAnswerUrl(fileService);
+        }
         model.addAttribute("query", query);
         model.addAttribute("query", query);
         model.addAttribute("upload", upload);
         model.addAttribute("upload", upload);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("levelList", subjectService.listLevel(examId));
         model.addAttribute("levelList", subjectService.listLevel(examId));
         model.addAttribute("categoryList", subjectService.listCategory(examId));
         model.addAttribute("categoryList", subjectService.listCategory(examId));
-        model.addAttribute("cardServer", cardServer);
+        model.addAttribute("fileServer", fileService.getFileServer());
         Exam exam = examService.findById(examId);
         Exam exam = examService.findById(examId);
         model.addAttribute("examType", exam.getType());
         model.addAttribute("examType", exam.getType());
         return "modules/exam/paperList";
         return "modules/exam/paperList";
@@ -104,10 +107,10 @@ public class PaperController extends BaseExamController {
         ExamSubject subject = subjectService.find(examId, subjectCode);
         ExamSubject subject = subjectService.find(examId, subjectCode);
         if (subject != null) {
         if (subject != null) {
             List<ExamQuestion> list = new LinkedList<ExamQuestion>();
             List<ExamQuestion> list = new LinkedList<ExamQuestion>();
-            if (objective == null || objective.booleanValue() == true) {
+            if (objective == null || objective) {
                 list.addAll(questionService.findByExamAndSubjectAndObjective(examId, subjectCode, true));
                 list.addAll(questionService.findByExamAndSubjectAndObjective(examId, subjectCode, true));
             }
             }
-            if (objective == null || objective.booleanValue() == false) {
+            if (objective == null || !objective) {
                 list.addAll(questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false));
                 list.addAll(questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false));
             }
             }
             model.addAttribute("questionList", list);
             model.addAttribute("questionList", list);

+ 11 - 14
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java

@@ -2,7 +2,6 @@ package cn.com.qmth.stmms.admin.exam;
 
 
 import cn.com.qmth.stmms.admin.vo.ScanInfoVO;
 import cn.com.qmth.stmms.admin.vo.ScanInfoVO;
 import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
 import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.query.ExamPackageSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamPackageSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
@@ -10,16 +9,15 @@ import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -44,8 +42,8 @@ public class ScanController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamPackageService packageService;
     private ExamPackageService packageService;
 
 
-    @Value("${package.image.server}")
-    private String packageServer;
+    @Autowired
+    private FileService fileService;
 
 
     /**
     /**
      * 按科目统计扫描进度
      * 按科目统计扫描进度
@@ -87,7 +85,7 @@ public class ScanController extends BaseExamController {
      * 按学习中心统计扫描进度
      * 按学习中心统计扫描进度
      *
      *
      * @param request
      * @param request
-     * @param subjectCode
+     * @param query
      * @return
      * @return
      */
      */
     @Logging(menu = "扫描进度-按学习中心查询", type = LogType.QUERY)
     @Logging(menu = "扫描进度-按学习中心查询", type = LogType.QUERY)
@@ -96,13 +94,12 @@ public class ScanController extends BaseExamController {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
         List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
         if (StringUtils.isBlank(query.getCampusName())) {
         if (StringUtils.isBlank(query.getCampusName())) {
-            query.setExamId(examId);
-            query = studentService.findDistinctCampusName(query);
-            for (ExamStudent s : query.getResult()) {
+            List<String> campusList = studentService.findDistinctCampusName(examId);
+            for (String campus : campusList) {
                 ScanInfoVO vo = new ScanInfoVO();
                 ScanInfoVO vo = new ScanInfoVO();
-                vo.setName(s.getCampusName());
-                vo.setTotalCount(studentService.countByExamIdAndCampusName(examId, s.getCampusName()));
-                vo.setScanCount(studentService.countByExamIdAndCampusName(examId, s.getCampusName(), true));
+                vo.setName(campus);
+                vo.setTotalCount(studentService.countByExamIdAndCampusName(examId, campus));
+                vo.setScanCount(studentService.countByExamIdAndCampusName(examId, campus, true));
                 list.add(vo);
                 list.add(vo);
             }
             }
         } else {
         } else {
@@ -138,13 +135,13 @@ public class ScanController extends BaseExamController {
         query.setExamId(examId);
         query.setExamId(examId);
         query = packageService.findByQuery(query);
         query = packageService.findByQuery(query);
         for (ExamPackage ep : query.getResult()) {
         for (ExamPackage ep : query.getResult()) {
-            ep.setUrls(PictureUrlBuilder.getPackageUrls(examId, ep.getCode(), ep.getPicCount()));
+            ep.setUrls(fileService.getPackageUris(ep.getExamId(), ep.getCode(), 1, ep.getPicCount()));
         }
         }
         ModelAndView view = new ModelAndView("modules/exam/scanPackage");
         ModelAndView view = new ModelAndView("modules/exam/scanPackage");
         view.addObject("packageList", query.getResult());
         view.addObject("packageList", query.getResult());
         view.addObject("query", query);
         view.addObject("query", query);
         view.addObject("totalCount", packageService.sumByExam(examId));
         view.addObject("totalCount", packageService.sumByExam(examId));
-        view.addObject("packageServer", packageServer);
+        view.addObject("fileServer", fileService.getFileServer());
         return view;
         return view;
     }
     }
 }
 }

+ 13 - 26
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -7,6 +7,7 @@ import cn.com.qmth.stmms.admin.utils.ExportStudentExcel;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
@@ -19,13 +20,11 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -76,17 +75,8 @@ public class ScoreController extends BaseExamController {
     @Autowired
     @Autowired
     private CheckStudentService checkStudentService;
     private CheckStudentService checkStudentService;
 
 
-    @Value("${sheet.image.server}")
-    private String imageServer;
-
-    @Value("${package.image.server}")
-    private String packageServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "成绩查询", type = LogType.QUERY)
     @Logging(menu = "成绩查询", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -122,10 +112,7 @@ public class ScoreController extends BaseExamController {
         view.addObject("examType", exam.getType());
         view.addObject("examType", exam.getType());
         view.addObject("query", query);
         view.addObject("query", query);
         view.addObject("filter", filter);
         view.addObject("filter", filter);
-        view.addObject("imageServer", imageServer);
-        view.addObject("packageServer", packageServer);
-        view.addObject("cardServer", cardServer);
-        view.addObject("jsonServer", jsonServer);
+        view.addObject("fileServer", fileService.getFileServer());
         return view;
         return view;
     }
     }
 
 
@@ -142,9 +129,7 @@ public class ScoreController extends BaseExamController {
             ModelAndView view = new ModelAndView("modules/exam/scoreDetail");
             ModelAndView view = new ModelAndView("modules/exam/scoreDetail");
             view.addObject("student", student);
             view.addObject("student", student);
             view.addObject("scoreList", buildScoreList(student));
             view.addObject("scoreList", buildScoreList(student));
-            view.addObject("imageServer", imageServer);
-            view.addObject("packageServer", packageServer);
-            view.addObject("cardServer", cardServer);
+            view.addObject("fileServer", fileService.getFileServer());
             view.addObject("queryString", StringUtils.trimToEmpty(queryString));
             view.addObject("queryString", StringUtils.trimToEmpty(queryString));
             return view;
             return view;
         } else {
         } else {
@@ -348,24 +333,26 @@ public class ScoreController extends BaseExamController {
 
 
     private void buildSheetUrl(ExamStudent student) {
     private void buildSheetUrl(ExamStudent student) {
         // 改为内部原图浏览地址,直接附带标记内容
         // 改为内部原图浏览地址,直接附带标记内容
-        student.setSheetUrls(PictureUrlBuilder
-                .getInnerSheetUrls(student.getExamId(), student.getExamNumber(), student.getSheetCount()));
+        //student.setSheetUrls(PictureUrlBuilder
+        //        .getInnerSheetUrls(student.getExamId(), student.getExamNumber(), student.getSheetCount()));
+        student.setSheetUrls(
+                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
     }
     }
 
 
     private void buildPackageUrl(ExamStudent student) {
     private void buildPackageUrl(ExamStudent student) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             if (ep != null && ep.getPicCount() > 0) {
             if (ep != null && ep.getPicCount() > 0) {
-                student.setPackageUrls(PictureUrlBuilder
-                        .getPackageUrls(student.getExamId(), student.getPackageCode(), ep.getPicCount()));
+                student.setPackageUrls(fileService.getPackageUris(ep.getExamId(), ep.getCode(), 1, ep.getPicCount()));
             }
             }
         }
         }
     }
     }
 
 
     private void buildAnswerUrl(ExamStudent student) {
     private void buildAnswerUrl(ExamStudent student) {
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        if (subject != null && subject.isHasAnswer()) {
-            student.setAnswerUrl(subject.getAnswerUrl());
+        if (subject != null && subject.getAnswerFileType() != null) {
+            student.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
         }
         }
         if (subject != null) {
         if (subject != null) {
             student.setSubjectRemark(StringUtils.trimToEmpty(subject.getRemark()));
             student.setSubjectRemark(StringUtils.trimToEmpty(subject.getRemark()));

+ 7 - 23
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java

@@ -2,8 +2,6 @@ package cn.com.qmth.stmms.admin.exam;
 
 
 import cn.com.qmth.stmms.admin.vo.ExamStudentVO;
 import cn.com.qmth.stmms.admin.vo.ExamStudentVO;
 import cn.com.qmth.stmms.admin.vo.UploadStudentVO;
 import cn.com.qmth.stmms.admin.vo.UploadStudentVO;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
 import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
@@ -13,6 +11,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
@@ -21,7 +20,6 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
@@ -29,7 +27,6 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -52,9 +49,6 @@ public class StudentController extends BaseExamController {
 
 
     protected static Logger log = LoggerFactory.getLogger(StudentController.class);
     protected static Logger log = LoggerFactory.getLogger(StudentController.class);
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private ExamStudentService studentService;
     private ExamStudentService studentService;
 
 
@@ -70,11 +64,8 @@ public class StudentController extends BaseExamController {
     @Autowired
     @Autowired
     private ExamPackageService packageService;
     private ExamPackageService packageService;
 
 
-    @Value("${sheet.image.server}")
-    private String imageServer;
-
-    @Value("${package.image.server}")
-    private String packageServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "查询考生", type = LogType.QUERY)
     @Logging(menu = "查询考生", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -99,8 +90,7 @@ public class StudentController extends BaseExamController {
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("levelList", subjectService.listLevel(examId));
         model.addAttribute("levelList", subjectService.listLevel(examId));
         model.addAttribute("categoryList", subjectService.listCategory(examId));
         model.addAttribute("categoryList", subjectService.listCategory(examId));
-        model.addAttribute("imageServer", imageServer);
-        model.addAttribute("packageServer", packageServer);
+        model.addAttribute("fileServer", fileService.getFileServer());
         Exam exam = examService.findById(examId);
         Exam exam = examService.findById(examId);
         model.addAttribute("examType", exam.getType());
         model.addAttribute("examType", exam.getType());
         return "modules/exam/studentList";
         return "modules/exam/studentList";
@@ -135,11 +125,8 @@ public class StudentController extends BaseExamController {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         Exam exam = examService.findById(examId);
         ExamSubject subject = subjectService.find(examId, student.getSubjectCode());
         ExamSubject subject = subjectService.find(examId, student.getSubjectCode());
-        Campus campus = campusService.findBySchoolAndName(exam.getSchoolId(), student.getCampusName());
         if (subject == null) {
         if (subject == null) {
             addMessage(redirectAttributes, "科目不存在");
             addMessage(redirectAttributes, "科目不存在");
-        } else if (campus == null) {
-            addMessage(redirectAttributes, "学习中心不存在");
         } else {
         } else {
             if (student.getId() != null) {
             if (student.getId() != null) {
                 ExamStudent previous = studentService.findById(student.getId());
                 ExamStudent previous = studentService.findById(student.getId());
@@ -569,18 +556,15 @@ public class StudentController extends BaseExamController {
     }
     }
 
 
     private void buildSheetUrl(ExamStudent student) {
     private void buildSheetUrl(ExamStudent student) {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        student.setSheetUrls(PictureUrlBuilder
-                .getSheetUrls(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(),
-                        student.getSheetCount()));
+        student.setSheetUrls(
+                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
     }
     }
 
 
     private void buildPackageUrl(ExamStudent student) {
     private void buildPackageUrl(ExamStudent student) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             if (ep != null && ep.getPicCount() > 0) {
             if (ep != null && ep.getPicCount() > 0) {
-                student.setPackageUrls(PictureUrlBuilder
-                        .getPackageUrls(student.getExamId(), student.getPackageCode(), ep.getPicCount()));
+                student.setPackageUrls(fileService.getPackageUris(ep.getExamId(), ep.getCode(), 1, ep.getPicCount()));
             }
             }
         }
         }
     }
     }

+ 8 - 15
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.admin.exam;
 
 
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
 import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
 import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
@@ -15,14 +16,12 @@ import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.DateUtils;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -68,11 +67,8 @@ public class TrialController extends BaseExamController {
     @Autowired
     @Autowired
     private UserService userService;
     private UserService userService;
 
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${json.server}")
-    private String jsonServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Logging(menu = "试评管理查询", type = LogType.QUERY)
     @Logging(menu = "试评管理查询", type = LogType.QUERY)
     @RequestMapping
     @RequestMapping
@@ -170,10 +166,8 @@ public class TrialController extends BaseExamController {
                 obj.accumulate("success", true);
                 obj.accumulate("success", true);
                 if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
                 if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
                     // 多媒体配置
                     // 多媒体配置
-                    obj.accumulate("jsonServer", jsonServer);
-                    obj.accumulate("urls", PictureUrlBuilder
-                            .getAnswerJson(library.getExamId(), library.getSubjectCode(), student.getPaperType(),
-                                    library.getExamNumber()));
+                    obj.accumulate("fileServer", fileService.getFileServer());
+                    obj.accumulate("urls", fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
                     List<ExamQuestion> questions = questionService
                     List<ExamQuestion> questions = questionService
                             .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(),
                             .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(),
                                     student.getSubjectCode(), false, group.getNumber());
                                     student.getSubjectCode(), false, group.getNumber());
@@ -185,10 +179,9 @@ public class TrialController extends BaseExamController {
                     obj.accumulate("questionNumbers", questionNumbers);
                     obj.accumulate("questionNumbers", questionNumbers);
                 } else {
                 } else {
                     // 裁切图配置
                     // 裁切图配置
-                    obj.accumulate("imageServer", sliceServer);
-                    obj.accumulate("urls", PictureUrlBuilder
-                            .getSliceUrls(library.getExamId(), library.getCampusId(), library.getSubjectCode(),
-                                    library.getExamNumber(), student.getSliceCount()));
+                    obj.accumulate("fileServer", fileService.getFileServer());
+                    obj.accumulate("urls", fileService
+                            .getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount()));
                     obj.accumulate("pictureConfig", group.getPictureConfigList());
                     obj.accumulate("pictureConfig", group.getPictureConfigList());
                 }
                 }
                 // 评卷记录集合
                 // 评卷记录集合

+ 26 - 47
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java

@@ -1,24 +1,6 @@
 package cn.com.qmth.stmms.admin.thread;
 package cn.com.qmth.stmms.admin.thread;
 
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import cn.com.qmth.stmms.admin.utils.HttpUtil;
 import cn.com.qmth.stmms.admin.utils.HttpUtil;
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
 import cn.com.qmth.stmms.biz.exam.model.DataSync;
 import cn.com.qmth.stmms.biz.exam.model.DataSync;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
@@ -27,9 +9,21 @@ import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 
 public class DataSyncThread implements Runnable {
 public class DataSyncThread implements Runnable {
 
 
@@ -43,16 +37,14 @@ public class DataSyncThread implements Runnable {
 
 
     private ExamService examService;
     private ExamService examService;
 
 
+    private FileService fileService;
+
     private LockService lockService;
     private LockService lockService;
 
 
     private DataSyncService dataSyncService;
     private DataSyncService dataSyncService;
 
 
     private Integer pageSize;
     private Integer pageSize;
 
 
-    private String baseDir;
-
-    private UpyunConfig config;
-
     private HttpUtil subjectHttp;
     private HttpUtil subjectHttp;
 
 
     private HttpUtil studentHttp;
     private HttpUtil studentHttp;
@@ -77,18 +69,17 @@ public class DataSyncThread implements Runnable {
 
 
     public static final String SIZE = "size";
     public static final String SIZE = "size";
 
 
-    public DataSyncThread(DataSync dataSync, Integer pageSize, String baseDir, UpyunConfig config,
-            LockService lockService, DataSyncService dataSyncService, ExamService examService,
-            ExamStudentService studentService, ExamSubjectService subjectService) {
+    public DataSyncThread(DataSync dataSync, Integer pageSize, LockService lockService, DataSyncService dataSyncService,
+            ExamService examService, ExamStudentService studentService, ExamSubjectService subjectService,
+            FileService fileService) {
         this.dataSync = dataSync;
         this.dataSync = dataSync;
         this.lockService = lockService;
         this.lockService = lockService;
         this.dataSyncService = dataSyncService;
         this.dataSyncService = dataSyncService;
         this.examService = examService;
         this.examService = examService;
         this.studentService = studentService;
         this.studentService = studentService;
         this.subjectService = subjectService;
         this.subjectService = subjectService;
+        this.fileService = fileService;
         this.pageSize = pageSize;
         this.pageSize = pageSize;
-        this.baseDir = baseDir;
-        this.config = config;
         this.subjectHttp = new HttpUtil(dataSync.getSubjectUrl(), dataSync.getSecretKey(), dataSync.getAppId(),
         this.subjectHttp = new HttpUtil(dataSync.getSubjectUrl(), dataSync.getSecretKey(), dataSync.getAppId(),
                 dataSync.getRootOrgId());
                 dataSync.getRootOrgId());
         this.studentHttp = new HttpUtil(dataSync.getStudentUrl(), dataSync.getSecretKey(), dataSync.getAppId(),
         this.studentHttp = new HttpUtil(dataSync.getStudentUrl(), dataSync.getSecretKey(), dataSync.getAppId(),
@@ -124,9 +115,10 @@ public class DataSyncThread implements Runnable {
                 String paperResult = subjectPaperHttp.httpAction(null, datas.toString());
                 String paperResult = subjectPaperHttp.httpAction(null, datas.toString());
                 JSONObject paperJson = JSONObject.fromObject(paperResult);
                 JSONObject paperJson = JSONObject.fromObject(paperResult);
                 String paper = paperJson.getString("subjectivePaperList");
                 String paper = paperJson.getString("subjectivePaperList");
-                File paperFile = new File(new File(baseDir, config.getMediaBucket()), PictureUrlBuilder.getAnswerJson(
-                        exam.getId(), subjectCode, null, subjectCode));
-                writeFile(paper, paperFile);
+                byte[] paperData = paper.getBytes(StandardCharsets.UTF_8);
+                fileService
+                        .uploadPaper(new ByteArrayInputStream(paperData), BinaryUtil.encodeMD5(paperData), exam.getId(),
+                                subjectCode, FormatType.JSON);
                 // 获取考生
                 // 获取考生
                 Long startId = 0L;
                 Long startId = 0L;
                 ExamSubject examSubject = subjectService.find(exam.getId(), subjectCode);
                 ExamSubject examSubject = subjectService.find(exam.getId(), subjectCode);
@@ -192,10 +184,9 @@ public class DataSyncThread implements Runnable {
                         list.add(examStudent);
                         list.add(examStudent);
 
 
                         String answerJson = student.getString(SUBJECTIVES);
                         String answerJson = student.getString(SUBJECTIVES);
-                        File file = new File(new File(baseDir, config.getMediaBucket()),
-                                PictureUrlBuilder.getAnswerJson(exam.getId(), subjectCode, null,
-                                        examStudent.getExamNumber()));
-                        writeFile(answerJson, file);
+                        byte[] jsonData = answerJson.getBytes(StandardCharsets.UTF_8);
+                        fileService.uploadJson(new ByteArrayInputStream(jsonData), BinaryUtil.encodeMD5(jsonData),
+                                exam.getId(), examStudent.getExamNumber());
                     }
                     }
                     int count = studentService.batchSave(list);
                     int count = studentService.batchSave(list);
                     if (count > 0) {
                     if (count > 0) {
@@ -218,16 +209,4 @@ public class DataSyncThread implements Runnable {
         }
         }
     }
     }
 
 
-    private void writeFile(String answerJson, File file) throws IOException, FileNotFoundException,
-            UnsupportedEncodingException {
-        if (!file.exists()) {
-            file.getParentFile().mkdirs();
-            file.createNewFile();
-        }
-        FileOutputStream fos = new FileOutputStream(file);
-        fos.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
-        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
-        bw.write(answerJson);
-        bw.close();
-    }
 }
 }

+ 33 - 77
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ImageCheckThread.java

@@ -1,60 +1,45 @@
 package cn.com.qmth.stmms.admin.thread;
 package cn.com.qmth.stmms.admin.thread;
 
 
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.commons.lang.StringUtils;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.enums.ExamType;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 
 
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.common.upyun.UpYun;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 
 public class ImageCheckThread implements Runnable {
 public class ImageCheckThread implements Runnable {
 
 
     protected static Logger log = LoggerFactory.getLogger(ImageCheckThread.class);
     protected static Logger log = LoggerFactory.getLogger(ImageCheckThread.class);
 
 
-    private int examId;
-
     private AtomicBoolean running;
     private AtomicBoolean running;
 
 
-    private UpYun sheetUpyun;
-
-    private UpYun sliceUpyun;
-
-    private String baseDir;
+    private Exam exam;
 
 
     private ExamStudentService studentService;
     private ExamStudentService studentService;
 
 
-    private CampusService campusService;
+    private FileService fileService;
 
 
-    public ImageCheckThread(int examId, AtomicBoolean running, UpyunConfig config, String baseDir,
-            ExamStudentService studentService, CampusService campusService) {
-        this.examId = examId;
+    public ImageCheckThread(Exam exam, ExamStudentService studentService, FileService fileService,
+            AtomicBoolean running) {
+        this.exam = exam;
         this.running = running;
         this.running = running;
-        this.sheetUpyun = new UpYun(config.getSheetBucket(), config.getSheetUsername(), config.getSheetPassword());
-        this.sliceUpyun = new UpYun(config.getSliceBucket(), config.getSliceUsername(), config.getSlicePassword());
-        this.baseDir = baseDir;
         this.studentService = studentService;
         this.studentService = studentService;
-        this.campusService = campusService;
+        this.fileService = fileService;
     }
     }
 
 
     @Override
     @Override
     public void run() {
     public void run() {
-        log.info("start check image for examId=" + examId);
+        log.info("start check image for examId=" + exam.getId());
         try {
         try {
             int pageNumber = 1;
             int pageNumber = 1;
             int pageSize = 500;
             int pageSize = 500;
             while (true) {
             while (true) {
-                List<ExamStudent> list = studentService.findByExamIdAndUploadAndAbsent(examId, true, false, pageNumber,
-                        pageSize);
+                List<ExamStudent> list = studentService
+                        .findByExamIdAndUploadAndAbsent(exam.getId(), true, false, pageNumber, pageSize);
                 if (list == null || list.isEmpty()) {
                 if (list == null || list.isEmpty()) {
                     break;
                     break;
                 }
                 }
@@ -66,65 +51,36 @@ public class ImageCheckThread implements Runnable {
                 pageNumber++;
                 pageNumber++;
             }
             }
         } catch (Exception e) {
         } catch (Exception e) {
-            log.error("check image exception for examId=" + examId, e);
+            log.error("check image exception for examId=" + exam.getId(), e);
         } finally {
         } finally {
             running.set(false);
             running.set(false);
-            log.info("finish check image for examId=" + examId);
+            log.info("finish check image for examId=" + exam.getId());
         }
         }
     }
     }
 
 
     private void checkStudent(ExamStudent student) {
     private void checkStudent(ExamStudent student) {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        if (student.getSheetCount() == 0 || student.getSliceCount() == 0 || campus == null) {
-            record(student, true);
-            return;
-        }
-
-        List<String> sheetUrls = PictureUrlBuilder.getSheetUrls(examId, campus.getId(), student.getSubjectCode(),
-                student.getExamNumber(), student.getSheetCount());
-        for (String url : sheetUrls) {
-            if (!exist(url, sheetUpyun)) {
-                record(student, true);
-                return;
+        if (exam.getType() == ExamType.SCAN_IMAGE) {
+            boolean exception = false;
+            for (int i = 1; i <= student.getSheetCount(); i++) {
+                if (!fileService.sheetExist(student.getExamId(), student.getExamNumber(), i)) {
+                    exception = true;
+                    break;
+                }
             }
             }
-        }
-
-        List<String> sliceUrls = PictureUrlBuilder.getSliceUrls(examId, campus.getId(), student.getSubjectCode(),
-                student.getExamNumber(), student.getSliceCount());
-        for (String url : sliceUrls) {
-            if (!exist(url, sliceUpyun)) {
-                record(student, true);
-                return;
+            for (int i = 1; i <= student.getSliceCount(); i++) {
+                if (!fileService.sliceExist(student.getExamId(), student.getSecretNumber(), i)) {
+                    exception = true;
+                    break;
+                }
             }
             }
+            record(student, exception);
+        } else if (exam.getType() == ExamType.MULTI_MEDIA) {
+            record(student, fileService.jsonExist(student.getExamId(), student.getSecretNumber()));
         }
         }
 
 
-        record(student, false);
     }
     }
 
 
     private void record(ExamStudent student, boolean exception) {
     private void record(ExamStudent student, boolean exception) {
         studentService.updateException(student.getId(), exception);
         studentService.updateException(student.getId(), exception);
     }
     }
-
-    private boolean exist(String path, UpYun config) {
-        if (StringUtils.isNotBlank(baseDir)) {
-            try {
-                File file = new File(baseDir, config.getBucketName() + path);
-                return file.exists() && file.isFile();
-            } catch (Exception e) {
-                return false;
-            }
-        } else {
-            int retry = 1;
-            while (retry <= 3) {
-                try {
-                    Map<String, String> result = config.getFileInfo(path);
-                    return result != null && "file".equals(result.get("type"));
-                } catch (Exception e) {
-                    retry++;
-                    continue;
-                }
-            }
-            return false;
-        }
-    }
 }
 }

+ 25 - 45
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ExamSubjectVO.java

@@ -1,45 +1,25 @@
-package cn.com.qmth.stmms.admin.vo;
-
-public class ExamSubjectVO {
-
-    private Integer examId;
-
-    private String code;
-
-    private Boolean hasPaper;
-
-    private Boolean hasAnswer;
-
-    public Integer getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Integer examId) {
-        this.examId = examId;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public Boolean getHasPaper() {
-        return hasPaper;
-    }
-
-    public void setHasPaper(Boolean hasPaper) {
-        this.hasPaper = hasPaper;
-    }
-
-    public Boolean getHasAnswer() {
-        return hasAnswer;
-    }
-
-    public void setHasAnswer(Boolean hasAnswer) {
-        this.hasAnswer = hasAnswer;
-    }
-
-}
+package cn.com.qmth.stmms.admin.vo;
+
+public class ExamSubjectVO {
+
+    private Integer examId;
+
+    private String code;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+}

+ 145 - 157
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ScoreDetailVO.java

@@ -1,157 +1,145 @@
-package cn.com.qmth.stmms.admin.vo;
-
-public class ScoreDetailVO {
-
-    private Integer examId;
-
-    private Integer subjectId;
-
-    private String studentCode;
-
-    private Integer classId;
-
-    private Integer classType;
-
-    private Integer graduateType;
-
-    private Integer paperType;
-
-    private String campusCode;
-
-    private String questionNumber;
-
-    private String mainNumber;
-
-    private String subNumber;
-
-    private Integer isObjective;
-
-    private Integer isSelected;
-
-    private Double score;
-
-    private String answer;
-
-    public Integer getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Integer examId) {
-        this.examId = examId;
-    }
-
-    public Integer getSubjectId() {
-        return subjectId;
-    }
-
-    public void setSubjectId(Integer subjectId) {
-        this.subjectId = subjectId;
-    }
-
-    public String getStudentCode() {
-        return studentCode;
-    }
-
-    public void setStudentCode(String studentCode) {
-        this.studentCode = studentCode;
-    }
-
-    public Integer getClassId() {
-        return classId;
-    }
-
-    public void setClassId(Integer classId) {
-        this.classId = classId;
-    }
-
-    public Integer getClassType() {
-        return classType;
-    }
-
-    public void setClassType(Integer classType) {
-        this.classType = classType;
-    }
-
-    public Integer getGraduateType() {
-        return graduateType;
-    }
-
-    public void setGraduateType(Integer graduateType) {
-        this.graduateType = graduateType;
-    }
-
-    public Integer getPaperType() {
-        return paperType;
-    }
-
-    public void setPaperType(Integer paperType) {
-        this.paperType = paperType;
-    }
-
-
-
-	public String getCampusCode() {
-		return campusCode;
-	}
-
-	public void setCampusCode(String campusCode) {
-		this.campusCode = campusCode;
-	}
-
-	public String getQuestionNumber() {
-        return questionNumber;
-    }
-
-    public void setQuestionNumber(String questionNumber) {
-        this.questionNumber = questionNumber;
-    }
-
-    public String getMainNumber() {
-        return mainNumber;
-    }
-
-    public void setMainNumber(String mainNumber) {
-        this.mainNumber = mainNumber;
-    }
-
-    public String getSubNumber() {
-        return subNumber;
-    }
-
-    public void setSubNumber(String subNumber) {
-        this.subNumber = subNumber;
-    }
-
-    public Integer getIsObjective() {
-        return isObjective;
-    }
-
-    public void setIsObjective(Integer isObjective) {
-        this.isObjective = isObjective;
-    }
-
-    public Integer getIsSelected() {
-        return isSelected;
-    }
-
-    public void setIsSelected(Integer isSelected) {
-        this.isSelected = isSelected;
-    }
-
-    public Double getScore() {
-        return score;
-    }
-
-    public void setScore(Double score) {
-        this.score = score;
-    }
-
-    public String getAnswer() {
-        return answer;
-    }
-
-    public void setAnswer(String answer) {
-        this.answer = answer;
-    }
-
-}
+package cn.com.qmth.stmms.admin.vo;
+
+public class ScoreDetailVO {
+
+    private Integer examId;
+
+    private Integer subjectId;
+
+    private String studentCode;
+
+    private Integer classId;
+
+    private Integer classType;
+
+    private Integer graduateType;
+
+    private Integer paperType;
+
+    private String questionNumber;
+
+    private String mainNumber;
+
+    private String subNumber;
+
+    private Integer isObjective;
+
+    private Integer isSelected;
+
+    private Double score;
+
+    private String answer;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public Integer getClassId() {
+        return classId;
+    }
+
+    public void setClassId(Integer classId) {
+        this.classId = classId;
+    }
+
+    public Integer getClassType() {
+        return classType;
+    }
+
+    public void setClassType(Integer classType) {
+        this.classType = classType;
+    }
+
+    public Integer getGraduateType() {
+        return graduateType;
+    }
+
+    public void setGraduateType(Integer graduateType) {
+        this.graduateType = graduateType;
+    }
+
+    public Integer getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(Integer paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getQuestionNumber() {
+        return questionNumber;
+    }
+
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
+    }
+
+    public String getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(String mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public String getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(String subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public Integer getIsObjective() {
+        return isObjective;
+    }
+
+    public void setIsObjective(Integer isObjective) {
+        this.isObjective = isObjective;
+    }
+
+    public Integer getIsSelected() {
+        return isSelected;
+    }
+
+    public void setIsSelected(Integer isSelected) {
+        this.isSelected = isSelected;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+}

+ 105 - 117
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/ScoreVO.java

@@ -1,117 +1,105 @@
-package cn.com.qmth.stmms.admin.vo;
-
-public class ScoreVO {
-
-    private String studentCode;
-
-    private Integer examId;
-
-    private Integer subjectId;
-
-    private Double score;
-
-    private Integer campusId;
-
-    private Integer classId;
-
-    private Integer classType;
-
-    private Integer graduateType;
-
-    private Integer classRank;
-
-    private Integer schoolRank;
-
-    private Integer areaRank;
-
-    public String getStudentCode() {
-        return studentCode;
-    }
-
-    public void setStudentCode(String studentCode) {
-        this.studentCode = studentCode;
-    }
-
-    public Integer getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Integer examId) {
-        this.examId = examId;
-    }
-
-    public Integer getSubjectId() {
-        return subjectId;
-    }
-
-    public void setSubjectId(Integer subjectId) {
-        this.subjectId = subjectId;
-    }
-
-    public Double getScore() {
-        return score;
-    }
-
-    public void setScore(Double score) {
-        this.score = score;
-    }
-
-    
-
-    public Integer getCampusId() {
-		return campusId;
-	}
-
-	public void setCampusId(Integer campusId) {
-		this.campusId = campusId;
-	}
-
-	public Integer getClassId() {
-        return classId;
-    }
-
-    public void setClassId(Integer classId) {
-        this.classId = classId;
-    }
-
-    public Integer getClassType() {
-        return classType;
-    }
-
-    public void setClassType(Integer classType) {
-        this.classType = classType;
-    }
-
-    public Integer getGraduateType() {
-        return graduateType;
-    }
-
-    public void setGraduateType(Integer graduateType) {
-        this.graduateType = graduateType;
-    }
-
-    public Integer getClassRank() {
-        return classRank;
-    }
-
-    public void setClassRank(Integer classRank) {
-        this.classRank = classRank;
-    }
-
-    public Integer getSchoolRank() {
-        return schoolRank;
-    }
-
-    public void setSchoolRank(Integer schoolRank) {
-        this.schoolRank = schoolRank;
-    }
-
-    public Integer getAreaRank() {
-        return areaRank;
-    }
-
-    public void setAreaRank(Integer areaRank) {
-        this.areaRank = areaRank;
-    }
-
-}
+package cn.com.qmth.stmms.admin.vo;
+
+public class ScoreVO {
+
+    private String studentCode;
+
+    private Integer examId;
+
+    private Integer subjectId;
+
+    private Double score;
+
+    private Integer classId;
+
+    private Integer classType;
+
+    private Integer graduateType;
+
+    private Integer classRank;
+
+    private Integer schoolRank;
+
+    private Integer areaRank;
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public Integer getClassId() {
+        return classId;
+    }
+
+    public void setClassId(Integer classId) {
+        this.classId = classId;
+    }
+
+    public Integer getClassType() {
+        return classType;
+    }
+
+    public void setClassType(Integer classType) {
+        this.classType = classType;
+    }
+
+    public Integer getGraduateType() {
+        return graduateType;
+    }
+
+    public void setGraduateType(Integer graduateType) {
+        this.graduateType = graduateType;
+    }
+
+    public Integer getClassRank() {
+        return classRank;
+    }
+
+    public void setClassRank(Integer classRank) {
+        this.classRank = classRank;
+    }
+
+    public Integer getSchoolRank() {
+        return schoolRank;
+    }
+
+    public void setSchoolRank(Integer schoolRank) {
+        this.schoolRank = schoolRank;
+    }
+
+    public Integer getAreaRank() {
+        return areaRank;
+    }
+
+    public void setAreaRank(Integer areaRank) {
+        this.areaRank = areaRank;
+    }
+
+}

+ 9 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/BaseApiController.java

@@ -1,15 +1,15 @@
 package cn.com.qmth.stmms.api.controller;
 package cn.com.qmth.stmms.api.controller;
 
 
-import javax.servlet.http.HttpServletResponse;
-
 import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.common.controller.BaseController;
+import net.sf.json.JSONObject;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 
 
-import cn.com.qmth.stmms.common.controller.BaseController;
+import javax.servlet.http.HttpServletResponse;
 
 
 public class BaseApiController extends BaseController {
 public class BaseApiController extends BaseController {
 
 
@@ -32,4 +32,10 @@ public class BaseApiController extends BaseController {
             log.error("api response senderror", e);
             log.error("api response senderror", e);
         }
         }
     }
     }
+
+    protected JSONObject result(boolean success) {
+        JSONObject obj = new JSONObject();
+        obj.accumulate("success", success);
+        return obj;
+    }
 }
 }

+ 28 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java

@@ -2,18 +2,18 @@ package cn.com.qmth.stmms.api.controller;
 
 
 import cn.com.qmth.stmms.admin.vo.ExamSubjectVO;
 import cn.com.qmth.stmms.admin.vo.ExamSubjectVO;
 import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.api.exception.ApiException;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.DateUtils;
@@ -39,7 +39,7 @@ public class ExamInfoController extends BaseApiController {
     private ExamSubjectService subjectService;
     private ExamSubjectService subjectService;
 
 
     @Autowired
     @Autowired
-    private CampusService campusService;
+    private FileService fileService;
 
 
     @RequestMapping("/version")
     @RequestMapping("/version")
     @ResponseBody
     @ResponseBody
@@ -54,6 +54,7 @@ public class ExamInfoController extends BaseApiController {
         ApiUser user = RequestUtils.getApiUser(request);
         ApiUser user = RequestUtils.getApiUser(request);
         JSONArray array = new JSONArray();
         JSONArray array = new JSONArray();
         query.setSchoolId(user.getSchoolId());
         query.setSchoolId(user.getSchoolId());
+        query.setType(ExamType.SCAN_IMAGE);
         query.setStatus(ExamStatus.START);
         query.setStatus(ExamStatus.START);
         if (query.getPageSize() < 1) {
         if (query.getPageSize() < 1) {
             query.setPageSize(20);
             query.setPageSize(20);
@@ -65,6 +66,11 @@ public class ExamInfoController extends BaseApiController {
             obj.accumulate("id", exam.getId());
             obj.accumulate("id", exam.getId());
             obj.accumulate("name", exam.getName());
             obj.accumulate("name", exam.getName());
             obj.accumulate("examTime", DateUtils.formatDate(exam.getExamTime()));
             obj.accumulate("examTime", DateUtils.formatDate(exam.getExamTime()));
+            if (exam.getCardType() != null) {
+                obj.accumulate("cardType", exam.getCardType().getExtName());
+                obj.accumulate("cardUrl",
+                        fileService.getFileServer() + fileService.getCardUri(exam.getId(), exam.getCardType()));
+            }
             array.add(obj);
             array.add(obj);
         }
         }
         return array;
         return array;
@@ -75,14 +81,14 @@ public class ExamInfoController extends BaseApiController {
     @ResponseBody
     @ResponseBody
     public JSONArray getCampus(HttpServletRequest request) {
     public JSONArray getCampus(HttpServletRequest request) {
         ApiUser user = RequestUtils.getApiUser(request);
         ApiUser user = RequestUtils.getApiUser(request);
-        List<Campus> list = campusService.findBySchoolId(user.getSchoolId());
         JSONArray array = new JSONArray();
         JSONArray array = new JSONArray();
-        for (Campus c : list) {
-            JSONObject obj = new JSONObject();
-            obj.accumulate("code", c.getId().toString());
-            obj.accumulate("name", c.getName());
-            array.add(obj);
-        }
+        //        List<Campus> list = campusService.findBySchoolId(user.getSchoolId());
+        //        for (Campus c : list) {
+        //            JSONObject obj = new JSONObject();
+        //            obj.accumulate("code", c.getId().toString());
+        //            obj.accumulate("name", c.getName());
+        //            array.add(obj);
+        //        }
         return array;
         return array;
     }
     }
 
 
@@ -95,6 +101,11 @@ public class ExamInfoController extends BaseApiController {
             JSONObject obj = new JSONObject();
             JSONObject obj = new JSONObject();
             obj.accumulate("code", subject.getCode());
             obj.accumulate("code", subject.getCode());
             obj.accumulate("name", subject.getName());
             obj.accumulate("name", subject.getName());
+            if (subject.getCardType() != null) {
+                obj.accumulate("cardType", subject.getCardType().getExtName());
+                obj.accumulate("cardUrl", fileService.getFileServer() + fileService
+                        .getCardUri(subject.getExamId(), subject.getCode(), subject.getCardType()));
+            }
             array.add(obj);
             array.add(obj);
         }
         }
         return array;
         return array;
@@ -111,13 +122,13 @@ public class ExamInfoController extends BaseApiController {
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
             ExamSubject es = subjectService.find(subject.getExamId(), subject.getCode());
             ExamSubject es = subjectService.find(subject.getExamId(), subject.getCode());
             if (es != null) {
             if (es != null) {
-                if (subject.getHasAnswer() != null) {
-                    es.setHasAnswer(subject.getHasAnswer());
-                }
-                if (subject.getHasPaper() != null) {
-                    es.setHasPaper(subject.getHasPaper());
-                }
-                subjectService.save(es);
+                //                if (subject.getHasAnswer() != null) {
+                //                    es.setHasAnswer(subject.getHasAnswer());
+                //                }
+                //                if (subject.getHasPaper() != null) {
+                //                    es.setHasPaper(subject.getHasPaper());
+                //                }
+                //                subjectService.save(es);
                 result.accumulate("code", subject.getCode());
                 result.accumulate("code", subject.getCode());
                 return result;
                 return result;
             } else {
             } else {

+ 6 - 10
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java

@@ -1,8 +1,8 @@
 package cn.com.qmth.stmms.api.controller;
 package cn.com.qmth.stmms.api.controller;
 
 
+import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.api.utils.AESUtil;
 import cn.com.qmth.stmms.api.utils.AESUtil;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.api.utils.MenualAbsentDTO;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
@@ -15,8 +15,10 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import com.google.common.base.Strings;
 import com.google.common.base.Strings;
@@ -46,9 +48,6 @@ public class ExamStudentController extends BaseApiController {
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
-    @Autowired
-    private CampusService campusService;
-
     @Autowired
     @Autowired
     private ExamQuestionService questionService;
     private ExamQuestionService questionService;
 
 
@@ -74,9 +73,7 @@ public class ExamStudentController extends BaseApiController {
             obj.accumulate("studentId", String.valueOf(student.getId()));
             obj.accumulate("studentId", String.valueOf(student.getId()));
             obj.accumulate("subjectCode", student.getSubjectCode());
             obj.accumulate("subjectCode", student.getSubjectCode());
             obj.accumulate("subjectName", student.getSubjectName());
             obj.accumulate("subjectName", student.getSubjectName());
-
-            Campus campus = campusService.findBySchoolAndName(exam.getSchoolId(), student.getCampusName());
-            obj.accumulate("campusCode", campus != null ? campus.getId().toString() : "");
+            obj.accumulate("campusCode", "");
         } else {
         } else {
             obj.accumulate("examId", examStudent.getExamId());
             obj.accumulate("examId", examStudent.getExamId());
             obj.accumulate("campusCode", "");
             obj.accumulate("campusCode", "");
@@ -149,8 +146,7 @@ public class ExamStudentController extends BaseApiController {
                 obj.accumulate("examSite", StringUtils.trimToEmpty(student.getExamSite()));
                 obj.accumulate("examSite", StringUtils.trimToEmpty(student.getExamSite()));
                 obj.accumulate("examRoom", StringUtils.trimToEmpty(student.getExamRoom()));
                 obj.accumulate("examRoom", StringUtils.trimToEmpty(student.getExamRoom()));
                 obj.accumulate("remark", StringUtils.trimToEmpty(student.getRemark()));
                 obj.accumulate("remark", StringUtils.trimToEmpty(student.getRemark()));
-                Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-                obj.accumulate("campusCode", campus != null ? campus.getId().toString() : "");
+                obj.accumulate("campusCode", "");
 
 
                 try {
                 try {
                     if (withScoreDetail != null && withScoreDetail.booleanValue()) {
                     if (withScoreDetail != null && withScoreDetail.booleanValue()) {

+ 264 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/FileController.java

@@ -0,0 +1,264 @@
+package cn.com.qmth.stmms.api.controller;
+
+import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * 统一的对外文件服务接口
+ *
+ * @author luoshi
+ */
+@Controller("fileApiController")
+@RequestMapping("/api/file")
+public class FileController extends BaseApiController {
+
+    protected static final Logger log = LoggerFactory.getLogger(FileController.class);
+
+    @Autowired
+    private FileService fileService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private ExamPackageService packageService;
+
+    private Exam validateExam(ApiUser au, Integer examId, ExamType... types) {
+        Exam exam = examService.findById(examId);
+        if (exam == null || !exam.getSchoolId().equals(au.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        if (types != null && !Arrays.asList(types).contains(exam.getType())) {
+            throw ApiException.QUERY_PARAM_ERROR.replaceMessage("exam type invalid");
+        }
+        return exam;
+    }
+
+    private ExamPackage validateExamPackage(Integer examId, String packageCode) {
+        ExamPackage ep = packageService.find(examId, packageCode);
+        if (ep == null) {
+            throw ApiException.QUERY_PARAM_ERROR.appendMessage(": packageCode error");
+        }
+        return ep;
+    }
+
+    private ExamStudent validateExamStudent(Integer examId, String examNumber) {
+        ExamStudent student = studentService.findByExamIdAndExamNumber(examId, examNumber);
+        if (student == null) {
+            throw ApiException.QUERY_PARAM_ERROR.appendMessage(": examNumber error");
+        }
+        return student;
+    }
+
+    private ExamSubject validateExamSubject(Integer examId, String subjectCode) {
+        ExamSubject subject = subjectService.find(examId, subjectCode);
+        if (subject == null) {
+            throw ApiException.QUERY_PARAM_ERROR.appendMessage(": subjectCode error");
+        }
+        return subject;
+    }
+
+    private void validateFormatType(FormatType format, FormatType... types) {
+        if (!Arrays.asList(types).contains(format)) {
+            throw new RuntimeException("format type error");
+        }
+    }
+
+    private void validateIndex(Integer index) {
+        if (index == null || index <= 0) {
+            throw ApiException.QUERY_PARAM_ERROR.appendMessage(": index error");
+        }
+    }
+
+    @RequestMapping(value = "/sheet/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadSheet(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam Integer index, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        validateExamStudent(examId, examNumber);
+        validateIndex(index);
+        try {
+            fileService.uploadSheet(file.getInputStream(), md5, examId, examNumber, index);
+        } catch (Exception e) {
+            log.error("sheet upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("sheet upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/slice/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadSlice(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam Integer index, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        ExamStudent student = validateExamStudent(examId, examNumber);
+        validateIndex(index);
+        try {
+            fileService.uploadSlice(file.getInputStream(), md5, examId, student.getSecretNumber(), index);
+        } catch (Exception e) {
+            log.error("slice upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("slice upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/json/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadJson(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam String md5, @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.MULTI_MEDIA);
+        ExamStudent student = validateExamStudent(examId, examNumber);
+        try {
+            fileService.uploadJson(file.getInputStream(), md5, examId, student.getSecretNumber());
+        } catch (Exception e) {
+            log.error("json upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("json upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/package/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadPackage(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String packageCode, @RequestParam Integer index, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        validateExamPackage(examId, packageCode);
+        validateIndex(index);
+        try {
+            fileService.uploadPackage(file.getInputStream(), md5, examId, packageCode, index);
+        } catch (Exception e) {
+            log.error("package upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("package upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/paper/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadPaper(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String subjectCode, @RequestParam FormatType format, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        Exam exam = validateExam(au, examId);
+        ExamSubject subject = validateExamSubject(examId, subjectCode);
+        if (exam.getType() == ExamType.SCAN_IMAGE) {
+            validateFormatType(format, FormatType.PDF);
+        } else if (exam.getType() == ExamType.MULTI_MEDIA) {
+            validateFormatType(format, FormatType.JSON);
+        }
+        try {
+            fileService.uploadPaper(file.getInputStream(), md5, examId, subjectCode, format);
+            subject.setPaperFileType(format);
+            subjectService.save(subject);
+        } catch (Exception e) {
+            log.error("paper upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("paper upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/answer/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadAnswer(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String subjectCode, @RequestParam FormatType format, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        Exam exam = validateExam(au, examId);
+        ExamSubject subject = validateExamSubject(examId, subjectCode);
+        if (exam.getType() == ExamType.SCAN_IMAGE) {
+            validateFormatType(format, FormatType.PDF);
+        } else if (exam.getType() == ExamType.MULTI_MEDIA) {
+            validateFormatType(format, FormatType.JSON);
+        }
+        try {
+            fileService.uploadAnswer(file.getInputStream(), md5, examId, subjectCode, format);
+            subject.setAnswerFileType(format);
+            subjectService.save(subject);
+        } catch (Exception e) {
+            log.error("answer upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("answer upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+
+    @RequestMapping(value = "/card/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadCard(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam(required = false) String subjectCode, @RequestParam FormatType format,
+            @RequestParam String md5, @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        subjectCode = StringUtils.trimToNull(subjectCode);
+        Exam exam = validateExam(au, examId, ExamType.SCAN_IMAGE);
+        ExamSubject subject = subjectCode != null ? validateExamSubject(examId, subjectCode) : null;
+        FormatType current = subject != null ? subject.getCardType() : exam.getCardType();
+        if (current != null) {
+            validateFormatType(format, current);
+        } else {
+            validateFormatType(format, FormatType.JSON, FormatType.ZIP);
+        }
+        try {
+            if (subject != null) {
+                fileService.uploadCard(file.getInputStream(), md5, examId, subjectCode, format);
+                subject.setCardType(format);
+                subjectService.save(subject);
+            } else {
+                fileService.uploadCard(file.getInputStream(), md5, examId, format);
+                exam.setCardType(format);
+                examService.save(exam);
+            }
+        } catch (Exception e) {
+            log.error("card upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("card upload error: " + e.getMessage());
+        }
+        return result(true);
+    }
+}

+ 4 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/LoginController.java

@@ -1,23 +1,18 @@
 package cn.com.qmth.stmms.api.controller;
 package cn.com.qmth.stmms.api.controller;
 
 
-import javax.servlet.http.HttpServletRequest;
-
-import cn.com.qmth.stmms.api.dto.UserDTO;
-import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
+import javax.servlet.http.HttpServletRequest;
 
 
 @Controller("loginApiController")
 @Controller("loginApiController")
 @RequestMapping("/api")
 @RequestMapping("/api")
@@ -34,6 +29,7 @@ public class LoginController extends BaseApiController {
         JSONObject obj = new JSONObject();
         JSONObject obj = new JSONObject();
         obj.accumulate("userId", user.getUserData() != null ? user.getUserData().getId() : 0);
         obj.accumulate("userId", user.getUserData() != null ? user.getUserData().getId() : 0);
         obj.accumulate("userName", user.getUserData() != null ? user.getUserData().getName() : "");
         obj.accumulate("userName", user.getUserData() != null ? user.getUserData().getName() : "");
+        obj.accumulate("userRole", user.getRole().toString());
         obj.accumulate("campusId", 0);
         obj.accumulate("campusId", 0);
         obj.accumulate("schoolId", user.getSchoolId());
         obj.accumulate("schoolId", user.getSchoolId());
         return obj;
         return obj;

+ 0 - 161
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/PictureController.java

@@ -1,161 +0,0 @@
-package cn.com.qmth.stmms.api.controller;
-
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.task.AsyncTaskExecutor;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.api.utils.ImageBuildUtil;
-import cn.com.qmth.stmms.api.utils.SheetDownloadThread;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.utils.PictureTag;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.upyun.UpYun;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
-import net.sf.json.JSONObject;
-
-@Controller("pictureController")
-@RequestMapping("/")
-public class PictureController {
-
-    protected static final Logger log = LoggerFactory.getLogger(PictureController.class);
-
-    @Autowired
-    private ExamService examService;
-
-    @Autowired
-    private CampusService campusService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    private UpyunConfig config;
-
-    @Autowired
-    private LockService lockService;
-
-    @Qualifier("task-executor")
-    @Autowired
-    private AsyncTaskExecutor taskExecutor;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${file.root}")
-    private String baseDir;
-
-    @Value("${file.save}")
-    private String saveDir;
-
-    @RequestMapping("/sheet/{examId}/{examNumber}-{index}")
-    public void getSheet(HttpServletResponse response, @PathVariable Integer examId, @PathVariable String examNumber,
-            @PathVariable Integer index, @RequestParam(required = false, defaultValue = "true") Boolean withTag) throws IOException {
-        ExamStudent student = studentService.findByExamIdAndExamNumber(examId, examNumber);
-        if (student == null || !student.isUpload() || index < 1 || index > student.getSheetCount()) {
-            response.sendError(HttpStatus.NOT_FOUND.value());
-            return;
-        }
-        try {
-            List<PictureTag> tags = null;
-            if (withTag != null && withTag) {
-                tags = studentService.buildSheetTags(student, index);
-            }
-            BufferedImage image = ImageBuildUtil.buildTagImage(getSheetImage(student, index), tags);
-            response.setContentType("image/jpeg");
-            ImageIO.write(image, "jpg", response.getOutputStream());
-        } catch (Exception e) {
-            log.error("get sheet error", e);
-            response.reset();
-            response.sendError(HttpStatus.NOT_FOUND.value());
-            return;
-        }
-    }
-
-    @RequestMapping("/sheet/{examId}/save")
-    @ResponseBody
-    public Object saveAllSheet(HttpServletResponse response, @PathVariable Integer examId,
-            @RequestParam(required = false, defaultValue = "true") Boolean withTag) throws IOException {
-        JSONObject result = new JSONObject();
-        Exam exam = examService.findById(examId);
-        if (exam == null) {
-            result.accumulate("success", false);
-            result.accumulate("message", "exam not exists");
-            return result;
-        }
-        if (StringUtils.isBlank(saveDir)) {
-            result.accumulate("success", false);
-            result.accumulate("message", "file.save not exists");
-            return result;
-        }
-        if (lockService.trylock(LockType.SAVE_SHEET, examId)) {
-            taskExecutor.submit(new SheetDownloadThread(examId, saveDir, withTag, this, studentService, lockService));
-        }
-        result.accumulate("running", lockService.isLocked(LockType.SAVE_SHEET, examId));
-        return result;
-    }
-
-    @RequestMapping("/sheet/{examId}/status")
-    @ResponseBody
-    public Object saveAllSheetStatus(HttpServletResponse response, @PathVariable Integer examId) throws IOException {
-        JSONObject result = new JSONObject();
-        result.accumulate("running", lockService.isLocked(LockType.SAVE_SHEET, examId));
-        return result;
-    }
-
-    public BufferedImage getSheetImage(ExamStudent student, int index) throws FileNotFoundException, IOException {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        String url = PictureUrlBuilder
-                .getSheetUrl(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(), index);
-        if (StringUtils.isNotBlank(baseDir)) {
-            return ImageIO.read(new File(new File(baseDir, config.getSheetBucket()), url));
-        } else {
-            UpYun upyun = new UpYun(config.getSheetBucket(), config.getSheetUsername(), config.getSheetPassword());
-            ByteArrayOutputStream ous = new ByteArrayOutputStream();
-            upyun.readFile(url, ous);
-            return ImageIO.read(new ByteArrayInputStream(ous.toByteArray()));
-        }
-    }
-
-    public BufferedImage getSliceImage(ExamStudent student, int index) throws FileNotFoundException, IOException {
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        String url = PictureUrlBuilder
-                .getSliceUrl(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(), index);
-        if (StringUtils.isNotBlank(baseDir)) {
-            return ImageIO.read(new File(new File(baseDir, config.getSliceBucket()), url));
-        } else {
-            UpYun upyun = new UpYun(config.getSliceBucket(), config.getSliceUsername(), config.getSlicePassword());
-            ByteArrayOutputStream ous = new ByteArrayOutputStream();
-            upyun.readFile(url, ous);
-            return ImageIO.read(new ByteArrayInputStream(ous.toByteArray()));
-        }
-    }
-
-}

+ 13 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/exception/ApiException.java

@@ -15,6 +15,14 @@ public class ApiException extends RuntimeException {
         return code;
         return code;
     }
     }
 
 
+    public ApiException replaceMessage(String message) {
+        return new ApiException(this.code, message);
+    }
+
+    public ApiException appendMessage(String message) {
+        return new ApiException(this.code, this.getMessage() + message);
+    }
+
     public static final ApiException AUTHORIZATION_UNEXIST = new ApiException(401, "authorization unexists");
     public static final ApiException AUTHORIZATION_UNEXIST = new ApiException(401, "authorization unexists");
 
 
     public static final ApiException SIGNATURE_INVALID = new ApiException(401, "signature invalid");
     public static final ApiException SIGNATURE_INVALID = new ApiException(401, "signature invalid");
@@ -25,5 +33,10 @@ public class ApiException extends RuntimeException {
 
 
     public static final ApiException EXAM_NOT_ACCESSIBLED = new ApiException(401, "user cannot access specified exam");
     public static final ApiException EXAM_NOT_ACCESSIBLED = new ApiException(401, "user cannot access specified exam");
 
 
+    public static final ApiException QUERY_PARAM_ERROR = new ApiException(400, "query param error");
+
     public static final ApiException USER_LOGIN_FAILE = new ApiException(500, "user login faile");
     public static final ApiException USER_LOGIN_FAILE = new ApiException(500, "user login faile");
+
+    public static final ApiException FILE_UPLOAD_ERROR = new ApiException(500, "file upload error");
+
 }
 }

+ 0 - 87
stmms-web/src/main/java/cn/com/qmth/stmms/api/utils/SheetDownloadThread.java

@@ -1,87 +0,0 @@
-package cn.com.qmth.stmms.api.utils;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-
-import javax.imageio.ImageIO;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import cn.com.qmth.stmms.api.controller.PictureController;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.common.enums.LockType;
-
-public class SheetDownloadThread implements Runnable {
-
-    public static final Logger log = LoggerFactory.getLogger(SheetDownloadThread.class);
-
-    private Integer examId;
-
-    private File baseDir;
-
-    private Boolean withTag;
-
-    private PictureController controller;
-
-    private ExamStudentService studentService;
-
-    private LockService lockService;
-
-    public SheetDownloadThread(Integer examId, String dir, Boolean withTag, PictureController controller,
-            ExamStudentService studentService, LockService lockService) {
-        this.examId = examId;
-        this.baseDir = new File(dir);
-        this.withTag = withTag;
-        this.controller = controller;
-        this.studentService = studentService;
-        this.lockService = lockService;
-    }
-
-    @Override
-    public void run() {
-        try {
-            ExamStudentSearchQuery query = new ExamStudentSearchQuery();
-            query.setExamId(examId);
-            query.setUpload(true);
-            query.setPageSize(100);
-            query.setPageNumber(0);
-            while (true) {
-                query.setPageNumber(query.getPageNumber() + 1);
-                query = studentService.findByQuery(query);
-                if (query.getCurrentCount() == 0) {
-                    break;
-                }
-
-                for (ExamStudent student : query.getResult()) {
-                    log.info("write for student: " + student.getExamNumber());
-                    for (int i = 1; i <= student.getSheetCount(); i++) {
-                        download(student, i);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            log.error("save sheet thread error", e);
-        } finally {
-            lockService.unlock(LockType.SAVE_SHEET, examId);
-        }
-    }
-
-    private void download(ExamStudent student, int index) {
-        File file = new File(baseDir, examId + File.separator + student.getSubjectCode() + File.separator
-                + student.getExamNumber() + "-" + index + ".jpg");
-        try {
-            file.getParentFile().mkdirs();
-            BufferedImage image = ImageBuildUtil.buildTagImage(controller.getSheetImage(student, index),
-                    withTag != null && withTag.booleanValue() ? studentService.buildSheetTags(student, index) : null);
-            ImageIO.write(image, "jpg", file);
-            log.info("write sheet file success: " + file.getAbsolutePath());
-        } catch (Exception e) {
-            log.error("write sheet file error: " + file.getAbsolutePath(), e);
-        }
-    }
-
-}

+ 26 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java

@@ -6,6 +6,8 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.file.enums.FileType;
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
 import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
@@ -221,6 +223,30 @@ public class BaseController {
                 }
                 }
             }
             }
         });
         });
+        // FileType 类型转换
+        binder.registerCustomEditor(FileType.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(FileType.findByText(text));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
+        // FormatType 类型转换
+        binder.registerCustomEditor(FormatType.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(FormatType.findByText(text));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
         binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
         binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
     }
     }
 
 

+ 0 - 135
stmms-web/src/main/java/cn/com/qmth/stmms/file/controller/FileController.java

@@ -1,135 +0,0 @@
-package cn.com.qmth.stmms.file.controller;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.util.FileCopyUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import cn.com.qmth.stmms.common.upyun.UpYun;
-
-/**
- * 模拟又拍云的数据接口,提供局域网内的文件上传/下载服务
- * 
- * @author luoshi
- * 
- */
-@Controller("fileApiController")
-@RequestMapping("/file")
-public class FileController implements InitializingBean {
-
-    protected static final Logger log = LoggerFactory.getLogger(FileController.class);
-
-    @Value("${file.root}")
-    private String baseDir;
-
-    private boolean enable;
-
-    @RequestMapping(value = "/**", method = { RequestMethod.PUT, RequestMethod.POST })
-    public void upload(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        if (enable == false) {
-            response.sendError(401, "file api disable");
-            return;
-        }
-
-        File full = new File(baseDir, getFilePath(request));
-        File parent = full.getParentFile();
-        if (parent.exists() || parent.mkdirs()) {
-            try {
-                OutputStream output = new FileOutputStream(full);
-                IOUtils.copy(request.getInputStream(), output);
-                output.close();
-
-                String md5 = request.getHeader(UpYun.CONTENT_MD5);
-                if (StringUtils.isNotBlank(md5)) {
-                    // 文件内容MD5摘要验证
-                    if (!UpYun.md5(full).equals(md5)) {
-                        log.error("md5 check faile: " + full.getAbsolutePath());
-                        response.sendError(500, "md5 check faile: " + full.getAbsolutePath());
-                    }
-                }
-            } catch (Exception e) {
-                log.error("write file faile: " + full.getAbsolutePath(), e);
-                response.sendError(500, "write file faile: " + full.getAbsolutePath());
-            }
-        } else {
-            log.error("mkdir faile: " + parent.getAbsolutePath());
-            response.sendError(500, "mkdir faile: " + parent.getAbsolutePath());
-        }
-    }
-
-    @RequestMapping(value = "/**", method = RequestMethod.GET)
-    public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        if (enable == false) {
-            response.sendError(401, "file api disable");
-            return;
-        }
-
-        String filePath = getFilePath(request);
-        File full = new File(baseDir, filePath);
-        if (full.exists()) {
-            try {
-                FileCopyUtils.copy(new FileInputStream(full), response.getOutputStream());
-            } catch (Exception e) {
-                log.error("read file faile: " + full.getAbsolutePath(), e);
-                response.sendError(500, "read file faile: " + full.getAbsolutePath());
-            }
-        } else {
-            response.sendError(404, "file not found: " + filePath);
-        }
-    }
-
-    @RequestMapping(value = "/**", method = RequestMethod.HEAD)
-    public void info(HttpServletRequest request, HttpServletResponse response) throws IOException {
-        if (enable == false) {
-            response.sendError(401, "file api disable");
-            return;
-        }
-
-        String filePath = getFilePath(request);
-        File full = new File(baseDir, filePath);
-        if (full.exists()) {
-            try {
-                response.addHeader(UpYun.X_UPYUN_FILE_TYPE, full.isFile() ? "file" : "folder");
-                response.addHeader(UpYun.X_UPYUN_FILE_SIZE, String.valueOf(full.length()));
-                response.addHeader(UpYun.X_UPYUN_FILE_DATE, String.valueOf(full.lastModified()));
-                if (full.isFile()) {
-                    response.addHeader(UpYun.CONTENT_MD5, UpYun.md5(full));
-                }
-            } catch (Exception e) {
-                log.error("read file faile: " + full.getAbsolutePath(), e);
-                response.sendError(500, "read file faile: " + full.getAbsolutePath());
-            }
-        } else {
-            response.sendError(404, "file not found: " + filePath);
-        }
-    }
-
-    private String getFilePath(HttpServletRequest request) {
-        return request.getRequestURI().substring(5);
-    }
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-        if (StringUtils.isNotBlank(baseDir)) {
-            File dir = new File(baseDir);
-            if (dir.exists() && dir.isDirectory()) {
-                enable = true;
-            }
-        }
-    }
-}

+ 5 - 15
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -6,6 +6,7 @@ import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -87,21 +88,12 @@ public class MarkController extends BaseController {
     @Autowired
     @Autowired
     private SessionService sessionService;
     private SessionService sessionService;
 
 
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
+    @Autowired
+    private FileService fileService;
 
 
     @Value("${marker.forceMode}")
     @Value("${marker.forceMode}")
     private String forceMarkMode;
     private String forceMarkMode;
 
 
-    @Value("${json.server}")
-    private String jsonServer;
-
     @RequestMapping(value = "/reset", method = RequestMethod.GET)
     @RequestMapping(value = "/reset", method = RequestMethod.GET)
     public ModelAndView reset(HttpServletRequest request) {
     public ModelAndView reset(HttpServletRequest request) {
         User user = RequestUtils.getWebUser(request).getUser();
         User user = RequestUtils.getWebUser(request).getUser();
@@ -235,12 +227,10 @@ public class MarkController extends BaseController {
      * @param modelAndView
      * @param modelAndView
      */
      */
     private void preProcess(Marker marker, ModelAndView modelAndView) {
     private void preProcess(Marker marker, ModelAndView modelAndView) {
-        modelAndView.addObject("sliceServer", sliceServer);
-        modelAndView.addObject("sheetServer", sheetServer);
-        modelAndView.addObject("cardServer", cardServer);
-        modelAndView.addObject("jsonServer", jsonServer);
+        modelAndView.addObject("fileServer", fileService.getFileServer());
         modelAndView.addObject("marker", marker);
         modelAndView.addObject("marker", marker);
         ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
         ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
+        subject.setPaperAnswerUrl(fileService);
         modelAndView.addObject("subject", subject);
         modelAndView.addObject("subject", subject);
         Exam exam = examService.findById(marker.getExamId());
         Exam exam = examService.findById(marker.getExamId());
         modelAndView.addObject("forceSpecialTag", exam.isForceSpecialTag());
         modelAndView.addObject("forceSpecialTag", exam.isForceSpecialTag());

+ 0 - 157
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkLeaderController.java

@@ -1,157 +0,0 @@
-package cn.com.qmth.stmms.mark;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.mark.model.Task;
-import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.common.controller.BaseController;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
-
-@Controller
-@RequestMapping("/admin/mark/leader")
-public class MarkLeaderController extends BaseController {
-
-    private static Logger log = LoggerFactory.getLogger(MarkLeaderController.class);
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Value("${slice.image.server}")
-    private String sliceServer;
-
-    @Value("${sheet.image.server}")
-    private String sheetServer;
-
-    @Value("${card.server}")
-    private String cardServer;
-
-    @RequestMapping("/index")
-    public ModelAndView index(HttpServletRequest request, @RequestParam(value = "studentId") Integer studentId) {
-        ExamStudent student = studentService.findById(studentId);
-        WebUser user = RequestUtils.getWebUser(request);
-        Marker marker = new Marker();
-        marker.setId(user.getId());
-        marker.setExamId(student.getExamId());
-        marker.setSubjectCode(student.getSubjectCode());
-        ModelAndView modelAndView = new ModelAndView("modules/mark/markLeader");
-        preProcess(marker, studentId, modelAndView);
-        return modelAndView;
-    }
-
-    /**
-     * 进入评卷界面后的通用预处理
-     * 
-     * @param marker
-     * @param modelAndView
-     * @param modelAndView
-     */
-    private void preProcess(Marker marker, Integer studentId, ModelAndView modelAndView) {
-        modelAndView.addObject("sliceServer", sliceServer);
-        modelAndView.addObject("sheetServer", sheetServer);
-        modelAndView.addObject("cardServer", cardServer);
-        modelAndView.addObject("marker", marker);
-        modelAndView.addObject("studentId", studentId);
-        ExamStudent student = studentService.findById(studentId);
-        modelAndView.addObject("subject", subjectService.find(student.getExamId(), student.getSubjectCode()));
-    }
-
-    @RequestMapping("/status")
-    @ResponseBody
-    public JSONObject status(HttpServletRequest request,
-            @RequestParam(value = "studentId", required = false) Integer studentId) {
-        JSONObject status = new JSONObject();
-        if (studentId == null) {
-            status.accumulate("valid", false);
-            status.accumulate("totalCount", 1);
-            status.accumulate("markedCount", 1);
-        } else {
-            ExamStudent student = studentService.findById(studentId);
-            ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-            if (subject == null) {
-                status.accumulate("valid", false);
-                return status;
-            }
-            status.accumulate("valid", true);
-        }
-        return status;
-    }
-
-    @RequestMapping("/gettask")
-    @ResponseBody
-    public Task getTask(HttpServletRequest request,
-            @RequestParam(value = "studentId", required = false) Integer studentId) {
-        WebUser marker = RequestUtils.getWebUser(request);
-        Task task = null;
-        if (studentId == null) {
-            task = new Task();
-            task.setExist(false);
-            task.setMessage("当前无评卷任务");
-        } else {
-            task = getTask(marker, studentId);
-        }
-        return task;
-    }
-
-    /**
-     * 设置任务通用属性
-     * 
-     * @param task
-     * @param marker
-     * @param stage
-     * @param count
-     * @param bmList
-     */
-    private void setTaskParameter(Task task, WebUser marker) {
-        task.setHeaderId(marker.getId());
-    }
-
-    private Task getTask(WebUser marker, Integer studentId) {
-        Task task = taskService.build(studentId);
-        setTaskParameter(task, marker);
-        return task;
-    }
-
-    @RequestMapping(value = "/savetask", method = RequestMethod.POST)
-    @ResponseBody
-    public JSONObject saveTask(HttpServletRequest request, @RequestBody Task task) {
-        JSONObject result = new JSONObject();
-        try {
-            if (taskService.submitByStudent(task)) {
-                result.accumulate("success", true);
-                result.accumulate("status", status(request, null));
-            } else {
-                result.accumulate("success", false);
-            }
-        } catch (Exception e) {
-            log.error("MarkController-保存任务出错", e);
-            result.accumulate("success", false);
-        }
-        return result;
-    }
-
-}

+ 131 - 130
stmms-web/src/main/webapp/WEB-INF/views/include/trialDetail.jsp

@@ -1,155 +1,156 @@
-<%@ page contentType="text/html;charset=UTF-8"%>
+<%@ page contentType="text/html;charset=UTF-8" %>
 <link rel="stylesheet" type="text/css" href="${ctxStatic}/jBox/Source/jBox.css">
 <link rel="stylesheet" type="text/css" href="${ctxStatic}/jBox/Source/jBox.css">
 <script type="text/javascript" src="${ctxStatic}/jBox/Source/jBox.min.js"></script>
 <script type="text/javascript" src="${ctxStatic}/jBox/Source/jBox.min.js"></script>
 <link rel="stylesheet" type="text/css" href="${ctxStatic}/rich-text/css/rich-text.css">
 <link rel="stylesheet" type="text/css" href="${ctxStatic}/rich-text/css/rich-text.css">
 <script type="text/javascript" src="${ctxStatic}/rich-text/js/render.js"></script>
 <script type="text/javascript" src="${ctxStatic}/rich-text/js/render.js"></script>
 
 
 <div id="trial-detail-content" class="container-fluid" style="display:none">
 <div id="trial-detail-content" class="container-fluid" style="display:none">
-<div class="row-fluid">
-    <div id="trial-left-div" class="span7" style="overflow-y:scroll">
-    </div>
-    <div id="trial-right-div" class="span5">
-        <table id="contentTable" class="table table-striped table-bordered table-condensed">
-            <thead>
+    <div class="row-fluid">
+        <div id="trial-left-div" class="span7" style="overflow-y:scroll">
+        </div>
+        <div id="trial-right-div" class="span5">
+            <table id="contentTable" class="table table-striped table-bordered table-condensed">
+                <thead>
                 <tr>
                 <tr>
                     <th>评卷员</th>
                     <th>评卷员</th>
                     <th>姓名</th>
                     <th>姓名</th>
                     <th>给分</th>
                     <th>给分</th>
                     <th>时间</th>
                     <th>时间</th>
                 </tr>
                 </tr>
-            </thead>
-            <tbody id="trial-history">
-            </tbody>
-        </table>
+                </thead>
+                <tbody id="trial-history">
+                </tbody>
+            </table>
+        </div>
     </div>
     </div>
 </div>
 </div>
-</div>
 
 
 <script type="text/javascript">
 <script type="text/javascript">
-var trialDetailModal = new jBox('Modal', {isolateScroll: false});
+    var trialDetailModal = new jBox('Modal', {isolateScroll: false});
 
 
-$(document).ready(function() {
-    $('#trial-left-div').height($(window).height()*0.83);
-});
+    $(document).ready(function () {
+        $('#trial-left-div').height($(window).height() * 0.83);
+    });
 
 
-function initTrialDetailPopover(title, libraryId) {
-	initTrialDetailContent(libraryId); 
-	trialDetailModal.setWidth($(window).width()*0.9);
-	trialDetailModal.setHeight($(window).height()*0.85);
-	trialDetailModal.setTitle(title);
-	trialDetailModal.open();
-}
+    function initTrialDetailPopover(title, libraryId) {
+        initTrialDetailContent(libraryId);
+        trialDetailModal.setWidth($(window).width() * 0.9);
+        trialDetailModal.setHeight($(window).height() * 0.85);
+        trialDetailModal.setTitle(title);
+        trialDetailModal.open();
+    }
 
 
-function initTrialDetailContent(libraryId){
-	$('#trial-history').empty();
-	$('#trial-left-div').empty();
-	$.ajax({
-        type:"GET",
-        url:'${ctx}/admin/exam/trial/detail?libraryId='+libraryId,  
-        dataType:"json",
-        success:function(data){
-	        if(data.success==true) {
-	            for (var i = 0; i < data.historyList.length; i++) {
-	                var history = data.historyList[i];
-	                $('#trial-history').append('<tr><td>'+history.loginName+'</td><td>'+history.name+'</td><td>'+history.score+'</td><td>'+history.time+'</td></tr>');
-	            }
-	            if(data.imageServer != undefined && data.pictureConfig != undefined){
-		            new ImageLoader( {
-		                server: data.imageServer
-		            }).merge(data.urls, data.pictureConfig, function(image){
-	                    trialDetailModal.setContent($('#trial-detail-content'));
-	                    $(image).width($('#trial-left-div').width()*0.95);
-	                    $(image).appendTo('#trial-left-div');
-	                }, function(error){
-		                trialDetailModal.setTitle('加载失败');
-		            });
-	            }else if(data.jsonServer != undefined && data.questionNumbers != undefined){
-	            	var url = data.jsonServer + data.urls;
-	            	var questionNumbers = data.questionNumbers.split(",");
-	            	let questionArr = {};
-	            	questionNumbers.forEach(questionNumber => {
-	            		questionArr[questionNumber] = true;
-	                });
-	            	$.get(url, function (result) {
-	            		 let questions = JSON.parse(result) || [];
-	            		//var result = '[{"mainNumber": 6,"subNumber": 19,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"}]},{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"},{"type": "text","value": "我是答案答案daan"}]}]}}]';
-	            		//let questions = JSON.parse(result);
+    function initTrialDetailContent(libraryId) {
+        $('#trial-history').empty();
+        $('#trial-left-div').empty();
+        $.ajax({
+            type: "GET",
+            url: '${ctx}/admin/exam/trial/detail?libraryId=' + libraryId,
+            dataType: "json",
+            success: function (data) {
+                if (data.success == true) {
+                    for (var i = 0; i < data.historyList.length; i++) {
+                        var history = data.historyList[i];
+                        $('#trial-history').append('<tr><td>' + history.loginName + '</td><td>' + history.name + '</td><td>' + history.score + '</td><td>' + history.time + '</td></tr>');
+                    }
+                    if (data.fileServer != undefined && data.pictureConfig != undefined) {
+                        new ImageLoader({
+                            server: data.fileServer
+                        }).merge(data.urls, data.pictureConfig, function (image) {
+                            trialDetailModal.setContent($('#trial-detail-content'));
+                            $(image).width($('#trial-left-div').width() * 0.95);
+                            $(image).appendTo('#trial-left-div');
+                        }, function (error) {
+                            trialDetailModal.setTitle('加载失败');
+                        });
+                    } else if (data.fileServer != undefined && data.questionNumbers != undefined) {
+                        var url = data.fileServer + data.urls;
+                        var questionNumbers = data.questionNumbers.split(",");
+                        let questionArr = {};
+                        questionNumbers.forEach(questionNumber => {
+                            questionArr[questionNumber] = true;
+                        });
+                        $.get(url, function (result) {
+                            let questions = JSON.parse(result) || [];
+                            //var result = '[{"mainNumber": 6,"subNumber": 19,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"}]},{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"},{"type": "text","value": "我是答案答案daan"}]}]}}]';
+                            //let questions = JSON.parse(result);
 
 
-	            		 questions.forEach(question => {
-	            	            // 按题号过滤
-	            	            if (questionArr[question.mainNumber + "." + question.subNumber] === true) {
-	            	                let numberTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "题号:" + question.mainNumber + "-" + question.subNumber
-	            	                    }]
-	            	                };
-	            	                let bodyTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "题干:"
-	            	                    }]
-	            	                };
-	            	                let answerTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "考生答案:"
-	            	                    }, {
-	            	                        "type": "text",
-	            	                        "param": {
-	            	                            "italic": true,
-	            	                            "danger": true
-	            	                        },
-	            	                        "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
-	            	                    }]
-	            	                };
-	            	                let standardTitle = {
-	            	                    "blocks": [{
-	            	                        "type": "text",
-	            	                        "param": {"bold": true},
-	            	                        "value": "标准答案:"
-	            	                    }]
-	            	                };
-	            	                this.holder = $('#trial-left-div');
-	            	                $(renderSection(numberTitle)).appendTo(this.holder);
-	            	                $(renderSection(bodyTitle)).appendTo(this.holder);
-	            	                if(question.parentBody!=null && question.parentBody!=undefined){
-	            						$(renderRichText(question.parentBody)).appendTo(this.holder); 
-	            					}
-	            	                $(renderRichText(question.body)).appendTo(this.holder);
-	            	                $(renderSection(answerTitle)).appendTo(this.holder);
-	            	                $(renderRichText(question.studentAnswer)).appendTo(this.holder);
-	            	                $(renderSection(standardTitle)).appendTo(this.holder);
-	            	                $(renderRichText(question.answer)).appendTo(this.holder);
-	            	                trialDetailModal.setContent($('#trial-detail-content'));
-	            	            }
-	            	        });
-	                }).error(function () {
-	                	trialDetailModal.setTitle('加载失败')
-	                }); 
-	            }
-	        }else {
-	            trialDetailModal.setTitle('加载失败')
-	        }
-        }
-    });
-}
-function textCount(jsonBody) {
-    let sections = jsonBody.sections || [];
-    let count = 0;
-    sections.forEach(section => {
-        let blocks = section.blocks || [];
-        blocks.forEach(block => {
-            if (block.type === 'text' && block.value != undefined) {
-                count += block.value.length;
+                            questions.forEach(question => {
+                                // 按题号过滤
+                                if (questionArr[question.mainNumber + "." + question.subNumber] === true) {
+                                    let numberTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "题号:" + question.mainNumber + "-" + question.subNumber
+                                        }]
+                                    };
+                                    let bodyTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "题干:"
+                                        }]
+                                    };
+                                    let answerTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "考生答案:"
+                                        }, {
+                                            "type": "text",
+                                            "param": {
+                                                "italic": true,
+                                                "danger": true
+                                            },
+                                            "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
+                                        }]
+                                    };
+                                    let standardTitle = {
+                                        "blocks": [{
+                                            "type": "text",
+                                            "param": {"bold": true},
+                                            "value": "标准答案:"
+                                        }]
+                                    };
+                                    this.holder = $('#trial-left-div');
+                                    $(renderSection(numberTitle)).appendTo(this.holder);
+                                    $(renderSection(bodyTitle)).appendTo(this.holder);
+                                    if (question.parentBody != null && question.parentBody != undefined) {
+                                        $(renderRichText(question.parentBody)).appendTo(this.holder);
+                                    }
+                                    $(renderRichText(question.body)).appendTo(this.holder);
+                                    $(renderSection(answerTitle)).appendTo(this.holder);
+                                    $(renderRichText(question.studentAnswer)).appendTo(this.holder);
+                                    $(renderSection(standardTitle)).appendTo(this.holder);
+                                    $(renderRichText(question.answer)).appendTo(this.holder);
+                                    trialDetailModal.setContent($('#trial-detail-content'));
+                                }
+                            });
+                        }).error(function () {
+                            trialDetailModal.setTitle('加载失败')
+                        });
+                    }
+                } else {
+                    trialDetailModal.setTitle('加载失败')
+                }
             }
             }
         });
         });
-    });
-    return count;
-}
+    }
+
+    function textCount(jsonBody) {
+        let sections = jsonBody.sections || [];
+        let count = 0;
+        sections.forEach(section => {
+            let blocks = section.blocks || [];
+            blocks.forEach(block => {
+                if (block.type === 'text' && block.value != undefined) {
+                    count += block.value.length;
+                }
+            });
+        });
+        return count;
+    }
 </script>
 </script>
 
 
 
 

+ 82 - 85
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcess.jsp

@@ -1,92 +1,89 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 </head>
 <body>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				clearUrl: '${ctx}/admin/exam/arbitrate/clear',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-history':{
-                        pageSize:10
-                    },
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				getUrl : '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				historyUrl : '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
-				submitUrl : '${ctx}/admin/exam/arbitrate/saveTask',
-				clearUrl : '${ctx}/admin/exam/arbitrate/clear'
-			});
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-history': {
+                    pageSize: 10
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'sheet-view': {
+                    server: '${fileServer}'
+                },
+                'warning-info': {},
+                'thumbnail': {},
+                'view-sidebar': {
+                    list: [
+                        {title: '试卷', url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'},
+                        {title: '答案', url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'}
+                    ]
+                }
+            }
+        });
+        mc.start({
+            mode: 'loop',
+            statusUrl: '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            getUrl: '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            historyUrl: '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear'
+        });
+    });
+</script>
 </body>
 </body>
 </html>
 </html>

+ 77 - 79
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateBatchProcessJson.jsp

@@ -1,86 +1,84 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-<script src="${ctxStatic}/rich-text/js/render.js"></script>
-<link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/rich-text/js/render.js"></script>
+    <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-history.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 </head>
 <body>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				clearUrl: '${ctx}/admin/exam/arbitrate/clear',
-				modules : {
-					'json-loader': {
-	                    jsonServer: '${jsonServer}'
-	                },
-	                'json-view': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-history':{
-                        pageSize:10
-                    },
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'warning-info': {
-					}
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				getUrl : '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
-				historyUrl : '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
-				submitUrl : '${ctx}/admin/exam/arbitrate/saveTask',
-				clearUrl : '${ctx}/admin/exam/arbitrate/clear'
-			});
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear',
+            modules: {
+                'json-loader': {
+                    jsonServer: '${fileServer}'
+                },
+                'json-view': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-history': {
+                    pageSize: 10
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'warning-info': {}
+            }
+        });
+        mc.start({
+            mode: 'loop',
+            statusUrl: '${ctx}/admin/exam/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            getUrl: '${ctx}/admin/exam/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+            historyUrl: '${ctx}/admin/exam/arbitrate/history/${group.subjectCode}/${group.number}',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            clearUrl: '${ctx}/admin/exam/arbitrate/clear'
+        });
+    });
+</script>
 </body>
 </body>
 </html>
 </html>

+ 79 - 82
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcess.jsp

@@ -1,89 +1,86 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 </head>
 <body>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-			mc.on('task.submit.success', this, function(event, context){
-                window.close();
-            });
-            mc.on('task.submit.error', this, function(event, context){
-                //window.close();
-            });
-            $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function(task){
-                mc.setTask(task);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'sheet-view': {
+                    server: '${fileServer}'
+                },
+                'warning-info': {},
+                'thumbnail': {},
+                'view-sidebar': {
+                    list: [
+                        {title: '试卷', url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'},
+                        {title: '答案', url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'}
+                    ]
+                }
+            }
+        });
+        mc.on('task.submit.success', this, function (event, context) {
+            window.close();
+        });
+        mc.on('task.submit.error', this, function (event, context) {
+            //window.close();
+        });
+        $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function (task) {
+            mc.setTask(task);
+        });
+    });
+</script>
 </body>
 </body>
 </html>
 </html>

+ 74 - 76
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateSingleProcessJson.jsp

@@ -1,83 +1,81 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-<script src="${ctxStatic}/rich-text/js/render.js"></script>
-<link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/rich-text/js/render.js"></script>
+    <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/mark-board.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/arbitration-process.js"></script>
 </head>
 </head>
 <body>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
-				modules : {
-					'json-loader': {
-	                    jsonServer: '${jsonServer}'
-	                },
-	                'json-view': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'arbitration-process': {
-					},
-					'warning-info': {
-					}
-				}
-			});
-			mc.on('task.submit.success', this, function(event, context){
-                window.close();
-            });
-            mc.on('task.submit.error', this, function(event, context){
-                //window.close();
-            });
-            $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function(task){
-                mc.setTask(task);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            submitUrl: '${ctx}/admin/exam/arbitrate/saveTask',
+            modules: {
+                'json-loader': {
+                    jsonServer: '${fileServer}'
+                },
+                'json-view': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'mark-board': {
+                    showScoreBoard: false,
+                    autoSubmit: false,
+                    needConfirm: false
+                },
+                'arbitration-process': {},
+                'warning-info': {}
+            }
+        });
+        mc.on('task.submit.success', this, function (event, context) {
+            window.close();
+        });
+        mc.on('task.submit.error', this, function (event, context) {
+            //window.close();
+        });
+        $.post('${ctx}/admin/exam/arbitrate/singleTask?historyId=${history.id}', {}, function (task) {
+            mc.setTask(task);
+        });
+    });
+</script>
 </body>
 </body>
 </html>
 </html>

+ 231 - 228
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkAnswerEdit.jsp

@@ -1,34 +1,36 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang="en">
 <html lang="en">
 <head>
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
-
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
+    
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
 </head>
 </head>
 <body id="index">
 <body id="index">
 <div class="wp">
 <div class="wp">
     <div id="top" class="top cl">
     <div id="top" class="top cl">
-        <div class="z"><div>
-            <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
-            <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
-            <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
-            <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
-            <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
-            <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
-            <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
-            <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
-        </div></div>
+        <div class="z">
+            <div>
+                <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
+                <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
+                <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
+                <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
+                <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
+                <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
+                <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
+                <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
+            </div>
+        </div>
         <div class="y cl">
         <div class="y cl">
             <div class="iviewer_zoom_in" id="zoom-in-button"></div>
             <div class="iviewer_zoom_in" id="zoom-in-button"></div>
             <div class="iviewer_zoom_out" id="zoom-out-button"></div>
             <div class="iviewer_zoom_out" id="zoom-out-button"></div>
@@ -41,28 +43,28 @@
         <div class="box">
         <div class="box">
             <div class="cont cl">
             <div class="cont cl">
                 <div id="left" class="left">
                 <div id="left" class="left">
-                        <div class="form-m">
-                            <div class="form-t">
-                                <span class="b">是否缺考:</span>
-                                <label>
+                    <div class="form-m">
+                        <div class="form-t">
+                            <span class="b">是否缺考:</span>
+                            <label>
                                 <span class="radio"><input type="button" class="absent-select" data-absent="true"></span><span>是</span>
                                 <span class="radio"><input type="button" class="absent-select" data-absent="true"></span><span>是</span>
-                                </label>
-                                <label>
+                            </label>
+                            <label>
                                 <span class="radio"><input type="button" class="absent-select" data-absent="false"></span><span>否</span>
                                 <span class="radio"><input type="button" class="absent-select" data-absent="false"></span><span>否</span>
-                                </label>
-                                <span class="b">试卷类型:</span>
-                                <label>
+                            </label>
+                            <span class="b">试卷类型:</span>
+                            <label>
                                 <input id="paperType" name="paperType" class="input-large" maxlength="1"/>
                                 <input id="paperType" name="paperType" class="input-large" maxlength="1"/>
-                                </label>
-                            </div>
-                            <div id="answer-content">
-                            </div>
+                            </label>
                         </div>
                         </div>
-                        <div class="form-b cl">
-                            <input type="button" id="save-button" value="保存"/>
-                            <input type="button" id="previous-button" class="next" value="上一张"/>
-                            <input type="button" id="next-button" class="next" value="下一张"/>
+                        <div id="answer-content">
                         </div>
                         </div>
+                    </div>
+                    <div class="form-b cl">
+                        <input type="button" id="save-button" value="保存"/>
+                        <input type="button" id="previous-button" class="next" value="上一张"/>
+                        <input type="button" id="next-button" class="next" value="下一张"/>
+                    </div>
                 </div>
                 </div>
                 <div class="right">
                 <div class="right">
                     <div style="position:relative;" class="image-content" id="image-holder">
                     <div style="position:relative;" class="image-content" id="image-holder">
@@ -74,214 +76,215 @@
 </div>
 </div>
 </body>
 </body>
 <script type="text/javascript">
 <script type="text/javascript">
-var ids = [${ids}];
-var current;
-var student;
-var iviewer;
-var regex = /^[a-z]+$/ig;
-$(document).ready(function() {
-    $('#next-button').click(function(){
-        process(current+1);
-    });
-    $('#previous-button').click(function(){
-        process(current-1);
-    });
-    $('#save-button').click(save);
-    $('.absent-select').click(function(){
-        if(!$(this).hasClass('on')) {
-            $('.absent-select').removeClass('on');
-            $(this).addClass('on');
-        }
-        if(student!=undefined) {
-            student.absent = $(this).attr('data-absent')=='true';
-        }
-    });
-    $('#zoom-in-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', 1);
-        }
-    });
-    $('#zoom-out-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', -1);
+    var ids = [${ids}];
+    var current;
+    var student;
+    var iviewer;
+    var regex = /^[a-z]+$/ig;
+    $(document).ready(function () {
+        $('#next-button').click(function () {
+            process(current + 1);
+        });
+        $('#previous-button').click(function () {
+            process(current - 1);
+        });
+        $('#save-button').click(save);
+        $('.absent-select').click(function () {
+            if (!$(this).hasClass('on')) {
+                $('.absent-select').removeClass('on');
+                $(this).addClass('on');
+            }
+            if (student != undefined) {
+                student.absent = $(this).attr('data-absent') == 'true';
+            }
+        });
+        $('#zoom-in-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', 1);
+            }
+        });
+        $('#zoom-out-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', -1);
+            }
+        });
+        $('#zoom-origin-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('set_zoom', 100);
+            }
+        });
+        $('#zoom-fit-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('fit');
+            }
+        });
+        if (ids.length == 0) {
+            alert('没有需要处理的考生,请返回重新搜索');
+            return;
         }
         }
+        process(1);
     });
     });
-    $('#zoom-origin-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('set_zoom', 100);
+
+    function process(index) {
+        if (index < 1) {
+            return;
         }
         }
-    });
-    $('#zoom-fit-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('fit');
+        if (index > ids.length) {
+            alert('所有考生已处理完毕,请返回重新搜索');
+            return;
         }
         }
-    });
-    if(ids.length==0){
-        alert('没有需要处理的考生,请返回重新搜索');
-        return;
+        current = index;
+        $('#answer-content').empty();
+        $('#image-holder').hide();
+        $('#save-button').attr("disabled", true);
+        $('#previous-button').attr("disabled", true);
+        $('#next-button').attr("disabled", true);
+        $.post('${ctx}/admin/exam/check/answer/info', {
+            studentId: ids[index - 1]
+        }, function (result) {
+            student = result;
+            render();
+        }).error(function () {
+            alert('获取考生信息出错');
+            onProcessFinish(true)
+        });
     }
     }
-    process(1);
-});
 
 
-function process(index){
-    if(index<1){
-        return;
-    }
-    if(index > ids.length){
-        alert('所有考生已处理完毕,请返回重新搜索');
-        return;
+    function onProcessFinish(error) {
+        if (!error) {
+            $('#save-button').removeAttr("disabled");
+        }
+        $('#previous-button').removeAttr("disabled");
+        $('#next-button').removeAttr("disabled");
     }
     }
-    current = index;
-    $('#answer-content').empty();
-    $('#image-holder').hide();
-    $('#save-button').attr("disabled", true);
-    $('#previous-button').attr("disabled", true);
-    $('#next-button').attr("disabled", true);
-    $.post('${ctx}/admin/exam/check/answer/info', {
-        studentId: ids[index-1]
-    }, function(result){
-        student = result;
-        render();
-    }).error(function() {
-        alert('获取考生信息出错');
-        onProcessFinish(true)
-    });
-}
 
 
-function onProcessFinish(error) {
-    if(!error) {
-        $('#save-button').removeAttr("disabled");
-    }
-    $('#previous-button').removeAttr("disabled");
-    $('#next-button').removeAttr("disabled");
-}
+    function render() {
+        $('#progress').html(current + '/' + ids.length);
+        $('#name').html(student.name);
+        $('#examNumber').html(student.examNumber);
+        $('#studentCode').html(student.studentCode);
+        $('#subject').html(student.subjectCode + '_' + student.subjectName);
+        $('#campusName').html(student.campusName);
+        $('#objectiveScore').html(student.objectiveScore);
+        $('#subjectiveScore').html(student.subjectiveScore);
 
 
-function render(){
-    $('#progress').html(current+'/'+ids.length);
-    $('#name').html(student.name);
-    $('#examNumber').html(student.examNumber);
-    $('#studentCode').html(student.studentCode);
-    $('#subject').html(student.subjectCode+'_'+student.subjectName);
-    $('#campusName').html(student.campusName);
-    $('#objectiveScore').html(student.objectiveScore);
-    $('#subjectiveScore').html(student.subjectiveScore);
-    
-    $('.absent-select').removeClass('on');
-    if(student.absent==true){
-        $('.absent-select[data-absent="true"]').addClass('on');
-    }else{
-        $('.absent-select[data-absent="false"]').addClass('on');
-    }
-    $('.form-t').find('input').on('input', onPaperTypeInput);
-    
-    var count = {};
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var title = student.titles[q.mainNumber];
-            var dom = $('#answer-content dl[number="'+q.mainNumber+'"]');
-            if(dom.length<1){
-                dom = $('<dl number="'+q.mainNumber+'"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
-                dom.find('span.b').html(student.titles[q.mainNumber]);
-            }
-            if(count[q.mainNumber]==undefined){
-                count[q.mainNumber] = 0;
-            }
-            count[q.mainNumber]++;
-            dom.find('span.num').html('('+count[q.mainNumber]+')');
-            
-            q.dom = $('<span class="input"><em>'+q.subNumber+'</em><input type="text" value="'+q.answer+'" number="'+i+'"/></span>').appendTo(dom.find('dd'));
-            if(title.indexOf('多项选择')>=0 || title.indexOf('多选')>=0){
-                q.dom.find('input').addClass('large');
+        $('.absent-select').removeClass('on');
+        if (student.absent == true) {
+            $('.absent-select[data-absent="true"]').addClass('on');
+        } else {
+            $('.absent-select[data-absent="false"]').addClass('on');
+        }
+        $('.form-t').find('input').on('input', onPaperTypeInput);
+
+        var count = {};
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var title = student.titles[q.mainNumber];
+                var dom = $('#answer-content dl[number="' + q.mainNumber + '"]');
+                if (dom.length < 1) {
+                    dom = $('<dl number="' + q.mainNumber + '"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
+                    dom.find('span.b').html(student.titles[q.mainNumber]);
+                }
+                if (count[q.mainNumber] == undefined) {
+                    count[q.mainNumber] = 0;
+                }
+                count[q.mainNumber]++;
+                dom.find('span.num').html('(' + count[q.mainNumber] + ')');
+
+                q.dom = $('<span class="input"><em>' + q.subNumber + '</em><input type="text" value="' + q.answer + '" number="' + i + '"/></span>').appendTo(dom.find('dd'));
+                if (title.indexOf('多项选择') >= 0 || title.indexOf('多选') >= 0) {
+                    q.dom.find('input').addClass('large');
+                }
+                q.dom.find('input').on('input', onAnswerInput);
+                q.dom.find('input').on('focus', onAnswerFocus);
             }
             }
-            q.dom.find('input').on('input', onAnswerInput);
-            q.dom.find('input').on('focus', onAnswerFocus);
+        }
+
+        if (iviewer == undefined) {
+            iviewer = $('#image-holder').iviewer({
+                src: '${fileServer}' + student.sheetUrls[0],
+                zoom_delta: 1.2,
+                zoom: 'fit',
+                zoom_min: 10,
+                mousewheel: false,
+                zoom_animation: false,
+                update_on_resize: true,
+                ui_disabled: true,
+                onFinishLoad: function (ev, url) {
+                    $('#image-holder').show();
+                    onProcessFinish(false);
+                },
+                onErrorLoad: function (ev, url) {
+                    onProcessFinish(true);
+                }
+            });
+        } else {
+            iviewer.iviewer('loadImage', '${fileServer}' + student.sheetUrls[0]);
         }
         }
     }
     }
 
 
-    if(iviewer==undefined){
-        iviewer = $('#image-holder').iviewer({
-            src: '${sheetServer}' + student.sheetUrls[0],
-            zoom_delta: 1.2,
-            zoom: 'fit',
-            zoom_min: 10,
-            mousewheel: false,
-            zoom_animation: false,
-            update_on_resize: true,
-            ui_disabled: true,
-            onFinishLoad: function(ev, url) {
-                $('#image-holder').show();
-                onProcessFinish(false);
-            },
-            onErrorLoad: function(ev, url) {
-                onProcessFinish(true);
+    function save() {
+        if (student == undefined) {
+            return;
+        }
+        var array = [];
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var value = q.dom.find('input').val();
+                if (value.length == 0) {
+                    value = '#';
+                }
+                array.push(value);
+            } else {
+                array.push(q.answer);
+            }
+        }
+        $.post('${ctx}/admin/exam/check/answer/save', {
+            studentId: student.id,
+            absent: student.absent,
+            answers: array.join(',')
+        }, function (result) {
+            if (result == true) {
+                process(current + 1);
+            } else {
+                alert('保存失败,请稍后重试');
             }
             }
         });
         });
-    }else{
-        iviewer.iviewer('loadImage', '${sheetServer}' + student.sheetUrls[0]);
     }
     }
-}
 
 
-function save(){
-    if(student==undefined){
-        return;
+    function onAnswerFocus() {
+        $(this)[0].select();
     }
     }
-    var array = [];
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var value = q.dom.find('input').val();
-            if(value.length==0){
-                value='#';
-            }
-            array.push(value);
-        }else{
-            array.push(q.answer);
+
+    function onAnswerInput() {
+        var value = $(this).val();
+        var q = student.answers[parseInt($(this).attr('number'))];
+        if (value.length > 1 && q.multi == false) {
+            value = value.substring(value.length - 1);
         }
         }
-    }
-    $.post('${ctx}/admin/exam/check/answer/save', {
-        studentId: student.id,
-        absent: student.absent,
-        answers: array.join(',')
-    }, function(result){
-        if(result==true){
-            process(current+1);
-        }else{
-            alert('保存失败,请稍后重试');
+        regex.lastIndex = 0;
+        if (value.length == 0 || regex.test(value) == false) {
+            value = '';
+        } else {
+            value = value.toUpperCase();
         }
         }
-    });
-}
-
-function onAnswerFocus(){
-    $(this)[0].select();
-}
-
-function onAnswerInput(){
-    var value = $(this).val();
-    var q = student.answers[parseInt($(this).attr('number'))];
-    if(value.length>1 && q.multi==false){
-        value = value.substring(value.length-1);
-    }
-    regex.lastIndex = 0;
-    if(value.length==0 || regex.test(value)==false){
-        value='';
-    }else{
-        value = value.toUpperCase();
-    }
-    $(this).val(value);
-}
-function onPaperTypeInput(){
-    var value = $(this).val();
-    if(value.length>1){
-        value = value.substring(value.length-1);
+        $(this).val(value);
     }
     }
-    var re = new RegExp("^[a-zA-Z#]+$"); 
-    if(value.length==0 || re.test(value)==false){
-        value='';
-    }else{
-        value = value.toUpperCase();
+
+    function onPaperTypeInput() {
+        var value = $(this).val();
+        if (value.length > 1) {
+            value = value.substring(value.length - 1);
+        }
+        var re = new RegExp("^[a-zA-Z#]+$");
+        if (value.length == 0 || re.test(value) == false) {
+            value = '';
+        } else {
+            value = value.toUpperCase();
+        }
+        $(this).val(value);
     }
     }
-    $(this).val(value);
-}
 </script>
 </script>
 </html>
 </html>

+ 217 - 215
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkStudentEdit.jsp

@@ -1,34 +1,36 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang="en">
 <html lang="en">
 <head>
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
-
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <link rel="stylesheet" href="${ctxStatic}/answer-check/css/style.css"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
+    
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
 </head>
 </head>
 <body id="index">
 <body id="index">
 <div class="wp">
 <div class="wp">
     <div id="top" class="top cl">
     <div id="top" class="top cl">
-        <div class="z"><div>
-            <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
-            <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
-            <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
-            <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
-            <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
-            <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
-            <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
-            <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
-        </div></div>
+        <div class="z">
+            <div>
+                <span class="b">进度:</span><span class="i" id="progress"></span><span class="pipe">|</span>
+                <span class="b">姓名:</span><span class="i" id="name"></span><span class="pipe">|</span>
+                <span class="b">准考证:</span><span class="i" id="examNumber"></span><span class="pipe">|</span>
+                <span class="b">学号:</span><span class="i" id="studentCode"></span><span class="pipe">|</span>
+                <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
+                <span class="b">学习中心:</span><span class="i" id="campusName"></span><span class="pipe">|</span>
+                <span class="b">客观总分:</span><span class="i r" id="objectiveScore"></span><span class="pipe">|</span>
+                <span class="b">主观总分:</span><span class="i r" id="subjectiveScore"></span>
+            </div>
+        </div>
         <div class="y cl">
         <div class="y cl">
             <div class="iviewer_zoom_in" id="zoom-in-button"></div>
             <div class="iviewer_zoom_in" id="zoom-in-button"></div>
             <div class="iviewer_zoom_out" id="zoom-out-button"></div>
             <div class="iviewer_zoom_out" id="zoom-out-button"></div>
@@ -41,24 +43,24 @@
         <div class="box">
         <div class="box">
             <div class="cont cl">
             <div class="cont cl">
                 <div id="left" class="left">
                 <div id="left" class="left">
-                        <div class="form-m">
-                      <!--       <div class="form-t">
-                                <span class="b">是否缺考:</span>
-                                <label>
-                                <span class="radio"><input type="button" class="absent-select" data-absent="true"></span><span>是</span>
-                                </label>
-                                <label>
-                                <span class="radio"><input type="button" class="absent-select" data-absent="false"></span><span>否</span>
-                                </label>
-                            </div> -->
-                            <div id="answer-content">
-                            </div>
-                        </div>
-                        <div class="form-b cl">
-                            <input type="button" id="save-button" value="保存"/>
-                            <input type="button" id="previous-button" class="next" value="上一张"/>
-                            <input type="button" id="next-button" class="next" value="下一张"/>
+                    <div class="form-m">
+                        <!--       <div class="form-t">
+                                  <span class="b">是否缺考:</span>
+                                  <label>
+                                  <span class="radio"><input type="button" class="absent-select" data-absent="true"></span><span>是</span>
+                                  </label>
+                                  <label>
+                                  <span class="radio"><input type="button" class="absent-select" data-absent="false"></span><span>否</span>
+                                  </label>
+                              </div> -->
+                        <div id="answer-content">
                         </div>
                         </div>
+                    </div>
+                    <div class="form-b cl">
+                        <input type="button" id="save-button" value="保存"/>
+                        <input type="button" id="previous-button" class="next" value="上一张"/>
+                        <input type="button" id="next-button" class="next" value="下一张"/>
+                    </div>
                 </div>
                 </div>
                 <div class="right">
                 <div class="right">
                     <div style="position:relative;" class="image-content" id="image-holder">
                     <div style="position:relative;" class="image-content" id="image-holder">
@@ -70,200 +72,200 @@
 </div>
 </div>
 </body>
 </body>
 <script type="text/javascript">
 <script type="text/javascript">
-var ids = [${ids}];
-var current;
-var student;
-var iviewer;
-var regex = /^[a-z]+$/ig;
-$(document).ready(function() {
-    $('#next-button').click(function(){
-        process(current+1);
-    });
-    $('#previous-button').click(function(){
-        process(current-1);
-    });
-    $('#save-button').click(save);
-    $('.absent-select').click(function(){
-        if(!$(this).hasClass('on')) {
-            $('.absent-select').removeClass('on');
-            $(this).addClass('on');
-        }
-        if(student!=undefined) {
-            student.absent = $(this).attr('data-absent')=='true';
-        }
-    });
-    $('#zoom-in-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', 1);
-        }
-    });
-    $('#zoom-out-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('zoom_by', -1);
+    var ids = [${ids}];
+    var current;
+    var student;
+    var iviewer;
+    var regex = /^[a-z]+$/ig;
+    $(document).ready(function () {
+        $('#next-button').click(function () {
+            process(current + 1);
+        });
+        $('#previous-button').click(function () {
+            process(current - 1);
+        });
+        $('#save-button').click(save);
+        $('.absent-select').click(function () {
+            if (!$(this).hasClass('on')) {
+                $('.absent-select').removeClass('on');
+                $(this).addClass('on');
+            }
+            if (student != undefined) {
+                student.absent = $(this).attr('data-absent') == 'true';
+            }
+        });
+        $('#zoom-in-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', 1);
+            }
+        });
+        $('#zoom-out-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', -1);
+            }
+        });
+        $('#zoom-origin-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('set_zoom', 100);
+            }
+        });
+        $('#zoom-fit-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('fit');
+            }
+        });
+        if (ids.length == 0) {
+            alert('没有需要处理的考生,请返回重新搜索');
+            return;
         }
         }
+        process(1);
     });
     });
-    $('#zoom-origin-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('set_zoom', 100);
+
+    function process(index) {
+        if (index < 1) {
+            return;
         }
         }
-    });
-    $('#zoom-fit-button').click(function(){
-        if(iviewer!=undefined) {
-            iviewer.iviewer('fit');
+        if (index > ids.length) {
+            alert('所有考生已处理完毕,请返回重新搜索');
+            return;
         }
         }
-    });
-    if(ids.length==0){
-        alert('没有需要处理的考生,请返回重新搜索');
-        return;
+        current = index;
+        $('#answer-content').empty();
+        $('#image-holder').hide();
+        $('#save-button').attr("disabled", true);
+        $('#previous-button').attr("disabled", true);
+        $('#next-button').attr("disabled", true);
+        $.post('${ctx}/admin/exam/check/answer/info', {
+            studentId: ids[index - 1]
+        }, function (result) {
+            student = result;
+            render();
+        }).error(function () {
+            alert('获取考生信息出错');
+            onProcessFinish(true)
+        });
     }
     }
-    process(1);
-});
 
 
-function process(index){
-    if(index<1){
-        return;
-    }
-    if(index > ids.length){
-        alert('所有考生已处理完毕,请返回重新搜索');
-        return;
+    function onProcessFinish(error) {
+        if (!error) {
+            $('#save-button').removeAttr("disabled");
+        }
+        $('#previous-button').removeAttr("disabled");
+        $('#next-button').removeAttr("disabled");
     }
     }
-    current = index;
-    $('#answer-content').empty();
-    $('#image-holder').hide();
-    $('#save-button').attr("disabled", true);
-    $('#previous-button').attr("disabled", true);
-    $('#next-button').attr("disabled", true);
-    $.post('${ctx}/admin/exam/check/answer/info', {
-        studentId: ids[index-1]
-    }, function(result){
-        student = result;
-        render();
-    }).error(function() {
-        alert('获取考生信息出错');
-        onProcessFinish(true)
-    });
-}
 
 
-function onProcessFinish(error) {
-    if(!error) {
-        $('#save-button').removeAttr("disabled");
-    }
-    $('#previous-button').removeAttr("disabled");
-    $('#next-button').removeAttr("disabled");
-}
+    function render() {
+        $('#progress').html(current + '/' + ids.length);
+        $('#name').html(student.name);
+        $('#examNumber').html(student.examNumber);
+        $('#studentCode').html(student.studentCode);
+        $('#subject').html(student.subjectCode + '_' + student.subjectName);
+        $('#campusName').html(student.campusName);
+        $('#objectiveScore').html(student.objectiveScore);
+        $('#subjectiveScore').html(student.subjectiveScore);
 
 
-function render(){
-    $('#progress').html(current+'/'+ids.length);
-    $('#name').html(student.name);
-    $('#examNumber').html(student.examNumber);
-    $('#studentCode').html(student.studentCode);
-    $('#subject').html(student.subjectCode+'_'+student.subjectName);
-    $('#campusName').html(student.campusName);
-    $('#objectiveScore').html(student.objectiveScore);
-    $('#subjectiveScore').html(student.subjectiveScore);
-    
-    $('.absent-select').removeClass('on');
-    if(student.absent==true){
-        $('.absent-select[data-absent="true"]').addClass('on');
-    }else{
-        $('.absent-select[data-absent="false"]').addClass('on');
-    }
-    
-    var count = {};
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var title = student.titles[q.mainNumber];
-            var dom = $('#answer-content dl[number="'+q.mainNumber+'"]');
-            if(dom.length<1){
-                dom = $('<dl number="'+q.mainNumber+'"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
-                dom.find('span.b').html(student.titles[q.mainNumber]);
-            }
-            if(count[q.mainNumber]==undefined){
-                count[q.mainNumber] = 0;
-            }
-            count[q.mainNumber]++;
-            dom.find('span.num').html('('+count[q.mainNumber]+')');
-            
-            q.dom = $('<span class="input"><em>'+q.subNumber+'</em><input type="text" value="'+q.answer+'" number="'+i+'"/></span>').appendTo(dom.find('dd'));
-            if(title.indexOf('多项选择')>=0 || title.indexOf('多选')>=0){
-                q.dom.find('input').addClass('large');
+        $('.absent-select').removeClass('on');
+        if (student.absent == true) {
+            $('.absent-select[data-absent="true"]').addClass('on');
+        } else {
+            $('.absent-select[data-absent="false"]').addClass('on');
+        }
+
+        var count = {};
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var title = student.titles[q.mainNumber];
+                var dom = $('#answer-content dl[number="' + q.mainNumber + '"]');
+                if (dom.length < 1) {
+                    dom = $('<dl number="' + q.mainNumber + '"><dt><span class="icon"></span><span class="b"></span><span class="num"></span></dt><dd></dd></dl>').appendTo($('#answer-content'));
+                    dom.find('span.b').html(student.titles[q.mainNumber]);
+                }
+                if (count[q.mainNumber] == undefined) {
+                    count[q.mainNumber] = 0;
+                }
+                count[q.mainNumber]++;
+                dom.find('span.num').html('(' + count[q.mainNumber] + ')');
+
+                q.dom = $('<span class="input"><em>' + q.subNumber + '</em><input type="text" value="' + q.answer + '" number="' + i + '"/></span>').appendTo(dom.find('dd'));
+                if (title.indexOf('多项选择') >= 0 || title.indexOf('多选') >= 0) {
+                    q.dom.find('input').addClass('large');
+                }
+                q.dom.find('input').on('input', onAnswerInput);
+                q.dom.find('input').on('focus', onAnswerFocus);
             }
             }
-            q.dom.find('input').on('input', onAnswerInput);
-            q.dom.find('input').on('focus', onAnswerFocus);
+        }
+
+        if (iviewer == undefined) {
+            iviewer = $('#image-holder').iviewer({
+                src: '${fileServer}' + student.sheetUrls[0],
+                zoom_delta: 1.2,
+                zoom: 'fit',
+                zoom_min: 10,
+                mousewheel: false,
+                zoom_animation: false,
+                update_on_resize: true,
+                ui_disabled: true,
+                onFinishLoad: function (ev, url) {
+                    $('#image-holder').show();
+                    onProcessFinish(false);
+                },
+                onErrorLoad: function (ev, url) {
+                    onProcessFinish(true);
+                }
+            });
+        } else {
+            iviewer.iviewer('loadImage', '${fileServer}' + student.sheetUrls[0]);
         }
         }
     }
     }
 
 
-    if(iviewer==undefined){
-        iviewer = $('#image-holder').iviewer({
-            src: '${sheetServer}' + student.sheetUrls[0],
-            zoom_delta: 1.2,
-            zoom: 'fit',
-            zoom_min: 10,
-            mousewheel: false,
-            zoom_animation: false,
-            update_on_resize: true,
-            ui_disabled: true,
-            onFinishLoad: function(ev, url) {
-                $('#image-holder').show();
-                onProcessFinish(false);
-            },
-            onErrorLoad: function(ev, url) {
-                onProcessFinish(true);
+    function save() {
+        if (student == undefined) {
+            return;
+        }
+        var array = [];
+        for (var i = 0; i < student.answers.length; i++) {
+            var q = student.answers[i];
+            if (q.exist == true) {
+                var value = q.dom.find('input').val();
+                if (value.length == 0) {
+                    value = '#';
+                }
+                array.push(value);
+            } else {
+                array.push(q.answer);
+            }
+        }
+        $.post('${ctx}/admin/exam/check/student/save', {
+            studentId: student.id,
+            absent: student.absent,
+            answers: array.join(',')
+        }, function (result) {
+            if (result == true) {
+                process(current + 1);
+            } else {
+                alert('保存失败,请稍后重试');
             }
             }
         });
         });
-    }else{
-        iviewer.iviewer('loadImage', '${sheetServer}' + student.sheetUrls[0]);
     }
     }
-}
 
 
-function save(){
-    if(student==undefined){
-        return;
+    function onAnswerFocus() {
+        $(this)[0].select();
     }
     }
-    var array = [];
-    for(var i=0;i<student.answers.length;i++){
-        var q = student.answers[i];
-        if(q.exist==true){
-            var value = q.dom.find('input').val();
-            if(value.length==0){
-                value='#';
-            }
-            array.push(value);
-        }else{
-            array.push(q.answer);
+
+    function onAnswerInput() {
+        var value = $(this).val();
+        var q = student.answers[parseInt($(this).attr('number'))];
+        if (value.length > 1 && q.multi == false) {
+            value = value.substring(value.length - 1);
         }
         }
-    }
-    $.post('${ctx}/admin/exam/check/student/save', {
-        studentId: student.id,
-        absent: student.absent,
-        answers: array.join(',')
-    }, function(result){
-        if(result==true){
-            process(current+1);
-        }else{
-            alert('保存失败,请稍后重试');
+        regex.lastIndex = 0;
+        if (value.length == 0 || regex.test(value) == false) {
+            value = '';
+        } else {
+            value = value.toUpperCase();
         }
         }
-    });
-}
-
-function onAnswerFocus(){
-    $(this)[0].select();
-}
-
-function onAnswerInput(){
-    var value = $(this).val();
-    var q = student.answers[parseInt($(this).attr('number'))];
-    if(value.length>1 && q.multi==false){
-        value = value.substring(value.length-1);
-    }
-    regex.lastIndex = 0;
-    if(value.length==0 || regex.test(value)==false){
-        value='';
-    }else{
-        value = value.toUpperCase();
+        $(this).val(value);
     }
     }
-    $(this).val(value);
-}
 </script>
 </script>
 </html>
 </html>

+ 7 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspected.jsp

@@ -195,7 +195,9 @@
         
         
         
         
         
         
-        ${sheetServer}' + student.sheetUrls[0],
+        
+        
+        ${fileServer}' + student.sheetUrls[0],
               zoom_delta: 1.2,
               zoom_delta: 1.2,
               zoom: 'fit',
               zoom: 'fit',
               zoom_min: 10,
               zoom_min: 10,
@@ -221,12 +223,14 @@
         
         
         
         
         
         
-        ${sheetServer}' + student.sheetUrls[0]);
+        
+        
+        ${fileServer}' + student.sheetUrls[0]);
     } */
     } */
         var pane = $('<canvas id="track-builder-canvas"></canvas>').appendTo($('#image-holder-track'));
         var pane = $('<canvas id="track-builder-canvas"></canvas>').appendTo($('#image-holder-track'));
         var canvas = document.getElementById('track-builder-canvas');
         var canvas = document.getElementById('track-builder-canvas');
         var ctx = canvas.getContext('2d');
         var ctx = canvas.getContext('2d');
-        buildImages('${sliceServer}', student.picUrls, student.pictureConfig, canvas, ctx, student.markTracks, student.markSpecialTagList);
+        buildImages('${fileServer}', student.picUrls, student.pictureConfig, canvas, ctx, student.markTracks, student.markSpecialTagList);
         $('#image-holder-track').show();
         $('#image-holder-track').show();
         onProcessFinish(false);
         onProcessFinish(false);
     }
     }

+ 106 - 105
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/jsonView.jsp

@@ -1,121 +1,122 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang="en">
 <html lang="en">
 <head>
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<link rel="stylesheet" type="text/css" href="${ctxStatic}/rich-text/css/rich-text.css">
-<script type="text/javascript" src="${ctxStatic}/rich-text/js/render.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <link rel="stylesheet" type="text/css" href="${ctxStatic}/rich-text/css/rich-text.css">
+    <script type="text/javascript" src="${ctxStatic}/rich-text/js/render.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
 
 
 </head>
 </head>
 <body id="index">
 <body id="index">
-	<div id="json-view-content" class="rich-text">
-	</div>
+<div id="json-view-content" class="rich-text">
+</div>
 </body>
 </body>
 <script type="text/javascript">
 <script type="text/javascript">
-var url = "${jsonServer}${answerUrl}";
-var questionNumbers ="${questionNumbers}";
+    var url = "${fileServer}${answerUrl}";
+    var questionNumbers = "${questionNumbers}";
 
 
-$(document).ready(function() {
-	initJsonPopover(url,questionNumbers); 
-});
-
-function initJsonPopover(url,questionNumbers){
-	questionNumbers = questionNumbers.split(",");
-	let questionArr = {};
-	questionNumbers.forEach(questionNumber => {
-		questionArr[questionNumber] = true;
+    $(document).ready(function () {
+        initJsonPopover(url, questionNumbers);
     });
     });
-	$('#json-view-content').empty();
-    $.ajax({  
-        type:"GET",  
-        url:url,  
-        dataType:"json",  
-        success:function(data){ 
-        	//var data ='[{"mainNumber": 6,"subNumber": 1,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"}]}]}}]';
-        	//data = JSON.parse(data);
-         	let questions = data || [];
-         	questions.forEach(question => {
-                 // 按题号过滤
-                 if (questionArr[question.mainNumber + "." + question.subNumber] === true || questionNumbers=="") {
-                     let numberTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "题号:" + question.mainNumber + "-" + question.subNumber
-                         }]
-                     };
-                     let bodyTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "题干:"
-                         }]
-                     };
-                     let answerTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "考生答案:"
-                         }, {
-                             "type": "text",
-                             "param": {
-                                 "italic": true,
-                                 "danger": true
-                             },
-                             "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
-                         }]
-                     };
-                     let standardTitle = {
-                         "blocks": [{
-                             "type": "text",
-                             "param": {"bold": true},
-                             "value": "标准答案:"
-                         }]
-                     };
-                     this.holder = $('#json-view-content');
-                     $(renderSection(numberTitle)).appendTo(this.holder);
-                     $(renderSection(bodyTitle)).appendTo(this.holder);
-                     if(question.parentBody!=null && question.parentBody!=undefined){
-     					$(renderRichText(question.parentBody)).appendTo(this.holder); 
-     				}
-                     $(renderRichText(question.body)).appendTo(this.holder);
-                     $(renderSection(answerTitle)).appendTo(this.holder);
-                     $(renderRichText(question.studentAnswer)).appendTo(this.holder);
-                     $(renderSection(standardTitle)).appendTo(this.holder);
-                     $(renderRichText(question.answer)).appendTo(this.holder);
-                 }
-             });
-             if (this.viewer != undefined) {
-                 this.viewer.destroy();
-             }
-         	const viewer = new Viewer($('#json-view-content')[0], {}); 
-          } 
-     }); 
 
 
-}
-function textCount(jsonBody) {
-    let sections = jsonBody.sections || [];
-    let count = 0;
-    sections.forEach(section => {
-        let blocks = section.blocks || [];
-        blocks.forEach(block => {
-            if (block.type === 'text' && block.value != undefined) {
-                count += block.value.length;
+    function initJsonPopover(url, questionNumbers) {
+        questionNumbers = questionNumbers.split(",");
+        let questionArr = {};
+        questionNumbers.forEach(questionNumber => {
+            questionArr[questionNumber] = true;
+        });
+        $('#json-view-content').empty();
+        $.ajax({
+            type: "GET",
+            url: url,
+            dataType: "json",
+            success: function (data) {
+                //var data ='[{"mainNumber": 6,"subNumber": 1,"body": {"sections": [{ "blocks":[{"type": "text","value": "我是题目我是题目我是题目"}]}]},"answer": {"sections": [{"blocks":[{"type": "audio","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/19/3_8_19_15748452552644264.mp3"}]}]},"studentAnswer": {"sections": [{"blocks":[{"type": "image","value": "https://ecs-test-static.qmth.com.cn/oe-answer-file/3/8/20/3_8_20_15748452889591137.jpeg"},{"type": "image","value": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1582709869784&di=39683b1330bd09bebd93c95fe925ca70&imgtype=0&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn10108%2F170%2Fw600h370%2F20190222%2Fd6de-htknpmh2595255.jpg"}]}]}}]';
+                //data = JSON.parse(data);
+                let questions = data || [];
+                questions.forEach(question => {
+                    // 按题号过滤
+                    if (questionArr[question.mainNumber + "." + question.subNumber] === true || questionNumbers == "") {
+                        let numberTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "题号:" + question.mainNumber + "-" + question.subNumber
+                            }]
+                        };
+                        let bodyTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "题干:"
+                            }]
+                        };
+                        let answerTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "考生答案:"
+                            }, {
+                                "type": "text",
+                                "param": {
+                                    "italic": true,
+                                    "danger": true
+                                },
+                                "value": "(字数统计:" + textCount(question.studentAnswer) + ")"
+                            }]
+                        };
+                        let standardTitle = {
+                            "blocks": [{
+                                "type": "text",
+                                "param": {"bold": true},
+                                "value": "标准答案:"
+                            }]
+                        };
+                        this.holder = $('#json-view-content');
+                        $(renderSection(numberTitle)).appendTo(this.holder);
+                        $(renderSection(bodyTitle)).appendTo(this.holder);
+                        if (question.parentBody != null && question.parentBody != undefined) {
+                            $(renderRichText(question.parentBody)).appendTo(this.holder);
+                        }
+                        $(renderRichText(question.body)).appendTo(this.holder);
+                        $(renderSection(answerTitle)).appendTo(this.holder);
+                        $(renderRichText(question.studentAnswer)).appendTo(this.holder);
+                        $(renderSection(standardTitle)).appendTo(this.holder);
+                        $(renderRichText(question.answer)).appendTo(this.holder);
+                    }
+                });
+                if (this.viewer != undefined) {
+                    this.viewer.destroy();
+                }
+                const viewer = new Viewer($('#json-view-content')[0], {});
             }
             }
         });
         });
-    });
-    return count;
-}
+
+    }
+
+    function textCount(jsonBody) {
+        let sections = jsonBody.sections || [];
+        let count = 0;
+        sections.forEach(section => {
+            let blocks = section.blocks || [];
+            blocks.forEach(block => {
+                if (block.type === 'text' && block.value != undefined) {
+                    count += block.value.length;
+                }
+            });
+        });
+        return count;
+    }
 </script>
 </script>
 
 
 
 

+ 177 - 166
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperList.jsp

@@ -1,167 +1,178 @@
-<%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
-<html>
-<head>
-	<title>试卷管理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
-</head>
-<body>
-	<div id="objImportBox" class="hide">
-		<form id="objImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
-			style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-			<input name="objective" type="hidden" value="true"/>
-			<input name="file" type="file" style="width:330px"/><br/><br/>  
-			<input class="btn btn-primary" type="submit" value="导入" onclick="goObjImport()"/>
-			<a href="${ctx}/admin/exam/paper/template?objective=true">下载模板</a>
-		</form>
-	</div>
-	<div id="subImportBox" class="hide">
-		<form id="subImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
-			style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-			<input name="objective" type="hidden" value="false"/>
-			<input name="file" type="file" style="width:330px"/><br/><br/>  
-			<input class="btn btn-primary" type="submit" value="导入" onclick="goSubImport()"/>
-			<a href="${ctx}/admin/exam/paper/template?objective=false">下载模板</a>
-		</form>
-	</div>
-	<%-- <%@include file="/WEB-INF/views/include/examInfoNavTabs.jsp" %> --%>
-	<form id="searchForm" action="${ctx}/admin/exam/paper" method="post" class="breadcrumb form-search">
-		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
-		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
-		<div>
-			<label>科目</label>
-			<select class="input-large" name="code" id="subject-select">
-				<option value="">请选择</option>
-				<c:forEach items="${subjectList}" var="subject">
-				<option value="${subject.code}" data-level="${subject.level}" <c:if test="${subject.code==query.code}">selected</c:if>>${subject.code}-${subject.name}</option>
-				</c:forEach>
-			</select>
-			<label>层次</label>
-			<select class="input-small" name="level" id="level-select">
-				<option value="">请选择</option>
-				<c:forEach items="${levelList}" var="level">
-				<option value="${level}" data-level="${level}" <c:if test="${level==query.level}">selected</c:if>>${level}</option>
-				</c:forEach>
-			</select>
-			<label>专业类型</label>
-			<select class="input-small" name="category" id="category-select">
-				<option value="">请选择</option>
-				<c:forEach items="${categoryList}" var="category">
-				<option value="${category}" <c:if test="${category==query.category}">selected</c:if>>${category}</option>
-				</c:forEach>
-			</select>
-			&nbsp;
-			<label>状态</label>
-			<select class="input-small" name="upload">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${upload!=null && upload==true}">selected</c:if>>已扫描</option>
-				<option value="0" <c:if test="${upload!=null && upload==false}">selected</c:if>>未扫描</option>
-			</select>
-			&nbsp;
-			<label>总分不等于</label>
-			<input type="text" name="totalScoreNotEqual" value="${query.totalScoreNotEqual}"  maxlength="10" class="input-mini"/>
-			<br/><br/>
-			&nbsp;
-			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-			<c:if test="${web_user.schoolAdmin==true}">
-			&nbsp;
-			<div class="btn-group">
-				<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-					导入<span class="caret"></span>
-				</a>
-				<ul class="dropdown-menu">
-					<li><a href="##" id="obj-import">客观题</a></li>
-					<li><a href="##" id="sub-import">主观题</a></li>
-				</ul>
-			</div>
-			</c:if>
-			&nbsp;
-			<div class="btn-group">
-				<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-					导出<span class="caret"></span>
-				</a>
-				<ul class="dropdown-menu">
-					<li><a href="${ctx}/admin/exam/paper/export?objective=true">客观题</a></li>
-					<li><a href="${ctx}/admin/exam/paper/export?objective=false">主观题</a></li>
-				</ul>
-			</div>
-		</div>
-	</form>
-	<tags:message content="${message}"/>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>科目名称</th>
-				<th>层次</th>
-				<th>专业类型</th>
-				<th>试卷</th>
-				<th>答案</th>
-				<th>客观总分</th>
-				<th>主观总分</th>
-				<th>试卷总分</th>
-				<th>操作</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${query.result}" var="subject">
-			<tr>
-				<td>
-					<a href="${ctx}/admin/exam/paper/detail?subjectCode=${subject.code}">${subject.code}-${subject.name}&nbsp;${subject.remark}</a>
-				</td>
-				<td>${subject.level}</td>
-				<td>${subject.category}</td>
-				<td>
-				<c:if test="${subject.hasPaper}">
-				<a href="${cardServer}${subject.paperUrl}" target="_blank">已上传</a>
-				</c:if>
-				</td>
-				<td>
-				<c:if test="${subject.hasAnswer}">
-				<a href="${cardServer}${subject.answerUrl}" target="_blank">已上传</a>
-				</c:if>
-				</td>
-				<td>${subject.objectiveScore}</td>
-				<td>${subject.subjectiveScore}</td>
-				<td>${subject.totalScore}</td>
-				<td>
-				<c:if test="${examType!='MULTI_MEDIA'}">
-				<a href="${ctx}/admin/exam/subject/edit?code=${subject.code}">原图遮盖</a>
-				</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-<script type="text/javascript">
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#pageSize").val(s);
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-	$("#pageNumber").val(1);
-	$("#pageSize").val('${query.pageSize}');
-	$("#searchForm").submit();
-	return false;
-}
-$("#obj-import").click(function(){
-	$.jBox($("#objImportBox").html(), {title:"导入客观题", buttons:{"关闭":true}, 
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-$("#sub-import").click(function(){
-	$.jBox($("#subImportBox").html(), {title:"导入主观题", buttons:{"关闭":true}, 
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-function goObjImport(){
-    alert("导入后请务必重新统分");
-};
-function goSubImport(){
-    alert("导入后请务必重新统分");
-};
-</script>	
-</body>
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title>试卷管理</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
+</head>
+<body>
+<div id="objImportBox" class="hide">
+    <form id="objImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <input name="objective" type="hidden" value="true"/>
+        <input name="file" type="file" style="width:330px"/><br/><br/>  
+        <input class="btn btn-primary" type="submit" value="导入" onclick="goObjImport()"/>
+        <a href="${ctx}/admin/exam/paper/template?objective=true">下载模板</a>
+    </form>
+</div>
+<div id="subImportBox" class="hide">
+    <form id="subImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <input name="objective" type="hidden" value="false"/>
+        <input name="file" type="file" style="width:330px"/><br/><br/>  
+        <input class="btn btn-primary" type="submit" value="导入" onclick="goSubImport()"/>
+        <a href="${ctx}/admin/exam/paper/template?objective=false">下载模板</a>
+    </form>
+</div>
+<%-- <%@include file="/WEB-INF/views/include/examInfoNavTabs.jsp" %> --%>
+<form id="searchForm" action="${ctx}/admin/exam/paper" method="post" class="breadcrumb form-search">
+    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
+    <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+    <div>
+        <label>科目</label>
+        <select class="input-large" name="code" id="subject-select">
+            <option value="">请选择</option>
+            <c:forEach items="${subjectList}" var="subject">
+                <option value="${subject.code}" data-level="${subject.level}" <c:if test="${subject.code==query.code}">selected</c:if>>${subject.code}-${subject.name}</option>
+            </c:forEach>
+        </select>
+        <label>层次</label>
+        <select class="input-small" name="level" id="level-select">
+            <option value="">请选择</option>
+            <c:forEach items="${levelList}" var="level">
+                <option value="${level}" data-level="${level}" <c:if test="${level==query.level}">selected</c:if>>${level}</option>
+            </c:forEach>
+        </select>
+        <label>专业类型</label>
+        <select class="input-small" name="category" id="category-select">
+            <option value="">请选择</option>
+            <c:forEach items="${categoryList}" var="category">
+                <option value="${category}" <c:if test="${category==query.category}">selected</c:if>>${category}</option>
+            </c:forEach>
+        </select>
+        &nbsp;
+        <label>状态</label>
+        <select class="input-small" name="upload">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${upload!=null && upload==true}">selected</c:if>>已扫描</option>
+            <option value="0" <c:if test="${upload!=null && upload==false}">selected</c:if>>未扫描</option>
+        </select>
+        &nbsp;
+        <label>总分不等于</label>
+        <input type="text" name="totalScoreNotEqual" value="${query.totalScoreNotEqual}" maxlength="10" class="input-mini"/>
+        <br/><br/>
+        &nbsp;
+        <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+        <c:if test="${web_user.schoolAdmin==true}">
+            &nbsp;
+            <div class="btn-group">
+                <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+                    导入<span class="caret"></span>
+                </a>
+                <ul class="dropdown-menu">
+                    <li><a href="##" id="obj-import">客观题</a></li>
+                    <li><a href="##" id="sub-import">主观题</a></li>
+                </ul>
+            </div>
+        </c:if>
+        &nbsp;
+        <div class="btn-group">
+            <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+                导出<span class="caret"></span>
+            </a>
+            <ul class="dropdown-menu">
+                <li><a href="${ctx}/admin/exam/paper/export?objective=true">客观题</a></li>
+                <li><a href="${ctx}/admin/exam/paper/export?objective=false">主观题</a></li>
+            </ul>
+        </div>
+    </div>
+</form>
+<tags:message content="${message}"/>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>科目名称</th>
+        <th>层次</th>
+        <th>专业类型</th>
+        <th>试卷</th>
+        <th>答案</th>
+        <th>客观总分</th>
+        <th>主观总分</th>
+        <th>试卷总分</th>
+        <th>操作</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${query.result}" var="subject">
+        <tr>
+            <td>
+                <a href="${ctx}/admin/exam/paper/detail?subjectCode=${subject.code}">${subject.code}-${subject.name}&nbsp;${subject.remark}</a>
+            </td>
+            <td>${subject.level}</td>
+            <td>${subject.category}</td>
+            <td>
+                <c:if test="${subject.paperUrl != null}">
+                    <a href="${fileServer}${subject.paperUrl}" target="_blank">已上传</a>
+                </c:if>
+            </td>
+            <td>
+                <c:if test="${subject.answerUrl != null}">
+                    <a href="${fileServer}${subject.answerUrl}" target="_blank">已上传</a>
+                </c:if>
+            </td>
+            <td>${subject.objectiveScore}</td>
+            <td>${subject.subjectiveScore}</td>
+            <td>${subject.totalScore}</td>
+            <td>
+                <c:if test="${examType!='MULTI_MEDIA'}">
+                    <a href="${ctx}/admin/exam/subject/edit?code=${subject.code}">原图遮盖</a>
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${query}</div>
+<script type="text/javascript">
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function goSearch() {
+        $("#pageNumber").val(1);
+        $("#pageSize").val('${query.pageSize}');
+        $("#searchForm").submit();
+        return false;
+    }
+
+    $("#obj-import").click(function () {
+        $.jBox($("#objImportBox").html(), {
+            title: "导入客观题", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
+    });
+    $("#sub-import").click(function () {
+        $.jBox($("#subImportBox").html(), {
+            title: "导入主观题", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
+    });
+
+    function goObjImport() {
+        alert("导入后请务必重新统分");
+    };
+
+    function goSubImport() {
+        alert("导入后请务必重新统分");
+    };
+</script>
+</body>
 </html>
 </html>

+ 66 - 69
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcess.jsp

@@ -1,77 +1,74 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/sheet-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
 
 
 </head>
 </head>
 <body>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'quality-process': {
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-            $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function(taskList){
-                mc.setTask(taskList[0]);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            modules: {
+                'single-image-view': {},
+                'image-builder': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'quality-process': {},
+                'sheet-view': {
+                    server: '${fileServer}'
+                },
+                'warning-info': {},
+                'thumbnail': {},
+                'view-sidebar': {
+                    list: [
+                        {title: '试卷', url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'},
+                        {title: '答案', url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'}
+                    ]
+                }
+            }
+        });
+        $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function (taskList) {
+            mc.setTask(taskList[0]);
+        });
+    });
+</script>
 </body>
 </body>
 </html>
 </html>

+ 64 - 66
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityProcessJson.jsp

@@ -1,74 +1,72 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
-<script src="${ctxStatic}/rich-text/js/render.js"></script>
-<link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
-<link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
+    <title>云阅卷高校版</title>
+    <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
+    <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
+    
+    <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
+    <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
+    
+    <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
+    <script src="${ctxStatic}/rich-text/js/render.js"></script>
+    <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/header-mark-status.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/image-builder.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/warning-info.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/thumbnail.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/single-image-view.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/quality-process.js"></script>
 
 
 </head>
 </head>
 <body>
 <body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutTitle: '关闭',
-				logoutUrl: 'javascript:window.close()',
-				modules : {
-					'json-loader': {
-	                    jsonServer: '${jsonServer}'
-	                },
-	                'json-view': {},
-					'header-mark-status': {
-						title : '${subject.code}_${subject.name}_${group.title}'
-					},
-					'quality-process': {
-					},
-					'warning-info': {
-					}
-				}
-			});
-            $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function(taskList){
-                mc.setTask(taskList[0]);
-            });
-		});
-	</script>
+<div class="container-fluid" id="container"></div>
+<script type="text/javascript">
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            staticServer: '${ctxStatic}',
+            imageServer: '${fileServer}',
+            userName: '${web_user.name}',
+            logoutTitle: '关闭',
+            logoutUrl: 'javascript:window.close()',
+            modules: {
+                'json-loader': {
+                    jsonServer: '${fileServer}'
+                },
+                'json-view': {},
+                'header-mark-status': {
+                    title: '${subject.code}_${subject.name}_${group.title}'
+                },
+                'quality-process': {},
+                'warning-info': {}
+            }
+        });
+        $.post('${ctx}/admin/exam/quality/history?markerId=${markerId}&markerScore=${markerScore}&pageSize=1', {}, function (taskList) {
+            mc.setTask(taskList[0]);
+        });
+    });
+</script>
 </body>
 </body>
 </html>
 </html>

+ 79 - 74
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scanPackage.jsp

@@ -1,83 +1,88 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <html>
 <head>
 <head>
-	<title>扫描进度</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+    <title>扫描进度</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
 </head>
 </head>
 <body>
 <body>
-	<ul class="nav nav-tabs">
-		<li><a href="${ctx}/admin/exam/scan/subject">按科目统计</a></li>
-		<!--<li><a href="${ctx}/admin/exam/scan/campus">按学习中心统计</a></li>-->
-		<li class="active"><a href="${ctx}/admin/exam/scan/package">统计签到表</a></li>
-	</ul>
-	<form id="searchForm" action="${ctx}/admin/exam/scan/package" method="post" class="breadcrumb form-search">
-		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
-		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
-
-		<label>编号</label>
-		<input type="text" name="code" value="${query.code}" class="input-medium"/>
-		&nbsp;
-		<label>状态</label>
-		<select name="upload" class="input-small">
-			<option value="">不限</option>
-			<option value="false" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
-			<option value="true" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
-		</select>
-		&nbsp;
-		<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-		&nbsp;
-		<input id="btnTotalCount" class="btn" type="button" value="总数:${totalCount}"/>
-	</form>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>签到表编号</th>
-				<th>图片数量</th>
-				<th>查看图片</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${packageList}" var="pac">
-			<tr>
-				<td>${pac.code}</td>
-				<td>${pac.picCount}</td>
-				<td>
-				<a class="view-link" href="##" data-image-url="${pac.urlString}" data-title="${pac.code}">查看</a>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/exam/scan/subject">按科目统计</a></li>
+    <!--<li><a href="${ctx}/admin/exam/scan/campus">按学习中心统计</a></li>-->
+    <li class="active"><a href="${ctx}/admin/exam/scan/package">统计签到表</a></li>
+</ul>
+<form id="searchForm" action="${ctx}/admin/exam/scan/package" method="post" class="breadcrumb form-search">
+    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
+    <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+    
+    <label>编号</label>
+    <input type="text" name="code" value="${query.code}" class="input-medium"/>
+    &nbsp;
+    <label>状态</label>
+    <select name="upload" class="input-small">
+        <option value="">不限</option>
+        <option value="false" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
+        <option value="true" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
+    </select>
+    &nbsp;
+    <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+    &nbsp;
+    <input id="btnTotalCount" class="btn" type="button" value="总数:${totalCount}"/>
+</form>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>签到表编号</th>
+        <th>图片数量</th>
+        <th>查看图片</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${packageList}" var="pac">
+        <tr>
+            <td>${pac.code}</td>
+            <td>${pac.picCount}</td>
+            <td>
+                <a class="view-link" href="##" data-image-url="${pac.urlString}" data-title="${pac.code}">查看</a>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${query}</div>
+<%@include file="/WEB-INF/views/include/imageView.jsp" %>
 <script type="text/javascript">
 <script type="text/javascript">
-$(document).ready(function() {
-    /* new jBox('Image', {
-    	imageFade: 0,
-    	delayOpen: 0,
-    	delayClose: 0,
-    	maxHeight: $(window).height()*0.88
-    }); */
-    $('.view-link').click(function(){
-    	initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
-    	return false;
+    $(document).ready(function () {
+        /* new jBox('Image', {
+            imageFade: 0,
+            delayOpen: 0,
+            delayClose: 0,
+            maxHeight: $(window).height()*0.88
+        }); */
+        $('.view-link').click(function () {
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
+            return false;
+        });
     });
     });
-});
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#pageSize").val(s);
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-	$("#pageNumber").val(1);
-	$("#pageSize").val('${query.pageSize}');
-	$("#searchForm").submit();
-	return false;
-}
-</script>	
+
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function goSearch() {
+        $("#pageNumber").val(1);
+        $("#pageSize").val('${query.pageSize}');
+        $("#searchForm").submit();
+        return false;
+    }
+</script>
 </body>
 </body>
 </html>
 </html>

+ 102 - 98
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreDetail.jsp

@@ -1,107 +1,111 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <html>
 <head>
 <head>
-	<title>分数查询</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
-	
-	<link rel="stylesheet" type="text/css" href="${ctxStatic}/jBox/Source/jBox.css">
-	<script type="text/javascript" src="${ctxStatic}/jBox/Source/jBox.min.js"></script>
+    <title>分数查询</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
+    
+    <link rel="stylesheet" type="text/css" href="${ctxStatic}/jBox/Source/jBox.css">
+    <script type="text/javascript" src="${ctxStatic}/jBox/Source/jBox.min.js"></script>
 </head>
 </head>
 <body>
 <body>
-	<form id="searchForm" action="" method="post" class="breadcrumb form-search">
-		<div>
-			<label>姓名:${student.name}</label>
-			<label>准考证号:${student.examNumber}</label>
-			<label>学号:${student.studentCode}</label>
-			<label>科目:${student.subjectCode}-${student.subjectName}</label>
-			<label>客观总分:${student.objectiveScore}</label>
-			<label>主观总分:${student.subjectiveScore}</label>
-			<label>试卷总分:${student.totalScore}</label>
-			<br/>
-			&nbsp;
-			<a class="btn sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>" data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
-			&nbsp;
-			<a class="btn package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">签到表</a>		
-			<c:if test="${web_user.schoolAdmin==true}">
-			&nbsp;
-			<a class="btn btn-warning" href="##" id="edit-button">保存</a>
-			</c:if>
-			&nbsp;
-			<a class="btn" href="${ctx}/admin/exam/score?${queryString}">返回</a>
-		</div>
-	</form>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>题目</th>
-				<th>分数</th>
-				<th>答案</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${scoreList}" var="item">
-			<tr class="score-tr" data-objective="${item.objective}">
-				<td>${item.title}</td>
-				<td><input class="score-input" value="${item.scoreString}"/></td>
-				<td>
-				<c:if test="${item.objective==true}">
-				<input class="answer-input" value="${item.answer}"/>
-				</c:if>
-				<c:if test="${item.objective==false}">
-				&nbsp;
-				</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<%@include file="/WEB-INF/views/include/sheetView.jsp" %>
-	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
+<form id="searchForm" action="" method="post" class="breadcrumb form-search">
+    <div>
+        <label>姓名:${student.name}</label>
+        <label>准考证号:${student.examNumber}</label>
+        <label>学号:${student.studentCode}</label>
+        <label>科目:${student.subjectCode}-${student.subjectName}</label>
+        <label>客观总分:${student.objectiveScore}</label>
+        <label>主观总分:${student.subjectiveScore}</label>
+        <label>试卷总分:${student.totalScore}</label>
+        <br/>
+        &nbsp;
+        <a class="btn sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
+           data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
+        &nbsp;
+        <a class="btn package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">签到表</a>
+        <c:if test="${web_user.schoolAdmin==true}">
+            &nbsp;
+            <a class="btn btn-warning" href="##" id="edit-button">保存</a>
+        </c:if>
+        &nbsp;
+        <a class="btn" href="${ctx}/admin/exam/score?${queryString}">返回</a>
+    </div>
+</form>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>题目</th>
+        <th>分数</th>
+        <th>答案</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${scoreList}" var="item">
+        <tr class="score-tr" data-objective="${item.objective}">
+            <td>${item.title}</td>
+            <td><input class="score-input" value="${item.scoreString}"/></td>
+            <td>
+                <c:if test="${item.objective==true}">
+                    <input class="answer-input" value="${item.answer}"/>
+                </c:if>
+                <c:if test="${item.objective==false}">
+                    &nbsp;
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<%@include file="/WEB-INF/views/include/sheetView.jsp" %>
+<%@include file="/WEB-INF/views/include/imageView.jsp" %>
 <script type="text/javascript">
 <script type="text/javascript">
-var examNumber = '${student.examNumber}';
-$(document).ready(function() {
-    /* new jBox('Image', {
-    	imageFade: 0,
-    	delayOpen: 0,
-    	delayClose: 0,
-    	maxHeight: $(window).height()*0.88
-    }); */
-    $('.sheet-link').click(function(){
-    	initSheetPopover($(this).attr('data-title'), '', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
-    	return false;
+    var examNumber = '${student.examNumber}';
+    $(document).ready(function () {
+        /* new jBox('Image', {
+            imageFade: 0,
+            delayOpen: 0,
+            delayClose: 0,
+            maxHeight: $(window).height()*0.88
+        }); */
+        $('.sheet-link').click(function () {
+            initSheetPopover($(this).attr('data-title'), '', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+            return false;
+        });
+        $('.package-link').click(function () {
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
+            return false;
+        });
+        $('#edit-button').click(function () {
+            var o = [];
+            var s = [];
+            $('tr.score-tr').each(function (index, obj) {
+                var tr = $(obj);
+                if (tr.attr('data-objective') == 'true') {
+                    o.push(tr.find('.answer-input').val() + ':' + tr.find('.score-input').val());
+                } else {
+                    s.push(tr.find('.score-input').val());
+                }
+            });
+            $.post('${ctx}/admin/exam/score/edit', {
+                examNumber: examNumber,
+                objectiveItems: o.join(';'),
+                subjectiveItems: s.join(';')
+            }, function (result) {
+                if (result.success == true) {
+                    alert('修改成功');
+                    window.location.reload();
+                } else {
+                    alert(result.message);
+                }
+            });
+        });
     });
     });
-    $('.package-link').click(function(){
-    	initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
-    	return false;
-    });
-    $('#edit-button').click(function(){
-    	var o = [];
-    	var s = [];
-    	$('tr.score-tr').each(function(index, obj){
-    		var tr = $(obj);
-    		if(tr.attr('data-objective')=='true'){
-    			o.push(tr.find('.answer-input').val()+':'+tr.find('.score-input').val());
-    		}else{
-    			s.push(tr.find('.score-input').val());
-    		}
-    	});
-    	$.post('${ctx}/admin/exam/score/edit', {
-    		examNumber: examNumber,
-    		objectiveItems: o.join(';'),
-    		subjectiveItems: s.join(';')
-    	}, function(result){
-    		if(result.success==true){
-    			alert('修改成功');
-    			window.location.reload();
-    		}else{
-    			alert(result.message);
-    		}
-    	});
-    });
-});
-</script>	
+</script>
 </body>
 </body>
 </html>
 </html>

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp

@@ -174,7 +174,7 @@
                 <c:if test="${student.upload==true}">
                 <c:if test="${student.upload==true}">
                     <c:if test="${examType!='MULTI_MEDIA'}">
                     <c:if test="${examType!='MULTI_MEDIA'}">
                         <a class="sheet-link" href="##" data-id="${student.id}" data-sheet-url="${student.sheetUrlString}"
                         <a class="sheet-link" href="##" data-id="${student.id}" data-sheet-url="${student.sheetUrlString}"
-                           data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>"
+                           data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
                            data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
                            data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
                         <a href="${ctx}/admin/exam/track/student/${student.id}" target="_blank">轨迹图</a>
                         <a href="${ctx}/admin/exam/track/student/${student.id}" target="_blank">轨迹图</a>
                     </c:if>
                     </c:if>
@@ -207,7 +207,7 @@
             return false;
             return false;
         });
         });
         $('.package-link').click(function () {
         $('.package-link').click(function () {
-            initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
             return false;
             return false;
         });
         });
         $('#subject-select').change(function () {
         $('#subject-select').change(function () {

+ 3 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentList.jsp

@@ -157,7 +157,7 @@
             <td>
             <td>
                 <c:if test="${student.upload==true}">
                 <c:if test="${student.upload==true}">
                     <c:if test="${examType!='MULTI_MEDIA'}">
                     <c:if test="${examType!='MULTI_MEDIA'}">
-                        <a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>"
+                        <a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
                            data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
                            data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
                     </c:if>
                     </c:if>
                     <c:if test="${examType=='MULTI_MEDIA'}">
                     <c:if test="${examType=='MULTI_MEDIA'}">
@@ -224,11 +224,11 @@
 
 
     $(document).ready(function () {
     $(document).ready(function () {
         $('.sheet-link').click(function () {
         $('.sheet-link').click(function () {
-            initSheetPopover($(this).attr('data-title'), '${imageServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+            initSheetPopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
             return false;
             return false;
         });
         });
         $('.package-link').click(function () {
         $('.package-link').click(function () {
-            initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
+            initImagePopover($(this).attr('data-title'), '${fileServer}', $(this).attr('data-image-url'));
             return false;
             return false;
         });
         });
     });
     });

+ 90 - 90
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentTrack.jsp

@@ -1,112 +1,112 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang="en">
 <html lang="en">
 <head>
 <head>
-<meta charset="UTF-8">
-<title>云阅卷</title>
-<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
 </head>
 </head>
 <body>
 <body>
 <canvas id="canvas"></canvas>
 <canvas id="canvas"></canvas>
 </body>
 </body>
 <script type="text/javascript">
 <script type="text/javascript">
-var imageServer = '${imageServer}';
-var urls = '${urls}'.split(',');
-var tags = JSON.parse('${tags}');
-var ctx;
-$(document).ready(function() {
-    var images = [];
-    var count = 0;
-    for(var i=0;i<urls.length;i++) {
-        var image = new Image();
-        images.push(image);
-        image.src = imageServer+urls[i];
-        image.onload = function(){
-            this.loaded = true;
-            count++;
-            
-            if(count==urls.length) {
-                render(images);
+    var imageServer = '${fileServer}';
+    var urls = '${urls}'.split(',');
+    var tags = JSON.parse('${tags}');
+    var ctx;
+    $(document).ready(function () {
+        var images = [];
+        var count = 0;
+        for (var i = 0; i < urls.length; i++) {
+            var image = new Image();
+            images.push(image);
+            image.src = imageServer + urls[i];
+            image.onload = function () {
+                this.loaded = true;
+                count++;
+
+                if (count == urls.length) {
+                    render(images);
+                }
             }
             }
         }
         }
-    }
-});
+    });
 
 
-function render(images) {
-    var maxWidth=0;
-    var totalHeight=0;
-    for(var i=0;i<images.length;i++) {
-        images[i].left = 0;
-        images[i].top = totalHeight;
-        maxWidth = Math.max(maxWidth, images[i].width);
-        totalHeight += images[i].height;
-    }
-    
-    var canvas = $('#canvas')[0];
-    canvas.width = maxWidth;
-    canvas.height = totalHeight;
-    ctx = canvas.getContext('2d');
-    for(var i=0;i<images.length;i++) {
-        ctx.drawImage(images[i], 0, 0, images[i].width, images[i].height, images[i].left, images[i].top, images[i].width, images[i].height);
-    }
-    
-    for(var i=0;i<tags.length;i++) {
-        renderGroup(tags[i], images)
-    }
-}
+    function render(images) {
+        var maxWidth = 0;
+        var totalHeight = 0;
+        for (var i = 0; i < images.length; i++) {
+            images[i].left = 0;
+            images[i].top = totalHeight;
+            maxWidth = Math.max(maxWidth, images[i].width);
+            totalHeight += images[i].height;
+        }
 
 
-function renderGroup(group, images) {
-    var configs = group.config;
-    var tags = group.tags;
-    if(configs.length==0 || tags.length==0) {
-        return;
-    }
-    
-    var maxWidth = 0;
-    var totalHeight = 0;
-    // 计算评卷分组拼接图的总高度与最大宽度
-    for (var i=0;i<configs.length;i++) {
-        var config = configs[i];
-        if (config.w == 0 || config.h == 0) {
-            // 兼容老数据,宽高未设置时,表示直接使用整张裁切图
-            var image = images[config.i-1];
-            if(image!=undefined) {
-                config.w = image.width;
-                config.h = image.height;
-            }
+        var canvas = $('#canvas')[0];
+        canvas.width = maxWidth;
+        canvas.height = totalHeight;
+        ctx = canvas.getContext('2d');
+        for (var i = 0; i < images.length; i++) {
+            ctx.drawImage(images[i], 0, 0, images[i].width, images[i].height, images[i].left, images[i].top, images[i].width, images[i].height);
         }
         }
-        if (config.w > 0 && config.h > 0) {
-            maxWidth = Math.max(maxWidth, config.w);
-            totalHeight += config.h;
+
+        for (var i = 0; i < tags.length; i++) {
+            renderGroup(tags[i], images)
         }
         }
     }
     }
-    
-    // 遍历所有显示元素
-    for (var i=0;i<tags.length;i++) {
-        var tag = tags[i];
-        // 计算显示元素在拼接图内的绝对位置
-        var left = maxWidth * tag.positionX;
-        var top = totalHeight * tag.positionY;
-        var start = 0;
-        for (var j=0;j<configs.length;j++) {
-            var config = configs[j];
+
+    function renderGroup(group, images) {
+        var configs = group.config;
+        var tags = group.tags;
+        if (configs.length == 0 || tags.length == 0) {
+            return;
+        }
+
+        var maxWidth = 0;
+        var totalHeight = 0;
+        // 计算评卷分组拼接图的总高度与最大宽度
+        for (var i = 0; i < configs.length; i++) {
+            var config = configs[i];
+            if (config.w == 0 || config.h == 0) {
+                // 兼容老数据,宽高未设置时,表示直接使用整张裁切图
+                var image = images[config.i - 1];
+                if (image != undefined) {
+                    config.w = image.width;
+                    config.h = image.height;
+                }
+            }
             if (config.w > 0 && config.h > 0) {
             if (config.w > 0 && config.h > 0) {
-                var image = images[config.i-1];
-                if (top <= (config.h + start) && image!=undefined) {
-                    // 根据绝对高度判断显示元素是否落在当前拼接块
-                    ctx.font ="60px Arial";
-                    ctx.fillStyle ='red';
-                    ctx.fillText(tag.content, Math.max(60,left+config.x+image.left), Math.max(60,top-start+config.y+image.top));
-                    break;
-                } else {
-                    start += config.h;
+                maxWidth = Math.max(maxWidth, config.w);
+                totalHeight += config.h;
+            }
+        }
+
+        // 遍历所有显示元素
+        for (var i = 0; i < tags.length; i++) {
+            var tag = tags[i];
+            // 计算显示元素在拼接图内的绝对位置
+            var left = maxWidth * tag.positionX;
+            var top = totalHeight * tag.positionY;
+            var start = 0;
+            for (var j = 0; j < configs.length; j++) {
+                var config = configs[j];
+                if (config.w > 0 && config.h > 0) {
+                    var image = images[config.i - 1];
+                    if (top <= (config.h + start) && image != undefined) {
+                        // 根据绝对高度判断显示元素是否落在当前拼接块
+                        ctx.font = "60px Arial";
+                        ctx.fillStyle = 'red';
+                        ctx.fillText(tag.content, Math.max(60, left + config.x + image.left), Math.max(60, top - start + config.y + image.top));
+                        break;
+                    } else {
+                        start += config.h;
+                    }
                 }
                 }
             }
             }
         }
         }
     }
     }
-}
 </script>
 </script>
 </html>
 </html>

+ 30 - 30
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/mark.jsp

@@ -1,23 +1,23 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title>高校版阅卷系统</title>
     <title>高校版阅卷系统</title>
-    <link type="text/css" href="${ctxStatic}/mark/style/bootstrap.css" rel="stylesheet" />
+    <link type="text/css" href="${ctxStatic}/mark/style/bootstrap.css" rel="stylesheet"/>
     <link type="text/css" href="${ctxStatic}/mark/style/style.css" rel="stylesheet"/>
     <link type="text/css" href="${ctxStatic}/mark/style/style.css" rel="stylesheet"/>
     
     
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.mousewheel.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.mousewheel.min.js"></script>
-	
+    
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.iviewer.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/jquery.iviewer.js"></script>
-    <link rel="stylesheet" href="${ctxStatic}/mark/style/jquery.iviewer.css" rel="stylesheet" />
-
+    <link rel="stylesheet" href="${ctxStatic}/mark/style/jquery.iviewer.css" rel="stylesheet"/>
+    
     <script type="text/javascript" src="${ctxStatic}/mark/js/perfect-scrollbar.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/perfect-scrollbar.min.js"></script>
     <link rel="stylesheet" href="${ctxStatic}/mark/style/perfect-scrollbar.min.css"/>
     <link rel="stylesheet" href="${ctxStatic}/mark/style/perfect-scrollbar.min.css"/>
- 
+    
     <script type="text/javascript" src="${ctxStatic}/mark/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/mark-module.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/mark-module.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/task-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark/js/task-control.js"></script>
@@ -25,34 +25,34 @@
 </head>
 </head>
 
 
 <body>
 <body>
-    <div class="container-fluid">
-        <div class="row-fluid" id="container">
-        </div>
+<div class="container-fluid">
+    <div class="row-fluid" id="container">
     </div>
     </div>
+</div>
 </body>
 </body>
 
 
 <script type="text/javascript">
 <script type="text/javascript">
-$(document).ready(function() {
-    var mc = new MarkControl({
-        container: $('#container'),
-        userName: '${web_user.marker.name}',
-        staticServer: '${ctxStatic}/mark/',
-        imageServer: '${imageServer}',
-        modules: {
-            'imageSimple': {},
-            'problem': {
-                autoSubmit: false,
-                reasons: ['试卷模糊', '答错位置', '无法判别']
+    $(document).ready(function () {
+        var mc = new MarkControl({
+            container: $('#container'),
+            userName: '${web_user.marker.name}',
+            staticServer: '${ctxStatic}/mark/',
+            imageServer: '${fileServer}',
+            modules: {
+                'imageSimple': {},
+                'problem': {
+                    autoSubmit: false,
+                    reasons: ['试卷模糊', '答错位置', '无法判别']
+                }
             }
             }
-        }
-    });
-    mc.start({
-        mode: 'loop', //loop, list
-        submitUrl: '${ctx}/mark/savetask',
-        getUrl: '${ctx}/mark/gettask',
-        historyUrl: '${ctx}/mark/gethistory'
+        });
+        mc.start({
+            mode: 'loop', //loop, list
+            submitUrl: '${ctx}/mark/savetask',
+            getUrl: '${ctx}/mark/gettask',
+            historyUrl: '${ctx}/mark/gethistory'
+        });
     });
     });
-});
 </script>
 </script>
 
 
 </html>
 </html>

+ 13 - 13
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markJson.jsp

@@ -6,27 +6,27 @@
     <title>云阅卷高校版</title>
     <title>云阅卷高校版</title>
     <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-new/css/bootstrap.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-new/css/style.css" rel="stylesheet" type="text/css"/>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/json2.js"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
     <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
     <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
     <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet"/>
-
+    
     <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
     <script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
     <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
     <link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
     
     
     <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
     <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
-	<script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
+    <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
+    
     <script src="${ctxStatic}/rich-text/js/render.js"></script>
     <script src="${ctxStatic}/rich-text/js/render.js"></script>
     <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
     <link href="${ctxStatic}/rich-text/css/rich-text.css" rel="stylesheet">
-	<script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/viewer/viewer.js"></script>
     <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
     <link href="${ctxStatic}/viewer/viewer.css" rel="stylesheet">
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-view.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-json/js/json-loader.js"></script>
@@ -49,7 +49,7 @@
         var mc = new MarkControl({
         var mc = new MarkControl({
             container: $('#container'),
             container: $('#container'),
             staticServer: '${ctxStatic}',
             staticServer: '${ctxStatic}',
-            imageServer: '${sliceServer}',
+            imageServer: '${fileServer}',
             userId: '${marker.id}',
             userId: '${marker.id}',
             userName: '${web_user.name}',
             userName: '${web_user.name}',
             logoutUrl: '${ctx}/mark/logout',
             logoutUrl: '${ctx}/mark/logout',
@@ -64,7 +64,7 @@
             settingSyncUrl: '${ctx}/mark/update-setting',
             settingSyncUrl: '${ctx}/mark/update-setting',
             modules: {
             modules: {
                 'json-loader': {
                 'json-loader': {
-                    jsonServer: '${jsonServer}'
+                    jsonServer: '${fileServer}'
                 },
                 },
                 'json-view': {},
                 'json-view': {},
                 'mark-status': {
                 'mark-status': {
@@ -81,10 +81,10 @@
                 },
                 },
                 'warning-info': {},
                 'warning-info': {},
                 <c:if test="${isFormal==true}">
                 <c:if test="${isFormal==true}">
-				'problem-process':{
-					problemTypes : '${problemTypes}'
+                'problem-process': {
+                    problemTypes: '${problemTypes}'
                 },
                 },
-				</c:if>	
+                </c:if>
                 'change-name': {
                 'change-name': {
                     url: '${ctx}/mark/change-name'
                     url: '${ctx}/mark/change-name'
                 }
                 }

+ 0 - 97
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markLeader.jsp

@@ -1,97 +0,0 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>云阅卷高校版</title>
-<link href="${ctxStatic}/mark-leader/css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="${ctxStatic}/mark-leader/css/style.css" rel="stylesheet" type="text/css" />
-
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/json2.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/jquery.min.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/jquery-ui.min.js "></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/jquery.mousewheel.min.js"></script>
-
-<script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
-<link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css" rel="stylesheet" />
-
-<script src="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.js"></script>
-<link href="${ctxStatic}/perfect-scrollbar/min/perfect-scrollbar.min.css" rel="stylesheet">
-
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/mark-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/task-control.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/answer-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/paper-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/sheet-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/mark-board.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/mark-history.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/header-mark-status.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/image-builder.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/warning-info.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/thumbnail.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/single-image-view.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/change-name.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/tag-process.js"></script>
-<script type="text/javascript" src="${ctxStatic}/mark-leader/js/modules/view-sidebar.js"></script>
-</head>
-<body>
-	<div class="container-fluid" id="container"></div>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			var mc = new MarkControl({
-				container : $('#container'),
-				staticServer : '${ctxStatic}',
-				imageServer : '${sliceServer}',
-				userName : '${web_user.name}',
-				logoutUrl: '${ctx}/mark/logout',
-				clearUrl: '${ctx}/admin/mark/leader/clear',
-				prefetchCount:'1',
-				modules : {
-					'single-image-view' : {},
-					'image-builder': {},
-					'header-mark-status': {
-						simple : false,
-						subjectName : '${subject.displayName}'
-					},
-// 					'mark-history':{
-// 						pageSize:10
-// 					},
-					'mark-board' : {
-						showScoreBoard : false,
-						autoSubmit : false,
-						needConfirm : false
-					},
-					'sheet-view' : {
-						server : '${sheetServer}'
-					},
-					'warning-info': {
-					},
-					'thumbnail':{
-					},
-					'change-name':{
-						url : '${ctx}/mark/change-name'
-					},
-					'tag-process':{
-						url : '${ctx}/mark/tags'
-					},
-					'view-sidebar':{
-						list: [
-							{title:'试卷',  url:'<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'},
-							{title:'答案',  url:'<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'}
-						]
-					}
-				}
-			});
-			mc.start({
-				mode : 'loop',
-				statusUrl : '${ctx}/admin/mark/leader/status',
-				getUrl : '${ctx}/admin/mark/leader/gettask?studentId=${studentId}',
-				historyUrl : '${ctx}/admin/mark/leader/gethistory',
-				submitUrl : '${ctx}/admin/mark/leader/savetask',
-				clearUrl : '${ctx}/admin/mark/leader/clear'
-			});
-		});
-	</script>
-</body>
-</html>

+ 5 - 5
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp

@@ -55,7 +55,7 @@
         var mc = new MarkControl({
         var mc = new MarkControl({
             container: $('#container'),
             container: $('#container'),
             staticServer: '${ctxStatic}',
             staticServer: '${ctxStatic}',
-            imageServer: '${sliceServer}',
+            imageServer: '${fileServer}',
             userId: '${marker.id}',
             userId: '${marker.id}',
             userName: '${web_user.name}',
             userName: '${web_user.name}',
             logoutUrl: '${ctx}/mark/logout',
             logoutUrl: '${ctx}/mark/logout',
@@ -88,11 +88,11 @@
                     //showTotalScore:true
                     //showTotalScore:true
                 },
                 },
                 'slice-view': {
                 'slice-view': {
-                    server: '${sliceServer}'
+                    server: '${fileServer}'
                 },
                 },
                 <c:if test="${sheetView==true}">
                 <c:if test="${sheetView==true}">
                 'sheet-view': {
                 'sheet-view': {
-                    server: '${sheetServer}',
+                    server: '${fileServer}',
                     sheetConfig: '${sheetConfig}'
                     sheetConfig: '${sheetConfig}'
                 },
                 },
                 </c:if>
                 </c:if>
@@ -110,11 +110,11 @@
                     list: [
                     list: [
                         {
                         {
                             title: getMessage('mark.sidebar.paper'),
                             title: getMessage('mark.sidebar.paper'),
-                            url: '<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'
+                            url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'
                         },
                         },
                         {
                         {
                             title: getMessage('mark.sidebar.answer'),
                             title: getMessage('mark.sidebar.answer'),
-                            url: '<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'
+                            url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'
                         }
                         }
                     ]
                     ]
                 },
                 },

+ 9 - 9
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp

@@ -6,16 +6,16 @@
     <title>云阅卷高校版</title>
     <title>云阅卷高校版</title>
     <link href="${ctxStatic}/mark-track/css/bootstrap.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-track/css/bootstrap.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-track/css/style.css" rel="stylesheet" type="text/css"/>
     <link href="${ctxStatic}/mark-track/css/style.css" rel="stylesheet" type="text/css"/>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/json2.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/json2.js"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery-ui.min.js "></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery.mousewheel.min.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/jquery.mousewheel.min.js"></script>
-
+    
     <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
     <script src="${ctxStatic}/i18n/jquery.i18n.properties.js" type="text/javascript"></script>
     <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
     <script src="${ctxStatic}/i18n/load.js" type="text/javascript"></script>
-
+    
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/mark-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/task-control.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/modules/object-view.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-track/js/modules/object-view.js"></script>
@@ -47,7 +47,7 @@
         var mc = new MarkControl({
         var mc = new MarkControl({
             container: $('#container'),
             container: $('#container'),
             staticServer: '${ctxStatic}',
             staticServer: '${ctxStatic}',
-            imageServer: '${sliceServer}',
+            imageServer: '${fileServer}',
             userId: '${marker.id}',
             userId: '${marker.id}',
             userName: '${web_user.name}',
             userName: '${web_user.name}',
             logoutUrl: '${ctx}/mark/logout',
             logoutUrl: '${ctx}/mark/logout',
@@ -90,11 +90,11 @@
                 },
                 },
                 'specialTag': {},
                 'specialTag': {},
                 'slice-view': {
                 'slice-view': {
-                    server: '${sliceServer}'
+                    server: '${fileServer}'
                 },
                 },
                 <c:if test="${sheetView==true}">
                 <c:if test="${sheetView==true}">
                 'sheet-view': {
                 'sheet-view': {
-                    server: '${sheetServer}',
+                    server: '${fileServer}',
                     sheetConfig: '${sheetConfig}'
                     sheetConfig: '${sheetConfig}'
                 },
                 },
                 </c:if>
                 </c:if>
@@ -102,11 +102,11 @@
                     list: [
                     list: [
                         {
                         {
                             title: getMessage('mark.sidebar.paper'),
                             title: getMessage('mark.sidebar.paper'),
-                            url: '<c:if test="${subject.hasPaper==true}">${cardServer}${subject.paperUrl}</c:if>'
+                            url: '<c:if test="${subject.paperUrl!=null}">${fileServer}${subject.paperUrl}</c:if>'
                         },
                         },
                         {
                         {
                             title: getMessage('mark.sidebar.answer'),
                             title: getMessage('mark.sidebar.answer'),
-                            url: '<c:if test="${subject.hasAnswer==true}">${cardServer}${subject.answerUrl}</c:if>'
+                            url: '<c:if test="${subject.answerUrl!=null}">${fileServer}${subject.answerUrl}</c:if>'
                         }
                         }
                     ]
                     ]
                 }
                 }

+ 172 - 172
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/picConfig.jsp

@@ -1,14 +1,14 @@
-<%@ page language="java" pageEncoding="utf-8"%>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title>高校版阅卷系统</title>
     <title>高校版阅卷系统</title>
-	<link rel="stylesheet" href="${ctxStatic}/jcrop/css/jquery.Jcrop.min.css"/>
-	<link rel="stylesheet" href="${ctxStatic}/pic-config/css/style.css"/>
-	<script type="text/javascript" src="${ctxStatic}/jquery/jquery-1.9.1.min.js"></script>
-	<script type="text/javascript" src="${ctxStatic}/jcrop/js/jquery.Jcrop.min.js"></script>
+    <link rel="stylesheet" href="${ctxStatic}/jcrop/css/jquery.Jcrop.min.css"/>
+    <link rel="stylesheet" href="${ctxStatic}/pic-config/css/style.css"/>
+    <script type="text/javascript" src="${ctxStatic}/jquery/jquery-1.9.1.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/jcrop/js/jquery.Jcrop.min.js"></script>
 </head>
 </head>
 <body>
 <body>
 <div class="c-box" style="display:none" id="pic-config-div">
 <div class="c-box" style="display:none" id="pic-config-div">
@@ -48,185 +48,185 @@
 </body>
 </body>
 
 
 <script type="text/javascript">
 <script type="text/javascript">
-var message = '${message}';
-if(message!=null&&message!=''&&message!=undefined){
-	alert(message);
-}
-var image_server = '${imageServer}';
-var pictureConfig = '${pictureConfig}';
-var picUrls = '${picUrls}';
-var picUrl = picUrls.split('[')[1].split(']')[0];
-var urls=[];
-for (var j = 0; j < picUrl.split(',').length; j++) {
-	urls.push(picUrl.split(',')[j].trim());
-} 
-var config=window.localStorage.getItem("pictureConfig");
-if(config!=null&&config!=undefined){
-	pictureConfig = config;
-}
-
-var saveCallback;
-var jcrop_canvas;
-var jcrop_api;
-var image_array = [];
-$(document).ready(function(e) {
-    $('#pic-config-div').css('z-index', 9999);
-    $('#pic-config-div').height($(window).height());
-    $('#pic-config-div').width($(window).width());
-    $('#pic-config-div').offset({top:0, left:0});
-    
-    $('#pic-config-clear').click(function(){
-        $('#pic-config-preview').empty();
-    });
-    $('#pic-config-save').click(function(){
-        var result = [];
-        $('#pic-config-preview').find('li').each(function(){
-            result.push(JSON.parse($(this).attr('data-config')));
-        })
-        if(result.length==0){
-            alert('请至少裁切一张小图后再保存');
-            return;
-        }
-        $('#pic-config-div').hide();
-        if(saveCallback!=undefined){
-            saveCallback(result);
-        }
-    });
-    $('#pic-config-cancel').click(function(){
-       // $('#pic-config-div').hide();
-    	window.close(); 
-    });
-    $('#preview-image-button').click(function(){
-        addPreviewImage();
-    });
-    $('#pic-content').Jcrop({
-        //boxWidth: $(window).width()*0.65,
-        boxHeight: $(window).height()-90,
-        onDblClick: addPreview
-    }, function() {
-        jcrop_api = this;
-    });
-    jcrop_canvas = $('#pic-canvas')[0];
-    
-    initPicConfigPopup(urls,pictureConfig,function(result){
-    	if (window.opener && !window.opener.closed) {
-    	 	window.opener.document.getElementById("picList").value = JSON.stringify(result);
-    		window.opener.document.getElementById("configuration").innerText="设置成功";
-    		window.localStorage.setItem("pictureConfig",JSON.stringify(result));
-    		window.close(); 
-    	}
-    });
-});
-
-function initPicConfigPopup(urls, config, onSave) {
-	if(config){
-		config = JSON.parse(config);
-	}
-    initImages(urls,config);
-    saveCallback = onSave;
-    $('#pic-config-div').show();
-}
-
-function initImages(urls,config) {
-    var container = $('#pic-switch');
-    container.empty();
-    container.attr('data-index','');
-    image_array = [];
-    for(var i=1;i<=urls.length;i++) {
-        var img = new Image();
-        img.crossOrigin = '';
-        var timestamp = new Date().getTime();
-        img.src = image_server + urls[i-1]+ '?' + timestamp;
-        image_array.push(img);
-        var dom = $('<li data-index="'+i+'"><a href="javascript:void(0)">'+i+'</a></li>').appendTo(container);
-        dom.find('a').click(function(){
-            var index = parseInt($(this).parent().attr('data-index'));
-            jcrop_api.setImage(image_array[index-1].src);
-            container.attr('data-index', index);
-            container.find('li').removeClass('on');
-            $(this).parent().addClass('on');
-        })
+    var message = '${message}';
+    if (message != null && message != '' && message != undefined) {
+        alert(message);
+    }
+    var image_server = '${fileServer}';
+    var pictureConfig = '${pictureConfig}';
+    var picUrls = '${picUrls}';
+    var picUrl = picUrls.split('[')[1].split(']')[0];
+    var urls = [];
+    for (var j = 0; j < picUrl.split(',').length; j++) {
+        urls.push(picUrl.split(',')[j].trim());
     }
     }
-    container.find('li:first a').trigger('click');
-    if(image_array.length==urls.length){
-    	img.onload = function () {
-    		initConfigs(config);
-    	};
+    var config = window.localStorage.getItem("pictureConfig");
+    if (config != null && config != undefined) {
+        pictureConfig = config;
     }
     }
-    
-}
 
 
-function initConfigs(config) {
-    $('#pic-config-preview').empty();
+    var saveCallback;
+    var jcrop_canvas;
+    var jcrop_api;
+    var image_array = [];
+    $(document).ready(function (e) {
+        $('#pic-config-div').css('z-index', 9999);
+        $('#pic-config-div').height($(window).height());
+        $('#pic-config-div').width($(window).width());
+        $('#pic-config-div').offset({top: 0, left: 0});
+
+        $('#pic-config-clear').click(function () {
+            $('#pic-config-preview').empty();
+        });
+        $('#pic-config-save').click(function () {
+            var result = [];
+            $('#pic-config-preview').find('li').each(function () {
+                result.push(JSON.parse($(this).attr('data-config')));
+            })
+            if (result.length == 0) {
+                alert('请至少裁切一张小图后再保存');
+                return;
+            }
+            $('#pic-config-div').hide();
+            if (saveCallback != undefined) {
+                saveCallback(result);
+            }
+        });
+        $('#pic-config-cancel').click(function () {
+            // $('#pic-config-div').hide();
+            window.close();
+        });
+        $('#preview-image-button').click(function () {
+            addPreviewImage();
+        });
+        $('#pic-content').Jcrop({
+            //boxWidth: $(window).width()*0.65,
+            boxHeight: $(window).height() - 90,
+            onDblClick: addPreview
+        }, function () {
+            jcrop_api = this;
+        });
+        jcrop_canvas = $('#pic-canvas')[0];
+
+        initPicConfigPopup(urls, pictureConfig, function (result) {
+            if (window.opener && !window.opener.closed) {
+                window.opener.document.getElementById("picList").value = JSON.stringify(result);
+                window.opener.document.getElementById("configuration").innerText = "设置成功";
+                window.localStorage.setItem("pictureConfig", JSON.stringify(result));
+                window.close();
+            }
+        });
+    });
 
 
-    if(config!=undefined){
-        for(var i=0;i<config.length;i++){
-            addPreviewByConfig(config[i]);
+    function initPicConfigPopup(urls, config, onSave) {
+        if (config) {
+            config = JSON.parse(config);
         }
         }
+        initImages(urls, config);
+        saveCallback = onSave;
+        $('#pic-config-div').show();
     }
     }
-}
-
-function getCropConfig(c) {
-    var scaleX = jcrop_api.getScaleFactor()[0];
-    var scaleY = jcrop_api.getScaleFactor()[1];
-    config = {
-        x: c.x * scaleX,
-        y: c.y * scaleY,
-        w: c.w * scaleX,
-        h: c.h * scaleY
+
+    function initImages(urls, config) {
+        var container = $('#pic-switch');
+        container.empty();
+        container.attr('data-index', '');
+        image_array = [];
+        for (var i = 1; i <= urls.length; i++) {
+            var img = new Image();
+            img.crossOrigin = '';
+            var timestamp = new Date().getTime();
+            img.src = image_server + urls[i - 1] + '?' + timestamp;
+            image_array.push(img);
+            var dom = $('<li data-index="' + i + '"><a href="javascript:void(0)">' + i + '</a></li>').appendTo(container);
+            dom.find('a').click(function () {
+                var index = parseInt($(this).parent().attr('data-index'));
+                jcrop_api.setImage(image_array[index - 1].src);
+                container.attr('data-index', index);
+                container.find('li').removeClass('on');
+                $(this).parent().addClass('on');
+            })
+        }
+        container.find('li:first a').trigger('click');
+        if (image_array.length == urls.length) {
+            img.onload = function () {
+                initConfigs(config);
+            };
+        }
+
     }
     }
-    return config;
-}
-
-function addPreview(c) {
-    if (parseInt(c.w) > 0) {
-        var config = getCropConfig(c);
-        config.i = $('#pic-switch').attr('data-index');
-        if(config.i!='') {
-            config.i = parseInt(config.i);
-            addPreviewByConfig(config);
+
+    function initConfigs(config) {
+        $('#pic-config-preview').empty();
+
+        if (config != undefined) {
+            for (var i = 0; i < config.length; i++) {
+                addPreviewByConfig(config[i]);
+            }
         }
         }
-        jcrop_api.release();
     }
     }
-}
 
 
-function addPreviewImage() {
-    var index = $('#pic-switch').attr('data-index');
-    if(index==''){
-        return;
+    function getCropConfig(c) {
+        var scaleX = jcrop_api.getScaleFactor()[0];
+        var scaleY = jcrop_api.getScaleFactor()[1];
+        config = {
+            x: c.x * scaleX,
+            y: c.y * scaleY,
+            w: c.w * scaleX,
+            h: c.h * scaleY
+        }
+        return config;
     }
     }
-    var config = {
-        i: parseInt(index),
-        x: 0,
-        y: 0,
-        w: 0,
-        h: 0
+
+    function addPreview(c) {
+        if (parseInt(c.w) > 0) {
+            var config = getCropConfig(c);
+            config.i = $('#pic-switch').attr('data-index');
+            if (config.i != '') {
+                config.i = parseInt(config.i);
+                addPreviewByConfig(config);
+            }
+            jcrop_api.release();
+        }
     }
     }
-    addPreviewByConfig(config);
-}
-
-function addPreviewByConfig(config){
-    var container = $('#pic-config-preview');
-    var width = config.w;
-    var height = config.h;
-    if(width==0){
-        width = image_array[config.i-1].width;
+
+    function addPreviewImage() {
+        var index = $('#pic-switch').attr('data-index');
+        if (index == '') {
+            return;
+        }
+        var config = {
+            i: parseInt(index),
+            x: 0,
+            y: 0,
+            w: 0,
+            h: 0
+        }
+        addPreviewByConfig(config);
     }
     }
-    if(height==0){
-        height = image_array[config.i-1].height;
+
+    function addPreviewByConfig(config) {
+        var container = $('#pic-config-preview');
+        var width = config.w;
+        var height = config.h;
+        if (width == 0) {
+            width = image_array[config.i - 1].width;
+        }
+        if (height == 0) {
+            height = image_array[config.i - 1].height;
+        }
+        jcrop_canvas.width = width
+        jcrop_canvas.height = height
+
+        jcrop_canvas.getContext("2d").drawImage(image_array[config.i - 1], config.x, config.y, width, height, 0, 0, width, height);
+
+        var dom = $('<li><span class="order">' + config.i + '</span><div class="m"><img src=""/></div><span class="close">&times;</span></li>').appendTo(container);
+        dom.attr('data-config', JSON.stringify(config));
+        dom.find('img').attr('src', jcrop_canvas.toDataURL());
+        dom.find('span.close').click(function () {
+            $(this).parent().remove();
+        });
     }
     }
-    jcrop_canvas.width = width
-    jcrop_canvas.height = height
-    
-    jcrop_canvas.getContext("2d").drawImage(image_array[config.i-1], config.x, config.y, width, height,0,0,width, height);
-    
-    var dom = $('<li><span class="order">'+config.i+'</span><div class="m"><img src=""/></div><span class="close">&times;</span></li>').appendTo(container);
-    dom.attr('data-config', JSON.stringify(config));
-    dom.find('img').attr('src', jcrop_canvas.toDataURL());
-    dom.find('span.close').click(function(){
-        $(this).parent().remove();
-    });
-}
 </script>
 </script>
 
 
 </html>
 </html>

+ 0 - 6443
stmms-web/src/main/webapp/static/mark-leader/css/bootstrap.css

@@ -1,6443 +0,0 @@
-/*!
- * Bootstrap v2.3.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
-  *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.clearfix:after {
-  clear: both;
-}
-
-.hide-text {
-  font: 0/0 a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-
-.input-block-level {
-  display: block;
-  width: 100%;
-  min-height: 30px;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
-  display: block;
-}
-
-audio,
-canvas,
-video {
-  display: inline-block;
-  *display: inline;
-  *zoom: 1;
-}
-
-audio:not([controls]) {
-  display: none;
-}
-
-html {
-  font-size: 100%;
-  -webkit-text-size-adjust: 100%;
-      -ms-text-size-adjust: 100%;
-}
-
-a:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-a:hover,
-a:active {
-  outline: 0;
-}
-
-sub,
-sup {
-  position: relative;
-  font-size: 75%;
-  line-height: 0;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-img {
-  width: auto\9;
-  height: auto;
-  max-width: 100%;
-  vertical-align: middle;
-  border: 0;
-  -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img,
-.google-maps img {
-  max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
-  margin: 0;
-  font-size: 100%;
-  vertical-align: middle;
-}
-
-button,
-input {
-  *overflow: visible;
-  line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
-  cursor: pointer;
-  -webkit-appearance: button;
-}
-
-label,
-select,
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"],
-input[type="radio"],
-input[type="checkbox"] {
-  cursor: pointer;
-}
-
-input[type="search"] {
-  -webkit-box-sizing: content-box;
-     -moz-box-sizing: content-box;
-          box-sizing: content-box;
-  -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
-  -webkit-appearance: none;
-}
-
-textarea {
-  overflow: auto;
-  vertical-align: top;
-}
-
-@media print {
-  * {
-    color: #000 !important;
-    text-shadow: none !important;
-    background: transparent !important;
-    box-shadow: none !important;
-  }
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-  .ir a:after,
-  a[href^="javascript:"]:after,
-  a[href^="#"]:after {
-    content: "";
-  }
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-  thead {
-    display: table-header-group;
-  }
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-  img {
-    max-width: 100% !important;
-  }
-  @page  {
-    margin: 0.5cm;
-  }
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-}
-
-body {
-  margin: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 14px;
-  line-height: 20px;
-  color: #333333;
-  background-color: #ffffff;
-}
-
-a {
-  color: #0088cc;
-  text-decoration: none;
-}
-
-a:hover,
-a:focus {
-  color: #005580;
-  text-decoration: underline;
-}
-
-.img-rounded {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.img-polaroid {
-  padding: 4px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-
-.img-circle {
-  -webkit-border-radius: 500px;
-     -moz-border-radius: 500px;
-          border-radius: 500px;
-}
-
-.row {
-  margin-left: -20px;
-  *zoom: 1;
-}
-
-.row:before,
-.row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row:after {
-  clear: both;
-}
-
-[class*="span"] {
-  float: left;
-  min-height: 1px;
-  margin-left: 20px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.span12 {
-  width: 940px;
-}
-
-.span11 {
-  width: 860px;
-}
-
-.span10 {
-  width: 780px;
-}
-
-.span9 {
-  width: 700px;
-}
-
-.span8 {
-  width: 620px;
-}
-
-.span7 {
-  width: 540px;
-}
-
-.span6 {
-  width: 460px;
-}
-
-.span5 {
-  width: 380px;
-}
-
-.span4 {
-  width: 300px;
-}
-
-.span3 {
-  width: 220px;
-}
-
-.span2 {
-  width: 140px;
-}
-
-.span1 {
-  width: 100px;
-}
-
-.offset12 {
-  margin-left: 980px;
-}
-
-.offset11 {
-  margin-left: 900px;
-}
-
-.offset10 {
-  margin-left: 820px;
-}
-
-.offset9 {
-  margin-left: 740px;
-}
-
-.offset8 {
-  margin-left: 660px;
-}
-
-.offset7 {
-  margin-left: 580px;
-}
-
-.offset6 {
-  margin-left: 500px;
-}
-
-.offset5 {
-  margin-left: 420px;
-}
-
-.offset4 {
-  margin-left: 340px;
-}
-
-.offset3 {
-  margin-left: 260px;
-}
-
-.offset2 {
-  margin-left: 180px;
-}
-
-.offset1 {
-  margin-left: 100px;
-}
-
-.row-fluid {
-  width: 100%;
-  *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.row-fluid:after {
-  clear: both;
-}
-
-.row-fluid [class*="span"] {
-  display: block;
-  float: left;
-  width: 100%;
-  min-height: 30px;
-  margin-left:0px;
-/*  margin-left: 2.127659574468085%;
-*/  *margin-left: 2.074468085106383%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
-  margin-left: 0;
-}
-
-.row-fluid .controls-row [class*="span"] + [class*="span"] {
-	margin-left:0px;
-/*  margin-left: 2.127659574468085%;
-*/}
-
-.row-fluid .span12 {
-  width: 100%;
-  *width: 99.94680851063829%;
-}
-
-.row-fluid .span11 {
-  width: 91.48936170212765%;
-  *width: 91.43617021276594%;
-}
-
-.row-fluid .span10 {
-	width:85.106%;
-/*  width: 82.97872340425532%;*/
-  *width: 82.92553191489361%;
-}
-
-.row-fluid .span9 {
-	 width:76.595%;
-/*  width: 74.46808510638297%;*/
-  *width: 74.41489361702126%;
-}
-
-.row-fluid .span8 {
-	 width:70.21%;
-/*  width: 65.95744680851064%;
-*/  *width: 65.90425531914893%;
-}
-
-.row-fluid .span7 {width:57%;
-/*  width: 57.44680851063829%;
-*/  *width: 57.39361702127659%;}
-
-.row-fluid .span6 {
-	width:49.96%;
-/*  width: 48.93617021276595%;
-*/  *width: 48.88297872340425%;
-}
-
-.row-fluid .span5 {
-	width:42.553%;
-/*  width: 40.42553191489362%;
-*/  *width: 40.37234042553192%;
-}
-
-.row-fluid .span4 {width: 31.914893617021278%;
-/*	width:34.042px;
-*//*  width: 31.914893617021278%;
-*/  *width: 31.861702127659576%;
-}
-
-.row-fluid .span3 {
-	width:25.531%;
-/*  width: 23.404255319148934%;
-*/  *width: 23.351063829787233%;
-}
-
-.row-fluid .span2 {
-  width: 14.893617021276595%;
-  *width: 14.840425531914894%;
-}
-
-.row-fluid .span1 {
-  width: 6.382978723404255%;
-  *width: 6.329787234042553%;
-}
-
-.row-fluid .offset12 {
-  margin-left: 104.25531914893617%;
-  *margin-left: 104.14893617021275%;
-}
-
-.row-fluid .offset12:first-child {
-  margin-left: 102.12765957446808%;
-  *margin-left: 102.02127659574467%;
-}
-
-.row-fluid .offset11 {
-  margin-left: 95.74468085106382%;
-  *margin-left: 95.6382978723404%;
-}
-
-.row-fluid .offset11:first-child {
-  margin-left: 93.61702127659574%;
-  *margin-left: 93.51063829787232%;
-}
-
-.row-fluid .offset10 {
-  margin-left: 87.23404255319149%;
-  *margin-left: 87.12765957446807%;
-}
-
-.row-fluid .offset10:first-child {
-  margin-left: 85.1063829787234%;
-  *margin-left: 84.99999999999999%;
-}
-
-.row-fluid .offset9 {
-  margin-left: 78.72340425531914%;
-  *margin-left: 78.61702127659572%;
-}
-
-.row-fluid .offset9:first-child {
-  margin-left: 76.59574468085106%;
-  *margin-left: 76.48936170212764%;
-}
-
-.row-fluid .offset8 {
-  margin-left: 70.2127659574468%;
-  *margin-left: 70.10638297872339%;
-}
-
-.row-fluid .offset8:first-child {
-  margin-left: 68.08510638297872%;
-  *margin-left: 67.9787234042553%;
-}
-
-.row-fluid .offset7 {
-  margin-left: 61.70212765957446%;
-  *margin-left: 61.59574468085106%;
-}
-
-.row-fluid .offset7:first-child {
-  margin-left: 59.574468085106375%;
-  *margin-left: 59.46808510638297%;
-}
-
-.row-fluid .offset6 {
-  margin-left: 53.191489361702125%;
-  *margin-left: 53.085106382978715%;
-}
-
-.row-fluid .offset6:first-child {
-  margin-left: 51.063829787234035%;
-  *margin-left: 50.95744680851063%;
-}
-
-.row-fluid .offset5 {
-  margin-left: 44.68085106382979%;
-  *margin-left: 44.57446808510638%;
-}
-
-.row-fluid .offset5:first-child {
-  margin-left: 42.5531914893617%;
-  *margin-left: 42.4468085106383%;
-}
-
-.row-fluid .offset4 {
-  margin-left: 36.170212765957444%;
-  *margin-left: 36.06382978723405%;
-}
-
-.row-fluid .offset4:first-child {
-  margin-left: 34.04255319148936%;
-  *margin-left: 33.93617021276596%;
-}
-
-.row-fluid .offset3 {
-  margin-left: 27.659574468085104%;
-  *margin-left: 27.5531914893617%;
-}
-
-.row-fluid .offset3:first-child {
-  margin-left: 25.53191489361702%;
-  *margin-left: 25.425531914893618%;
-}
-
-.row-fluid .offset2 {
-  margin-left: 19.148936170212764%;
-  *margin-left: 19.04255319148936%;
-}
-
-.row-fluid .offset2:first-child {
-  margin-left: 17.02127659574468%;
-  *margin-left: 16.914893617021278%;
-}
-
-.row-fluid .offset1 {
-  margin-left: 10.638297872340425%;
-  *margin-left: 10.53191489361702%;
-}
-
-.row-fluid .offset1:first-child {
-  margin-left: 8.51063829787234%;
-  *margin-left: 8.404255319148938%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
-  display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
-  float: right;
-}
-
-.container {
-  margin-right: auto;
-  margin-left: auto;
-  *zoom: 1;
-}
-
-.container:before,
-.container:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container:after {
-  clear: both;
-}
-
-.container-fluid {
-/*  padding-right: 20px;
-  padding-left: 20px;*/
-  *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.container-fluid:after {
-  clear: both;
-}
-
-p {
-  margin: 0 0 10px;
-}
-
-.lead {
-  margin-bottom: 20px;
-  font-size: 21px;
-  font-weight: 200;
-  line-height: 30px;
-}
-
-small {
-  font-size: 85%;
-}
-
-strong {
-  font-weight: bold;
-}
-
-em {
-  font-style: italic;
-}
-
-cite {
-  font-style: normal;
-}
-
-.muted {
-  color: #999999;
-}
-
-a.muted:hover,
-a.muted:focus {
-  color: #808080;
-}
-
-.text-warning {
-  color: #c09853;
-}
-
-a.text-warning:hover,
-a.text-warning:focus {
-  color: #a47e3c;
-}
-
-.text-error {
-  color: #b94a48;
-  margin:0 5px;
-}
-
-a.text-error:hover,
-a.text-error:focus {
-  color: #953b39;
-}
-
-.text-info {
-  color: #3a87ad;
-}
-
-a.text-info:hover,
-a.text-info:focus {
-  color: #2d6987;
-}
-
-.text-success {
-  color: #468847;
-}
-
-a.text-success:hover,
-a.text-success:focus {
-  color: #356635;
-}
-
-.text-left {
-  text-align: left;
-}
-
-.text-right {
-  text-align: right;
-}
-
-.text-center {
-  text-align: center;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  margin: 10px 0;
-  font-family: inherit;
-  font-weight: bold;
-  line-height: 20px;
-  color: inherit;
-  text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
-  font-weight: normal;
-  line-height: 1;
-  color: #999999;
-}
-
-h1,
-h2,
-h3 {
-  line-height: 40px;
-}
-
-h1 {
-  font-size: 38.5px;
-}
-
-h2 {
-  font-size: 31.5px;
-}
-
-h3 {
-  font-size: 24.5px;
-}
-
-h4 {
-  font-size: 17.5px;
-}
-
-h5 {
-  font-size: 14px;
-}
-
-h6 {
-  font-size: 11.9px;
-}
-
-h1 small {
-  font-size: 24.5px;
-}
-
-h2 small {
-  font-size: 17.5px;
-}
-
-h3 small {
-  font-size: 14px;
-}
-
-h4 small {
-  font-size: 14px;
-}
-
-.page-header {
-  padding-bottom: 9px;
-  margin: 20px 0 30px;
-  border-bottom: 1px solid #eeeeee;
-}
-
-ul,
-ol {
-  padding: 0;
-  margin: 0 0 10px 25px;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
-  margin-bottom: 0;
-}
-
-li {
-  line-height: 20px;
-}
-
-ul.unstyled,
-ol.unstyled {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline,
-ol.inline {
-  margin-left: 0;
-  list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
-  display: inline-block;
-  *display: inline;
-  padding-right: 5px;
-  padding-left: 5px;
-  *zoom: 1;
-}
-
-dl {
-  margin-bottom: 20px;
-}
-
-dt,
-dd {
-  line-height: 20px;
-}
-
-dt {
-  font-weight: bold;
-}
-
-dd {
-  margin-left: 10px;
-}
-
-.dl-horizontal {
-  *zoom: 1;
-}
-
-.dl-horizontal:before,
-.dl-horizontal:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.dl-horizontal:after {
-  clear: both;
-}
-
-.dl-horizontal dt {
-  float: left;
-  width: 160px;
-  overflow: hidden;
-  clear: left;
-  text-align: right;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.dl-horizontal dd {
-  margin-left: 180px;
-}
-
-hr {
-  margin: 20px 0;
-  border: 0;
-  border-top: 1px solid #eeeeee;
-  border-bottom: 1px solid #ffffff;
-}
-
-abbr[title],
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted #999999;
-}
-
-abbr.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-blockquote {
-  padding: 0 0 0 15px;
-  margin: 0 0 20px;
-  border-left: 5px solid #eeeeee;
-}
-
-blockquote p {
-  margin-bottom: 0;
-  font-size: 17.5px;
-  font-weight: 300;
-  line-height: 1.25;
-}
-
-blockquote small {
-  display: block;
-  line-height: 20px;
-  color: #999999;
-}
-
-blockquote small:before {
-  content: '\2014 \00A0';
-}
-
-blockquote.pull-right {
-  float: right;
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid #eeeeee;
-  border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
-  text-align: right;
-}
-
-blockquote.pull-right small:before {
-  content: '';
-}
-
-blockquote.pull-right small:after {
-  content: '\00A0 \2014';
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-
-address {
-  display: block;
-  margin-bottom: 20px;
-  font-style: normal;
-  line-height: 20px;
-}
-
-code,
-pre {
-  padding: 0 3px 2px;
-  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-  font-size: 12px;
-  color: #333333;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-code {
-  padding: 2px 4px;
-  color: #d14;
-  white-space: nowrap;
-  background-color: #f7f7f9;
-  border: 1px solid #e1e1e8;
-}
-
-pre {
-  display: block;
-  padding: 9.5px;
-  margin: 0 0 10px;
-  font-size: 13px;
-  line-height: 20px;
-  word-break: break-all;
-  word-wrap: break-word;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: #f5f5f5;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-pre.prettyprint {
-  margin-bottom: 20px;
-}
-
-pre code {
-  padding: 0;
-  color: inherit;
-  white-space: pre;
-  white-space: pre-wrap;
-  background-color: transparent;
-  border: 0;
-}
-
-.pre-scrollable {
-  max-height: 340px;
-  overflow-y: scroll;
-}
-
-form {
-  margin: 0 0 20px;
-}
-
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: 40px;
-  color: #333333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5;
-}
-
-legend small {
-  font-size: 15px;
-  color: #999999;
-}
-
-label,
-input,
-button,
-select,
-textarea {
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-}
-
-input,
-button,
-select,
-textarea {
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-label {
-  display: block;
-  margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  display: inline-block;
-  height: 20px;
-  padding: 4px 6px;
-  margin-bottom: 0px;
-  font-size: 14px;
-  line-height: 20px;
-  color: #555555;
-/*  vertical-align: middle;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-input,
-textarea,
-.uneditable-input {
-  width: 206px;
-}
-
-textarea {
-  height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
-     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
-       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
-          transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
-  border-color: rgba(82, 168, 236, 0.8);
-  outline: 0;
-  outline: thin dotted \9;
-  /* IE6-9 */
-
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-input[type="radio"],
-input[type="checkbox"] {
-  margin:5px;
-  margin-top: 1px \9;
-  *margin-top: 0;
-  line-height: normal;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
-  width: auto;
-}
-
-select,
-input[type="file"] {
-  height: 30px;
-  /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
-  *margin-top: 4px;
-  /* For IE7, add top margin to align select with labels */
-
-  line-height: 30px;
-}
-
-select {
-  width: 220px;
-  background-color: #ffffff;
-  border: 1px solid #cccccc;
-}
-
-select[multiple],
-select[size] {
-  height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
-  color: #999999;
-  cursor: not-allowed;
-  background-color: #fcfcfc;
-  border-color: #cccccc;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-}
-
-.uneditable-input {
-  overflow: hidden;
-  white-space: nowrap;
-}
-
-.uneditable-textarea {
-  width: auto;
-  height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
-  color: #999999;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
-  color: #999999;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
-  color: #999999;
-}
-
-.radio,
-.checkbox {
-  min-height: 20px;
-  padding-left: 20px;
-}
-
-.checkbox-tab {
-  min-height: 20px;
-  padding-left: 20px;
-  margin-right:20px; float:left;
-}
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
-  float: left;
-/*  margin-left: -20px;
-*/}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
-  padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
-  display: inline-block;
-  padding-top: 5px;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
-  margin-left: 10px;
-}
-
-.input-mini {
-  width: 60px;
-}
-
-.input-small {
-  width: 90px;
-}
-
-.input-medium {
-  width: 150px;
-}
-
-.input-large {
-  width: 210px;
-}
-
-.input-xlarge {
-  width: 270px;
-}
-
-.input-xxlarge {
-  width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
-  float: none;
-  margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
-  display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
-  margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
-  margin-left: 20px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
-  width: 926px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
-  width: 846px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
-  width: 766px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
-  width: 686px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
-  width: 606px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
-  width: 526px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
-  width: 446px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
-  width: 366px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
-  width: 286px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
-  width: 206px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
-  width: 126px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
-  width: 46px;
-}
-
-.controls-row {
-  *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.controls-row:after {
-  clear: both;
-}
-
-.controls-row [class*="span"],
-.row-fluid .controls-row [class*="span"] {
-  float: left;
-}
-
-.controls-row .checkbox[class*="span"],
-.controls-row .radio[class*="span"] {
-  padding-top: 5px;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
-  cursor: not-allowed;
-  background-color: #eeeeee;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
-  background-color: transparent;
-}
-
-.control-group.warning .control-label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
-  color: #c09853;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  color: #c09853;
-}
-
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
-  border-color: #c09853;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
-  border-color: #a47e3c;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
-  color: #c09853;
-  background-color: #fcf8e3;
-  border-color: #c09853;
-}
-
-.control-group.error .control-label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
-  color: #b94a48;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  color: #b94a48;
-}
-
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
-  border-color: #b94a48;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
-  border-color: #953b39;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #b94a48;
-}
-
-.control-group.success .control-label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
-  color: #468847;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  color: #468847;
-}
-
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
-  border-color: #468847;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
-  border-color: #356635;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #468847;
-}
-
-.control-group.info .control-label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
-  color: #3a87ad;
-}
-
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-  color: #3a87ad;
-}
-
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
-  border-color: #3a87ad;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
-  border-color: #2d6987;
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-}
-
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
-  color: #3a87ad;
-  background-color: #d9edf7;
-  border-color: #3a87ad;
-}
-
-input:focus:invalid,
-textarea:focus:invalid,
-select:focus:invalid {
-  color: #b94a48;
-  border-color: #ee5f5b;
-}
-
-input:focus:invalid:focus,
-textarea:focus:invalid:focus,
-select:focus:invalid:focus {
-  border-color: #e9322d;
-  -webkit-box-shadow: 0 0 6px #f8b9b7;
-     -moz-box-shadow: 0 0 6px #f8b9b7;
-          box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
-  padding: 19px 20px 20px;
-  margin-top: 20px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #e5e5e5;
-  *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-actions:after {
-  clear: both;
-}
-
-.help-block,
-.help-inline {
-  color: #595959;
-}
-
-.help-block {
-  display: block;
-  margin-bottom: 10px;
-}
-
-.help-inline {
-  display: inline-block;
-  *display: inline;
-  padding-left: 5px;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
-  display: inline-block;
-  padding-left:15px;
-  margin: 10px;
-  font-size: 0;
-  white-space: nowrap;
-  vertical-align: middle;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input,
-.input-append .dropdown-menu,
-.input-prepend .dropdown-menu,
-.input-append .popover,
-.input-prepend .popover {
-  font-size: 14px;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
-  position: relative;
-  margin-bottom: 0;
-  *margin-left: 0;
-  vertical-align: top;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
-  z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
-  display: inline-block;
-  width: auto;
-  height: 20px;
-  min-width: 16px;
-  padding: 4px 5px;
-  font-size: 14px;
-  font-weight: normal;
-  line-height: 20px;
-  text-align: center;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #eeeeee;
-  border: 1px solid #ccc;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn,
-.input-append .btn-group > .dropdown-toggle,
-.input-prepend .btn-group > .dropdown-toggle {
-  vertical-align: top;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-append .active,
-.input-prepend .active {
-  background-color: #a9dba9;
-  border-color: #46a546;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
-  margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-append input + .btn-group .btn:last-child,
-.input-append select + .btn-group .btn:last-child,
-.input-append .uneditable-input + .btn-group .btn:last-child {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-append .add-on,
-.input-append .btn,
-.input-append .btn-group {
-  margin-left: -1px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child,
-.input-append .btn-group:last-child > .dropdown-toggle {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.input-prepend.input-append input + .btn-group .btn,
-.input-prepend.input-append select + .btn-group .btn,
-.input-prepend.input-append .uneditable-input + .btn-group .btn {
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.input-prepend.input-append .btn-group:first-child {
-  margin-left: 0;
-}
-
-input.search-query {
-  padding-right: 14px;
-  padding-right: 4px \9;
-  padding-left: 14px;
-  padding-left: 4px \9;
-  /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
-  margin-bottom: 0;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.form-search .input-append .search-query {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-
-.form-search .input-append .btn {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .search-query {
-  -webkit-border-radius: 0 14px 14px 0;
-     -moz-border-radius: 0 14px 14px 0;
-          border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .btn {
-  -webkit-border-radius: 14px 0 0 14px;
-     -moz-border-radius: 14px 0 0 14px;
-          border-radius: 14px 0 0 14px;
-}
-.form-inline{ margin:5px;}
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
-  display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
-  display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
-  margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
-  padding-left: 0;
-  margin-bottom: 0;
-  vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
-  float: left;
-  margin-right: 3px;
-  margin-left: 0;
-}
-
-.control-group {
-  margin-bottom: 10px;
-}
-
-legend + .control-group {
-  margin-top: 20px;
-  -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
-  margin-bottom: 20px;
-  *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.form-horizontal .control-group:after {
-  clear: both;
-}
-
-.form-horizontal .control-label {
-  float: left;
-  width: 160px;
-  padding-top: 5px;
-  text-align: right;
-}
-
-.form-horizontal .controls {
-  *display: inline-block;
-  *padding-left: 20px;
-  margin-left: 180px;
-  *margin-left: 0;
-}
-.controls-list{margin-left:0 !important;}
-.controls-list a{
-width:50px; height:28px;
-padding:0 3px;
-line-height:28px;
-display:block;
-text-align:center;
-margin:0px 10px 10px 0px;
-border:#c1c1c1 solid 1px;
-background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-/*text-shadow:0px 0px 1px #fff;
-*/box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-color:#333333;
-border-radius:2px;
-float:left;
-}
-.controls-list a:hover{
-border:#004898 solid 1px;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;
-}
-.controls-list a.curr{
-border:#004898 solid 1px;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;	
-}
-.form-horizontal .controls:first-child {
-  *padding-left: 180px;
-}
-
-.form-horizontal .help-block {
-  margin-bottom: 0;
-}
-
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block,
-.form-horizontal .uneditable-input + .help-block,
-.form-horizontal .input-prepend + .help-block,
-.form-horizontal .input-append + .help-block {
-  margin-top: 10px;
-}
-
-.form-horizontal .form-actions {
-  padding-left: 180px;
-}
-
-table {
-  max-width: 100%;
-  background-color: #c9d1d6;
-  border-spacing: 0;
-  text-align:center;
-  font-size:14px;
-}
-
-.table {
-  width: 100%;
-
-}
-.table th,
-.table td {
-  padding: 9px 6px;
-  line-height: 20px;
-  text-align: left;
-  border-top: 1px solid #5d6d7d;
-  color:#004260;
-}
-
-.table th {
-  font-weight: bold;
-  	font-size:15px;
-}
-
-.table thead th {
-	background:#455b71;
-	color:#fff;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table tbody + tbody {
-  border-top: 2px solid #dddddd;
-}
-
-.table .table {
-  background-color: #ffffff;
-}
-
-.table-condensed th,
-.table-condensed td {
-  padding: 4px 5px;
-}
-
-.table-bordered {
-  border: 1px solid #dddddd;
-  border-collapse: separate;
-  *border-collapse: collapse;
-  border-left: 0;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.table-bordered th,
-.table-bordered td {
-  border-left: 1px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
-  border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child > th:first-child,
-.table-bordered tbody:first-child tr:first-child > td:first-child,
-.table-bordered tbody:first-child tr:first-child > th:first-child {
-/*  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;*/
-}
-
-.table-bordered thead:first-child tr:first-child > th:last-child,
-.table-bordered tbody:first-child tr:first-child > td:last-child,
-.table-bordered tbody:first-child tr:first-child > th:last-child {
-/*  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;*/
-}
-
-.table-bordered thead:last-child tr:last-child > th:first-child,
-.table-bordered tbody:last-child tr:last-child > td:first-child,
-.table-bordered tbody:last-child tr:last-child > th:first-child,
-.table-bordered tfoot:last-child tr:last-child > td:first-child,
-.table-bordered tfoot:last-child tr:last-child > th:first-child {
-/*  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;*/
-}
-
-.table-bordered thead:last-child tr:last-child > th:last-child,
-.table-bordered tbody:last-child tr:last-child > td:last-child,
-.table-bordered tbody:last-child tr:last-child > th:last-child,
-.table-bordered tfoot:last-child tr:last-child > td:last-child,
-.table-bordered tfoot:last-child tr:last-child > th:last-child {
-/*  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-bottomright: 4px;*/
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
-  -webkit-border-bottom-left-radius: 0;
-          border-bottom-left-radius: 0;
-  -moz-border-radius-bottomleft: 0;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
-  -webkit-border-bottom-right-radius: 0;
-          border-bottom-right-radius: 0;
-  -moz-border-radius-bottomright: 0;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
-/*  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-topleft: 4px;*/
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
-/*  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -moz-border-radius-topright: 4px;*/
-}
-
-.table-striped tbody > tr:nth-child(odd) > td,
-.table-striped tbody > tr:nth-child(odd) > th {
-  background-color: #f9f9f9;
-}
-
-.table-hover tbody tr:hover > td,
-.table-hover tbody tr:hover > th {
-  background-color: #a2b2bb;
-}
-.table-hover tbody tr.active > td,
-.table-hover tbody tr.active > th {
-  background-color: #a2b2bb;
-  color:#fff;
-}
-
-table td[class*="span"],
-table th[class*="span"],
-.row-fluid table td[class*="span"],
-.row-fluid table th[class*="span"] {
-  display: table-cell;
-  float: none;
-  margin-left: 0;
-}
-
-.table td.span1,
-.table th.span1 {
-  float: none;
-  width: 44px;
-  margin-left: 0;
-}
-
-.table td.span2,
-.table th.span2 {
-  float: none;
-  width: 124px;
-  margin-left: 0;
-}
-
-.table td.span3,
-.table th.span3 {
-  float: none;
-  width: 204px;
-  margin-left: 0;
-}
-
-.table td.span4,
-.table th.span4 {
-  float: none;
-  width: 284px;
-  margin-left: 0;
-}
-
-.table td.span5,
-.table th.span5 {
-  float: none;
-  width: 364px;
-  margin-left: 0;
-}
-
-.table td.span6,
-.table th.span6 {
-  float: none;
-  width: 444px;
-  margin-left: 0;
-}
-
-.table td.span7,
-.table th.span7 {
-  float: none;
-  width: 524px;
-  margin-left: 0;
-}
-
-.table td.span8,
-.table th.span8 {
-  float: none;
-  width: 604px;
-  margin-left: 0;
-}
-
-.table td.span9,
-.table th.span9 {
-  float: none;
-  width: 684px;
-  margin-left: 0;
-}
-
-.table td.span10,
-.table th.span10 {
-  float: none;
-  width: 764px;
-  margin-left: 0;
-}
-
-.table td.span11,
-.table th.span11 {
-  float: none;
-  width: 844px;
-  margin-left: 0;
-}
-
-.table td.span12,
-.table th.span12 {
-  float: none;
-  width: 924px;
-  margin-left: 0;
-}
-.table thead tr.gray > td {
-  background-color: #f00;
-}
-
-.table tbody tr.success > td {
-  background-color: #dff0d8;
-}
-
-.table tbody tr.error > td {
-  background-color: #f2dede;
-}
-
-.table tbody tr.warning > td {
-  background-color: #fefbee;
-}
-
-.table tbody tr.info > td {
-  background-color: #e4f5fe;
-}
-.table tbody tr.active > td {
-  background-color: #5a7686;
-}
-.table-hover thead tr.gray:hover > td {
-  background-color: #efeded;
-}
-
-.table-hover tbody tr.success:hover > td {
-  background-color: #d0e9c6;
-}
-
-.table-hover tbody tr.error:hover > td {
-  background-color: #ebcccc;
-}
-
-.table-hover tbody tr.warning:hover > td {
-  background-color: #faf2cc;
-}
-
-.table-hover tbody tr.info:hover > td {
-  background-color: #c4e3f3;
-}
-
-
-[class^="icon-"],
-[class*=" icon-"] {
-  display: inline-block;
-  width: 14px;
-  height: 14px;
-  margin-top: 1px;
-  *margin-right: .3em;
-  line-height: 14px;
-  vertical-align: text-top;
-  background-image: url("../img/glyphicons-halflings.png");
-  background-position: 14px 14px;
-  background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/focus/active states of certain elements */
-
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-
-.icon-red,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
-  background-image: url("../img/glyphicons-halflings-red.png");
-}
-
-
-.icon-glass {
-  background-position: 0      0;
-}
-
-.icon-music {
-  background-position: -24px 0;
-}
-
-.icon-search {
-  background-position: -48px 0;
-}
-
-.icon-envelope {
-  background-position: -72px 0;
-}
-
-.icon-heart {
-  background-position: -96px 0;
-}
-
-.icon-star {
-  background-position: -120px 0;
-}
-
-.icon-star-empty {
-  background-position: -144px 0;
-}
-
-.icon-user {
-  background-position: -168px 0;
-}
-
-.icon-film {
-  background-position: -192px 0;
-}
-
-.icon-th-large {
-  background-position: -216px 0;
-}
-
-.icon-th {
-  background-position: -240px 0;
-}
-
-.icon-th-list {
-  background-position: -264px 0;
-}
-
-.icon-ok {
-  background-position: -288px 0;
-}
-
-.icon-remove {
-  background-position: -312px 0;
-}
-
-.icon-zoom-in {
-  background-position: -336px 0;
-}
-
-.icon-zoom-out {
-  background-position: -360px 0;
-}
-
-.icon-off {
-  background-position: -384px 0;
-}
-
-.icon-signal {
-  background-position: -408px 0;
-}
-
-.icon-cog {
-  background-position: -432px 0;
-}
-
-.icon-trash {
-  background-position: -456px 0;
-}
-
-.icon-home {
-  background-position: 0 -24px;
-}
-
-.icon-file {
-  background-position: -24px -24px;
-}
-
-.icon-time {
-  background-position: -48px -24px;
-}
-
-.icon-road {
-  background-position: -72px -24px;
-}
-
-.icon-download-alt {
-  background-position: -96px -24px;
-}
-
-.icon-download {
-  background-position: -120px -24px;
-}
-
-.icon-upload {
-  background-position: -144px -24px;
-}
-
-.icon-inbox {
-  background-position: -168px -24px;
-}
-
-.icon-play-circle {
-  background-position: -192px -24px;
-}
-
-.icon-repeat {
-  background-position: -216px -24px;
-}
-
-.icon-refresh {
-  background-position: -240px -24px;
-}
-
-.icon-list-alt {
-  background-position: -264px -24px;
-}
-
-.icon-lock {
-  background-position: -287px -24px;
-}
-
-.icon-flag {
-  background-position: -312px -24px;
-}
-
-.icon-headphones {
-  background-position: -336px -24px;
-}
-
-.icon-volume-off {
-  background-position: -360px -24px;
-}
-
-.icon-volume-down {
-  background-position: -384px -24px;
-}
-
-.icon-volume-up {
-  background-position: -408px -24px;
-}
-
-.icon-qrcode {
-  background-position: -432px -24px;
-}
-
-.icon-barcode {
-  background-position: -456px -24px;
-}
-
-.icon-tag {
-  background-position: 0 -48px;
-}
-
-.icon-tags {
-  background-position: -25px -48px;
-}
-
-.icon-book {
-  background-position: -48px -48px;
-}
-
-.icon-bookmark {
-  background-position: -72px -48px;
-}
-
-.icon-print {
-  background-position: -96px -48px;
-}
-
-.icon-camera {
-  background-position: -120px -48px;
-}
-
-.icon-font {
-  background-position: -144px -48px;
-}
-
-.icon-bold {
-  background-position: -167px -48px;
-}
-
-.icon-italic {
-  background-position: -192px -48px;
-}
-
-.icon-text-height {
-  background-position: -216px -48px;
-}
-
-.icon-text-width {
-  background-position: -240px -48px;
-}
-
-.icon-align-left {
-  background-position: -264px -48px;
-}
-
-.icon-align-center {
-  background-position: -288px -48px;
-}
-
-.icon-align-right {
-  background-position: -312px -48px;
-}
-
-.icon-align-justify {
-  background-position: -336px -48px;
-}
-
-.icon-list {
-  background-position: -360px -48px;
-}
-
-.icon-indent-left {
-  background-position: -384px -48px;
-}
-
-.icon-indent-right {
-  background-position: -408px -48px;
-}
-
-.icon-facetime-video {
-  background-position: -432px -48px;
-}
-
-.icon-picture {
-  background-position: -456px -48px;
-}
-
-.icon-pencil {
-  background-position: 0 -72px;
-}
-
-.icon-map-marker {
-  background-position: -24px -72px;
-}
-
-.icon-adjust {
-  background-position: -48px -72px;
-}
-
-.icon-tint {
-  background-position: -72px -72px;
-}
-
-.icon-edit {
-  background-position: -96px -72px;
-}
-
-.icon-share {
-  background-position: -120px -72px;
-}
-
-.icon-check {
-  background-position: -144px -72px;
-}
-
-.icon-move {
-  background-position: -168px -72px;
-}
-
-.icon-step-backward {
-  background-position: -192px -72px;
-}
-
-.icon-fast-backward {
-  background-position: -216px -72px;
-}
-
-.icon-backward {
-  background-position: -240px -72px;
-}
-
-.icon-play {
-  background-position: -264px -72px;
-}
-
-.icon-pause {
-  background-position: -288px -72px;
-}
-
-.icon-stop {
-  background-position: -312px -72px;
-}
-
-.icon-forward {
-  background-position: -336px -72px;
-}
-
-.icon-fast-forward {
-  background-position: -360px -72px;
-}
-
-.icon-step-forward {
-  background-position: -384px -72px;
-}
-
-.icon-eject {
-  background-position: -408px -72px;
-}
-
-.icon-chevron-left {
-  background-position: -432px -72px;
-}
-
-.icon-chevron-right {
-  background-position: -456px -72px;
-}
-
-.icon-plus-sign {
-  background-position: 0 -96px;
-}
-
-.icon-minus-sign {
-  background-position: -24px -96px;
-}
-
-.icon-remove-sign {
-  background-position: -48px -96px;
-}
-
-.icon-ok-sign {
-  background-position: -72px -96px;
-}
-
-.icon-question-sign {
-  background-position: -96px -96px;
-}
-
-.icon-info-sign {
-  background-position: -120px -96px;
-}
-
-.icon-screenshot {
-  background-position: -144px -96px;
-}
-
-.icon-remove-circle {
-  background-position: -168px -96px;
-}
-
-.icon-ok-circle {
-  background-position: -192px -96px;
-}
-
-.icon-ban-circle {
-  background-position: -216px -96px;
-}
-
-.icon-arrow-left {
-  background-position: -240px -96px;
-}
-
-.icon-arrow-right {
-  background-position: -264px -96px;
-}
-
-.icon-arrow-up {
-  background-position: -289px -96px;
-}
-
-.icon-arrow-down {
-  background-position: -312px -96px;
-}
-
-.icon-share-alt {
-  background-position: -336px -96px;
-}
-
-.icon-resize-full {
-  background-position: -360px -96px;
-}
-
-.icon-resize-small {
-  background-position: -384px -96px;
-}
-
-.icon-plus {
-  background-position: -408px -96px;
-}
-
-.icon-minus {
-  background-position: -433px -96px;
-}
-
-.icon-asterisk {
-  background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
-  background-position: 0 -120px;
-}
-
-.icon-gift {
-  background-position: -24px -120px;
-}
-
-.icon-leaf {
-  background-position: -48px -120px;
-}
-
-.icon-fire {
-  background-position: -72px -120px;
-}
-
-.icon-eye-open {
-  background-position: -96px -120px;
-}
-
-.icon-eye-close {
-  background-position: -120px -120px;
-}
-
-.icon-warning-sign {
-  background-position: -144px -120px;
-}
-
-.icon-plane {
-  background-position: -168px -120px;
-}
-
-.icon-calendar {
-  background-position: -192px -120px;
-}
-
-.icon-random {
-  width: 16px;
-  background-position: -216px -120px;
-}
-
-.icon-comment {
-  background-position: -240px -120px;
-}
-
-.icon-magnet {
-  background-position: -264px -120px;
-}
-
-.icon-chevron-up {
-  background-position: -288px -120px;
-}
-
-.icon-chevron-down {
-  background-position: -313px -119px;
-}
-
-.icon-retweet {
-  background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
-  background-position: -360px -120px;
-}
-
-.icon-folder-close {
-  width: 16px;
-  background-position: -384px -120px;
-}
-
-.icon-folder-open {
-  width: 16px;
-  background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
-  background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
-  background-position: -456px -118px;
-}
-
-.icon-hdd {
-  background-position: 0 -144px;
-}
-
-.icon-bullhorn {
-  background-position: -24px -144px;
-}
-
-.icon-bell {
-  background-position: -48px -144px;
-}
-
-.icon-certificate {
-  background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
-  background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
-  background-position: -120px -144px;
-}
-
-.icon-hand-right {
-  background-position: -144px -144px;
-}
-
-.icon-hand-left {
-  background-position: -168px -144px;
-}
-
-.icon-hand-up {
-  background-position: -192px -144px;
-}
-
-.icon-hand-down {
-  background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
-  background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
-  background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
-  background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
-  background-position: -312px -144px;
-}
-
-.icon-globe {
-  background-position: -336px -144px;
-}
-
-.icon-wrench {
-  background-position: -360px -144px;
-}
-
-.icon-tasks {
-  background-position: -384px -144px;
-}
-
-.icon-filter {
-  background-position: -408px -144px;
-}
-
-.icon-briefcase {
-  background-position: -432px -144px;
-}
-
-.icon-fullscreen {
-  background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
-  position: relative;
-}
-
-.dropdown-toggle {
-  *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
-  outline: 0;
-}
-
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  vertical-align: top;
-  border-top: 4px solid #000000;
-  border-right: 4px solid transparent;
-  border-left: 4px solid transparent;
-  content: "";
-}
-
-.dropdown .caret {
-  margin-top: 8px;
-  margin-left: 2px;
-}
-
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index:9999;
-  display: none;
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0;
-  list-style: none;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  *border-right-width: 2px;
-  *border-bottom-width: 2px;
-/*  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;*/
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.dropdown-menu .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.dropdown-menu > li > a {
-  display: block;
-  padding: 3px 20px;
-  clear: both;
-  font-weight: normal;
-  line-height: 20px;
-  color: #333333;
-  white-space: nowrap;
-}
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus,
-.dropdown-submenu:hover > a,
-.dropdown-submenu:focus > a {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #0081c2;
-  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  color: #ffffff;
-  text-decoration: none;
-  background-color: #0081c2;
-  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
-  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
-  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
-  background-repeat: repeat-x;
-  outline: 0;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  color: #999999;
-}
-
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-  background-image: none;
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.open {
-  *z-index: 1000;
-}
-
-.open > .dropdown-menu {
-  display: block;
-}
-
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
-  border-top: 0;
-  border-bottom: 4px solid #000000;
-  content: "";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
-  top: auto;
-  bottom: 100%;
-  margin-bottom: 1px;
-}
-
-.dropdown-submenu {
-  position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
-  top: 0;
-  left: 100%;
-  margin-top: -6px;
-  margin-left: -1px;
-  -webkit-border-radius: 0 6px 6px 6px;
-     -moz-border-radius: 0 6px 6px 6px;
-          border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover > .dropdown-menu {
-  display: block;
-}
-
-.dropup .dropdown-submenu > .dropdown-menu {
-  top: auto;
-  bottom: 0;
-  margin-top: 0;
-  margin-bottom: -2px;
-  -webkit-border-radius: 5px 5px 5px 0;
-     -moz-border-radius: 5px 5px 5px 0;
-          border-radius: 5px 5px 5px 0;
-}
-
-.dropdown-submenu > a:after {
-  display: block;
-  float: right;
-  width: 0;
-  height: 0;
-  margin-top: 5px;
-  margin-right: -10px;
-  border-color: transparent;
-  border-left-color: #cccccc;
-  border-style: solid;
-  border-width: 5px 0 5px 5px;
-  content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
-  border-left-color: #ffffff;
-}
-
-.dropdown-submenu.pull-left {
-  float: none;
-}
-
-.dropdown-submenu.pull-left > .dropdown-menu {
-  left: -100%;
-  margin-left: 10px;
-  -webkit-border-radius: 6px 0 6px 6px;
-     -moz-border-radius: 6px 0 6px 6px;
-          border-radius: 6px 0 6px 6px;
-}
-
-.dropdown .dropdown-menu .nav-header {
-  padding-right: 20px;
-  padding-left: 20px;
-}
-
-.typeahead {
-  z-index: 1051;
-  margin-top: 2px;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-
-.well blockquote {
-  border-color: #ddd;
-  border-color: rgba(0, 0, 0, 0.15);
-}
-
-.well-large {
-  padding: 24px;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.well-small {
-  padding: 9px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.fade {
-  opacity: 0;
-  -webkit-transition: opacity 0.15s linear;
-     -moz-transition: opacity 0.15s linear;
-       -o-transition: opacity 0.15s linear;
-          transition: opacity 0.15s linear;
-}
-
-.fade.in {
-  opacity: 1;
-}
-
-.collapse {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  -webkit-transition: height 0.35s ease;
-     -moz-transition: height 0.35s ease;
-       -o-transition: height 0.35s ease;
-          transition: height 0.35s ease;
-}
-
-.collapse.in {
-  height: auto;
-}
-
-.close {
-  float: right;
-  font-size: 13px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #000000;
-  text-shadow: 0 1px 0 #ffffff;
-  opacity: 0.2;
-  filter: alpha(opacity=20);
-}
-
-.close:hover,
-.close:focus {
-  color: #000000;
-  text-decoration: none;
-  cursor: pointer;
-  opacity: 0.4;
-  filter: alpha(opacity=40);
-}
-
-button.close {
-  padding: 0;
-  cursor: pointer;
-  background: transparent;
-  border: 0;
-  -webkit-appearance: none;
-}
-
-.btn {
-  display: inline-block;
-  *display: inline;
-  padding: 4px 12px;
-  *margin-left: .3em;
-  font-size: 14px;
-  line-height: 20px;
-  color: #333333;
-  text-align: center;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  vertical-align: middle;
-  cursor: pointer;
-  background-color: #f5f5f5;
-  *background-color: #e6e6e6;
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  border: 1px solid #cccccc;
-  *border: 0;
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  border-bottom-color: #b3b3b3;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn:hover,
-.btn:focus,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-  color: #333333;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-}
-
-.btn:active,
-.btn.active {
-  background-color: #cccccc \9;
-}
-
-.btn:first-child {
-  *margin-left: 0;
-}
-
-.btn:hover,
-.btn:focus {
-  color: #333333;
-  text-decoration: none;
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-     -moz-transition: background-position 0.1s linear;
-       -o-transition: background-position 0.1s linear;
-          transition: background-position 0.1s linear;
-}
-
-.btn:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn.disabled,
-.btn[disabled] {
-  cursor: default;
-  background-image: none;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-large {
-  padding: 11px 19px;
-  font-size: 17.5px;
-/*  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;*/
-}
-
-.btn-large [class^="icon-"],
-.btn-large [class*=" icon-"] {
-  margin-top: 4px;
-}
-
-.btn-small {
-  padding: 2px 10px;
-  font-size: 11.9px;
-/*  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;*/
-}
-
-.btn-small [class^="icon-"],
-.btn-small [class*=" icon-"] {
-  margin-top: 0;
-}
-
-.btn-mini [class^="icon-"],
-.btn-mini [class*=" icon-"] {
-  margin-top: -1px;
-}
-
-.btn-mini {
-  padding: 0 6px;
-  font-size: 10.5px;
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
-  width: 100%;
-}
-
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-.btn-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #006dcc;
-  *background-color: #0044cc;
-  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
-  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
-  background-repeat: repeat-x;
-  border-color: #0044cc #0044cc #002a80;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-primary:hover,
-.btn-primary:focus,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
-  color: #ffffff;
-  background-color: #0044cc;
-  *background-color: #003bb3;
-}
-
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #003399 \9;
-}
-
-.btn-warning {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #faa732;
-  *background-color: #f89406;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  border-color: #f89406 #f89406 #ad6704;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-  color: #ffffff;
-  background-color: #f89406;
-  *background-color: #df8505;
-}
-
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #c67605 \9;
-}
-
-.btn-danger {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #da4f49;
-  *background-color: #bd362f;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
-  background-repeat: repeat-x;
-  border-color: #bd362f #bd362f #802420;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-  color: #ffffff;
-  background-color: #bd362f;
-  *background-color: #a9302a;
-}
-
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #942a25 \9;
-}
-
-.btn-success {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #5bb75b;
-  *background-color: #51a351;
-  background-image: -moz-linear-gradient(top, #62c462, #51a351);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
-  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
-  background-image: -o-linear-gradient(top, #62c462, #51a351);
-  background-image: linear-gradient(to bottom, #62c462, #51a351);
-  background-repeat: repeat-x;
-  border-color: #51a351 #51a351 #387038;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-  color: #ffffff;
-  background-color: #51a351;
-  *background-color: #499249;
-}
-
-.btn-success:active,
-.btn-success.active {
-  background-color: #408140 \9;
-}
-
-.btn-info {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #49afcd;
-  *background-color: #2f96b4;
-  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
-  background-repeat: repeat-x;
-  border-color: #2f96b4 #2f96b4 #1f6377;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-  color: #ffffff;
-  background-color: #2f96b4;
-  *background-color: #2a85a0;
-}
-
-.btn-info:active,
-.btn-info.active {
-  background-color: #24748c \9;
-}
-
-.btn-inverse {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #363636;
-  *background-color: #222222;
-  background-image: -moz-linear-gradient(top, #444444, #222222);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
-  background-image: -webkit-linear-gradient(top, #444444, #222222);
-  background-image: -o-linear-gradient(top, #444444, #222222);
-  background-image: linear-gradient(to bottom, #444444, #222222);
-  background-repeat: repeat-x;
-  border-color: #222222 #222222 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:focus,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-  color: #ffffff;
-  background-color: #222222;
-  *background-color: #151515;
-}
-
-.btn-inverse:active,
-.btn-inverse.active {
-  background-color: #080808 \9;
-}
-
-button.btn,
-input[type="submit"].btn {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
-  *padding-top: 7px;
-  *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
-  *padding-top: 3px;
-  *padding-bottom: 3px;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
-  *padding-top: 1px;
-  *padding-bottom: 1px;
-}
-
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
-  background-color: transparent;
-  background-image: none;
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-.btn-link {
-  color: #0088cc;
-  cursor: pointer;
-  border-color: transparent;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-link:hover,
-.btn-link:focus {
-  color: #005580;
-  text-decoration: underline;
-  background-color: transparent;
-}
-
-.btn-link[disabled]:hover,
-.btn-link[disabled]:focus {
-  color: #333333;
-  text-decoration: none;
-}
-
-.btn-group {
-  position: relative;
-  display: inline-block;
-  *display: inline;
-  *margin-left: .3em;
-  font-size: 0;
-  white-space: nowrap;
-  vertical-align: middle;
-  *zoom: 1;
-}
-
-.btn-group:first-child {
-  *margin-left: 0;
-}
-
-.btn-group + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-toolbar {
-  margin-top: 10px;
-  margin-bottom: 10px;
-  font-size: 0;
-}
-
-.btn-toolbar > .btn + .btn,
-.btn-toolbar > .btn-group + .btn,
-.btn-toolbar > .btn + .btn-group {
-  margin-left: 5px;
-}
-
-.btn-group > .btn {
-  position: relative;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
-  margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu,
-.btn-group > .popover {
-  font-size: 14px;
-}
-
-.btn-group > .btn-mini {
-  font-size: 10.5px;
-}
-
-.btn-group > .btn-small {
-  font-size: 11.9px;
-}
-
-.btn-group > .btn-large {
-  font-size: 17.5px;
-}
-
-.btn-group > .btn:first-child {
-  margin-left: 0;
-/*  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  -moz-border-radius-topleft: 4px;*/
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
-/*  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-bottomright: 4px;*/
-}
-
-.btn-group > .btn.large:first-child {
-  margin-left: 0;
-/*  -webkit-border-bottom-left-radius: 6px;
-          border-bottom-left-radius: 6px;
-  -webkit-border-top-left-radius: 6px;
-          border-top-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  -moz-border-radius-topleft: 6px;*/
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
-/*  -webkit-border-top-right-radius: 6px;
-          border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-          border-bottom-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  -moz-border-radius-bottomright: 6px;*/
-}
-
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
-  z-index: 2;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
-  *padding-top: 5px;
-  padding-right: 8px;
-  *padding-bottom: 5px;
-  padding-left: 8px;
-  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
-  *padding-top: 2px;
-  padding-right: 5px;
-  *padding-bottom: 2px;
-  padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
-  *padding-top: 5px;
-  *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
-  *padding-top: 7px;
-  padding-right: 12px;
-  *padding-bottom: 7px;
-  padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
-  background-image: none;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group.open .btn.dropdown-toggle {
-  background-color: #e6e6e6;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
-  background-color: #0044cc;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
-  background-color: #f89406;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
-  background-color: #bd362f;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
-  background-color: #51a351;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
-  background-color: #2f96b4;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
-  background-color: #222222;
-}
-
-.btn .caret {
-  margin-top: 8px;
-  margin-left: 0;
-}
-
-.btn-large .caret {
-  margin-top: 6px;
-}
-
-.btn-large .caret {
-  border-top-width: 5px;
-  border-right-width: 5px;
-  border-left-width: 5px;
-}
-
-.btn-mini .caret,
-.btn-small .caret {
-  margin-top: 8px;
-}
-
-.dropup .btn-large .caret {
-  border-bottom-width: 5px;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
-  display: inline-block;
-  *display: inline;
-  /* IE7 inline-block hack */
-
-  *zoom: 1;
-}
-
-.btn-group-vertical > .btn {
-  display: block;
-  float: none;
-  max-width: 100%;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.btn-group-vertical > .btn + .btn {
-  margin-top: -1px;
-  margin-left: 0;
-}
-
-.btn-group-vertical > .btn:first-child {
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.btn-group-vertical > .btn:last-child {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.btn-group-vertical > .btn-large:first-child {
-  -webkit-border-radius: 6px 6px 0 0;
-     -moz-border-radius: 6px 6px 0 0;
-          border-radius: 6px 6px 0 0;
-}
-
-.btn-group-vertical > .btn-large:last-child {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.alert {
-  padding: 5px 30px 5px 14px;
-  margin:6px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  background-color: #fcf8e3;
-  border: 1px solid #fbeed5;
- -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.alert,
-.alert h4 {
-  color: #c09853;
-}
-
-.alert h4 {
-  margin: 0;
-}
-
-.alert .close {
-  position: relative;
-/*  top: -2px;
-*/  right: -21px;
-  line-height: 20px;
-}
-
-.alert-success {
-  color: #468847;
-  background-color: #dff0d8;
-  border-color: #d6e9c6;
-}
-
-.alert-success h4 {
-  color: #468847;
-}
-
-.alert-danger,
-.alert-error {
-  color: #b94a48;
-  background-color: #f2dede;
-  border-color: #eed3d7;
-}
-
-.alert-danger h4,
-.alert-error h4 {
-  color: #b94a48;
-}
-
-.alert-info {
-  color: #3a87ad;
-  background-color: #d9edf7;
-  border-color: #bce8f1;
-}
-
-.alert-info h4 {
-  color: #3a87ad;
-}
-
-.alert-block {
-  padding-top: 14px;
-  padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
-  margin-bottom: 0;
-}
-
-.alert-block p + p {
-  margin-top: 5px;
-}
-
-.nav {
-/*  margin-bottom: 20px;*/
-/*margin-top:5px;*/
-  margin-left: 0;
-  list-style: none;
-  font-weight:bold;
-}
-
-.nav > li > a {
-  display: block;
-}
-
-.nav > li > a:hover,
-.nav > li > a:focus {
-  text-decoration: none;
-  background-color: #0088CC;
-  color:#fff;
-}
-
-.nav > li > a > img {
-  max-width: none;
-}
-
-.nav > .pull-right {
-  float: right;
-}
-
-.nav-header {
-  display: block;
-  padding: 3px 15px;
-  font-size: 11px;
-  font-weight: bold;
-  line-height: 20px;
-  color: #999999;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-  text-transform: uppercase;
-}
-
-.nav li + .nav-header {
-  margin-top: 9px;
-}
-
-.nav-list {
-  padding-right: 15px;
-  padding-left: 15px;
-  margin-bottom: 0;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
-  margin-right: -15px;
-  margin-left: -15px;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.nav-list > li > a {
-  padding: 3px 15px;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover,
-.nav-list > .active > a:focus {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
-  background-color: #0088cc;
-}
-
-.nav-list [class^="icon-"],
-.nav-list [class*=" icon-"] {
-  margin-right: 2px;
-}
-
-.nav-list .divider {
-  *width: 100%;
-  height: 1px;
-  margin: 9px 1px;
-  *margin: -5px 0 5px;
-  overflow: hidden;
-  background-color: #e5e5e5;
-  border-bottom: 1px solid #ffffff;
-}
-
-.nav-tabs,
-.nav-pills {
-  *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
-  clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
-  float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
-  padding-right: 12px;
-  padding-left: 12px;
-  margin-right: 2px;
-  line-height: 14px;
-}
-
-.nav-tabs {
- /*  border-bottom: 1px solid #ddd;
- min-height:250px;
-*/
-margin:0 10px;
-}
-
-.nav-tabs > li {
-  margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
-  padding-top: 10px;
-  padding-bottom: 10px;
-/*  line-height: 20px;*/
-  border: 1px solid transparent;
-  -webkit-border-radius: 4px 4px 0 0;
-     -moz-border-radius: 4px 4px 0 0;
-          border-radius: 4px 4px 0 0;
-}
-
-.nav-tabs > li > a:hover,
-.nav-tabs > li > a:focus {
-  border-color: #eeeeee #eeeeee #dddddd;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover,
-.nav-tabs > .active > a:focus {
-  color: #555555;
-  cursor: default;
-  background-color: #ffffff;
-  background-image:linear-gradient(to bottom, #fafafa, #f0f0f0);
-  border: 1px solid #ddd;
-  border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
-  padding-top: 8px;
-  padding-bottom: 8px;
-  margin-top: 2px;
-  margin-bottom: 2px;
-  background-color:#c9e9ff;
-/*  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;*/
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover,
-.nav-pills > .active > a:focus {
-  color: #fff;
-  background-color: #0088cc;
-  border:#1972c3 solid 1px;
-}
-
-.nav-pills > .warning > a,
-.nav-pills > .warning > a:hover,
-.nav-pills > .warning > a:focus {
-  color: #B94A48;
-  background-color: #F2DEDE;
-  border:#EED3D7 solid 1px;
-}
-
-.nav-stacked > li {
-  float: none;
-}
-
-.nav-stacked > li > a {
-  margin-right: 0;
-/*  border:1px solid #B9D9F0;
-*/}
-
-.nav-tabs.nav-stacked {
-  border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
-  border: 1px solid #ddd;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
-  -webkit-border-top-right-radius: 2px;
-          border-top-right-radius: 2px;
-  -webkit-border-top-left-radius: 2px;
-          border-top-left-radius: 2px;
-  -moz-border-radius-topright: 2px;
-  -moz-border-radius-topleft: 2px;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -moz-border-radius-bottomright: 4px;
-  -moz-border-radius-bottomleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li > a:hover,
-.nav-tabs.nav-stacked > li > a:focus {
-  z-index: 2;
-  border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
-  margin-bottom: 5px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
-  margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-}
-
-.nav-pills .dropdown-menu {
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.nav .dropdown-toggle .caret {
-  margin-top: 6px;
-  border-top-color: #0088cc;
-  border-bottom-color: #0088cc;
-}
-
-.nav .dropdown-toggle:hover .caret,
-.nav .dropdown-toggle:focus .caret {
-  border-top-color: #005580;
-  border-bottom-color: #005580;
-}
-
-/* move down carets for tabs */
-
-.nav-tabs .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.nav .active .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.nav > .dropdown.active > a:hover,
-.nav > .dropdown.active > a:focus {
-  cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover,
-.nav > li.dropdown.open.active > a:focus {
-  color: #ffffff;
-  background-color: #999999;
-  border-color: #999999;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret,
-.nav li.dropdown.open a:focus .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-  opacity: 1;
-  filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover,
-.tabs-stacked .open > a:focus {
-  border-color: #999999;
-}
-
-.tabbable {
-  *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.tabbable:after {
-  clear: both;
-}
-
-.tab-content {
-  overflow: auto;
-  border:#ddd solid 1px;
-  padding:15px;
-/*  min-height:428px;
-*/  border-radius:0px 4px 4px 4px;
-/*  border-top:none;
-  border-right:none;
-  border-bottom:none;  border-left:none;*/
-  border:#ddd solid 1px;
-  margin-bottom:10px;
-  margin-left:10px; margin-right:10px;
-
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
-  border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
-  display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
-  display: block;
-}
-
-.tabs-below > .nav-tabs {
-  border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
-  margin-top: -1px;
-  margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
-  -webkit-border-radius: 0 0 4px 4px;
-     -moz-border-radius: 0 0 4px 4px;
-          border-radius: 0 0 4px 4px;
-}
-
-.tabs-below > .nav-tabs > li > a:hover,
-.tabs-below > .nav-tabs > li > a:focus {
-  border-top-color: #ddd;
-  border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover,
-.tabs-below > .nav-tabs > .active > a:focus {
-  border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
-  float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
-  min-width: 74px;
-  margin-right: 0;
-  margin-bottom: 5px;
-}
-
-.tabs-left > .nav-tabs {
-  float: left;
-  margin-right: 0px;
-  border-right: 1px solid #ddd;
-  min-height:448px;
-}
-
-.tabs-left > .nav-tabs > li > a {
-  margin-right: -1px;
-  -webkit-border-radius: 4px 0 0 4px;
-     -moz-border-radius: 4px 0 0 4px;
-          border-radius: 4px 0 0 4px;
-		  font-size:18px;
-}
-
-.tabs-left > .nav-tabs > li > a:hover,
-.tabs-left > .nav-tabs > li > a:focus {
-  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover,
-.tabs-left > .nav-tabs .active > a:focus {
-  border-color: #ddd transparent #ddd #ddd;
-  *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
-  float: right;
-  margin-left: 19px;
-  border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
-  margin-left: -1px;
-  -webkit-border-radius: 0 4px 4px 0;
-     -moz-border-radius: 0 4px 4px 0;
-          border-radius: 0 4px 4px 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover,
-.tabs-right > .nav-tabs > li > a:focus {
-  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover,
-.tabs-right > .nav-tabs .active > a:focus {
-  border-color: #ddd #ddd #ddd transparent;
-  *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
-  color: #999999;
-}
-
-.nav > .disabled > a:hover,
-.nav > .disabled > a:focus {
-  text-decoration: none;
-  cursor: default;
-  background-color: transparent;
-}
-
-.navbar {
-  *position: relative;
-  *z-index: 2;
-  margin-bottom: 0px;
-  overflow: visible;
-}
-
-.navbar-inner {
-  background-image:url(../images/header-bg.png);
-  min-height: 50px;
-  padding-right: 20px;
-  padding-left: 20px;
- background-color: #0073BF;
-  /* background-image: -moz-linear-gradient(top, #017CCE, #0073BF);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#017CCE), to(#0073BF));
-  background-image: -webkit-linear-gradient(top, #017CCE, #0073BF);
-  background-image: -o-linear-gradient(top, #017CCE, #0073BF);
-  background-image: linear-gradient(to bottom, #017CCE, #0073BF);*/
-  background-repeat: repeat-x;
-  border: none;
-  -webkit-border-radius: 0px;
-     -moz-border-radius: 0px;
-          border-radius: 0px;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#34a4ee', endColorstr='#086dba', GradientType=0);
-  *zoom: 1;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-
-.navbar-inner:before,
-.navbar-inner:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.navbar-inner:after {
-  clear: both;
-}
-
-.navbar .container {
-  width: auto;
-}
-
-.nav-collapse.collapse {
-  height: auto;
-  overflow: visible;
-}
-
-.navbar .brand {
-  display: block;
-  float: left;
-  margin-left: -20px;
-  font-size: 26px;
-  color: #fff;
-  text-shadow: 0 1px 0 #4d4d4d;
-  font-family:"微软雅黑";
-  height:50px; line-height:50px;
-  padding:0 20px;
-}
-
-.navbar .brand:hover,
-.navbar .brand:focus {
-  text-decoration: none;
-}
-
-.navbar-text {
-  margin-bottom: 0;
-  line-height: 40px;
-  color: #777777;
-}
-
-.navbar-link {
-  color: #777777;
-}
-
-.navbar-link:hover,
-.navbar-link:focus {
-  color: #333333;
-}
-
-.navbar .divider-vertical {
-  height: 10px;
-  margin: 22px 5px;
-  border-right: 0px solid #ffffff;
-  border-left: 1px solid #f2f2f2;
-}
-
-.navbar .btn,
-.navbar .btn-group {
-  margin-top: 5px;
-}
-
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn,
-.navbar .input-prepend .btn-group,
-.navbar .input-append .btn-group {
-  margin-top: 0;
-}
-
-.navbar-form {
-  margin-bottom: 0;
-  *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.navbar-form:after {
-  clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
-  margin-top: 5px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
-  display: inline-block;
-  margin-bottom: 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
-  margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
-  margin-top: 5px;
-  white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
-  margin-top: 0;
-}
-
-.navbar-search {
-  position: relative;
-  float: left;
-  margin-top: 5px;
-  margin-bottom: 0;
-}
-
-.navbar-search .search-query {
-  padding: 4px 14px;
-  margin-bottom: 0;
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.navbar-static-top {
-  position: static;
-  margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: 1030;
-  margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  border-width: 0 0 1px;
-}
-
-.navbar-fixed-bottom .navbar-inner {
-  border-width: 1px 0 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
-  padding-right: 0;
-  padding-left: 0;
-  -webkit-border-radius: 0;
-     -moz-border-radius: 0;
-          border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
-  width: 940px;
-}
-
-.navbar-fixed-top {
-  top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
-  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar-fixed-bottom {
-  bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
-  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar .nav {
-  position: relative;
-  left: 0;
-  display: block;
-  float: left;
-  margin: 0 10px 0 0;
-}
-
-.navbar .nav.pull-right {
-  float: right;
-  margin-right: 0;
-}
-
-.navbar .nav > li {
-  float: left;
-}
-
-.navbar .nav > li > a {
-  color: #fff;
-  text-decoration: none;
-/*  border-radius:4px;*/
-  height:35px; 
-  line-height:35px;
-  margin:10px; 
-  padding:0 10px;
-  text-shadow: 0 1px 0 #;
-}
-
-.navbar .nav .dropdown-toggle .caret {
-  margin-top: 8px;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
-  color: #fff;
-  text-decoration: none;
-  background-color: #0961a3;
-  
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
-  color: #00659a;
-  text-decoration: none;
-/*  border-radius:4px;*/
-  height:35px; line-height:35px;
-  margin:10px; 
-  padding:0 10px;
-  background-color: #c4e8ff;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-
-.navbar .btn-navbar {
-  display: none;
-  float: right;
-  padding: 7px 10px;
-  margin-right: 5px;
-  margin-left: 5px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #ededed;
-  *background-color: #e5e5e5;
-  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
-  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
-  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
-  background-repeat: repeat-x;
-  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:focus,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #e5e5e5;
-  *background-color: #d9d9d9;
-}
-
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
-  background-color: #cccccc \9;
-}
-
-.navbar .btn-navbar .icon-bar {
-  display: block;
-  width: 18px;
-  height: 2px;
-  background-color: #f5f5f5;
-  -webkit-border-radius: 1px;
-     -moz-border-radius: 1px;
-          border-radius: 1px;
-  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.btn-navbar .icon-bar + .icon-bar {
-  margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
-  position: absolute;
-  top: -7px;
-  left: 9px;
-  display: inline-block;
-  border-right: 7px solid transparent;
-  border-bottom: 7px solid #ccc;
-  border-left: 7px solid transparent;
-  border-bottom-color: rgba(0, 0, 0, 0.2);
-  content: '';
-}
-
-.navbar .nav > li > .dropdown-menu:after {
-  position: absolute;
-  top: -6px;
-  left: 10px;
-  display: inline-block;
-  border-right: 6px solid transparent;
-  border-bottom: 6px solid #ffffff;
-  border-left: 6px solid transparent;
-  content: '';
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
-  top: auto;
-  bottom: -7px;
-  border-top: 7px solid #ccc;
-  border-bottom: 0;
-  border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
-  top: auto;
-  bottom: -6px;
-  border-top: 6px solid #ffffff;
-  border-bottom: 0;
-}
-
-.navbar .nav li.dropdown > a:hover .caret,
-.navbar .nav li.dropdown > a:focus .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #555555;
-  background-color: #e5e5e5;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #fff;
-  border-bottom-color: #fff;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #555555;
-  border-bottom-color: #555555;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
-  right: 0;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
-  right: 12px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
-  right: 13px;
-  left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
-  right: 100%;
-  left: auto;
-  margin-right: -1px;
-  margin-left: 0;
-  -webkit-border-radius: 6px 0 6px 6px;
-     -moz-border-radius: 6px 0 6px 6px;
-          border-radius: 6px 0 6px 6px;
-}
-
-.navbar-inverse .navbar-inner {
-  background-color: #1b1b1b;
-  background-image: -moz-linear-gradient(top, #222222, #111111);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
-  background-image: -webkit-linear-gradient(top, #222222, #111111);
-  background-image: -o-linear-gradient(top, #222222, #111111);
-  background-image: linear-gradient(to bottom, #222222, #111111);
-  background-repeat: repeat-x;
-  border-color: #252525;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
-  color: #999999;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover,
-.navbar-inverse .brand:focus,
-.navbar-inverse .nav > li > a:focus {
-  color: #ffffff;
-}
-
-.navbar-inverse .brand {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-text {
-  color: #999999;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
-  color: #ffffff;
-  background-color: transparent;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
-  color: #ffffff;
-  background-color: #111111;
-}
-
-.navbar-inverse .navbar-link {
-  color: #999999;
-}
-
-.navbar-inverse .navbar-link:hover,
-.navbar-inverse .navbar-link:focus {
-  color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
-  border-right-color: #222222;
-  border-left-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
-  color: #ffffff;
-  background-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown > a:hover .caret,
-.navbar-inverse .nav li.dropdown > a:focus .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
-  border-top-color: #999999;
-  border-bottom-color: #999999;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
-  border-top-color: #ffffff;
-  border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
-  color: #ffffff;
-  background-color: #515151;
-  border-color: #111111;
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
-  -webkit-transition: none;
-     -moz-transition: none;
-       -o-transition: none;
-          transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
-  color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
-  padding: 5px 15px;
-  color: #333333;
-  text-shadow: 0 1px 0 #ffffff;
-  background-color: #ffffff;
-  border: 0;
-  outline: 0;
-  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-
-.navbar-inverse .btn-navbar {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e0e0e;
-  *background-color: #040404;
-  background-image: -moz-linear-gradient(top, #151515, #040404);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
-  background-image: -webkit-linear-gradient(top, #151515, #040404);
-  background-image: -o-linear-gradient(top, #151515, #040404);
-  background-image: linear-gradient(to bottom, #151515, #040404);
-  background-repeat: repeat-x;
-  border-color: #040404 #040404 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:focus,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
-  color: #ffffff;
-  background-color: #040404;
-  *background-color: #000000;
-}
-
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
-  background-color: #000000 \9;
-}
-
-.breadcrumb {
-  padding: 8px 15px;
-  margin: 0 0 0px;
-  list-style: none;
-  font-weight:bold;
-  background-color: #f5f5f5;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.breadcrumb > li {
-  display: inline-block;
-  *display: inline;
-  text-shadow: 0 1px 0 #ffffff;
-  *zoom: 1;
-}
-
-.breadcrumb > li > .divider {
-  padding: 0 5px;
-  color: #ccc;
-}
-
-.breadcrumb > .active {
-  color: #ababab;
-}
-
-.pagination {
-/*  margin: 20px 0;*/
-margin:10px;
-float:left;
-}
-
-.pagination ul {
-  display: inline-block;
-  *display: inline;
-  margin-bottom: 0;
-  margin-left: 0;
-  -webkit-border-radius: 0px;
-     -moz-border-radius: 0px;
-          border-radius: 4px;
-  *zoom: 1;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination ul > li {
-  display: inline;
-}
-
-.pagination ul > li > a,
-.pagination ul > li > span {
-  float: left;
-  padding: 6px 14px;
-  line-height: 20px;
-  text-decoration: none;
-  background-color: #ffffff;
-  border: 1px solid #dddddd;
-  border-left-width: 0;
-}
-
-.pagination ul > li > a:hover,
-.pagination ul > li > a:focus,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-  background-color: #f5f5f5;
-}
-
-.pagination ul > .active > a,
-.pagination ul > .active > span {
-  color: #999999;
-  cursor: default;
-}
-
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover,
-.pagination ul > .disabled > a:focus {
-  color: #999999;
-  cursor: default;
-  background-color: transparent;
-}
-
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
-  border-left-width: 1px;
-  -webkit-border-bottom-left-radius: 4px;
-          border-bottom-left-radius: 4px;
-  -webkit-border-top-left-radius: 4px;
-          border-top-left-radius: 4px;
-  -moz-border-radius-bottomleft: 4px;
-  -moz-border-radius-topleft: 4px;
-}
-
-.pagination ul > li:last-child > a,
-.pagination ul > li:last-child > span {
-  -webkit-border-top-right-radius: 4px;
-          border-top-right-radius: 4px;
-  -webkit-border-bottom-right-radius: 4px;
-          border-bottom-right-radius: 4px;
-  -moz-border-radius-topright: 4px;
-  -moz-border-radius-bottomright: 4px;
-}
-
-.pagination-centered {
-  text-align: center;
-}
-
-.pagination-right {
-  text-align: right;
-}
-
-.pagination-large ul > li > a,
-.pagination-large ul > li > span {
-  padding: 11px 19px;
-  font-size: 17.5px;
-}
-
-.pagination-large ul > li:first-child > a,
-.pagination-large ul > li:first-child > span {
-  -webkit-border-bottom-left-radius: 6px;
-          border-bottom-left-radius: 6px;
-  -webkit-border-top-left-radius: 6px;
-          border-top-left-radius: 6px;
-  -moz-border-radius-bottomleft: 6px;
-  -moz-border-radius-topleft: 6px;
-}
-
-.pagination-large ul > li:last-child > a,
-.pagination-large ul > li:last-child > span {
-  -webkit-border-top-right-radius: 6px;
-          border-top-right-radius: 6px;
-  -webkit-border-bottom-right-radius: 6px;
-          border-bottom-right-radius: 6px;
-  -moz-border-radius-topright: 6px;
-  -moz-border-radius-bottomright: 6px;
-}
-
-.pagination-mini ul > li:first-child > a,
-.pagination-small ul > li:first-child > a,
-.pagination-mini ul > li:first-child > span,
-.pagination-small ul > li:first-child > span {
-  -webkit-border-bottom-left-radius: 3px;
-          border-bottom-left-radius: 3px;
-  -webkit-border-top-left-radius: 3px;
-          border-top-left-radius: 3px;
-  -moz-border-radius-bottomleft: 3px;
-  -moz-border-radius-topleft: 3px;
-}
-
-.pagination-mini ul > li:last-child > a,
-.pagination-small ul > li:last-child > a,
-.pagination-mini ul > li:last-child > span,
-.pagination-small ul > li:last-child > span {
-  -webkit-border-top-right-radius: 3px;
-          border-top-right-radius: 3px;
-  -webkit-border-bottom-right-radius: 3px;
-          border-bottom-right-radius: 3px;
-  -moz-border-radius-topright: 3px;
-  -moz-border-radius-bottomright: 3px;
-}
-
-.pagination-small ul > li > a,
-.pagination-small ul > li > span {
-  padding: 2px 10px;
-  font-size: 11.9px;
-}
-
-.pagination-mini ul > li > a,
-.pagination-mini ul > li > span {
-  padding: 0 6px;
-  font-size: 10.5px;
-}
-
-.pager {
-  margin: 20px 0;
-  text-align: center;
-  list-style: none;
-  *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.pager:after {
-  clear: both;
-}
-
-.pager li {
-  display: inline;
-}
-
-.pager li > a,
-.pager li > span {
-  display: inline-block;
-  padding: 5px 14px;
-  background-color: #fff;
-  border: 1px solid #ddd;
-  -webkit-border-radius: 15px;
-     -moz-border-radius: 15px;
-          border-radius: 15px;
-}
-
-.pager li > a:hover,
-.pager li > a:focus {
-  text-decoration: none;
-  background-color: #f5f5f5;
-}
-
-.pager .next > a,
-.pager .next > span {
-  float: right;
-}
-
-.pager .previous > a,
-.pager .previous > span {
-  float: left;
-}
-
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
-  color: #999999;
-  cursor: default;
-  background-color: #fff;
-}
-
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: 1040;
-  background-color: #000000;
-}
-
-.modal-backdrop.fade {
-  opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.modal {
-  position: fixed;
-  top: 10%;
-  left: 50%;
-  z-index: 1050;
- width: 560px;
-margin-left: -280px;
-
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  outline: none;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-.modal2 {
-  position: fixed;
-top: 10%;
- /*   left: 50%;*/
-  z-index: 1050;
-  width: 80%;
-  margin:0 10%;
-/*  margin-left: -280px;*/
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  outline: none;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-
-.modal-copy {
-  position: fixed;
-top: 10%;
- /*   left: 50%;*/
-  z-index: 1050;
-  width: 70%;
- margin:0 1%;
-  background-color: #ffffff;
-  border: 1px solid #999;
-  border: 1px solid rgba(0, 0, 0, 0.3);
-  *border: 1px solid #999;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  outline: none;
-  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding-box;
-          background-clip: padding-box;
-}
-.modal.fade {
-  top: -25%;
-  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
-     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
-       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
-          transition: opacity 0.3s linear, top 0.3s ease-out;
-}
-
-.modal.fade.in {
-  top: 10%;
-}
-
-.modal-header {
-  padding: 9px 15px;
-  border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
-  margin-top: 2px;
-}
-
-.modal-header h3 {
-  margin: 0;
-  line-height: 30px;
-}
-
-.modal-body {
-  position: relative;
-  max-height: 440px;
-  padding: 15px;
-  overflow-y: hidden;
-}
-
-.modal-form {
-  margin-bottom: 0;
-}
-
-.modal-footer {
-  padding: 14px 15px 15px;
-  margin-bottom: 0;
-  text-align: right;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  -webkit-border-radius: 0 0 6px 6px;
-     -moz-border-radius: 0 0 6px 6px;
-          border-radius: 0 0 6px 6px;
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 #ffffff;
-     -moz-box-shadow: inset 0 1px 0 #ffffff;
-          box-shadow: inset 0 1px 0 #ffffff;
-}
-
-.modal-footer:before,
-.modal-footer:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.modal-footer:after {
-  clear: both;
-}
-
-.modal-footer .btn + .btn {
-  margin-bottom: 0;
-  margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
-  margin-left: -1px;
-}
-
-.modal-footer .btn-block + .btn-block {
-  margin-left: 0;
-}
-
-.tooltip {
-  position: absolute;
-  z-index: 1030;
-  display: block;
-  font-size: 11px;
-  line-height: 1.4;
-  opacity: 0;
-  filter: alpha(opacity=0);
-  visibility: visible;
-}
-
-.tooltip.in {
-  opacity: 0.8;
-  filter: alpha(opacity=80);
-}
-
-.tooltip.top {
-  padding: 5px 0;
-  margin-top: -3px;
-}
-
-.tooltip.right {
-  padding: 0 5px;
-  margin-left: 3px;
-}
-
-.tooltip.bottom {
-  padding: 5px 0;
-  margin-top: 3px;
-}
-
-.tooltip.left {
-  padding: 0 5px;
-  margin-left: -3px;
-}
-
-.tooltip-inner {
-  max-width: 200px;
-  padding: 8px;
-  color: #ffffff;
-  text-align: center;
-  text-decoration: none;
-  background-color: #000000;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
-  bottom: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-top-color: #000000;
-  border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
-  top: 50%;
-  left: 0;
-  margin-top: -5px;
-  border-right-color: #000000;
-  border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
-  top: 50%;
-  right: 0;
-  margin-top: -5px;
-  border-left-color: #000000;
-  border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
-  top: 0;
-  left: 50%;
-  margin-left: -5px;
-  border-bottom-color: #000000;
-  border-width: 0 5px 5px;
-}
-
-.popover {
-	width:245px;
-  position: absolute;
-  top: 0;
- left: 0;
- z-index: 1010;
-  display: none;
-/* max-width: 265px;
-*/ padding: 1px;
-  text-align: left;
-  white-space: normal;
-  background-color: #ffffff;
-  border: 1px solid #ccc;
-  border: 1px solid rgba(0, 0, 0, 0.2);
-  word-wrap: break-word;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
-}
-.popover.top {
-  margin-top: -10px;
-}
-
-.popover.right {
-  margin-left: 10px;
-}
-
-.popover.bottom {
-  margin-top: 10px;
-}
-
-.popover.left {
-  margin-left: -10px;
-}
-
-.popover-title {
-	width:215px;
-  padding: 9px 15px;
-  margin:0;
-  float:left;
-  font-size: 15px;
-  font-weight: bold;
-  line-height: 18px;
-  background-color: #f7f7f7;
-  border-bottom: 1px solid #ebebeb;
-  -webkit-border-radius: 5px 5px 0 0;
-     -moz-border-radius: 5px 5px 0 0;
-          border-radius: 5px 5px 0 0;
-}
-.popover-list{
-  padding: 5px 14px;
-  border-bottom:1px solid #ebebeb;
-  float:left;
-}
-.popover-list.wit{ width:237px;}
-.popover-button{
-	line-height:42px;
-	text-align:center;
-	margin-bottom:5px;
-}
-.popover-button i{ margin:0 3px;}
-.popover-title:empty {
-  display: none;
-}
-
-.popover-content{
-}
-.popover-content a{
-padding:5px 13px;
-text-align:center;
-margin:6px 8px;
-border:#949494 solid 1px;
-background-image: -moz-linear-gradient(top, #eaeaea, #bbbbbb);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#eaeaea), to(#bbbbbb));
-background-image: -webkit-linear-gradient(top, #eaeaea, #bbbbbb);
-background-image: -o-linear-gradient(top, #eaeaea, #bbbbbb);
-background-image: linear-gradient(to bottom, #eaeaea, #bbbbbb);
-/*text-shadow:0px 0px 1px #fff;
-*/box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-color:#333333;
-border-radius:2px;
-display:block;
-float:left;
-}
-.popover-content a:hover{
-border:#455565 solid 1px;
-background-image: -moz-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6d7c8b), to(#5d6d7d));
-background-image: -webkit-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -o-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: linear-gradient(to bottom, #6d7c8b, #5d6d7d);
-color:#fff;
-}
-.popover-content a.curr{
-border:#455565 solid 1px;
-background:#5d6d7d;
-background-image: -moz-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6d7c8b), to(#5d6d7d));
-background-image: -webkit-linear-gradient(top, #6d7c8b, #5d6d7d);
-background-image: -o-linear-gradient(top, #6d7c8b, #006baa);
-background-image: linear-gradient(to bottom, #6d7c8b, #5d6d7d);
-color:#fff;	5d6d7d
-}
-
-.popover-content2{
-}
-.popover-content2 a{
-width:60px; height:28px;
-line-height:28px;
-display:block;
-text-align:center;
-margin:6px 8px;
-border:#c1c1c1 solid 1px;
-background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-/*text-shadow:0px 0px 1px #fff;
-*/box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-color:#333333;
-border-radius:2px;
-float:left;
-}
-.popover-content2 a:hover{
-border:#004898 solid 1px;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;
-}
-.popover-content2 a.curr{
-border:#004898 solid 1px;
-background:#006baa;
-background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-background-image: -o-linear-gradient(top, #0082cb, #006baa);
-background-image: linear-gradient(to bottom, #0082cb, #006baa);
-color:#fff;	
-}
-
-
-.popover .arrow,
-.popover .arrow:after {
-  position: absolute;
-  display: block;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-
-.popover .arrow {
-  border-width: 11px;
-}
-
-.popover .arrow:after {
-  border-width: 10px;
-  content: "";
-}
-
-.popover.top .arrow {
-  bottom: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-top-color: #999;
-  border-top-color: rgba(0, 0, 0, 0.25);
-  border-bottom-width: 0;
-}
-
-.popover.top .arrow:after {
-  bottom: 1px;
-  margin-left: -10px;
-  border-top-color: #ffffff;
-  border-bottom-width: 0;
-}
-
-.popover.right .arrow {
-  top: 50%;
-  left: -11px;
-  margin-top: -11px;
-  border-right-color: #999;
-  border-right-color: rgba(0, 0, 0, 0.25);
-  border-left-width: 0;
-}
-
-.popover.right .arrow:after {
-  bottom: -10px;
-  left: 1px;
-  border-right-color: #ffffff;
-  border-left-width: 0;
-}
-
-.popover.bottom .arrow {
-  top: -11px;
-  left: 50%;
-  margin-left: -11px;
-  border-bottom-color: #999;
-  border-bottom-color: rgba(0, 0, 0, 0.25);
-  border-top-width: 0;
-}
-
-.popover.bottom .arrow:after {
-  top: 1px;
-  margin-left: -10px;
-  border-bottom-color: #ffffff;
-  border-top-width: 0;
-}
-
-.popover.left .arrow {
-  top: 50%;
-  right: -11px;
-  margin-top: -11px;
-  border-left-color: #999;
-  border-left-color: rgba(0, 0, 0, 0.25);
-  border-right-width: 0;
-}
-
-.popover.left .arrow:after {
-  right: 1px;
-  bottom: -10px;
-  border-left-color: #ffffff;
-  border-right-width: 0;
-}
-
-
-
-.thumbnails {
-  margin-left: -20px;
-  list-style: none;
-  *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
-  display: table;
-  line-height: 0;
-  content: "";
-}
-
-.thumbnails:after {
-  clear: both;
-}
-
-.row-fluid .thumbnails {
-  margin-left: 0;
-}
-
-.thumbnails > li {
-  float: left;
-}
-.row-fluid .entry-w{ width:980px; margin:0 auto; font-family:"微软雅黑";}
-.thumbnail {
-  display: block;
-  padding: 16px 35px;
-  margin:150px 20px;
-  line-height: 20px;
-  border: 1px solid #bce8f1;
-   background-image: -moz-linear-gradient(top, #f0f9fd, #c8e5f3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f0f9fd), to(#c8e5f3));
-  background-image: -webkit-linear-gradient(top, #f0f9fd, #c8e5f3);
-  background-image: -o-linear-gradient(top, #f0f9fd, #c8e5f3);
-  background-image: linear-gradient(to bottom, #f0f9fd, #c8e5f3);
-  box-shadow:0 1px 0 rgba(255, 255, 255, 0.8) inset, 0 1px 2px rgba(0, 0, 0, 0.05);/*
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
-  -webkit-transition: all 0.2s ease-in-out;
-     -moz-transition: all 0.2s ease-in-out;
-       -o-transition: all 0.2s ease-in-out;
-          transition: all 0.2s ease-in-out;
-}
-
-a.thumbnail:hover,
-a.thumbnail:focus {
-  background-image: -moz-linear-gradient(top, #e5f6ff, #9cd6f3);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e5f6ff), to(#9cd6f3));
-  background-image: -webkit-linear-gradient(top, #e5f6ff, #9cd6f3);
-  background-image: -o-linear-gradient(top, #e5f6ff, #9cd6f3);
-  background-image: linear-gradient(to bottom, #e5f6ff, #9cd6f3);
-  box-shadow:0 1px 0 rgba(255, 255, 255, 0.8) inset, 0 1px 2px rgba(0, 0, 0, 0.05);
-  border-color: #85c1e0;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-
-.thumbnail > img {
-  display: block;
-  max-width: 100%;
-  margin-right: auto;
-  margin-left: auto;
-}
-
-.thumbnail .caption {
-  padding: 9px;
-  color: #383838;
-  text-align:center;
-
-
-}
-
-.media,
-.media-body {
-  overflow: hidden;
-  *overflow: visible;
-  zoom: 1;
-}
-
-.media,
-.media .media {
-  margin-top: 15px;
-}
-
-.media:first-child {
-  margin-top: 0;
-}
-
-.media-object {
-  display: block;
-}
-
-.media-heading {
-  margin: 0 0 5px;
-}
-
-.media > .pull-left {
-  margin-right: 10px;
-}
-
-.media > .pull-right {
-  margin-left: 10px;
-}
-
-.media-list {
-  margin-left: 0;
-  list-style: none;
-}
-
-.label,
-.badge {
-  display: inline-block;
-  padding: 2px 4px;
-  font-size: 11.844px;
-  font-weight: bold;
-  line-height: 14px;
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  white-space: nowrap;
-  vertical-align: baseline;
-  background-color: #999999;
-}
-
-.label {
-  -webkit-border-radius: 3px;
-     -moz-border-radius: 3px;
-          border-radius: 3px;
-}
-
-.badge {
-  padding-right: 9px;
-  padding-left: 9px;
-  -webkit-border-radius: 9px;
-     -moz-border-radius: 9px;
-          border-radius: 9px;
-}
-
-.label:empty,
-.badge:empty {
-  display: none;
-}
-
-a.label:hover,
-a.label:focus,
-a.badge:hover,
-a.badge:focus {
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-}
-
-.label-important,
-.badge-important {
-  background-color: #b94a48;
-}
-
-.label-important[href],
-.badge-important[href] {
-  background-color: #953b39;
-}
-
-.label-warning,
-.badge-warning {
-  background-color: #f89406;
-}
-
-.label-warning[href],
-.badge-warning[href] {
-  background-color: #c67605;
-}
-
-.label-success,
-.badge-success {
-  background-color: #468847;
-}
-
-.label-success[href],
-.badge-success[href] {
-  background-color: #356635;
-}
-
-.label-info,
-.badge-info {
-  background-color: #3a87ad;
-}
-
-.label-info[href],
-.badge-info[href] {
-  background-color: #2d6987;
-}
-
-.label-inverse,
-.badge-inverse {
-  background-color: #333333;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
-  background-color: #1a1a1a;
-}
-
-.btn .label,
-.btn .badge {
-  position: relative;
-  top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
-  top: 0;
-}
-
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-moz-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-ms-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-@-o-keyframes progress-bar-stripes {
-  from {
-    background-position: 0 0;
-  }
-  to {
-    background-position: 40px 0;
-  }
-}
-
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-
-.progress {
-  height: 20px;
-  margin-bottom: 20px;
-  overflow: hidden;
-  background-color: #f7f7f7;
-  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
-  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
-  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
-  background-repeat: repeat-x;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-}
-
-.progress .bar {
-  float: left;
-  width: 0;
-  height: 100%;
-  font-size: 12px;
-  color: #ffffff;
-  text-align: center;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #0e90d2;
-  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
-  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
-  background-image: -o-linear-gradient(top, #149bdf, #0480be);
-  background-image: linear-gradient(to bottom, #149bdf, #0480be);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
-  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-transition: width 0.6s ease;
-     -moz-transition: width 0.6s ease;
-       -o-transition: width 0.6s ease;
-          transition: width 0.6s ease;
-}
-
-.progress .bar + .bar {
-  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-}
-
-.progress-striped .bar {
-  background-color: #149bdf;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  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: -moz-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);
-  -webkit-background-size: 40px 40px;
-     -moz-background-size: 40px 40px;
-       -o-background-size: 40px 40px;
-          background-size: 40px 40px;
-}
-
-.progress.active .bar {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-     -moz-animation: progress-bar-stripes 2s linear infinite;
-      -ms-animation: progress-bar-stripes 2s linear infinite;
-       -o-animation: progress-bar-stripes 2s linear infinite;
-          animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
-  background-color: #dd514c;
-  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
-  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
-  background-color: #ee5f5b;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  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: -moz-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);
-}
-
-.progress-success .bar,
-.progress .bar-success {
-  background-color: #5eb95e;
-  background-image: -moz-linear-gradient(top, #62c462, #57a957);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
-  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
-  background-image: -o-linear-gradient(top, #62c462, #57a957);
-  background-image: linear-gradient(to bottom, #62c462, #57a957);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
-  background-color: #62c462;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  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: -moz-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);
-}
-
-.progress-info .bar,
-.progress .bar-info {
-  background-color: #4bb1cf;
-  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
-  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
-  background-color: #5bc0de;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  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: -moz-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);
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
-  background-color: #faa732;
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
-  background-color: #fbb450;
-  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
-  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: -moz-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);
-}
-
-.accordion {
-  margin-bottom: 20px;
-}
-
-.accordion-group {
-  margin-bottom: 2px;
-  border: 1px solid #e5e5e5;
-/*  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;*/
-}
-
-.accordion-heading {
-  border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
-  display: block;
-  padding: 8px 15px;
-}
-
-.accordion-toggle {
-  cursor: pointer;
-}
-
-.accordion-inner {
-  padding: 9px 15px;
-  border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
-  position: relative;
-  margin-bottom: 20px;
-  line-height: 1;
-}
-
-.carousel-inner {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-}
-
-.carousel-inner > .item {
-  position: relative;
-  display: none;
-  -webkit-transition: 0.6s ease-in-out left;
-     -moz-transition: 0.6s ease-in-out left;
-       -o-transition: 0.6s ease-in-out left;
-          transition: 0.6s ease-in-out left;
-}
-
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
-  display: block;
-  line-height: 1;
-}
-
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  display: block;
-}
-
-.carousel-inner > .active {
-  left: 0;
-}
-
-.carousel-inner > .next,
-.carousel-inner > .prev {
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-
-.carousel-inner > .next {
-  left: 100%;
-}
-
-.carousel-inner > .prev {
-  left: -100%;
-}
-
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
-  left: 0;
-}
-
-.carousel-inner > .active.left {
-  left: -100%;
-}
-
-.carousel-inner > .active.right {
-  left: 100%;
-}
-
-.carousel-control {
-  position: absolute;
-  top: 40%;
-  left: 15px;
-  width: 40px;
-  height: 40px;
-  margin-top: -20px;
-  font-size: 60px;
-  font-weight: 100;
-  line-height: 30px;
-  color: #ffffff;
-  text-align: center;
-  background: #222222;
-  border: 3px solid #ffffff;
-  -webkit-border-radius: 23px;
-     -moz-border-radius: 23px;
-          border-radius: 23px;
-  opacity: 0.5;
-  filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
-  right: 15px;
-  left: auto;
-}
-
-.carousel-control:hover,
-.carousel-control:focus {
-  color: #ffffff;
-  text-decoration: none;
-  opacity: 0.9;
-  filter: alpha(opacity=90);
-}
-
-.carousel-indicators {
-  position: absolute;
-  top: 15px;
-  right: 15px;
-  z-index: 5;
-  margin: 0;
-  list-style: none;
-}
-
-.carousel-indicators li {
-  display: block;
-  float: left;
-  width: 10px;
-  height: 10px;
-  margin-left: 5px;
-  text-indent: -999px;
-  background-color: #ccc;
-  background-color: rgba(255, 255, 255, 0.25);
-  border-radius: 5px;
-}
-
-.carousel-indicators .active {
-  background-color: #fff;
-}
-
-.carousel-caption {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  padding: 15px;
-  background: #333333;
-  background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
-  line-height: 20px;
-  color: #ffffff;
-}
-
-.carousel-caption h4 {
-  margin: 0 0 5px;
-}
-
-.carousel-caption p {
-  margin-bottom: 0;
-}
-
-.hero-unit {
-  padding: 60px;
-  margin-bottom: 30px;
-  font-size: 18px;
-  font-weight: 200;
-  line-height: 30px;
-  color: inherit;
-  background-color: #eeeeee;
-  -webkit-border-radius: 6px;
-     -moz-border-radius: 6px;
-          border-radius: 6px;
-}
-
-.hero-unit h1 {
-  margin-bottom: 0;
-  font-size: 60px;
-  line-height: 1;
-  letter-spacing: -1px;
-  color: inherit;
-}
-
-.hero-unit li {
-  line-height: 30px;
-}
-
-.pull-right {
-  float: right;
-}
-
-.pull-left {
-  float: left;
-}
-
-.hide {
-  display: none;
-}
-
-.show {
-  display: block;
-}
-
-.invisible {
-  visibility: hidden;
-}
-
-.affix {
-  position: fixed;
-}

+ 0 - 1168
stmms-web/src/main/webapp/static/mark-leader/css/style.css

@@ -1,1168 +0,0 @@
-@charset "utf-8";
-/* CSS Document */
-html {
-	height: 100%;
-}
-
-body {
-	margin: 0;
-	padding: 0px 0 0 0;
-	font-size: 14px;
-	background: #f5f4f4;
-}
-
-input
-,
-textarea
-,
-{
-margin
-:
- 
-0;
-padding
-:
- 
-0;
-font-size
-:
- 
-14
-px
-;
-
-    
-outline
-:
- 
-none
-;
-
-
-}
-html:root body,html:root input,html:root button,html:root textarea,html:root select { '
-	font-family: "微软雅黑", Fixedsys;
-	';
-}
-
-form,ul,ol,li,dl,dt,dd,h1,h2,h3,h4,h5,p {
-	margin: 0;
-	padding: 0;
-	list-style: none;
-	ont-style: normal;
-}
-
-fieldset {
-	border-left: none;
-	border-right: none;
-	font-size: 14px;
-	border-top: solid 1px #decfa0;
-	border-bottom: none;
-}
-
-legend {
-	color: #4971b9;
-	margin-left: 10px;
-}
-
-a {
-	text-decoration: none;
-	color: #484848;
-	outline: none;
-}
-
-a:hover {
-	text-decoration: none;
-	color: #279437;
-}
-
-a img {
-	border: none;
-}
-
-i,em {
-	font-style: normal;
-}
-/* 通用样式 */
-.fl {
-	float: left;
-}
-
-.fr {
-	float: right;
-}
-
-.oh {
-	overflow: hidden;
-}
-
-.hd {
-	display: none
-}
-
-.width2 {
-	width: 200px;
-}
-
-.padding5 {
-	padding: 5px;
-}
-
-.padding10 {
-	padding: 10px;
-}
-
-.domain {
-	padding: 3px;
-	min-height: 30px;
-}
-
-.border {
-	border-color: #ccc;
-	border-left: none;
-	border-right: none;
-}
-
-.mr-t {
-	margin-top: 5px;
-}
-
-.mr2-t {
-	margin-top: 10px;
-}
-
-.hide {
-	display: none;
-}
-
-.show {
-	display: block;
-}
-/*回评*/
-.image-view-popover {
-	width: 100%;
-	background: #fff;
-	position: absolute;
-}
-
-.image-view-popover .popover-header {
-	height: 50px;
-	background: #eff3f6;
-	border-bottom: solid 1px #dce0e2;
-}
-
-.image-view-popover .popover-header .title {
-	font-size: 26px;
-	line-height: 46px;
-	font-weight: bold;
-	color: #3163a1;
-	margin-left: 15px;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-switch {
-	float: left;
-	margin: 9px 0px 8px 15px;
-}
-
-.image-view-popover .popover-header .image-switch a {
-	padding: 3px 8px;
-	text-align: center;
-	margin: 3px 5px;
-	border: #c1c1c1 solid 1px;
-	background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-	background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-	color: #333333;
-	border-radius: 2px;
-	display: block;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-switch a:hover {
-	border: #004898 solid 1px;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-switch a.curr {
-	border: #004898 solid 1px;
-	background: #006baa;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-control {
-	margin: 9px 15px 8px 15px;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-control a {
-	padding: 3px 8px;
-	text-align: center;
-	margin: 3px 5px;
-	border: #c1c1c1 solid 1px;
-	background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-	background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-	color: #333333;
-	border-radius: 2px;
-	display: block;
-	float: left;
-}
-
-.image-view-popover .popover-header .image-control a:hover {
-	border: #004898 solid 1px;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-control a.curr {
-	border: #004898 solid 1px;
-	background: #006baa;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-view-popover .popover-header .image-close {
-	margin-top: 15px;
-	margin-right: 15px;
-	cursor: pointer;
-	float: right;
-}
-
-.image-view-popover .popover-content {
-	padding: 10px;
-}
-
-.image-content {
-	position: relative;
-	overflow: hidden;
-}
-
-.mark-steps {
-	background-color: #cbd0d3;
-	height: 100%;
-}
-
-.mark-steps .header {
-	background-color: #2da5da;
-	height: 40px;
-	line-height: 40px;
-	font-size: 14px;
-	color: #fff;
-	text-align: center;
-	white-space: nowrap;
-}
-
-.mark-steps .header .useinfo {
-	width: 55%;
-	color: #fff;
-	padding: 0 5px 0 10px;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-	display: block;
-	float: left;
-}
-
-.mark-steps .header .logout {
-	width: 30%;
-	color: #fff;
-	padding: 0 20px 0 5px;
-}
-
-.mark-steps .tips {
-	padding: 5px;
-}
-
-.mark-steps .tips .tools {
-	
-}
-
-.mark-steps .tips .setp {
-	margin-top: 5px;
-}
-
-.mark-steps .tips .text {
-	padding: 0 55px;
-	line-height: 28px;
-}
-
-.mark-steps .tips .on {
-	width: 74px;
-	height: 28px;
-	background: url(../images/on.png) no-repeat;
-	display: block;
-	margin-left: 50px;
-}
-
-.mark-steps .tips .off {
-	width: 74px;
-	height: 28px;
-	background: url(../images/off.png) no-repeat;
-	display: block;
-	margin-left: 50px;
-}
-/*键盘给分*/
-.mark-steps .step-board {
-	padding: 5px 5px 5px 5px;
-}
-
-.mark-steps .step-board .step-list {
-	position: relative;
-	overflow: hidden;
-}
-
-.mark-steps .step-board .header {
-	color: #fff;
-	font-size: 14px;
-	font-weight: bold;
-	background: #5d6d7d;
-	height: 16px;
-	line-height: 16px;
-	text-align: center;
-	display: block;
-}
-
-.mark-steps .step-board .sublist {
-	
-}
-
-.mark-steps .step-board .sublist .fraction {
-	background: #ececec;
-	height: 39px;
-	line-height: 39px;
-	color: #ed5321;
-	display: block;
-	text-align: center;
-	font-family: "微软雅黑";
-	font-size: 30px;
-	font-weight: bold;
-	margin: 4px 0;
-}
-.mark-steps .step-board .newSubListCss{height: 20px;line-height: 19px; color: #333; display: block;text-align: center; font-family: "微软雅黑"; font-size: 16px; font-weight: normal; margin: 5px 0 5px 0;}
-.mark-steps .step-board .newSubListCss .red{ color: #ed5321; font-weight: bold; font-size: 16px; }
-/*.sidebar .step-list .sublist .up{ height:27px; text-align:center; cursor:pointer;}
-.sidebar .step-list .sublist .down{height:22px; text-align:center; cursor:pointer;}*/
-.mark-steps .step-board .step-list .done {
-	width: 100%;
-	height: 118px;
-	background: #c6fde7;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .done .number {
-	-webkit-box-sizing: border-box;
-	width: 49%;
-	height: 118px;
-	float: left;
-	border-right: #ced0ce dashed 1px;
-}
-
-.mark-steps .step-board .step-list .done .number .title {
-	height: 30px;
-	border-bottom: #ced0ce dashed 1px;
-	font-weight: bold;
-	color: #309c52;
-	text-align: center;
-	line-height: 30px;
-}
-
-.mark-steps .step-board .step-list .done .number .num {
-	height: 88px;
-	font-weight: bold;
-	font-size: 40px;
-	color: #ed5321;
-	text-align: center;
-	line-height: 88px;
-}
-
-.mark-steps .step-board .step-list .done .score {
-	width: 50%;
-	height: 118px;
-	float: right;
-	text-align: center;
-	-webkit-box-sizing: border-box;
-}
-
-.mark-steps .step-board .step-list .done .score .title {
-	font-weight: bold;
-	width: 100%;
-	height: 30px;
-	line-height: 30px;
-	color: #309c52;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .done .score .icon {
-	width: 100%;
-	height: 27px;
-	float: right;
-	font-size: 22px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .done .score .num {
-	font-weight: bold;
-	width: 100%;
-	height: 24px;
-	float: right;
-	font-size: 30px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .current {
-	width: 100%;
-	height: 118px;
-	background: #ffe2d7;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .current .number {
-	-webkit-box-sizing: border-box;
-	width: 49%;
-	height: 118px;
-	float: left;
-	border-right: #ced0ce dashed 1px;
-}
-
-.mark-steps .step-board .step-list .current .number .title {
-	height: 30px;
-	border-bottom: #ced0ce dashed 1px;
-	font-weight: bold;
-	color: #309c52;
-	text-align: center;
-	line-height: 30px;
-}
-
-.mark-steps .step-board .step-list .current .number .num {
-	height: 88px;
-	font-weight: bold;
-	font-size: 40px;
-	color: #ed5321;
-	text-align: center;
-	line-height: 88px;
-}
-
-.mark-steps .step-board .step-list .current .score {
-	width: 50%;
-	height: 118px;
-	float: right;
-	text-align: center;
-	-webkit-box-sizing: border-box;
-}
-
-.mark-steps .step-board .step-list .current .score .title {
-	font-weight: bold;
-	width: 100%;
-	height: 30px;
-	line-height: 30px;
-	color: #309c52;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .current .score .icon {
-	width: 100%;
-	height: 27px;
-	float: right;
-	font-size: 22px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .current .score .num {
-	font-weight: bold;
-	width: 100%;
-	height: 24px;
-	float: right;
-	font-size: 30px;
-	color: #309c52;
-}
-
-.mark-steps .step-board .step-list .todo {
-	width: 100%;
-	height: 118px;
-	background: #e0e2e4;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .todo .number {
-	-webkit-box-sizing: border-box;
-	width: 49%;
-	height: 118px;
-	float: left;
-	border-right: #ced0ce dashed 1px;
-}
-
-.mark-steps .step-board .step-list .todo .number .title {
-	height: 30px;
-	border-bottom: #ced0ce dashed 1px;
-	font-weight: bold;
-	color: #8d8d8d;
-	text-align: center;
-	line-height: 30px;
-}
-
-.mark-steps .step-board .step-list .todo .number .num {
-	height: 88px;
-	font-weight: bold;
-	font-size: 40px;
-	color: #8d8d8d;
-	text-align: center;
-	line-height: 88px;
-}
-
-.mark-steps .step-board .step-list .todo .score {
-	width: 50%;
-	height: 118px;
-	float: right;
-	text-align: center;
-	-webkit-box-sizing: border-box;
-}
-
-.mark-steps .step-board .step-list .todo .score .title {
-	font-weight: bold;
-	width: 100%;
-	height: 30px;
-	line-height: 30px;
-	color: #8d8d8d;
-	margin-bottom: 5px;
-}
-
-.mark-steps .step-board .step-list .todo .score .icon {
-	width: 100%;
-	height: 27px;
-	float: right;
-	font-size: 22px;
-	color: #8d8d8d;
-}
-
-.mark-steps .step-board .step-list .todo .score .num {
-	font-weight: bold;
-	width: 100%;
-	height: 24px;
-	float: right;
-	font-size: 30px;
-	color: #8d8d8d;
-}
-/*分值列表*/
-.score-board {
-	width: 283px;
-}
-
-.score-board .header {
-	width: 273px;
-	height: 39px;
-	padding: 0 5px;
-	background-color: #5d6d7d;
-	line-height: 39px;
-	font-size: 14px;
-	color: #fff;
-	font-weight: bold;
-	cursor: pointer;
-	float: left;
-}
-
-.score-board .header .span1 {
-	width: 120px;
-}
-
-.score-board .header-close {
-	margin-top: 10px;
-	float: right;
-}
-
-.score-board .header-text {
-	margin-top: -10px;
-	float: right;
-	color: #fff;
-}
-
-.score-board .footer {
-	width: 263px;
-	height: 39px;
-	line-height: 39px;
-	font-weight: bold;
-	color: #fff;
-	padding: 0 10px;
-	background: #5d6d7d;
-	float: left;
-}
-
-.score-board .footer .font {
-	font-size: 22px;
-	text-align: left;
-	font-family: "微软雅黑", Fixedsys;
-	float: left;
-}
-
-.score-board .footer .yellow {
-	color: #ffd800;
-}
-
-.score-board .footer .button {
-	width: 55px;
-	height: 26px;
-	line-height: 26px;
-	text-align: center;
-	margin-top: 7px;
-	margin-left: 5px;
-	color: #fff;
-	font-size: 16px;
-	font-weight: bold;
-	background: #ed5321;
-	display: block;
-	float: right;
-}
-
-.score-board .content {
-	width: 271px;
-	border: solid 1px #5d6d7d;
-	background: #e6eaed;
-	padding: 5px;
-	float: left;
-}
-
-.score-board .content .sublist {
-	width: 271px;
-	margin: 2px 0;
-	float: left;
-}
-
-.score-board .content .sublist:hover {
-	background: #fce9ce;
-}
-
-.score-board .content .sublist .number {
-	width: 55px;
-	padding: 4px 0;
-	font-size: 12px;
-	font-weight: bold;
-	color: #46565f;
-	word-wrap: break-word;
-	float: left;
-	text-align: right;
-}
-
-.score-board .content .sublist .fraction {
-	width: 211px;
-	margin-left: 5px;
-	word-wrap: break-word;
-	float: right;
-	text-align: left;
-}
-
-.score-board .content .sublist .fraction a {
-	width: 24px;
-	height: 24px;
-	line-height: 24px;
-	margin: 2px;
-	font-size: 12px;
-	color: #333333;
-	background: #d0d5d9;
-	border: solid 1px #9ea3a7;
-	text-align: center;
-	display: block;
-	float: left;
-}
-
-.score-board .content .sublist .fraction a:hover {
-	background: #ed5321;
-	color: #fff;
-	border: #ed5321 solid 1px;
-}
-
-.score-board .content .sublist .fraction a.active {
-	background: #ed5321;
-	color: #fff;
-	border: #ed5321 solid 1px;
-}
-
-.score-board-popover {
-	float: right;
-	top: 48px;
-	right: 15.3%;
-	position: absolute;
-}
-/*回评列表*/
-.mark-sidebar {
-	background-color: #cbd0d3;
-	height: 100%;
-}
-
-.mark-sidebar .header {
-	background-color: #46617b;
-	height: 40px;
-	line-height: 40px;
-	font-size: 20px;
-	border-bottom: #46617b solid 1px;
-	color: #fff;
-	text-align: center;
-}
-
-.mark-sidebar .header p {
-	float: left;
-	padding: 0 10px;
-}
-
-.mark-sidebar .header a {
-	float: right;
-	padding: 15px 10px 0 0;
-}
-
-.mark-sidebar .header .yellow {
-	color: #ffd800;
-}
-
-.mark-sidebar .m-pagination {
-	padding: 11px 0;
-	text-align: center;
-}
-
-.mark-sidebar .m-pagination a {
-	padding: 5px 8px;
-	text-align: center;
-	color: #fff;
-	font-size: 14px;
-	background: #5a7686;
-	margin: 0 5px;
-	text-align: center;
-}
-
-.mark-sidebar .m-pagination a:hover {
-	background: #ed5321;
-}
-
-.mark-sidebar .m-pagination a.active {
-	background: #ed5321;
-}
-
-.mark-sidebar .m-pagination {
-	padding: 11px 0;
-	text-align: center;
-}
-
-.mark-sidebar .m-pagination i {
-	padding: 5px 8px;
-	text-align: center;
-	color: #fff;
-	font-size: 14px;
-	background: #acacac;
-	margin: 0 5px;
-	text-align: center;
-}
-
-.mark-sidebar .sublist {
-	
-}
-
-.mark-sidebar .sublist .titel {
-	background: #2da5da;
-	height: 37px;
-	line-height: 37px;
-	color: #fff;
-	border: #2297cc solid 1px;
-	text-align: center;
-}
-/*图片内容区开始*/
-.center-content {
-	
-}
-
-.center-content .header {
-	background: #5d6d7d;
-	color: #fff;
-	height: 21px;
-	padding: 10px;
-}
-
-.center-content .header .text {
-	color: #fff;
-	font-size: 16px;
-	font-weight: bold;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-	float: left;
-}
-
-.center-content .header .text i {
-	padding: 0 2px;
-}
-
-.center-content .header .text em {
-	color: #ffe400;
-}
-/*.center-content .header .pictures{ color:#fff; margin-left:10px; cursor:pointer; float:left;}
-.center-content .header .pictures .L-btn{ background:#cbd0d3; width:93px; height:28px; padding:5px 10px; color:#4b555e; font-weight:bold;}
-.center-content .header .pictures .M-btn{ background:#e0e2e4; height:28px; padding:5px 10px; color:#354f67;}*/
-.center-content .header .header-btn {
-	
-}
-
-.center-content .header .btn {
-	background: #cbd0d3;
-	padding: 3px 6px 3px 6px;
-	margin: -3px 2px 2px 1px;
-	color: #4b555e;
-	font-weight: bold;
-	float: left;
-}
-/*.center-content .header .fraction{ font-size:36px; font-family:Arial, Helvetica, sans-serif; font-weight:bold; color:#008f58; text-align:right; float:right;}
-*/
-.center-content .header .fraction .active {
-	font-size: 45px;
-	color: #f53c00;
-}
-
-.center-content .tips {
-	word-wrap: break-word;
-	text-align: left;
-	float: right;
-}
-/*.center-content .tips .help{ width:25%;color:#fff; padding:0 5px 0 5px; float:left;}
-*/
-.center-content .tips .useinfo {
-	color: #fff;
-	padding: 0 5px 0 10px;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-	display: block;
-	float: left;
-}
-
-.center-content .tips .logout {
-	color: #fff;
-	padding: 0 5px 0 5px;
-	float: left;
-}
-
-.center-content .content {
-	height: 100%;
-	margin: 0;
-	padding: 0;
-	overflow: hidden;
-	position: relative;
-}
-/*从这里开始是评卷详细信息*/
-.mark-detail {
-	
-}
-
-.mark-detail .m-close {
-	font-size: 17.5px;
-	font-weight: bold;
-	color: #006998;
-	padding: 11px 19px;
-	background: #91d2f0;
-	cursor: pointer;
-	float: right;
-}
-
-.mark-detail .m-open {
-	font-size: 17.5px;
-	font-weight: bold;
-	color: #0079af;
-	padding: 11px 19px;
-	background: #b5e3f8;
-	float: right;
-}
-
-.mark-detail .m-open .yellow {
-	color: #ed5321;
-}
-
-.mark-detail-float {
-	float: right;
-	bottom: 5px;
-	right: 15.3%;
-	position: absolute;
-}
-/*小助手样式*/
-.assistant {
-	position: absolute;
-}
-/*图片属性*/
-.image-popover {
-	
-}
-
-.image-popover .image-control {
-	width: 330px;
-	border: #c4e0ed solid 1px;
-	background: #f2fbff;
-	float: left;
-}
-
-.image-popover .image-control .control-row {
-	width: 310px;
-	padding: 5px 6px;
-	float: left;
-}
-
-.image-popover .image-control .control-row .title {
-	width: 60px;
-	font-weight: bold;
-	font-size: 14px;
-	color: #006d9d;
-	font-family: "宋体";
-	margin-top: 10px;
-	text-align: right;
-	float: left;
-}
-
-.image-popover .image-control .control-row .content {
-	width: 250px;
-	word-wrap: break-word;
-	float: left;
-}
-
-.image-popover .image-control .control-row .content a {
-	padding: 6px 12px;
-	text-align: center;
-	margin: 3px 5px;
-	border: #c1c1c1 solid 1px;
-	background-image: -moz-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f7), to(#e8e8e5));
-	background-image: -webkit-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: -o-linear-gradient(top, #f9f9f7, #e8e8e5);
-	background-image: linear-gradient(to bottom, #f9f9f7, #e8e8e5);
-	/*text-shadow:0px 0px 1px #fff;
-*/
-	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.1);
-	color: #333333;
-	border-radius: 2px;
-	display: block;
-	float: left;
-}
-
-.image-popover .image-control .control-row .content a:hover {
-	border: #004898 solid 1px;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-popover .image-control .control-row .content a.curr {
-	border: #004898 solid 1px;
-	background: #006baa;
-	background-image: -moz-linear-gradient(top, #0082cb, #006baa);
-	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0082cb), to(#006baa));
-	background-image: -webkit-linear-gradient(top, #0082cb, #006baa);
-	background-image: -o-linear-gradient(top, #0082cb, #006baa);
-	background-image: linear-gradient(to bottom, #0082cb, #006baa);
-	color: #fff;
-}
-
-.image-popover .image-popover-close {
-	padding: 8px 8px;
-	background: #e4e4e4;
-	border: #c4e0ed solid 1px;
-	border-left: none;
-	font-size: 14px;
-	font-family: "宋体";
-	font-weight: bold;
-	color: #017eb5;
-	text-align: center;
-	float: left;
-	cursor: pointer;
-}
-/*弹出窗口*/
-.warning-popover {
-	width: 400px;
-	min-height: 150px;
-	background: #f2dede;
-	border: #eed3d7 solid 1px;
-	position: absolute;
-	left: 50%;
-	top: 50%;
-	margin: -100px 0 0 -200px;
-	text-align: center;
-}
-
-.warning-popover p {
-	font-size: 28px;
-	color: #b94a48;
-	text-align: center;
-	padding: 30px 15px;
-	line-height: 35px;
-}
-
-.warning-popover .text-c {
-	margin: 0px 10px 10px 10px;
-}
-
-.message-popover {
-	width: 400px;
-	min-height: 150px;
-	background: #fff;
-	font-family: "微软雅黑", Fixedsys;
-	border: #5d6d7d solid 1px;
-	position: absolute;
-	left: 50%;
-	top: 50%;
-	margin: -150px 0 0 -200px;
-	text-align: center;
-}
-
-.message-popover .popover-header {
-	width: 100%;
-	height: 46px;
-	background: #5d6d7d;
-	color: #fff;
-}
-
-.message-popover .popover-header .title {
-	font-size: 22px;
-	font-weight: bold;
-	color: #fff;
-	margin: 0px;
-	padding: 13px 0 0 13px;
-	float: left;
-}
-
-.message-popover .popover-header .image-close {
-	margin: 0px;
-	padding: 13px 13px 0 0px;
-	cursor: pointer;
-	float: right;
-}
-
-.message-popover .popover-cont {
-	font-size: 18px;
-	color: #005277;
-	text-align: left;
-	padding: 15px;
-	line-height: 30px;
-	word-wrap: break-word;
-}
-
-.message-popover .text-c {
-	margin: 0px 0 15px 0;
-	width: 100px;
-	text-align: center;
-}
-
-.message-popover2 {
-	width: 400px;
-	font-family: "微软雅黑", Fixedsys;
-	min-height: 150px;
-	background: #fff;
-	border: #ffcc00 solid 1px;
-	position: absolute;
-	left: 50%;
-	top: 50%;
-	margin: -150px 0 0 -200px;
-	text-align: center;
-}
-
-.message-popover2 .popover-header {
-	width: 100%;
-	height: 46px;
-	background: #eabb00;
-	color: #fff;
-}
-
-.message-popover2 .popover-header .title {
-	font-size: 22px;
-	font-weight: bold;
-	color: #000;
-	margin: 0px;
-	padding: 13px 0 0 13px;
-	float: left;
-}
-
-.message-popover2 .popover-header .image-close {
-	margin: 0px;
-	padding: 13px 13px 0 0px;
-	cursor: pointer;
-	float: right;
-}
-
-.message-popover2 .popover-cont {
-	font-size: 18px;
-	color: #fd3435;
-	text-align: center;
-	padding: 15px;
-	line-height: 30px;
-	text-align: left;
-}
-
-.message-popover2 .text-c {
-	margin: 0px 0 15px 0;
-	width: 100px;
-	text-align: center;
-}
-
-.user-input {
-	font-family: "微软雅黑", Fixedsys;
-	width: 94%;
-	height: 25px !important;
-	font-size: 14px;
-	font-weight: bold;
-	border-top: #a5c7c8 solid 1px;
-	border-left: #99b3d3 solid 1px;
-	border-right: #bec9d7 solid 1px;
-	border-bottom: #e2e7ed solid 1px;
-	font-size: 14px;
-	padding: 10px !important;
-	border-radius: 0px;
-	overflow: hidden;
-}
-
-.wrong {
-    font-size: 18px;
-    color: #f00;
-    line-height: 30px;
-}
-.message-popover .popover-cont .username,.password,.password2 {
-    font-size: 12px;
-    color: #f00;
-    line-height: 30px;
-    padding-left: 20px;
-}
-a.button.all-zero-button {
-	margin-right: 20px;
-}
-.message-popover .popover-cont .username-input,.password-input,.password2-input{
-    width: 200px;
-}
-.message-popover .text-userInfo {
-    margin: 0px 0 15px 0;
-    width: 50px;
-    float: right;
-    margin-right: 20px;
-}
-
-.password-input,.password2-input{
-    margin-left: 20px;
-}
-
-.username-input{
-    margin-left: 12px;
-}

+ 0 - 21
stmms-web/src/main/webapp/static/mark-leader/image-popover.html

@@ -1,21 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>高校版阅卷系统</title>
-<link href="css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="css/style.css" rel="stylesheet" type="text/css" />
-</head>
-
-<body>
-<div class="image-view-popover">
-  <div class="popover-header">
-    <p class="title">原图切换</p>
-    <p class="image-switch"><a href="#">1</a><a href="#">2</a><a class="curr" href="#">3</a><a href="#">4</a></p>
-    <p class="image-control"><a class="curr" href="#">放大</a><a href="#">缩小</a><a href="#">1:1</a><a href="#">全屏</a></p>
-    <p class="image-close"><img src="images/images-close.png" /></p>
-  </div>
-  <div class="popover-content"><img src="images/00001_F.jpg" /></div>
-</div>
-</body>
-</html>

二進制
stmms-web/src/main/webapp/static/mark-leader/images/00001_F.jpg


二進制
stmms-web/src/main/webapp/static/mark-leader/images/background.jpg


二進制
stmms-web/src/main/webapp/static/mark-leader/images/button.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/close.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/down.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/hp-close.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/images-close.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/off.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/on.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/up.png


二進制
stmms-web/src/main/webapp/static/mark-leader/images/未标题-2.psd


二進制
stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings-white.png


二進制
stmms-web/src/main/webapp/static/mark-leader/img/glyphicons-halflings.png


+ 0 - 308
stmms-web/src/main/webapp/static/mark-leader/index-select.html

@@ -1,308 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>高校版阅卷系统</title>
-<link href="css/bootstrap.css" rel="stylesheet" type="text/css" />
-<link href="css/style.css" rel="stylesheet" type="text/css" />
-</head>
-
-<body>
-<div class="container-fluid">
-  <div class="row-fluid">
-    <!--若隐藏左边回评界面,请将Body content里class="span10"改为span12-->
-    <div class="span2 mark-sidebar">
-       <div class="header">
-       <p class="fl">前<i class=" yellow">10</i>份-前<i class=" yellow">20</i>份</p>
-       <a href="#"><img src="images/hp-close.png" /></a>
-       </div>
-       <div class="m-pagination">
-        <a class="active" href="#">上一页</a>
-        <a href="#">下一页</a>
-       </div>
-       <div class="m-pagination">
-        <i>上一页</i>
-        <i>下一页</i>
-       </div>
-       <div class="sublist">
-        <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>密号</th>
-                  <th>时间</th>
-                  <th>总分</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr >
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr class="act">
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr class="active">
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-                <tr>
-                  <td>021568</td>
-                  <td>09:50</td>
-                  <td>10分</td>
-                </tr>
-              </tbody>
-            </table>
-       </div>
-    </div>
-    <div class="span10 center-content">
-     <!--头部内容区开始-->
-      <div class="row-fluid">
-         <div class="header">
-         <p class="text">
-         <i>正评</i>
-         <i>密号<em>89652</em></i>
-         <i>评卷数<em>0</em></i>
-         </p>
-         <p class="text">
-         <i>试卷总数<em>100</em></i>
-         <i>已评<em>50份</em></i>
-         <i>未评<em>30份</em></i>
-         <i>已评比例<em>20%</em></i>
-         </p>
-         <a href="#" class="btn">隐藏</a>
-         <p class="tips">
-          <em>
-          <a href="#" class="btn"><!--<i class="icon-zoom-in"></i>-->放大</a>
-          <a href="#" class="btn"><!--<i class="icon-zoom-out"></i>-->缩小</a>
-          <a href="#" class="btn"><!--<i class="icon-move"></i>-->拖动</a>
-          <a href="#" class="btn"><!--<i class="icon-zoom-out"></i>-->1:1</a>
-          </em>
-          <em><a href="#" class="btn"><i class="icon-hand-up"></i> <i>小助手</i></a></em>
-          <a class="useinfo" href="#"><i class="icon-user icon-white"></i> <i>中国党中国党</i></a>
-          <a class="logout" href="#"><i class="icon-off icon-white"></i> <i>退出</i></a>
-         </p>
-         </div>
-      </div>
-     <!--头部内容区结束-->
-      <div class="row-fluid">
-       <div class="span10 image-content"><img src="images/00001_F.jpg" /></div>
-       <div class="span2 mark-steps">
-        <!--从这里开始是键盘给分板-->
-           <div class="step-board">
-             <a href="#" class="header"><< 显示分值表</a>
-                 <p><i class="fl mr2-t"><strong>选作:</strong></i>
-                   <select class="span8 mr-t">
-                  <option>未选择</option>
-                  <option>2</option>
-                  <option>3</option>
-                  <option>4</option>
-                  <option>5</option>
-                </select>
-                </p>
-             <div class="sublist"><p class="fraction">总分 <i>50分</i></p><div>
-             
-             <div class="step-list">
-             <div class="done">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25.5</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="current">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">8</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="todo">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-             <div class="todo">
-               <div class="number">
-                 <div class="title">第一小题</div>
-                 <div class="num">25</div>
-               </div>
-               <div class="score">
-                 <div class="title">间隔2分</div>
-                 <div class="num">0</div>
-                 <div class="icon">▲</div>
-                 <div class="num">60</div>
-               </div>
-             </div>
-            </div>
-            
-           </div>
-       </div>
-           </div>
-           <!--键盘给分板到这里结束-->
-       </div>
-      </div>
-      <!--从这里开始是小助手-->
-      <div class="popover bottom assistant show">
-           <div class="arrow"></div>
-           <h3 class="popover-title">评卷功能</h3>
-           <div class="popover-content">
-               <p class="popover-list">
-               <a  href="#">回评</a><a class="curr" href="#">样卷</a><a  href="#">标答</a><a  href="#">全卷</a>
-               </p>      
-           </div>
-           <h3 class="popover-title">问题卷</h3>
-           <div class="popover-content">
-               <p class="popover-list">
-               <a  href="#">试卷模糊</a><a class="curr" href="#">答错位置</a><a  href="#">无法判别</a>
-               </p>      
-           </div>
-           <h3 class="popover-title">个人设置</h3>
-              <div class="popover-content">
-              <span class="popover-list">总分确认</span>
-              <label class="radio mr-t fl">
-                <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
-                开启
-              </label>
-              <label class="radio mr-t fl">
-                <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
-                关闭
-              </label>
-              </div>
-        </div>
-<!--小助手结束--> 
-    </div>
-  </div>
-</div>
-<!--从这里开始是分值列表-->
-  <div class="score-board score-board-popover">
-    <div class="header">
-    <p class="fl"><i class="fl">选作题:</i><select class="span1  mr-t">
-  <option>未选择</option>
-  <option>2</option>
-  <option>3</option>
-  <option>4</option>
-  <option>5</option>
-</select></p>
-    <a class="header-close" href="#"><i class="header-text">键盘给分 >></i></a>
-<!--    <a class="header-close" href="#"><img src="images/close.png" /> 键盘给分</a></div>
--->    </div>
-    <div class="content">
-      <div class="sublist">
-        <p class="number">01</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">02</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">第三小题填空提</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a class="active" href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">04</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">05</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">06</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">07</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">08</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-      <div class="sublist">
-        <p class="number">10</p>
-        <p class="fraction">
-         <a href="#">0.0</a><a href="#">0.5</a><a href="#">1.0</a><a href="#">1.5</a><a href="#">2.0</a><a href="#">2.5</a><a href="#">3.0</a>
-        </p>
-      </div>
-    </div>
-    <div class="footer">
-      <p class="font">总分:<i class="yellow">50分</i></p>
-      <a class="button" href="">提 交</a>
-    </div>
-  </div>
-<!--分值列表结束-->
-</body>
-</html>

Some files were not shown because too many files changed in this diff