Browse Source

Merge branch 'revert-933401eb' into 'master'

Revert "Merge branch 'fix/group_as_read' into 'master'"

See merge request o2oa/o2oa!124
o2null 5 years ago
parent
commit
54217fbba6
100 changed files with 21421 additions and 175 deletions
  1. 2 2
      .gitignore
  2. 1 1
      README.md
  3. 1 1
      gulpfile.js
  4. 0 1
      o2server/configSample/node_127.0.0.1.json
  5. 3 11
      o2server/pom.xml
  6. 1 0
      o2server/version.o2
  7. 113 125
      o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java
  8. 0 34
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CreateVersionFile.java
  9. 1 0
      o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAnonymousAction.java
  10. 12916 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/describe.json
  11. 894 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/common/date/DateOperation.java
  12. 24 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/AbstractFactory.java
  13. 33 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/ApplicationServletContextListener.java
  14. 163 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/Business.java
  15. 102 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/MessageFactory.java
  16. 153 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/ThisApplication.java
  17. 93 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSConfigSettingFactory.java
  18. 96 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSForumInfoFactory.java
  19. 59 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSOperationRecordFactory.java
  20. 152 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSPermissionInfoFactory.java
  21. 194 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSPermissionRoleFactory.java
  22. 390 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSReplyInfoFactory.java
  23. 125 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSRoleInfoFactory.java
  24. 276 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSectionInfoFactory.java
  25. 94 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSubjectAttachmentFactory.java
  26. 773 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSubjectInfoFactory.java
  27. 36 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSubjectVoteResultFactory.java
  28. 61 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSUserInfoFactory.java
  29. 172 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSUserRoleFactory.java
  30. 103 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSVoteOptionFactory.java
  31. 162 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSVoteRecordFactory.java
  32. 60 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/ActionApplication.java
  33. 14 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/BBSAnonyJaxrsFilter.java
  34. 25 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/BBSJaxrsFilter.java
  35. 15 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/BBSJaxrsManagerUserFilter.java
  36. 34 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/MethodExcuteResult.java
  37. 105 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionAttachmentDelete.java
  38. 78 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionAttachmentGet.java
  39. 63 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionAttachmentListBySubjectId.java
  40. 36 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionDownloadWithId.java
  41. 35 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionDownloadWithIdStream.java
  42. 98 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionSectionIconUpdate.java
  43. 136 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionUpload.java
  44. 48 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionUploadAndEncode.java
  45. 143 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionUploadCallback.java
  46. 175 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/AttachmentAction.java
  47. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/BaseAction.java
  48. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionEmptyExtension.java
  49. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionEmptyExtensionCallback.java
  50. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionURLParameterGet.java
  51. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionURLParameterGetCallback.java
  52. 76 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/PictureAction.java
  53. 78 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGet.java
  54. 75 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGetAll.java
  55. 77 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGetBBSName.java
  56. 109 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGetWithCode.java
  57. 155 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionUpdate.java
  58. 128 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAction.java
  59. 49 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAnonymousAction.java
  60. 18 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/BaseAction.java
  61. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingCodeEmpty.java
  62. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingIdEmpty.java
  63. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingInfoProcess.java
  64. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingNotExists.java
  65. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingProcess.java
  66. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingValueEmpty.java
  67. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionInsufficientPermissions.java
  68. 121 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionDelete.java
  69. 174 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionGet.java
  70. 165 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionGetAll.java
  71. 208 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionGetAllWithPermission.java
  72. 271 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionSave.java
  73. 26 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/BaseAction.java
  74. 95 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ForumInfoAction.java
  75. 133 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ForumInfoManagerUserAction.java
  76. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumCanNotDelete.java
  77. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumInfoIdEmpty.java
  78. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumInfoNotExists.java
  79. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumInfoProcess.java
  80. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumNameEmpty.java
  81. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumTypeCategoryEmpty.java
  82. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumTypeCategoryInvalid.java
  83. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionInsufficientPermissions.java
  84. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionPersonNotExists.java
  85. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionPersonQuery.java
  86. 144 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/ActionImageBase64.java
  87. 23 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/BaseAction.java
  88. 56 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/ImageBase64Action.java
  89. 16 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/exception/ExceptionURLEmpty.java
  90. 13 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/exception/ExceptionWrapInConvert.java
  91. 81 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/ActionLogin.java
  92. 35 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/ActionLogout.java
  93. 218 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/ActionMobileIndex.java
  94. 25 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/BaseAction.java
  95. 53 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/LoginAction.java
  96. 52 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/LogoutAction.java
  97. 63 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/MobileIndexAction.java
  98. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/exception/ExceptionInsufficientPermissions.java
  99. 12 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/exception/ExceptionUserLogin.java
  100. 138 0
      o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/permissioninfo/ActionCheckReplyPublishable.java

+ 2 - 2
.gitignore

@@ -25,7 +25,8 @@
 /o2web/ftpconfig.js
 **/.DS_Store
 .DS_Store
-**/.idea/
+**/.idea
+/.idea/
 # Windows thumbnail cache files
 Thumbs.db
 Thumbs.db:encryptable
@@ -150,4 +151,3 @@ typings/
 #vscode
 **/.factorypath
 **/.vscode/
-*.swp

+ 1 - 1
README.md

@@ -92,7 +92,7 @@ AIX : http://download.o2oa.net/download/o2server_20200316073520_aix.zip
 
 银河麒麟(飞腾):http://download.o2oa.net/download/o2server_20200316073520_kylinos_phytium.zip
 
-raspberrypi(树莓派):http://download.o2oa.net/download/o2server_20200316073520_raspberrypi.zip
+raspberrypi(树莓派):http://download.o2oa.net/download/o2server_20200316073520_raspberrypi.zip
 
 
 

+ 1 - 1
gulpfile.js

@@ -128,7 +128,7 @@ function downloadFile(path, filename, headcb, progresscb, cb){
                     });
                     request.get(options).pipe(str).pipe(stream);
                 } else {
-                    gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), "statusCode:"+res.statusCode);
+                    gutil.log(gutil.colors.red("download error"), ":", gutil.colors.red(filename), "statusCode:"+response.statusCode);
                 }
             })
             req.on('error', (e) => {

+ 0 - 1
o2server/configSample/node_127.0.0.1.json

@@ -166,7 +166,6 @@
   "nodeAgentPort": 20010.0,
   "nodeAgentEncrypt": true,
   "quickStartWebApp": false,
-  "autoStart": true,
   "###enable": "是否启用###",
   "###isPrimaryCenter": "是否是center节点,仅允许存在一个center节点###",
   "###center": "Center服务器配置###",

+ 3 - 11
o2server/pom.xml

@@ -1,5 +1,6 @@
-<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">
+<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>
 	<groupId>o2oa</groupId>
 	<artifactId>o2server</artifactId>
@@ -227,10 +228,6 @@
 			<groupId>org.apache.pdfbox</groupId>
 			<artifactId>jbig2-imageio</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-model</artifactId>
-		</dependency>
 		<dependency>
 			<groupId>com.adobe.xmp</groupId>
 			<artifactId>xmpcore</artifactId>
@@ -488,11 +485,6 @@
 				<artifactId>commons-text</artifactId>
 				<version>1.8</version>
 			</dependency>
-			<dependency>
-				<groupId>org.apache.maven</groupId>
-				<artifactId>maven-model</artifactId>
-				<version>3.0</version>
-			</dependency>
 			<dependency>
 				<groupId>org.eclipse.jetty</groupId>
 				<artifactId>jetty-server</artifactId>

+ 1 - 0
o2server/version.o2

@@ -0,0 +1 @@
+2020-03-17 18:53:45

+ 113 - 125
o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java

@@ -83,70 +83,70 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			// Object object = jpa.get(field.getName());
 			Object object = FieldUtils.readField(field, jpa, true);
 			switch (fieldType) {
-				case stringValue:
-					this.persistChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case stringValueList:
-					this.persistChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
-							checkPersist, checkPersistType);
-					break;
-				case dateValue:
-					this.persistChecker.dateValue.check(field, (null == object ? null : (Date) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case dateValueList:
-					this.persistChecker.dateValueList.check(field, (null == object ? null : (List<Date>) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case booleanValue:
-					this.persistChecker.booleanValue.check(field, (null == object ? null : (Boolean) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case booleanValueList:
-					this.persistChecker.booleanValueList.check(field, (null == object ? null : (List<Boolean>) object),
-							jpa, checkPersist, checkPersistType);
-					break;
-				case integerValue:
-					this.persistChecker.integerValue.check(field, (null == object ? null : (Integer) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case integerValueList:
-					this.persistChecker.integerValueList.check(field, (null == object ? null : (List<Integer>) object),
-							jpa, checkPersist, checkPersistType);
-					break;
-				case doubleValue:
-					this.persistChecker.doubleValue.check(field, (null == object ? null : (Double) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case doubleValueList:
-					this.persistChecker.doubleValueList.check(field, (null == object ? null : (List<Double>) object),
-							jpa, checkPersist, checkPersistType);
-					break;
-				case longValue:
-					this.persistChecker.longValue.check(field, (null == object ? null : (Long) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case longValueList:
-					this.persistChecker.longValueList.check(field, (null == object ? null : (List<Long>) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case floatValue:
-					this.persistChecker.floatValue.check(field, (null == object ? null : (Float) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case floatValueList:
-					this.persistChecker.floatValueList.check(field, (null == object ? null : (List<Float>) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case byteValueArray:
-					this.persistChecker.byteValueArray.check(field, (null == object ? null : (byte[]) object), jpa,
-							checkPersist, checkPersistType);
-					break;
-				case enumValue:
-					break;
-				default:
-					break;
+			case stringValue:
+				this.persistChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case stringValueList:
+				this.persistChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
+						checkPersist, checkPersistType);
+				break;
+			case dateValue:
+				this.persistChecker.dateValue.check(field, (null == object ? null : (Date) object), jpa, checkPersist,
+						checkPersistType);
+				break;
+			case dateValueList:
+				this.persistChecker.dateValueList.check(field, (null == object ? null : (List<Date>) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case booleanValue:
+				this.persistChecker.booleanValue.check(field, (null == object ? null : (Boolean) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case booleanValueList:
+				this.persistChecker.booleanValueList.check(field, (null == object ? null : (List<Boolean>) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case integerValue:
+				this.persistChecker.integerValue.check(field, (null == object ? null : (Integer) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case integerValueList:
+				this.persistChecker.integerValueList.check(field, (null == object ? null : (List<Integer>) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case doubleValue:
+				this.persistChecker.doubleValue.check(field, (null == object ? null : (Double) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case doubleValueList:
+				this.persistChecker.doubleValueList.check(field, (null == object ? null : (List<Double>) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case longValue:
+				this.persistChecker.longValue.check(field, (null == object ? null : (Long) object), jpa, checkPersist,
+						checkPersistType);
+				break;
+			case longValueList:
+				this.persistChecker.longValueList.check(field, (null == object ? null : (List<Long>) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case floatValue:
+				this.persistChecker.floatValue.check(field, (null == object ? null : (Float) object), jpa, checkPersist,
+						checkPersistType);
+				break;
+			case floatValueList:
+				this.persistChecker.floatValueList.check(field, (null == object ? null : (List<Float>) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case byteValueArray:
+				this.persistChecker.byteValueArray.check(field, (null == object ? null : (byte[]) object), jpa,
+						checkPersist, checkPersistType);
+				break;
+			case enumValue:
+				break;
+			default:
+				break;
 			}
 		}
 	}
@@ -161,16 +161,16 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			// Object object = jpa.get(field.getName());
 			Object object = FieldUtils.readField(field, jpa, true);
 			switch (fieldType) {
-				case stringValue:
-					this.removeChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
-							checkRemove, checkRemoveType);
-					break;
-				case stringValueList:
-					this.removeChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
-							checkRemove, checkRemoveType);
-					break;
-				default:
-					break;
+			case stringValue:
+				this.removeChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa,
+						checkRemove, checkRemoveType);
+				break;
+			case stringValueList:
+				this.removeChecker.stringValueList.check(field, null == object ? null : (List<String>) object, jpa,
+						checkRemove, checkRemoveType);
+				break;
+			default:
+				break;
 			}
 		}
 	}
@@ -208,19 +208,18 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			t = em.find(cls, id);
 		}
 		switch (exceptionWhen) {
-			case not_found:
-				if (null == t) {
-					throw new Exception("can not find entity id: " + id + ", class: " + cls.getCanonicalName() + ".");
-				}
-				break;
-			case found:
-				if (null != t) {
-					throw new Exception(
-							"entity already existed, id: " + id + ", class: " + cls.getCanonicalName() + ".");
-				}
-				break;
-			default:
-				break;
+		case not_found:
+			if (null == t) {
+				throw new Exception("can not find entity id: " + id + ", class: " + cls.getCanonicalName() + ".");
+			}
+			break;
+		case found:
+			if (null != t) {
+				throw new Exception("entity already existed, id: " + id + ", class: " + cls.getCanonicalName() + ".");
+			}
+			break;
+		default:
+			break;
 		}
 		return t;
 	}
@@ -245,14 +244,14 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			Predicate p = cb.equal(root.get(field.getName()), flag);
 			List<T> list = em.createQuery(cq.select(root).where(p).distinct(true)).setMaxResults(2).getResultList();
 			switch (list.size()) {
-				case 0:
-					break;
-				case 1:
-					t = list.get(0);
-					break out;
-				case 2:
-					throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
-							+ ", attribute:" + field.getName() + ".");
+			case 0:
+				break;
+			case 1:
+				t = list.get(0);
+				break out;
+			case 2:
+				throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
+						+ ", attribute:" + field.getName() + ".");
 			}
 		}
 		return t;
@@ -310,15 +309,15 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			cq.select(root).where(p);
 			List<T> list = em.createQuery(cq).setMaxResults(2).getResultList();
 			switch (list.size()) {
-				case 0:
-					break;
-				case 1:
-					t = list.get(0);
-					break out;
-				case 2:
-					throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
-							+ ", attribute:" + field.getName() + ", restrict attrubte:" + singularAttribute
-							+ ", restrict value:" + restrictValue + ".");
+			case 0:
+				break;
+			case 1:
+				t = list.get(0);
+				break out;
+			case 2:
+				throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName()
+						+ ", attribute:" + field.getName() + ", restrict attrubte:" + singularAttribute
+						+ ", restrict value:" + restrictValue + ".");
 			}
 		}
 		return t;
@@ -541,25 +540,13 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 
 	public <T extends JpaObject, W extends Object> List<T> listBetweenAndEqual(Class<T> cls, String attribute,
 			Object start, Object end, String equalAttribute, Object equalValue) throws Exception {
-		Comparable s = (Comparable) start;
-		Comparable e = (Comparable) end;
 		EntityManager em = this.get(cls);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<T> cq = cb.createQuery(cls);
-		Root<T> root = cq.from(cls);
-		Predicate p = cb.between(root.get(attribute), s, e);
-		p = cb.and(p, cb.equal(root.get(equalAttribute), equalValue));
-		cq.select(root).where(p);
-		List<T> os = em.createQuery(cq).getResultList();
-		List<T> list = new ArrayList<>(os);
-		return list;
-		// Query query = em.createQuery("select o from " + cls.getName() + " o where
-		// ((o." + attribute
-		// + " between ?1 and ?2) and (o." + equalAttribute + " = ?3))");
-		// query.setParameter(1, start);
-		// query.setParameter(2, end);
-		// query.setParameter(3, equalValue);
-		// return new ArrayList<T>(query.getResultList());
+		Query query = em.createQuery("select o from " + cls.getName() + " o where ((o." + attribute
+				+ " between ?1 and ?2) and (o." + equalAttribute + " = ?3))");
+		query.setParameter(1, start);
+		query.setParameter(2, end);
+		query.setParameter(3, equalValue);
+		return new ArrayList<T>(query.getResultList());
 	}
 
 	public <T extends JpaObject> List<T> listNotEqual(Class<T> cls, String attribute, Object value) throws Exception {
@@ -1138,9 +1125,9 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 			selections.add(root.get(str));
 		}
 		cq.multiselect(selections).where(predicate);
-		// if (StringUtils.isNotEmpty(orderAttribute)) {
-		// cq.orderBy(cb.desc(root.get(orderAttribute)));
-		// }
+//		if (StringUtils.isNotEmpty(orderAttribute)) {
+//			cq.orderBy(cb.desc(root.get(orderAttribute)));
+//		}
 		T t = null;
 		for (Tuple o : em.createQuery(cq).getResultList()) {
 			t = clz.newInstance();
@@ -1836,4 +1823,5 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return list;
 	}
 
+
 }

+ 0 - 34
o2server/x_base_core_project/src/main/java/com/x/base/core/project/build/CreateVersionFile.java

@@ -1,34 +0,0 @@
-package com.x.base.core.project.build;
-
-import java.io.File;
-import java.io.FileReader;
-import java.util.Date;
-import java.util.LinkedHashMap;
-
-import com.x.base.core.project.gson.XGsonBuilder;
-import com.x.base.core.project.tools.DateTools;
-import com.x.base.core.project.tools.DefaultCharset;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-
-public class CreateVersionFile {
-	public static void main(String... args) throws Exception {
-		File base = new File(args[0]);
-		File file = new File(base, "../version.o2");
-		File pom = new File(base, "../pom.xml");
-
-		MavenXpp3Reader reader = new MavenXpp3Reader();
-		Model model = reader.read(new FileReader(pom));
-
-		LinkedHashMap<String, String> map = new LinkedHashMap<>();
-
-		map.put("version", model.getVersion() + "");
-		map.put("date", DateTools.format(new Date()));
-
-		FileUtils.write(file, XGsonBuilder.toJson(map), DefaultCharset.charset_utf_8);
-
-	}
-
-}

+ 1 - 0
o2server/x_bbs_assemble_control/src/main/java/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAnonymousAction.java

@@ -9,6 +9,7 @@ import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import com.x.base.core.project.annotation.JaxrsDescribe;
 import com.x.base.core.project.annotation.JaxrsMethodDescribe;

+ 12916 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/describe.json

@@ -0,0 +1,12916 @@
+{
+  "jaxrs": [
+    {
+      "name": "AttachmentAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.attachment.AttachmentAction",
+      "description": "附件操作",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.bbs.assemble.control.jaxrs.attachment.ActionAttachmentDelete",
+          "description": "删除指定subject下指定的附件.",
+          "type": "DELETE",
+          "path": "jaxrs/attachment/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "附件标识"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "downloadWithSubject",
+          "className": "com.x.base.core.project.jaxrs.StandardJaxrsAction",
+          "description": "根据ID下载指定附件",
+          "type": "GET",
+          "path": "jaxrs/attachment/download/{id}",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "附件标识"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "downloadWithSubjectStream",
+          "className": "com.x.bbs.assemble.control.jaxrs.attachment.ActionDownloadWithIdStream",
+          "description": "根据Work下载附件,设定是否使用stream输出",
+          "type": "GET",
+          "path": "jaxrs/attachment/download/{id}/stream/{stream}",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "附件标识"
+            },
+            {
+              "name": "stream",
+              "type": "Boolean",
+              "description": "用.APPLICATION_OCTET_STREAM头输出"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "contentDisposition",
+              "type": "String",
+              "isCollection": false,
+              "description": "说明"
+            },
+            {
+              "name": "contentType",
+              "type": "String",
+              "isCollection": false,
+              "description": "类型"
+            },
+            {
+              "name": "bytes",
+              "type": "byte[]",
+              "isCollection": false,
+              "description": "字节内容."
+            }
+          ]
+        },
+        {
+          "name": "getWithId",
+          "className": "com.x.bbs.assemble.control.jaxrs.attachment.ActionAttachmentGet",
+          "description": "根据附件Id获取单个附件信息.",
+          "type": "GET",
+          "path": "jaxrs/attachment/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "附件ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "lastUpdateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最后更新时间"
+            },
+            {
+              "name": "storage",
+              "type": "String",
+              "isCollection": false,
+              "description": "关联的存储名称."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "name",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "isCollection": false,
+              "description": "服务器上编码后的文件名,为了方便辨识带扩展名"
+            },
+            {
+              "name": "fileHost",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储主机名"
+            },
+            {
+              "name": "filePath",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储路径"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件说明"
+            },
+            {
+              "name": "creatorUid",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者标识"
+            },
+            {
+              "name": "extension",
+              "type": "String",
+              "isCollection": false,
+              "description": "扩展名"
+            },
+            {
+              "name": "length",
+              "type": "Long",
+              "isCollection": false,
+              "description": "文件大小."
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "isCollection": false,
+              "description": "附件框分类."
+            },
+            {
+              "name": "deepPath",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否使用更深的路径."
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listWithSubjectId",
+          "className": "com.x.bbs.assemble.control.jaxrs.attachment.ActionAttachmentListBySubjectId",
+          "description": "根据Subject获取Attachment列表.",
+          "type": "GET",
+          "path": "jaxrs/attachment/list/subject/{subjectId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "description": "贴子ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "lastUpdateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最后更新时间"
+            },
+            {
+              "name": "storage",
+              "type": "String",
+              "isCollection": false,
+              "description": "关联的存储名称."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "name",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "isCollection": false,
+              "description": "服务器上编码后的文件名,为了方便辨识带扩展名"
+            },
+            {
+              "name": "fileHost",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储主机名"
+            },
+            {
+              "name": "filePath",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储路径"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件说明"
+            },
+            {
+              "name": "creatorUid",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者标识"
+            },
+            {
+              "name": "extension",
+              "type": "String",
+              "isCollection": false,
+              "description": "扩展名"
+            },
+            {
+              "name": "length",
+              "type": "Long",
+              "isCollection": false,
+              "description": "文件大小."
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "isCollection": false,
+              "description": "附件框分类."
+            },
+            {
+              "name": "deepPath",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否使用更深的路径."
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "upload",
+          "className": "com.x.base.core.project.jaxrs.StandardJaxrsAction",
+          "description": "上传附件.",
+          "type": "POST",
+          "path": "jaxrs/attachment/upload/subject/{subjectId}",
+          "contentType": "multipart/form-data",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "description": "主贴ID"
+            }
+          ],
+          "formParameters": [
+            {
+              "name": "file",
+              "type": "File",
+              "description": ""
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "description": "位置"
+            }
+          ],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "uploadCallback",
+          "className": "com.x.bbs.assemble.control.jaxrs.attachment.ActionUploadCallback",
+          "description": "上传附件(带回调).",
+          "type": "POST",
+          "path": "jaxrs/attachment/upload/subject/{subjectId}/callback/{callback}",
+          "contentType": "multipart/form-data",
+          "resultContentType": "text/html; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "description": "主贴ID"
+            },
+            {
+              "name": "callback",
+              "type": "String",
+              "description": "回调函数名"
+            }
+          ],
+          "formParameters": [
+            {
+              "name": "file",
+              "type": "File",
+              "description": ""
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "description": "位置"
+            }
+          ],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "callbackName",
+              "type": "String",
+              "isCollection": false,
+              "description": "回调函数名"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "BBSConfigSettingAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.configsetting.BBSConfigSettingAction",
+      "description": "论坛设置操作",
+      "methods": [
+        {
+          "name": "get",
+          "className": "com.x.bbs.assemble.control.jaxrs.configsetting.ActionGet",
+          "description": "根据ID获取论坛设置对象.",
+          "type": "GET",
+          "path": "jaxrs/user/setting/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "配置信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置名称"
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置编码"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置值"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "getByCode",
+          "className": "com.x.bbs.assemble.control.jaxrs.configsetting.ActionGetWithCode",
+          "description": "根据编码获取论坛设置对象.",
+          "type": "PUT",
+          "path": "jaxrs/user/setting/code",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置名称",
+              "isBaseType": true
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置编码",
+              "isBaseType": true
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置值",
+              "isBaseType": true
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text",
+              "isBaseType": true
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔",
+              "isBaseType": true
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置名称"
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置编码"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置值"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAll",
+          "className": "com.x.bbs.assemble.control.jaxrs.configsetting.ActionGetAll",
+          "description": "获取所有论坛设置信息列表.",
+          "type": "GET",
+          "path": "jaxrs/user/setting/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置名称"
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置编码"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置值"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "update",
+          "className": "com.x.bbs.assemble.control.jaxrs.configsetting.ActionUpdate",
+          "description": "更新论坛设置对象, 配置信息不允许新建和删除操作.",
+          "type": "PUT",
+          "path": "jaxrs/user/setting",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成.",
+              "isBaseType": true
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置名称",
+              "isBaseType": true
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置编码",
+              "isBaseType": true
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置值",
+              "isBaseType": true
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text",
+              "isBaseType": true
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔",
+              "isBaseType": true
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明",
+              "isBaseType": true
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位.",
+              "isBaseType": true
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中.",
+              "isBaseType": true
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置名称"
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置编码"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置值"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "BBSConfigSettingAnonymousAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.configsetting.BBSConfigSettingAnonymousAction",
+      "description": "论坛配置查询(匿名)",
+      "methods": [
+        {
+          "name": "getBBSName",
+          "className": "com.x.bbs.assemble.control.jaxrs.configsetting.ActionGetBBSName",
+          "description": "获取BBS系统名称配置的论坛设置对象.",
+          "type": "GET",
+          "path": "jaxrs/setting/bbsName",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "configName",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置名称"
+            },
+            {
+              "name": "configCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统配置编码"
+            },
+            {
+              "name": "configValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "配置值"
+            },
+            {
+              "name": "valueType",
+              "type": "String",
+              "isCollection": false,
+              "description": "值类型: select | identity | number | date | text"
+            },
+            {
+              "name": "selectContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "可选值,和select配合使用,以‘|’号分隔"
+            },
+            {
+              "name": "isMultiple",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否可以多值"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "备注说明"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "CacheAction",
+      "className": "com.x.base.core.project.jaxrs.cache.CacheAction",
+      "description": "缓存操作",
+      "methods": [
+        {
+          "name": "configFlush",
+          "className": "com.x.base.core.project.jaxrs.cache.ActionConfigFlush",
+          "description": "接收config flush 信号.",
+          "type": "GET",
+          "path": "jaxrs/cache/config/flush",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "receive",
+          "className": "com.x.base.core.project.jaxrs.cache.ActionReceive",
+          "description": "接收Cache刷新信息.",
+          "type": "PUT",
+          "path": "jaxrs/cache",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "nodeName",
+              "type": "String",
+              "isCollection": false,
+              "description": "节点名",
+              "isBaseType": true
+            },
+            {
+              "name": "className",
+              "type": "String",
+              "isCollection": false,
+              "description": "类名",
+              "isBaseType": true
+            },
+            {
+              "name": "keys",
+              "type": "List\u003cObject\u003e",
+              "isCollection": true,
+              "description": "关键字",
+              "isBaseType": false
+            }
+          ],
+          "outs": [
+            {
+              "name": "value",
+              "type": "String",
+              "isCollection": false,
+              "description": "字符串值"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "EchoAction",
+      "className": "com.x.base.core.project.jaxrs.echo.EchoAction",
+      "description": "响应",
+      "methods": [
+        {
+          "name": "get",
+          "className": "com.x.base.core.project.jaxrs.echo.ActionGet",
+          "description": "获取应答.",
+          "type": "GET",
+          "path": "jaxrs/echo",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "servletContextName",
+              "type": "String",
+              "isCollection": false,
+              "description": "上下文根"
+            },
+            {
+              "name": "serverTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "服务器时间"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "FireScheduleAction",
+      "className": "com.x.base.core.project.jaxrs.fireschedule.FireScheduleAction",
+      "description": "触发任务",
+      "methods": [
+        {
+          "name": "execute",
+          "className": "com.x.base.core.project.jaxrs.fireschedule.ActionExecute",
+          "description": "接受x_program_center发送过来的运行schedule.",
+          "type": "GET",
+          "path": "jaxrs/fireschedule/classname/{className}",
+          "contentType": "application/json",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "className",
+              "type": "String",
+              "description": "运行类"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "ForumInfoAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.foruminfo.ForumInfoAction",
+      "description": "论坛信息管理",
+      "methods": [
+        {
+          "name": "get",
+          "className": "com.x.bbs.assemble.control.jaxrs.foruminfo.ActionGet",
+          "description": "根据指定ID获取论坛信息.",
+          "type": "GET",
+          "path": "jaxrs/forum/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "表单ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "forumManagerName",
+              "type": "String",
+              "isCollection": false,
+              "description": "字符串形式输出的管理员信息,逗号(,)分隔."
+            },
+            {
+              "name": "forumVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "sections",
+              "type": "List\u003cWoSectionInfo\u003e",
+              "isCollection": true,
+              "description": "版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "forumManagerList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "论坛管理员列表"
+            },
+            {
+              "name": "forumNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛公告"
+            },
+            {
+              "name": "forumVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可发布范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可回复范围"
+            },
+            {
+              "name": "indexListStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页列表样式:经典|简单矩形|图片矩形"
+            },
+            {
+              "name": "forumIndexStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛主页面样式:经典|新闻|照片"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,默认:信息|问题|投票"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "sectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建版块:true|false"
+            },
+            {
+              "name": "sectionTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "版块数量"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "forumColor",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题顔色"
+            },
+            {
+              "name": "forumStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "viewAllWithMyPermission",
+          "className": "com.x.bbs.assemble.control.jaxrs.foruminfo.ActionGetAllWithPermission",
+          "description": "获取登录者可以访问到的所有ForumInfo的信息列表.",
+          "type": "GET",
+          "path": "jaxrs/forum/view/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "forumManagerName",
+              "type": "String",
+              "isCollection": false,
+              "description": "字符串形式输出的管理员信息,逗号(,)分隔."
+            },
+            {
+              "name": "forumVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "sections",
+              "type": "List\u003cWoSectionInfo\u003e",
+              "isCollection": true,
+              "description": "版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "forumManagerList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "论坛管理员列表"
+            },
+            {
+              "name": "forumNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛公告"
+            },
+            {
+              "name": "forumVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可发布范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可回复范围"
+            },
+            {
+              "name": "indexListStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页列表样式:经典|简单矩形|图片矩形"
+            },
+            {
+              "name": "forumIndexStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛主页面样式:经典|新闻|照片"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,默认:信息|问题|投票"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "sectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建版块:true|false"
+            },
+            {
+              "name": "sectionTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "版块数量"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "forumColor",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题顔色"
+            },
+            {
+              "name": "forumStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "ForumInfoManagerUserAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.foruminfo.ForumInfoManagerUserAction",
+      "description": "论坛信息查询(匿名)",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.bbs.assemble.control.jaxrs.foruminfo.ActionDelete",
+          "description": "根据ID删除指定的论坛信息,如果论坛里有版块或者贴子,则不允许删除.",
+          "type": "DELETE",
+          "path": "jaxrs/user/forum/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "表单ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "listAll",
+          "className": "com.x.bbs.assemble.control.jaxrs.foruminfo.ActionGetAll",
+          "description": "获取所有论坛信息列表.",
+          "type": "GET",
+          "path": "jaxrs/user/forum/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "forumManagerName",
+              "type": "String",
+              "isCollection": false,
+              "description": "字符串形式输出的管理员信息,逗号(,)分隔."
+            },
+            {
+              "name": "forumVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "sections",
+              "type": "List\u003cWoSectionInfo\u003e",
+              "isCollection": true,
+              "description": "版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "forumManagerList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "论坛管理员列表"
+            },
+            {
+              "name": "forumNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛公告"
+            },
+            {
+              "name": "forumVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可发布范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可回复范围"
+            },
+            {
+              "name": "indexListStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页列表样式:经典|简单矩形|图片矩形"
+            },
+            {
+              "name": "forumIndexStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛主页面样式:经典|新闻|照片"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,默认:信息|问题|投票"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "sectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建版块:true|false"
+            },
+            {
+              "name": "sectionTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "版块数量"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "forumColor",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题顔色"
+            },
+            {
+              "name": "forumStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.bbs.assemble.control.jaxrs.foruminfo.ActionSave",
+          "description": "创建新的论坛信息或者更新论坛信息.",
+          "type": "POST",
+          "path": "jaxrs/user/forum",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "forumManagerName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛管理员.",
+              "isBaseType": true
+            },
+            {
+              "name": "forumVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛可见范围.",
+              "isBaseType": true
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称",
+              "isBaseType": true
+            },
+            {
+              "name": "forumManagerList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "论坛管理员列表",
+              "isBaseType": true
+            },
+            {
+              "name": "forumNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛公告",
+              "isBaseType": true
+            },
+            {
+              "name": "forumVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛可见:所有人(默认)|根据权限",
+              "isBaseType": true
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限",
+              "isBaseType": true
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可发布范围",
+              "isBaseType": true
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限",
+              "isBaseType": true
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可回复范围",
+              "isBaseType": true
+            },
+            {
+              "name": "indexListStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页列表样式:经典|简单矩形|图片矩形",
+              "isBaseType": true
+            },
+            {
+              "name": "forumIndexStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛主页面样式:经典|新闻|照片",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻",
+              "isBaseType": true
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,默认:信息|问题|投票",
+              "isBaseType": true
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建版块:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "版块数量",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量",
+              "isBaseType": true
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量",
+              "isBaseType": true
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "forumColor",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题顔色",
+              "isBaseType": true
+            },
+            {
+              "name": "forumStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛状态:启用|停用",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "ImageBase64Action",
+      "className": "com.x.bbs.assemble.control.jaxrs.image.ImageBase64Action",
+      "description": "图片编码服务",
+      "methods": [
+        {
+          "name": "convert",
+          "className": "com.x.bbs.assemble.control.jaxrs.image.ActionImageBase64",
+          "description": "将URL指向的图片转换成base64String.",
+          "type": "POST",
+          "path": "jaxrs/image/encode/base64",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "url",
+              "type": "String",
+              "isCollection": false,
+              "description": "地址",
+              "isBaseType": true
+            },
+            {
+              "name": "size",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "像素大小",
+              "isBaseType": true
+            }
+          ],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "LoggerAction",
+      "className": "com.x.base.core.project.jaxrs.logger.LoggerAction",
+      "description": "日志操作",
+      "methods": [
+        {
+          "name": "debug",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionDebug",
+          "description": "设置日志级别为DEBUG.",
+          "type": "GET",
+          "path": "jaxrs/logger/debug",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionGet",
+          "description": "获取当前日志级别.",
+          "type": "GET",
+          "path": "jaxrs/logger",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "String",
+              "isCollection": false,
+              "description": "字符串值"
+            }
+          ]
+        },
+        {
+          "name": "info",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionInfo",
+          "description": "设置日志级别为INFO",
+          "type": "GET",
+          "path": "jaxrs/logger/info",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "trace",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionTrace",
+          "description": "设置日志级别为TRACE.",
+          "type": "GET",
+          "path": "jaxrs/logger/trace",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        },
+        {
+          "name": "warn",
+          "className": "com.x.base.core.project.jaxrs.logger.ActionWarn",
+          "description": "设置日志级别为WARN",
+          "type": "GET",
+          "path": "jaxrs/logger/warn",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "LoginAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.login.LoginAction",
+      "description": "登入信息服务",
+      "methods": [
+        {
+          "name": "login",
+          "className": "com.x.bbs.assemble.control.jaxrs.login.ActionLogin",
+          "description": "用户进入系统,获取并且更新用户权限角色信息.",
+          "type": "POST",
+          "path": "jaxrs/login",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "LogoutAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.login.LogoutAction",
+      "description": "登出服务",
+      "methods": [
+        {
+          "name": "login",
+          "className": "com.x.bbs.assemble.control.jaxrs.login.ActionLogout",
+          "description": "退出系统.",
+          "type": "POST",
+          "path": "jaxrs/logout",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "MobileIndexAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.login.MobileIndexAction",
+      "description": "手机APP论坛首页信息内容查询",
+      "methods": [
+        {
+          "name": "viewAllWithMyPermission",
+          "className": "com.x.bbs.assemble.control.jaxrs.login.ActionMobileIndex",
+          "description": "获取登录者可以访问到的所有ForumInfo的信息列表.",
+          "type": "GET",
+          "path": "jaxrs/mobile/view/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "forumManagerList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "论坛管理员列表"
+            },
+            {
+              "name": "forumNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛公告"
+            },
+            {
+              "name": "forumVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可发布范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "可回复范围"
+            },
+            {
+              "name": "indexListStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页列表样式:经典|简单矩形|图片矩形"
+            },
+            {
+              "name": "forumIndexStyle",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛主页面样式:经典|新闻|照片"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,默认:信息|问题|投票"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "sectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建版块:true|false"
+            },
+            {
+              "name": "sectionTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "版块数量"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "forumColor",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题顔色"
+            },
+            {
+              "name": "forumStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "PermissionInfoAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.PermissionInfoAction",
+      "description": "权限查询服务",
+      "methods": [
+        {
+          "name": "getSectionOperationPermissoin",
+          "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.ActionGetSectionOperationPermissoin",
+          "description": "查询用户在指定板块中的所有操作权限.",
+          "type": "GET",
+          "path": "jaxrs/permission/section/{sectionId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "sectionId",
+              "type": "String",
+              "description": "版块ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "subjectPublishAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_SUBJECT_PUBLISH:用户是否可以在版块中发布主题."
+            },
+            {
+              "name": "subjectAuditAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_SUBJECT_AUDIT:用户是否可以审核在版块中发布的主题."
+            },
+            {
+              "name": "subjectManageAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_SUBJECT_MANAGEMENT:用户是否可以在版块中对已发布主题进行删除等管理操作."
+            },
+            {
+              "name": "subjectRecommendAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_SUBJECT_RECOMMEND:用户是否可以在版块中对主题进行推荐操作."
+            },
+            {
+              "name": "subjectStickAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_SUBJECT_STICK:用户是否可以在版块中对主题进行置顶操作."
+            },
+            {
+              "name": "subjectCreamAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_SUBJECT_CREAM:用户是否可以在版块中对指定主题进行精华主题设置操作."
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_REPLY_PUBLISH:用户是否可以审核在版块中的所有回复内容."
+            },
+            {
+              "name": "replyAuditAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_REPLY_AUDIT:用户是否可以在版块中对回复进行审核."
+            },
+            {
+              "name": "replyManageAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_REPLY_MANAGEMENT:用户是否可以在版块中对回复进行查询或者删除."
+            },
+            {
+              "name": "sectionManageAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_SECTION_MANAGER:用户是否可以在版块中对子版块进行创建和删除等操作."
+            },
+            {
+              "name": "sectionPermissoinManageAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_PERMISSION_MANAGEMENT:用户是否可以对论坛用户进行版块的权限管理."
+            },
+            {
+              "name": "sectionConfigManageAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "对应权限SECTION_CONFIG_MANAGEMENT:用户是否可以对版块进行系统参数配置修改."
+            }
+          ]
+        },
+        {
+          "name": "getSubjectOperationPermissoin",
+          "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.ActionGetSubjectOperationPermissoin",
+          "description": "查询用户对指定主题的所有操作权限.",
+          "type": "GET",
+          "path": "jaxrs/permission/subject/{subjectId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "description": "主贴ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "auditAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以审核该主题."
+            },
+            {
+              "name": "editAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以编辑该主题."
+            },
+            {
+              "name": "manageAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以管理该主题."
+            },
+            {
+              "name": "recommendAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以推荐该主题."
+            },
+            {
+              "name": "stickAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以置顶该主题."
+            },
+            {
+              "name": "creamAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以对该主题进行精华主题设置操作."
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以在该主题中进行回复操作."
+            },
+            {
+              "name": "replyAuditAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以在版块中对回复进行审核."
+            },
+            {
+              "name": "replyManageAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "用户是否可以在主题中对回复进行查询或者删除."
+            }
+          ]
+        },
+        {
+          "name": "replyPublishable",
+          "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.ActionCheckReplyPublishable",
+          "description": "查询用户是否可以对指定主题进行回复.",
+          "type": "GET",
+          "path": "jaxrs/permission/replyPublishable/{subjectId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "description": "主贴ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "subjectPublishable",
+          "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.ActionCheckSubjectPublishable",
+          "description": "查询用户对指定主题的所有操作权限.",
+          "type": "GET",
+          "path": "jaxrs/permission/subjectPublishable/{sectionId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "sectionId",
+              "type": "String",
+              "description": "版块ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "PermissionInfoAdminAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.PermissionInfoAdminAction",
+      "description": "权限管理服务",
+      "methods": [
+        {
+          "name": "listPermissionByForumId",
+          "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.ActionListPermissionByRoleCode",
+          "description": "获取指定的论坛绑定的所有PermissionInfo的信息列表.",
+          "type": "GET",
+          "path": "jaxrs/user/permission/forum/{forumId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "forumId",
+              "type": "String",
+              "description": "论坛ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "permissionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限类别:论坛权限|版块权限|其他权限"
+            },
+            {
+              "name": "permissionFunction",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限功能:属于权限代码的一部分,描述权限的主要功能"
+            },
+            {
+              "name": "permissionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限名称"
+            },
+            {
+              "name": "permissionCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限代码"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限说明"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listPermissionByRoleCode",
+          "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.ActionListPermissionByRoleCode",
+          "description": "获取指定的角色Code绑定的所有PermissionInfo的信息列表.",
+          "type": "GET",
+          "path": "jaxrs/user/permission/role/{roleCode}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "roleCode",
+              "type": "String",
+              "description": "角色编码"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "permissionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限类别:论坛权限|版块权限|其他权限"
+            },
+            {
+              "name": "permissionFunction",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限功能:属于权限代码的一部分,描述权限的主要功能"
+            },
+            {
+              "name": "permissionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限名称"
+            },
+            {
+              "name": "permissionCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限代码"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限说明"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listPermissionBySection",
+          "className": "com.x.bbs.assemble.control.jaxrs.permissioninfo.ActionListPermissionBySection",
+          "description": "获取指定的版块绑定的所有PermissionInfo的信息列表.",
+          "type": "GET",
+          "path": "jaxrs/user/permission/section/{sectionId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "sectionId",
+              "type": "String",
+              "description": "版块ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "permissionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限类别:论坛权限|版块权限|其他权限"
+            },
+            {
+              "name": "permissionFunction",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限功能:属于权限代码的一部分,描述权限的主要功能"
+            },
+            {
+              "name": "permissionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限名称"
+            },
+            {
+              "name": "permissionCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限代码"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限说明"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "PictureAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.attachment.PictureAction",
+      "description": "图片操作",
+      "methods": [
+        {
+          "name": "pictureEncode",
+          "className": "com.x.bbs.assemble.control.jaxrs.attachment.ActionUploadAndEncode",
+          "description": "将图片转为base64编码,并且进行尺寸转换.",
+          "type": "POST",
+          "path": "jaxrs/picture/encode/base64/size/{size}",
+          "contentType": "multipart/form-data",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [
+            {
+              "name": "size",
+              "type": "Integer",
+              "description": "尺寸大小"
+            }
+          ],
+          "formParameters": [
+            {
+              "name": "file",
+              "type": "File",
+              "description": ""
+            }
+          ],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "sectionIconUpdate",
+          "className": "com.x.bbs.assemble.control.jaxrs.attachment.ActionSectionIconUpdate",
+          "description": "更新版块图标.",
+          "type": "POST",
+          "path": "jaxrs/picture/section/{id}/icon",
+          "contentType": "multipart/form-data",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "版块ID"
+            }
+          ],
+          "formParameters": [
+            {
+              "name": "file",
+              "type": "File",
+              "description": ""
+            }
+          ],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "ReplyInfoAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ReplyInfoAction",
+      "description": "回复查询服务",
+      "methods": [
+        {
+          "name": "get",
+          "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ActionGet",
+          "description": "根据指定ID获取回贴信息.",
+          "type": "GET",
+          "path": "jaxrs/reply/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "回复信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "回贴标题:如果没有则与主题相同"
+            },
+            {
+              "name": "parentId",
+              "type": "String",
+              "isCollection": false,
+              "description": "上级回帖ID"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "图片信息ID"
+            },
+            {
+              "name": "content",
+              "type": "String",
+              "isCollection": false,
+              "description": "内容"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "replyAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listWithSubjectForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ActionListWithSubjectForPage",
+          "description": "列示根据过滤条件的ReplyInfo, 下一页.",
+          "type": "PUT",
+          "path": "jaxrs/reply/filter/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题Id",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "回贴标题:如果没有则与主题相同"
+            },
+            {
+              "name": "parentId",
+              "type": "String",
+              "isCollection": false,
+              "description": "上级回帖ID"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "图片信息ID"
+            },
+            {
+              "name": "content",
+              "type": "String",
+              "isCollection": false,
+              "description": "内容"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "replyAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "ReplyInfoManagerUserAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ReplyInfoManagerUserAction",
+      "description": "主量回复服务",
+      "methods": [
+        {
+          "name": "accept",
+          "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ActionAcceptReply",
+          "description": "采纳回复信息.",
+          "type": "PUT",
+          "path": "jaxrs/user/reply/accept",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID",
+              "isBaseType": true
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID",
+              "isBaseType": true
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "回贴标题:如果没有则与主题相同",
+              "isBaseType": true
+            },
+            {
+              "name": "parentId",
+              "type": "String",
+              "isCollection": false,
+              "description": "上级回帖ID",
+              "isBaseType": true
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "图片信息ID",
+              "isBaseType": true
+            },
+            {
+              "name": "content",
+              "type": "String",
+              "isCollection": false,
+              "description": "内容",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "replyAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复审核状态:无审核|待审核|审核通过",
+              "isBaseType": true
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等",
+              "isBaseType": true
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称",
+              "isBaseType": true
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址",
+              "isBaseType": true
+            }
+          ],
+          "outs": []
+        },
+        {
+          "name": "delete",
+          "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ActionDelete",
+          "description": "根据ID删除指定的回贴信息.",
+          "type": "DELETE",
+          "path": "jaxrs/user/reply/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "回复信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "listMyReplyForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ActionListMyReplyForPages",
+          "description": "列示我发表的回贴,下一页.",
+          "type": "PUT",
+          "path": "jaxrs/user/reply/my/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "前一页最后一条记录ID"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题Id",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "回贴标题:如果没有则与主题相同"
+            },
+            {
+              "name": "parentId",
+              "type": "String",
+              "isCollection": false,
+              "description": "上级回帖ID"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "图片信息ID"
+            },
+            {
+              "name": "content",
+              "type": "String",
+              "isCollection": false,
+              "description": "内容"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "replyAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "save",
+          "className": "com.x.bbs.assemble.control.jaxrs.replyinfo.ActionSave",
+          "description": "创建新的回贴信息或者更新回贴信息.",
+          "type": "POST",
+          "path": "jaxrs/user/reply",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID",
+              "isBaseType": true
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID",
+              "isBaseType": true
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "回贴标题:如果没有则与主题相同",
+              "isBaseType": true
+            },
+            {
+              "name": "parentId",
+              "type": "String",
+              "isCollection": false,
+              "description": "上级回帖ID",
+              "isBaseType": true
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "图片信息ID",
+              "isBaseType": true
+            },
+            {
+              "name": "content",
+              "type": "String",
+              "isCollection": false,
+              "description": "内容",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "replyAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复审核状态:无审核|待审核|审核通过",
+              "isBaseType": true
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等",
+              "isBaseType": true
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称",
+              "isBaseType": true
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "RoleInfoAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.RoleInfoAction",
+      "description": "角色管理服务",
+      "methods": [
+        {
+          "name": "bindRoleToUser",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionBindRoleToUser",
+          "description": "把一个或者多个角色CODE绑定到一个对象(对象名称#对象类型)上.",
+          "type": "PUT",
+          "path": "jaxrs/user/role/bind/object",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "组织名称",
+              "isBaseType": true
+            },
+            {
+              "name": "userName",
+              "type": "String",
+              "isCollection": false,
+              "description": "人员名称",
+              "isBaseType": true
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛Id",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "区段Id",
+              "isBaseType": true
+            },
+            {
+              "name": "bindRoleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "绑定角色",
+              "isBaseType": true
+            },
+            {
+              "name": "bindObject",
+              "type": "BindObject",
+              "isCollection": false,
+              "description": "绑定对象",
+              "isBaseType": false
+            },
+            {
+              "name": "bindRoleCodes",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "绑定角色列表",
+              "isBaseType": true
+            },
+            {
+              "name": "bindObjectArray",
+              "type": "List\u003cBindObject\u003e",
+              "isCollection": true,
+              "description": "绑定对象列表",
+              "isBaseType": false
+            }
+          ],
+          "outs": []
+        },
+        {
+          "name": "bindUserToRole",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionBindUserToRole",
+          "description": "把一个或者多个对象(对象名称#对象类型)绑定到一个角色CODE上.",
+          "type": "PUT",
+          "path": "jaxrs/user/role/bind/role",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "delete",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionDelete",
+          "description": "根据ID删除指定的角色信息.",
+          "type": "DELETE",
+          "path": "jaxrs/user/role/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "角色ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionGet",
+          "description": "根据论坛角色ID查询论角色信息.",
+          "type": "GET",
+          "path": "jaxrs/user/role/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "角色ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称"
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码"
+            },
+            {
+              "name": "roleType",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色类别:论坛角色|版块角色"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色说明"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作者姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAll",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionGetAll",
+          "description": "获取所有角色信息列表.",
+          "type": "GET",
+          "path": "jaxrs/user/role/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称"
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码"
+            },
+            {
+              "name": "roleType",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色类别:论坛角色|版块角色"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色说明"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作者姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listBindObjectByRoleCode",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionLisstBindObjectByRoleCode",
+          "description": "根据角色编码查询绑定的对象列表.",
+          "type": "PUT",
+          "path": "jaxrs/user/role/rolecode/selected",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "topUnitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "对象所属顶层组织名称"
+            },
+            {
+              "name": "unitName",
+              "type": "String",
+              "isCollection": false,
+              "description": "对象所属组织名称"
+            },
+            {
+              "name": "objectName",
+              "type": "String",
+              "isCollection": false,
+              "description": "对象名称:姓名,组织,群组名等等"
+            },
+            {
+              "name": "objectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "对象类别:人员|组织|群组"
+            },
+            {
+              "name": "uniqueId",
+              "type": "String",
+              "isCollection": false,
+              "description": "对象唯一标识"
+            },
+            {
+              "name": "roleId",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色Id"
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码"
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listByForum",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionListByForum",
+          "description": "根据论坛ID查询论坛的角色列表.",
+          "type": "PUT",
+          "path": "jaxrs/user/role/forum/{forumId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称"
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码"
+            },
+            {
+              "name": "roleType",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色类别:论坛角色|版块角色"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色说明"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作者姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listBySection",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionListBySection",
+          "description": "根据版块ID查询版块的角色列表.",
+          "type": "PUT",
+          "path": "jaxrs/user/role/section/{sectionId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称"
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码"
+            },
+            {
+              "name": "roleType",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色类别:论坛角色|版块角色"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色说明"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作者姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listSelectedRoleByUnit",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionListBySection",
+          "description": "根据组织名称查询角色列表.",
+          "type": "PUT",
+          "path": "jaxrs/user/role/unit/selected",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称"
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码"
+            },
+            {
+              "name": "roleType",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色类别:论坛角色|版块角色"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色说明"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作者姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listSelectedRoleByUser",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionListSelectedRoleByUser",
+          "description": "根据用户姓名查询角色列表.",
+          "type": "PUT",
+          "path": "jaxrs/user/role/user/selected",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称"
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码"
+            },
+            {
+              "name": "roleType",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色类别:论坛角色|版块角色"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色说明"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作者姓名"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.bbs.assemble.control.jaxrs.roleinfo.ActionSave",
+          "description": "创建新的角色信息或者更新角色信息.",
+          "type": "POST",
+          "path": "jaxrs/user/role",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID",
+              "isBaseType": true
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "roleName",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色名称",
+              "isBaseType": true
+            },
+            {
+              "name": "roleCode",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色代码",
+              "isBaseType": true
+            },
+            {
+              "name": "roleType",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色类别:论坛角色|版块角色",
+              "isBaseType": true
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "角色说明",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "操作者姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "SectionInfoAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.SectionInfoAction",
+      "description": "版块查询服务",
+      "methods": [
+        {
+          "name": "get",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionGet",
+          "description": "根据指定ID获取版块信息.",
+          "type": "GET",
+          "path": "jaxrs/section/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "版块信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "sectionVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "replyPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subjectPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subSections",
+              "type": "List\u003cWo\u003e",
+              "isCollection": true,
+              "description": "子版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "sectionLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块级别:主版块|子版块"
+            },
+            {
+              "name": "sectionDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块简介"
+            },
+            {
+              "name": "icon",
+              "type": "String",
+              "isCollection": false,
+              "description": "图标icon Base64编码后的文本."
+            },
+            {
+              "name": "sectionNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块公告"
+            },
+            {
+              "name": "sectionVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可发表范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可回复范围"
+            },
+            {
+              "name": "moderatorNames",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版主姓名:可多值,默认为创建者"
+            },
+            {
+              "name": "sectionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块类别:图片新闻,普通新闻,公告,经典(默认)"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻, 如果未填写, 则以分区配置为主"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,信息|问题|投票, 如果未填写,则以分区配置为主"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "subSectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建子版块:true|false"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "sectionStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listSubSectionByMainSectionId",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionListSubSectionByMainSectionId",
+          "description": "根据主版块ID查询所有的子版块信息列表.",
+          "type": "GET",
+          "path": "jaxrs/section/viewsub/{sectionId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "sectionId",
+              "type": "String",
+              "description": "主版块信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "sectionVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "replyPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subjectPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subSections",
+              "type": "List\u003cWo\u003e",
+              "isCollection": true,
+              "description": "子版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "sectionLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块级别:主版块|子版块"
+            },
+            {
+              "name": "sectionDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块简介"
+            },
+            {
+              "name": "icon",
+              "type": "String",
+              "isCollection": false,
+              "description": "图标icon Base64编码后的文本."
+            },
+            {
+              "name": "sectionNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块公告"
+            },
+            {
+              "name": "sectionVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可发表范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可回复范围"
+            },
+            {
+              "name": "moderatorNames",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版主姓名:可多值,默认为创建者"
+            },
+            {
+              "name": "sectionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块类别:图片新闻,普通新闻,公告,经典(默认)"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻, 如果未填写, 则以分区配置为主"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,信息|问题|投票, 如果未填写,则以分区配置为主"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "subSectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建子版块:true|false"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "sectionStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "viewWithForum",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionViewWithForum",
+          "description": "根据论坛ID获取所有版块的信息列表.",
+          "type": "GET",
+          "path": "jaxrs/section/viewforum/{forumId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "forumId",
+              "type": "String",
+              "description": "论坛信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "sectionLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块级别:主版块|子版块"
+            },
+            {
+              "name": "sectionDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块简介"
+            },
+            {
+              "name": "icon",
+              "type": "String",
+              "isCollection": false,
+              "description": "图标icon Base64编码后的文本."
+            },
+            {
+              "name": "sectionNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块公告"
+            },
+            {
+              "name": "sectionVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可发表范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可回复范围"
+            },
+            {
+              "name": "moderatorNames",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版主姓名:可多值,默认为创建者"
+            },
+            {
+              "name": "sectionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块类别:图片新闻,普通新闻,公告,经典(默认)"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻, 如果未填写, 则以分区配置为主"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,信息|问题|投票, 如果未填写,则以分区配置为主"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "subSectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建子版块:true|false"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "sectionStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "SectionInfoManagerUserAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.SectionInfoManagerUserAction",
+      "description": "版块管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionDelete",
+          "description": "根据ID删除指定的版块信息,如果版块里有贴子,则不允许删除.",
+          "type": "DELETE",
+          "path": "jaxrs/user/section/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "版块信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "deleteForce",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionDeleteForce",
+          "description": "根据ID删除指定的版块信息,如果版块里有贴子,则全部删除.",
+          "type": "DELETE",
+          "path": "jaxrs/user/section/force/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "版块信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "listAllSection",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionAllSections",
+          "description": "获取所有版块的信息列表.",
+          "type": "GET",
+          "path": "jaxrs/user/section/all",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "sectionVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "replyPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subjectPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subSections",
+              "type": "List\u003cWo\u003e",
+              "isCollection": true,
+              "description": "子版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "sectionLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块级别:主版块|子版块"
+            },
+            {
+              "name": "sectionDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块简介"
+            },
+            {
+              "name": "icon",
+              "type": "String",
+              "isCollection": false,
+              "description": "图标icon Base64编码后的文本."
+            },
+            {
+              "name": "sectionNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块公告"
+            },
+            {
+              "name": "sectionVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可发表范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可回复范围"
+            },
+            {
+              "name": "moderatorNames",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版主姓名:可多值,默认为创建者"
+            },
+            {
+              "name": "sectionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块类别:图片新闻,普通新闻,公告,经典(默认)"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻, 如果未填写, 则以分区配置为主"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,信息|问题|投票, 如果未填写,则以分区配置为主"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "subSectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建子版块:true|false"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "sectionStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listAllSubSectionByMainSectionId",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionAllListSubSectionByMainSectionId",
+          "description": "根据主版块ID查询所有的子版块信息列表(管理).",
+          "type": "GET",
+          "path": "jaxrs/user/section/sub/{sectionId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "sectionId",
+              "type": "String",
+              "description": "主版块信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "sectionVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "replyPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subjectPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subSections",
+              "type": "List\u003cWo\u003e",
+              "isCollection": true,
+              "description": "子版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "sectionLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块级别:主版块|子版块"
+            },
+            {
+              "name": "sectionDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块简介"
+            },
+            {
+              "name": "icon",
+              "type": "String",
+              "isCollection": false,
+              "description": "图标icon Base64编码后的文本."
+            },
+            {
+              "name": "sectionNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块公告"
+            },
+            {
+              "name": "sectionVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可发表范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可回复范围"
+            },
+            {
+              "name": "moderatorNames",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版主姓名:可多值,默认为创建者"
+            },
+            {
+              "name": "sectionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块类别:图片新闻,普通新闻,公告,经典(默认)"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻, 如果未填写, 则以分区配置为主"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,信息|问题|投票, 如果未填写,则以分区配置为主"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "subSectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建子版块:true|false"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "sectionStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listWithForum",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionListWithForum",
+          "description": "根据论坛ID获取所有主版块的信息列表(管理).",
+          "type": "GET",
+          "path": "jaxrs/user/section/forum/{forumId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "forumId",
+              "type": "String",
+              "description": "论坛信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "sectionVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "replyPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subjectPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数."
+            },
+            {
+              "name": "subSections",
+              "type": "List\u003cWo\u003e",
+              "isCollection": true,
+              "description": "子版块列表."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "sectionLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块级别:主版块|子版块"
+            },
+            {
+              "name": "sectionDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块简介"
+            },
+            {
+              "name": "icon",
+              "type": "String",
+              "isCollection": false,
+              "description": "图标icon Base64编码后的文本."
+            },
+            {
+              "name": "sectionNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块公告"
+            },
+            {
+              "name": "sectionVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块可见:所有人(默认)|根据权限"
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围"
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可发表范围"
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限"
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可回复范围"
+            },
+            {
+              "name": "moderatorNames",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版主姓名:可多值,默认为创建者"
+            },
+            {
+              "name": "sectionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块类别:图片新闻,普通新闻,公告,经典(默认)"
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻, 如果未填写, 则以分区配置为主"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,信息|问题|投票, 如果未填写,则以分区配置为主"
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false"
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false"
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false"
+            },
+            {
+              "name": "subSectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建子版块:true|false"
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量"
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "sectionStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false"
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知"
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false"
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "post",
+          "className": "com.x.bbs.assemble.control.jaxrs.sectioninfo.ActionSave",
+          "description": "创建新的版块信息或者更新版块信息.",
+          "type": "POST",
+          "path": "jaxrs/user/section",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "sectionVisibleResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数.",
+              "isBaseType": true
+            },
+            {
+              "name": "replyPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数.",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectPublishResult",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块访问权限列表,用于接收参数.",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID",
+              "isBaseType": true
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionLevel",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块级别:主版块|子版块",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionDescription",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块简介",
+              "isBaseType": true
+            },
+            {
+              "name": "icon",
+              "type": "String",
+              "isCollection": false,
+              "description": "图标icon Base64编码后的文本.",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionNotice",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块公告",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionVisible",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块可见:所有人(默认)|根据权限",
+              "isBaseType": true
+            },
+            {
+              "name": "visiblePermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可见范围",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块发贴权限:所有人(默认)|根据权限",
+              "isBaseType": true
+            },
+            {
+              "name": "publishPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可发表范围",
+              "isBaseType": true
+            },
+            {
+              "name": "replyPublishAble",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块回复权限:所有人(默认)|根据权限",
+              "isBaseType": true
+            },
+            {
+              "name": "replyPermissionList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块可回复范围",
+              "isBaseType": true
+            },
+            {
+              "name": "moderatorNames",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版主姓名:可多值,默认为创建者",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionType",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块类别:图片新闻,普通新闻,公告,经典(默认)",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectType",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块默认的主题分类名称,以|分隔,如讨论|新闻, 如果未填写, 则以分区配置为主",
+              "isBaseType": true
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛版块支持的主题类别名称,以|分隔,信息|问题|投票, 如果未填写,则以分区配置为主",
+              "isBaseType": true
+            },
+            {
+              "name": "indexRecommendable",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许推荐到首页:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主题需要审核:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "replyNeedAudit",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复需要审核:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "subSectionCreateAble",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "允许创建子版块:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数量",
+              "isBaseType": true
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日主题数量",
+              "isBaseType": true
+            },
+            {
+              "name": "replyTotalToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日回复数量",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块状态:启用|停用",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "replyMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "回复消息通知:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "replyMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "回复消息通知类别:一共3位,第1位是否通知论坛分区管理员,第2位是否通知版主,第3位是否通知发贴人,0-不通知|1-通知",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectMessageNotify",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "新主题发布消息通知:true|false",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectMessageNotifyType",
+              "type": "String",
+              "isCollection": false,
+              "description": "新主题发布消息通知类别:一共2位,第1位是否通知论坛分区管理员,第2位是否通知版主,0-不通知|1-通知",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "SubjectAttachmentAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.SubjectAttachmentAction",
+      "description": "主贴附件管理服务",
+      "methods": [
+        {
+          "name": "delete",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionAttachmentDelete",
+          "description": "根据ID删除BBSSubjectAttachment数据对象.",
+          "type": "DELETE",
+          "path": "jaxrs/subjectattach/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "附件信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "lastUpdateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最后更新时间"
+            },
+            {
+              "name": "storage",
+              "type": "String",
+              "isCollection": false,
+              "description": "关联的存储名称."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "name",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "isCollection": false,
+              "description": "服务器上编码后的文件名,为了方便辨识带扩展名"
+            },
+            {
+              "name": "fileHost",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储主机名"
+            },
+            {
+              "name": "filePath",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储路径"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件说明"
+            },
+            {
+              "name": "creatorUid",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者标识"
+            },
+            {
+              "name": "extension",
+              "type": "String",
+              "isCollection": false,
+              "description": "扩展名"
+            },
+            {
+              "name": "length",
+              "type": "Long",
+              "isCollection": false,
+              "description": "文件大小."
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "isCollection": false,
+              "description": "附件框分类."
+            },
+            {
+              "name": "deepPath",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否使用更深的路径."
+            },
+            {
+              "name": "distributeFactor",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "分布式存储标识位."
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "sequence",
+              "type": "String",
+              "isCollection": false,
+              "description": "列表序号,由创建时间以及ID组成.在保存时自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionAttachmentGet",
+          "description": "根据指定ID获取附件信息.",
+          "type": "GET",
+          "path": "jaxrs/subjectattach/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "附件信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "lastUpdateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最后更新时间"
+            },
+            {
+              "name": "storage",
+              "type": "String",
+              "isCollection": false,
+              "description": "关联的存储名称."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "name",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "isCollection": false,
+              "description": "服务器上编码后的文件名,为了方便辨识带扩展名"
+            },
+            {
+              "name": "fileHost",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储主机名"
+            },
+            {
+              "name": "filePath",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储路径"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件说明"
+            },
+            {
+              "name": "creatorUid",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者标识"
+            },
+            {
+              "name": "extension",
+              "type": "String",
+              "isCollection": false,
+              "description": "扩展名"
+            },
+            {
+              "name": "length",
+              "type": "Long",
+              "isCollection": false,
+              "description": "文件大小."
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "isCollection": false,
+              "description": "附件框分类."
+            },
+            {
+              "name": "deepPath",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否使用更深的路径."
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "imageToBase64",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionImageToBase64",
+          "description": "将图片附件转为base64编码.",
+          "type": "GET",
+          "path": "jaxrs/subjectattach/{id}/binary/base64/{size}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "图片文件ID"
+            },
+            {
+              "name": "size",
+              "type": "String",
+              "description": "最大高宽值"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "listBySubjectId",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionAttachmentListBySubjectId",
+          "description": "根据主题ID获取BBSSubjectAttachment列表.",
+          "type": "GET",
+          "path": "jaxrs/subjectattach/list/subject/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "lastUpdateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最后更新时间"
+            },
+            {
+              "name": "storage",
+              "type": "String",
+              "isCollection": false,
+              "description": "关联的存储名称."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "name",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件真实名称"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "isCollection": false,
+              "description": "服务器上编码后的文件名,为了方便辨识带扩展名"
+            },
+            {
+              "name": "fileHost",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储主机名"
+            },
+            {
+              "name": "filePath",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件存储路径"
+            },
+            {
+              "name": "description",
+              "type": "String",
+              "isCollection": false,
+              "description": "文件说明"
+            },
+            {
+              "name": "creatorUid",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者标识"
+            },
+            {
+              "name": "extension",
+              "type": "String",
+              "isCollection": false,
+              "description": "扩展名"
+            },
+            {
+              "name": "length",
+              "type": "Long",
+              "isCollection": false,
+              "description": "文件大小."
+            },
+            {
+              "name": "site",
+              "type": "String",
+              "isCollection": false,
+              "description": "附件框分类."
+            },
+            {
+              "name": "deepPath",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否使用更深的路径."
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "SubjectInfoAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.SubjectInfoAction",
+      "description": "主贴查询服务",
+      "methods": [
+        {
+          "name": "listCreamedSubjectForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListCreamedForPages",
+          "description": "列示根据过滤条件的精华主题列表.",
+          "type": "PUT",
+          "path": "jaxrs/subject/creamed/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "显示页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "bBSIndexSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "screamSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "originalSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listRecommendedSubjectForBBSIndex",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListRecommendedForBBSIndex",
+          "description": "获取所有推荐到BBS首页的主题列表.",
+          "type": "GET",
+          "path": "jaxrs/subject/recommended/index/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "查询的最大条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "bBSIndexSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "screamSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "originalSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listRecommendedSubjectForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListRecommendedForPages",
+          "description": "列示根据过滤条件的推荐主题列表.",
+          "type": "PUT",
+          "path": "jaxrs/subject/recommended/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "展示页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "bBSIndexSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "screamSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "originalSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listSubjectForBBSIndex",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListForBBSIndex",
+          "description": "列示根据过滤条件的SubjectInfo,为首页准备的服务.",
+          "type": "PUT",
+          "path": "jaxrs/subject/index/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "显示页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "voteOptionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "投标选项ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子所属论坛ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子所属主版块ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子所属版块ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "searchContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "搜索内容.",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者名称.",
+              "isBaseType": true
+            },
+            {
+              "name": "needPicture",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否只查询有大图的贴子.",
+              "isBaseType": true
+            },
+            {
+              "name": "withTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否包含置顶贴.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "ID"
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "发贴用户"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            }
+          ]
+        },
+        {
+          "name": "listSubjectForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListForPage",
+          "description": "列示根据过滤条件的SubjectInfo,下一页.",
+          "type": "PUT",
+          "path": "jaxrs/subject/filter/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "显示页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "voteOptionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "投标选项ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子所属论坛ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子所属主版块ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "贴子所属版块ID.",
+              "isBaseType": true
+            },
+            {
+              "name": "searchContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "搜索内容.",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建者名称.",
+              "isBaseType": true
+            },
+            {
+              "name": "needPicture",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否只查询有大图的贴子.",
+              "isBaseType": true
+            },
+            {
+              "name": "withTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否包含置顶贴.",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "bBSIndexSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "screamSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "originalSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listTopSubject",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListTop",
+          "description": "获取所有可以取到的置顶贴列表.",
+          "type": "GET",
+          "path": "jaxrs/subject/top/{sectionId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "sectionId",
+              "type": "String",
+              "description": "版块信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "bBSIndexSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "screamSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "originalSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "searchSubjectForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectSearchForPage",
+          "description": "列示根据过滤条件的SubjectInfo,下一页.",
+          "type": "PUT",
+          "path": "jaxrs/subject/search/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "显示页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "viewSubject",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectView",
+          "description": "根据指定ID查看主贴具体信息,需要记录查询次数和热度的.",
+          "type": "GET",
+          "path": "jaxrs/subject/view/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        }
+      ]
+    },
+    {
+      "name": "SubjectInfoManagerUserAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.SubjectInfoManagerUserAction",
+      "description": "主贴管理服务",
+      "methods": [
+        {
+          "name": "acceptReply",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectAcceptReply",
+          "description": "问题贴采纳回复",
+          "type": "GET",
+          "path": "jaxrs/user/subject/acceptreply/{id}/{replyId}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            },
+            {
+              "name": "replyId",
+              "type": "String",
+              "description": "回帖信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "changeSection",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectChangeSection",
+          "description": "将指定ID的主贴转移到其他的版块中.",
+          "type": "PUT",
+          "path": "jaxrs/user/subject/change/section",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "subjectIds",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "需要变更版块的贴子Id列表",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "目标版块ID",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "successList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块变更成功的贴子ID列表"
+            },
+            {
+              "name": "failtureList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "版块变更失败的贴子ID列表"
+            },
+            {
+              "name": "total",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "需要变更版块的贴子总数"
+            }
+          ]
+        },
+        {
+          "name": "complete",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectCompleted",
+          "description": "完成主题: 属性isCompleted \u003d true",
+          "type": "GET",
+          "path": "jaxrs/user/subject/complete/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "delete",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectDelete",
+          "description": "根据ID删除指定的主题信息.",
+          "type": "DELETE",
+          "path": "jaxrs/user/subject/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "get",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectGet",
+          "description": "根据指定ID获取主题具体信息.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "bBSIndexSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "screamSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "originalSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listMySubjectForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectListMyForPage",
+          "description": "列示我发布的主题.",
+          "type": "PUT",
+          "path": "jaxrs/user/subject/my/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": true,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "显示页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "voteOptionGroupList",
+              "type": "List\u003cWoBBSVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票主题的所有投票选项列表."
+            },
+            {
+              "name": "latestReplyUserShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "bBSIndexSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "screamSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "originalSetterNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "creatorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "auditorNameShort",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "voted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "当前用户是否已经投票过."
+            },
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称"
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID"
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题"
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置"
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票"
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要"
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间"
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户"
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID"
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量"
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量"
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度"
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴"
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页"
+            },
+            {
+              "name": "bBSIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页推荐人姓名"
+            },
+            {
+              "name": "bBSIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "首页推荐时间"
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页"
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名"
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间"
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶"
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶"
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶"
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶"
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题"
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题"
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备"
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复"
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名"
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间"
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题"
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名"
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间"
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题"
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名"
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间"
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名"
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过"
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名"
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的"
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间"
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见"
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表"
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等"
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称"
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "listVoteRecordForPage",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionVoteRecordListMyForPage",
+          "description": "列示投票记录.",
+          "type": "PUT",
+          "path": "jaxrs/user/subject/voterecord/list/page/{page}/count/{count}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "page",
+              "type": "Integer",
+              "description": "显示页码"
+            },
+            {
+              "name": "count",
+              "type": "Integer",
+              "description": "每页显示条目数量"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID"
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID"
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID"
+            },
+            {
+              "name": "subjectId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题ID"
+            },
+            {
+              "name": "optionGroupId",
+              "type": "String",
+              "isCollection": false,
+              "description": "选项组ID"
+            },
+            {
+              "name": "optionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "用户投票结果选择项Id"
+            },
+            {
+              "name": "optionValue",
+              "type": "String",
+              "isCollection": false,
+              "description": "用户投票结果选择项,对应选择项属性optionValue"
+            },
+            {
+              "name": "votorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "投票人"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        },
+        {
+          "name": "lock",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectLock",
+          "description": "锁定主题: 状态修改为\u0027已锁定\u0027, 属性stopReply \u003d true",
+          "type": "GET",
+          "path": "jaxrs/user/subject/lock/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "nonCream",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectNonCream",
+          "description": "取消精华主题.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/nonCream/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "nonOriginal",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectNonOriginal",
+          "description": "取消原创主题.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/nonOriginal/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "nonRecommendToBBSIndex",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectNonRecommendToBBSIndex",
+          "description": "取消推荐到BBS首页.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/nonRecommendToBBSIndex/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "nonTopToBBS",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectNonTopToBBS",
+          "description": "取消全局置顶.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/nonTopToBBS/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "nonTopToForum",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectNonTopToForum",
+          "description": "取消论坛置顶.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/nonTopToForum/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "nonTopToMainSection",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectNonTopToMainSection",
+          "description": "取消主版块置顶",
+          "type": "GET",
+          "path": "jaxrs/user/subject/nonTopToMainSection/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "nonTopToSection",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectNonTopToSection",
+          "description": "取消版块置顶",
+          "type": "GET",
+          "path": "jaxrs/user/subject/nonTopToSection/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "save",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectSave",
+          "description": "创建新的主题信息或者更新主题信息.",
+          "type": "POST",
+          "path": "jaxrs/user/subject",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "optionGroups",
+              "type": "List\u003cWiVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票选项组集合",
+              "isBaseType": false
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID",
+              "isBaseType": true
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID",
+              "isBaseType": true
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题",
+              "isBaseType": true
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置",
+              "isBaseType": true
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票",
+              "isBaseType": true
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要",
+              "isBaseType": true
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间",
+              "isBaseType": true
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户",
+              "isBaseType": true
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID",
+              "isBaseType": true
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量",
+              "isBaseType": true
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量",
+              "isBaseType": true
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度",
+              "isBaseType": true
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页",
+              "isBaseType": true
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间",
+              "isBaseType": true
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题",
+              "isBaseType": true
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题",
+              "isBaseType": true
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备",
+              "isBaseType": true
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复",
+              "isBaseType": true
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间",
+              "isBaseType": true
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题",
+              "isBaseType": true
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间",
+              "isBaseType": true
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过",
+              "isBaseType": true
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的",
+              "isBaseType": true
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间",
+              "isBaseType": true
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见",
+              "isBaseType": true
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表",
+              "isBaseType": true
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等",
+              "isBaseType": true
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称",
+              "isBaseType": true
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "setCream",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectSetCream",
+          "description": "设置为精华主题.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/setCream/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "setOriginal",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectSetOriginal",
+          "description": "设置为原创主题.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/setOriginal/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "setRecommendToBBSIndex",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectSetRecommendToBBSIndex",
+          "description": "推荐到BBS首页.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/setRecommendToBBSIndex/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "topToBBS",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectTopToBBS",
+          "description": "全局置顶.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/topToBBS/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "topToForum",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectTopToForum",
+          "description": "论坛置顶",
+          "type": "GET",
+          "path": "jaxrs/user/subject/topToForum/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "topToMainSection",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectTopToMainSection",
+          "description": "主版块置顶",
+          "type": "GET",
+          "path": "jaxrs/user/subject/topToMainSection/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "topToSection",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectTopToMainSection",
+          "description": "版块置顶",
+          "type": "GET",
+          "path": "jaxrs/user/subject/topToSection/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "unAcceptReply",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectUnAcceptReply",
+          "description": "取消问题贴采纳回复",
+          "type": "GET",
+          "path": "jaxrs/user/subject/unacceptreply/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "unComplete",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectUnComplete",
+          "description": "取消完成主题: 属性isCompleted \u003d false.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/uncomplete/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "unlock",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectUnLock",
+          "description": "锁定主题: 状态修改为\u0027启用\u0027, 属性stopReply \u003d false.",
+          "type": "GET",
+          "path": "jaxrs/user/subject/unlock/{id}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "id",
+              "type": "String",
+              "description": "主贴信息ID"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        },
+        {
+          "name": "voteSubmit",
+          "className": "com.x.bbs.assemble.control.jaxrs.subjectinfo.ActionSubjectSubmitVoteResult",
+          "description": "提交投票信息.",
+          "type": "PUT",
+          "path": "jaxrs/user/subject/vote/submit",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [
+            {
+              "name": "optionGroups",
+              "type": "List\u003cWiVoteOptionGroup\u003e",
+              "isCollection": true,
+              "description": "投票选项组集合",
+              "isBaseType": false
+            },
+            {
+              "name": "forumId",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛ID",
+              "isBaseType": true
+            },
+            {
+              "name": "forumName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛名称",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "sectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionId",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块ID",
+              "isBaseType": true
+            },
+            {
+              "name": "mainSectionName",
+              "type": "String",
+              "isCollection": false,
+              "description": "主版块名称",
+              "isBaseType": true
+            },
+            {
+              "name": "picId",
+              "type": "String",
+              "isCollection": false,
+              "description": "首页图片ID",
+              "isBaseType": true
+            },
+            {
+              "name": "title",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题名称:标题",
+              "isBaseType": true
+            },
+            {
+              "name": "type",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题类别:讨论,新闻等等,根据版块设置",
+              "isBaseType": true
+            },
+            {
+              "name": "typeCategory",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题的类别,不同的类别有不同的操作:信息|问题|投票",
+              "isBaseType": true
+            },
+            {
+              "name": "summary",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题摘要",
+              "isBaseType": true
+            },
+            {
+              "name": "latestReplyTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最新回复时间",
+              "isBaseType": true
+            },
+            {
+              "name": "latestReplyUser",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复用户",
+              "isBaseType": true
+            },
+            {
+              "name": "latestReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "最新回复ID",
+              "isBaseType": true
+            },
+            {
+              "name": "replyTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数量",
+              "isBaseType": true
+            },
+            {
+              "name": "viewTotal",
+              "type": "Long",
+              "isCollection": false,
+              "description": "查看数量",
+              "isBaseType": true
+            },
+            {
+              "name": "hot",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题热度",
+              "isBaseType": true
+            },
+            {
+              "name": "stopReply",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "禁止回贴",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendToBBSIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到系统首页",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendToForumIndex",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "推荐到论坛首页",
+              "isBaseType": true
+            },
+            {
+              "name": "forumIndexSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "论坛推荐人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "forumIndexSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "论坛推荐时间",
+              "isBaseType": true
+            },
+            {
+              "name": "topToSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版块置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "topToMainSection",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "主版块置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "topToForum",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "论坛置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "topToBBS",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "全局置顶",
+              "isBaseType": true
+            },
+            {
+              "name": "isTopSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否为置顶主题",
+              "isBaseType": true
+            },
+            {
+              "name": "isCreamSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "精华主题",
+              "isBaseType": true
+            },
+            {
+              "name": "isCompleted",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "是否已解决:为问题贴准备",
+              "isBaseType": true
+            },
+            {
+              "name": "acceptReplyId",
+              "type": "String",
+              "isCollection": false,
+              "description": "采纳的回复ID:为问题贴准备,问题贴可以采纳一个回复",
+              "isBaseType": true
+            },
+            {
+              "name": "screamSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "精华设置人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "screamSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "精华设置时间",
+              "isBaseType": true
+            },
+            {
+              "name": "isOriginalSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "原创主题",
+              "isBaseType": true
+            },
+            {
+              "name": "originalSetterName",
+              "type": "String",
+              "isCollection": false,
+              "description": "原创设置人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "originalSetterTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "原创设置时间",
+              "isBaseType": true
+            },
+            {
+              "name": "isRecommendSubject",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "版主推荐主题",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "推荐人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "recommendTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "推荐时间",
+              "isBaseType": true
+            },
+            {
+              "name": "creatorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "创建人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectAuditStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题审核状态:无审核|待审核|审核通过",
+              "isBaseType": true
+            },
+            {
+              "name": "auditorName",
+              "type": "String",
+              "isCollection": false,
+              "description": "审核人姓名",
+              "isBaseType": true
+            },
+            {
+              "name": "subjectStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "主题状态:启用|关闭|锁定    锁定后是不允许任何人修改和回复的",
+              "isBaseType": true
+            },
+            {
+              "name": "voteLimitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "投票截止时间",
+              "isBaseType": true
+            },
+            {
+              "name": "voteResultVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票结果是否可见",
+              "isBaseType": true
+            },
+            {
+              "name": "votePersonVisible",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "投票人信息是否可见",
+              "isBaseType": true
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号",
+              "isBaseType": true
+            },
+            {
+              "name": "attachmentList",
+              "type": "List\u003cString\u003e",
+              "isCollection": true,
+              "description": "附件列表",
+              "isBaseType": true
+            },
+            {
+              "name": "machineName",
+              "type": "String",
+              "isCollection": false,
+              "description": "设备类别:手机|平板电脑|个人电脑等",
+              "isBaseType": true
+            },
+            {
+              "name": "systemType",
+              "type": "String",
+              "isCollection": false,
+              "description": "系统名称",
+              "isBaseType": true
+            },
+            {
+              "name": "hostIp",
+              "type": "String",
+              "isCollection": false,
+              "description": "IP地址",
+              "isBaseType": true
+            }
+          ],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "id"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "SysResourceAction",
+      "className": "com.x.base.core.project.jaxrs.sysresource.SysResourceAction",
+      "description": "系统资源",
+      "methods": [
+        {
+          "name": "listResource",
+          "className": "com.x.base.core.project.jaxrs.sysresource.ActionListResource",
+          "description": "获取静态资源信息.",
+          "type": "GET",
+          "path": "jaxrs/sysresource/filePath/{filePath}",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [
+            {
+              "name": "filePath",
+              "type": "String",
+              "description": "查找路径(根路径:(0))"
+            }
+          ],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": []
+        },
+        {
+          "name": "uploadResource",
+          "className": "com.x.base.core.project.jaxrs.sysresource.ActionUploadResource",
+          "description": "上传静态资源(仅上传到当前服务器)",
+          "type": "POST",
+          "path": "jaxrs/sysresource/upload/resource/as/new/{asNew}",
+          "contentType": "multipart/form-data",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": true,
+          "pathParameters": [
+            {
+              "name": "asNew",
+              "type": "Boolean",
+              "description": "覆盖类型:true删除原文件然后上传,false覆盖原文件"
+            }
+          ],
+          "formParameters": [
+            {
+              "name": "file",
+              "type": "File",
+              "description": "上传文件"
+            },
+            {
+              "name": "fileName",
+              "type": "String",
+              "description": "附件名称"
+            },
+            {
+              "name": "filePath",
+              "type": "String",
+              "description": "附件存放目录(可以为空)"
+            }
+          ],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "value",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "布尔值."
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "name": "UserInfoAction",
+      "className": "com.x.bbs.assemble.control.jaxrs.userinfo.UserInfoAction",
+      "description": "论坛用户信息查询服务",
+      "methods": [
+        {
+          "name": "filterUserInfo",
+          "className": "com.x.bbs.assemble.control.jaxrs.userinfo.ActionFilterUserInfo",
+          "description": "列示根据过滤条件的论坛用户信息.",
+          "type": "PUT",
+          "path": "jaxrs/userinfo",
+          "contentType": "application/json",
+          "resultContentType": "application/json; charset\u003dUTF-8",
+          "useJsonElementParameter": false,
+          "useStringParameter": false,
+          "pathParameters": [],
+          "formParameters": [],
+          "queryParameters": [],
+          "ins": [],
+          "outs": [
+            {
+              "name": "id",
+              "type": "String",
+              "isCollection": false,
+              "description": "数据库主键,自动生成."
+            },
+            {
+              "name": "userName",
+              "type": "String",
+              "isCollection": false,
+              "description": "用户标识"
+            },
+            {
+              "name": "nickName",
+              "type": "String",
+              "isCollection": false,
+              "description": "昵称"
+            },
+            {
+              "name": "sex",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "性别:0-女 1-男"
+            },
+            {
+              "name": "cardId",
+              "type": "String",
+              "isCollection": false,
+              "description": "身份证号"
+            },
+            {
+              "name": "mobile",
+              "type": "String",
+              "isCollection": false,
+              "description": "移动电话"
+            },
+            {
+              "name": "credit",
+              "type": "Long",
+              "isCollection": false,
+              "description": "积分"
+            },
+            {
+              "name": "subjectCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "主题数"
+            },
+            {
+              "name": "subjectCountToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日发表主题数"
+            },
+            {
+              "name": "replyCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "回复数"
+            },
+            {
+              "name": "replyCountToday",
+              "type": "Long",
+              "isCollection": false,
+              "description": "今日发表回复数"
+            },
+            {
+              "name": "creamCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "精华贴数"
+            },
+            {
+              "name": "originalCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "原创贴数"
+            },
+            {
+              "name": "popularity",
+              "type": "Long",
+              "isCollection": false,
+              "description": "人气"
+            },
+            {
+              "name": "fansCount",
+              "type": "Long",
+              "isCollection": false,
+              "description": "粉丝数"
+            },
+            {
+              "name": "signContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "签名内容"
+            },
+            {
+              "name": "permissionContent",
+              "type": "String",
+              "isCollection": false,
+              "description": "权限角色内容"
+            },
+            {
+              "name": "online",
+              "type": "Boolean",
+              "isCollection": false,
+              "description": "在线状态"
+            },
+            {
+              "name": "lastVisitTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "上次访问时间"
+            },
+            {
+              "name": "lastOperationTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "最近一次操作时间"
+            },
+            {
+              "name": "userStatus",
+              "type": "String",
+              "isCollection": false,
+              "description": "用户状态:启用|停用"
+            },
+            {
+              "name": "orderNumber",
+              "type": "Integer",
+              "isCollection": false,
+              "description": "排序号"
+            },
+            {
+              "name": "createTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "创建时间,自动生成,索引创建在约束中."
+            },
+            {
+              "name": "updateTime",
+              "type": "Date",
+              "isCollection": false,
+              "description": "修改时间,自动生成,索引创建在约束中."
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 894 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/common/date/DateOperation.java

@@ -0,0 +1,894 @@
+package com.x.bbs.assemble.common.date;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+/**
+ * 
+ * @项目名 :OKR
+ * @包  名 :com.x.okr.assemble.common.date
+ * @文件名 :DateOperation.java
+ * @作  者 :李  义
+ * @单  位 :浙江兰德纵横网络技术股份有限公司
+ * @日  期 :2016-06-07
+ */
+public class DateOperation {
+	
+	private static  Logger logger =  LoggerFactory.getLogger( DateOperation.class);
+	/**
+	 * 根据样式得到格式化对象SimpleDateFormat
+	 * @param date
+	 * @param style
+	 * @return
+	 */
+	public String getDate(Date date, String style) {
+		SimpleDateFormat format = new SimpleDateFormat(style);
+		return format.format(date);
+	}
+
+	/**
+	 * 得到某日期的日期部分
+	 * 
+	 * @param date
+	 * @return yyyy-MM-dd
+	 */
+	public String getDate(Date date) {
+		return format1.format(date);
+	}
+
+	/**
+	 * 得到某日期的时间部分
+	 * 
+	 * @param date
+	 * @return HH:mm:ss
+	 */
+	public  String getTime(Date date) {
+		return format2.format(date);
+	}
+
+	public  Date getDateFromString(String dateString, String style) throws Exception{
+		Date date = null;
+		if(style==null||"".equals(style.trim())){
+			date = format1.parse(dateString);
+		}else if( "yyyy-MM-dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			date = format3.parse(dateString);
+		}else if( "yyyy-MM-dd HH:mm".equalsIgnoreCase(style.trim())){
+			date = format3_2.parse(dateString);
+		}else if( "yyyy/MM/dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			date = format3_1.parse(dateString);
+		}else if( "yyyy/MM/dd".equalsIgnoreCase(style.trim())){
+			date = format4.parse(dateString);
+		}else if( "yyyy-MM-dd".equalsIgnoreCase(style.trim())){
+			date = format1.parse(dateString);
+		}else if( "yyyyMMdd".equalsIgnoreCase(style.trim())){
+			date = format5.parse(dateString);
+		}else if( "yyyyMMddHHmmss".equalsIgnoreCase(style.trim())){
+			date = format7.parse(dateString);
+		}else if( "HH:mm:ss".equalsIgnoreCase(style.trim())){
+			date = format2.parse(dateString);
+		}else if( "HH:mm".equalsIgnoreCase(style.trim())){
+			date = format2_1.parse(dateString);
+		}else{
+			throw new Exception( "对不起,您输入的日期style系统无法识别,请检查您的参数输入!" );
+		}
+		return date;
+	}
+	
+	/**
+	 * 将字符串转换为日期格式
+	 * 会尝试多种格式转换,转换成功后返回结果
+	 * @param dateString
+	 * @return
+	 * @throws Exception
+	 */
+	public  Date getDateFromString( String dateString ) throws Exception{
+		Date date = null;
+		try{
+			date = getDateFromString( dateString, "yyyy-MM-dd HH:mm:ss" );
+			return date;
+		}catch(Exception e){}
+
+		try{
+			date = getDateFromString( dateString, "yyyy-MM-dd HH:mm" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyy/MM/dd HH:mm:ss" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyy-MM-dd" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyy/MM/dd" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyyMMdd" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "yyyyMMddHHmmss" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "HH:mm:ss" );
+			return date;
+		}catch(Exception e){}
+		
+		try{
+			date = getDateFromString( dateString, "HH:mm" );
+			return date;
+		}catch(Exception e){}
+		
+		throw new Exception( "the style of date has error, date:" + dateString );
+	}
+	
+	
+	public  String getDateStringFromDate(Date date, String style) throws Exception{
+		String dateString = null;
+		if(style==null||"".equals(style.trim())){
+			dateString = format1.format(date);
+		}else if( "yyyy-MM-dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			dateString = format3.format(date);
+		}else if( "yyyy/MM/dd HH:mm:ss".equalsIgnoreCase(style.trim())){
+			dateString = format3_1.format(date);
+		}else if( "yyyy/MM/dd".equalsIgnoreCase(style.trim())){
+			dateString = format4.format(date);
+		}else if( "yyyy-MM-dd".equalsIgnoreCase(style.trim())){
+			dateString = format1.format(date);
+		}else if( "yyyyMMdd".equalsIgnoreCase(style.trim())){
+			dateString = format5.format(date);
+		}else if( "yyyyMMddHHmmss".equalsIgnoreCase(style.trim())){
+			dateString = format7.format(date);
+		}else if( "HH:mm:ss".equalsIgnoreCase(style.trim())){
+			dateString = format2.format(date);
+		}else{
+			throw new Exception( "对不起,您输入的日期style系统无法识别,请检查您的参数输入!style=" + style);
+		}
+		return dateString;
+	}
+	
+	/**
+	 * 得到某日期加上或减去天数后的日期,day为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd"
+	 * @throws Exception 
+	 */
+	public  String getDayAdd(String dateString, int day, String style) throws Exception {
+		Date date = getDateFromString(dateString, style);
+		return getDayAdd(date, day);
+	}
+	
+	/**
+	 * 得到某日期加上或减去天数后的日期,day为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd"
+	 */
+	public  String getDayAdd(Date date, int day) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.add(Calendar.DATE, day);
+		return format1.format(calendar.getTime());
+	}
+
+	/**
+	 * 得到某日期加上或减去月份后的日期,month为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd"
+	 */
+	public  String getMonthAdd(Date date, int month) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.add(Calendar.MONTH, month);
+		return format1.format(calendar.getTime());
+	}
+	
+	/**
+	 * 得到某日期加上或减去分钟后的日期,min为负数时减去
+	 * 
+	 * @param date
+	 * @param month
+	 * @return "yyyy-MM-dd HH:mi:ss"
+	 */
+	public  String getMinutesAdd(Date date, int min) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.add(Calendar.MINUTE, min);
+		return format3.format(calendar.getTime());
+	}
+	/**
+	 * 得到某日期的日
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getDay(Date date) {
+		try{
+			return format10.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	public int getDayNumber(Date date) {
+		String result = null;
+		try{
+			result = format10.format(date);
+		}catch(Exception e){
+			result = "0";
+		}
+		return Integer.parseInt(result);
+	}
+	/**
+	 * 得到某日期的月份
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getMonth(Date date) {
+		try{
+			return format9.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	public int getMonthNumber(Date date) {
+		String result = null;
+		try{
+			result = format9.format(date);
+		}catch(Exception e){
+			result = "0";
+		}
+		return Integer.parseInt(result);
+	}
+
+	/**
+	 * 得到某日期的年份
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getYear(Date date) {
+		try{
+			return format8.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	public int getYearNumber(Date date) {
+		String result = null;
+		try{
+			result = format8.format(date);
+		}catch(Exception e){
+			result = "0";
+		}
+		return Integer.parseInt(result);
+	}
+	/**
+	 * 得到某日期的小时
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getHour(Date date) {
+		try{
+			return format11.format(date);
+		}catch(Exception e){
+			return "0";
+		}
+	}
+	/**
+	 * 得到某日期的分钟
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getMinites(Date date) {
+		return format12.format(date);
+	}
+	/**
+	 * 得到某日期的秒
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 */
+	public  String getSeconds(Date date) {
+		return format13.format(date);
+	}
+	/**
+	 * 得到某年有多少天
+	 * 
+	 * @param String
+	 *            date "yyyy-MM-dd"
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForYear(String date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format1.parse(date));
+		return calendar.get(calendar.DAY_OF_YEAR);
+	}
+
+	/**
+	 * 得到某年有多少天
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForYear(Date date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		return calendar.get(calendar.DAY_OF_YEAR);
+	}
+
+	/**
+	 * 得到某年有多少天
+	 * 
+	 * @param String
+	 *            year "yyyy"
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForYear_YYYY(String year) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format8.parse(year));
+		return calendar.get(calendar.DAY_OF_YEAR);
+	}
+
+	/**
+	 * 得到某月有多少天
+	 * 
+	 * @param String
+	 *            date "yyyy-MM-dd"
+	 * @return
+	 * @throws ParseException
+	 */
+	public  int getDaysForMonth(String date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format1.parse(date));
+		return calendar.getActualMaximum( Calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 得到某月有多少天
+	 * 
+	 * @param String
+	 *            date "yyyy-MM"
+	 * @return
+	 * @throws ParseException
+	 */
+	@SuppressWarnings("static-access")
+	public  int getDaysForMonth_MM(String date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(format14.parse(date));
+		return calendar.get(calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 得到某月有多少天
+	 * 
+	 * @param Date
+	 *            date
+	 * @return
+	 * @throws ParseException
+	 */
+	public  int getDaysForMonth(Date date) throws ParseException {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		return calendar.get(Calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 得到当前的日期
+	 * 
+	 * @return
+	 */
+	public  String getNowDate() {
+		return format1.format(new Date());
+	}
+
+	/**
+	 * 得到当前的时间
+	 * 
+	 * @return
+	 */
+	public  String getNowTime() {
+		return format2.format(new Date());
+	}
+	/**
+	 * 得到当前的时间
+	 * yyyyMMddHHmmss
+	 * @return
+	 */
+	public  String getNowTimeChar() {
+		return format7.format(new Date());
+	}
+	/**
+	 * 得到当前的时间
+	 * yyyy-MM-dd HH:mm:ss
+	 * @return
+	 */
+	public  String getNowDateTime() {
+		return format3.format(new Date());
+	}
+	/**
+	 * 得到两个时间之前的分差
+	 * @param date1 yyyy-MM-dd HH:mm:ss
+	 * @param date2 yyyy-MM-dd HH:mm:ss
+	 * @return
+	 */
+	public  long getDeff(String date1,String date2) {
+		long dayNumber = 0;
+		// 1小时=60分钟=3600秒=3600000
+		long mins = 60L * 1000L;
+		// long day= 24L * 60L * 60L * 1000L;计算天数之差
+		SimpleDateFormat df = null;
+		if(date1.length() == 19){
+			df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
+		}else if(date1.length() == 10){
+			df = new SimpleDateFormat( "yyyy-MM-dd" );
+		}else if(date1.length() == 8){
+			df = new SimpleDateFormat( "HH:mm:ss" );
+		}else{
+			df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
+		}
+		try {
+			java.util.Date d1 = df.parse(date1);
+			java.util.Date d2 = df.parse(date2);
+			dayNumber = (d2.getTime() - d1.getTime()) / mins;
+		} catch (Exception e) {
+			logger.warn( "系统获取得到两个时间之前的分差发生异常");
+			logger.error(e);
+		}
+		return dayNumber;
+	}
+	/**
+	 * 得到两个时间之前的分差
+	 * @param date1 yyyy-MM-dd HH:mm:ss
+	 * @param date2 yyyy-MM-dd HH:mm:ss
+	 * @return
+	 */
+	public long getDeff(Date date1,Date date2) {
+		long dayNumber = 0;
+		// 1小时=60分钟=3600秒=3600000
+		long mins = 60L * 1000L;
+		// long day= 24L * 60L * 60L * 1000L;计算天数之差
+		try {
+			dayNumber = (date2.getTime() - date1.getTime()) / mins;
+		} catch (Exception e) {
+			logger.warn( "系统获取得到两个时间之前的分差发生异常");
+			logger.error(e);
+		}
+		return dayNumber;
+	}
+	/**
+	 * 
+	 * 日期格式转换
+	 * 从YYYY-MM-DD转换到YYYYMMDD
+	 * @param date
+	 * @throws ParseException 
+	 */
+	public  String changeDateFormat(String dateString){
+		Date date;
+		String reslut = null;
+		try {
+			if( "".equals(dateString)){
+				dateString="0000-00-00";
+			}
+			date = format1.parse(dateString);
+			reslut = format5.format(date);
+		} catch (ParseException e) {
+			try {
+				date = format1.parse( "0000-00-00" );
+			} catch (ParseException e1) {
+				logger.warn( "系统日期格式转换发生异常" );
+				logger.error(e);
+			}
+			logger.warn( "系统日期格式转换发生异常");
+			logger.error(e);
+		}
+		
+		return reslut;
+	}
+	
+	/** 格式 yyyy-MM-dd */
+	public  final SimpleDateFormat format1 = new SimpleDateFormat( "yyyy-MM-dd" );
+	/** 格式 HH:mm:ss */
+	public  final SimpleDateFormat format2 = new SimpleDateFormat( "HH:mm:ss" );
+	public  final SimpleDateFormat format2_1 = new SimpleDateFormat( "HH:mm" );
+	/** 格式 yyyy-MM-dd HH:mm:ss */
+	public  final SimpleDateFormat format3 = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
+	public  final SimpleDateFormat format3_2 = new SimpleDateFormat( "yyyy-MM-dd HH:mm" );
+	public  final SimpleDateFormat format3_1 = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" );
+	/** 格式 yyyy/MM/dd */
+	public  final SimpleDateFormat format4 = new SimpleDateFormat( "yyyy/MM/dd" );
+	/** 格式 yyyyMMdd */
+	public  final SimpleDateFormat format5 = new SimpleDateFormat( "yyyyMMdd" );
+	/** 格式 HHmmss */
+	public  final SimpleDateFormat format6 = new SimpleDateFormat( "HHmmss" );
+	/** 格式 yyyyMMddHHmmss */
+	public  final SimpleDateFormat format7 = new SimpleDateFormat( "yyyyMMddHHmmss" );
+	/** 格式 yyyy */
+	public  final SimpleDateFormat format8 = new SimpleDateFormat( "yyyy" );
+	/** 格式 MM */
+	public  final SimpleDateFormat format9 = new SimpleDateFormat( "MM" );
+	/** 格式 dd */
+	public  final SimpleDateFormat format10 = new SimpleDateFormat( "dd" );
+	/** 格式 HH */
+	public  final SimpleDateFormat format11 = new SimpleDateFormat( "HH" );
+	/** 格式 mm */
+	public  final SimpleDateFormat format12 = new SimpleDateFormat( "mm" );
+	/** 格式 ss */
+	public  final SimpleDateFormat format13 = new SimpleDateFormat( "ss" );
+	/** 格式 ss */
+	public  final SimpleDateFormat format14 = new SimpleDateFormat( "yyyy-MM" );
+	
+	
+	public  String getStartOfWeek(String dateString){
+		SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd" );
+		try {
+			Date date = format.parse(dateString);
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(date);
+			cal.setFirstDayOfWeek(Calendar.MONDAY);
+			int tmp = cal.get(Calendar.DAY_OF_WEEK) - 1;
+			if (0 == tmp) {
+				tmp = 7;
+			}
+			cal.add(Calendar.DATE, -(tmp-1));
+			return getDateStringFromDate(cal.getTime(), "yyyy-MM-dd" ) + " 00:00:00";
+		} catch (ParseException e) {
+			logger.warn( "系统getStartOfWeek日期格式转换发生异常");
+			logger.error(e);
+		} catch (Exception e) {
+			logger.warn( "系统getStartOfWeek发生异常");
+			logger.error(e);
+		}
+		return null;
+	}
+	
+	public  String getEndOfWeek(String dateString){
+		try {
+			Date date = getDateFromString(getStartOfWeek(dateString), "yyyy-MM-dd HH:mm:ss" );
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(date);
+			cal.setFirstDayOfWeek(Calendar.MONDAY);
+			cal.add(Calendar.DATE, 6);
+			return getDateStringFromDate(cal.getTime(), "yyyy-MM-dd" ) + " 23:59:59";
+		} catch (ParseException e) {
+			logger.warn( "系统getEndOfWeek日期格式转换发生异常");
+			logger.error(e);
+		} catch (Exception e) {
+			logger.warn( "系统getEndOfWeek发生异常");
+			logger.error(e);
+		}
+		return null;
+	}
+	
+	
+	
+	/**
+	 * 将时间格式转换为 **月**日**时**分的格式
+	 * @param dateString
+	 * @param style
+	 * @return
+	 * @throws Exception
+	 */
+	public String getDateCNString( String dateString, String style ) throws Exception{
+		StringBuffer ch_date_string = new StringBuffer();
+		Date _date = null;
+		try{
+			_date = getDateFromString( dateString, style );
+		}catch(Exception e){
+			logger.warn( "系统getDateCNString日期格式转换发生异常");
+			logger.error(e);
+		}
+		if(_date == null ){
+			_date = new Date();
+		}
+		String year = getYear( _date );
+		String month = getMonth( _date );
+		String day = getDay( _date );
+		String hour = getHour( _date );
+		String min = getMinites( _date );
+		ch_date_string.append( year );
+		ch_date_string.append( "年" );
+		ch_date_string.append( month );
+		ch_date_string.append( "月" );
+		ch_date_string.append( day );
+		ch_date_string.append( "日" );
+		ch_date_string.append( hour );
+		ch_date_string.append( "时" );
+		ch_date_string.append( min );
+		ch_date_string.append( "分" );		
+		return ch_date_string.toString();
+	}
+	
+	/**
+	 * 将时间格式转换为 **月**日**时**分**秒 的格式
+	 * @param dateString
+	 * @param style
+	 * @return
+	 * @throws Exception
+	 */
+	public String getDateCNString2( String dateString, String style ) throws Exception{
+		StringBuffer ch_date_string = new StringBuffer();
+		Date _date = null;
+		try{
+			_date = getDateFromString( dateString, style );
+		}catch(Exception e){
+			logger.warn( "系统getDateCNString2日期格式转换发生异常");
+			logger.error(e);
+		}
+		if(_date == null ){
+			_date = new Date();
+		}
+		String year = getYear( _date );
+		String month = getMonth( _date );
+		String day = getDay( _date );
+		String hour = getHour( _date );
+		String min = getMinites( _date );
+		String sec = getSeconds( _date );
+		ch_date_string.append( year );
+		ch_date_string.append( "年" );
+		ch_date_string.append( month );
+		ch_date_string.append( "月" );
+		ch_date_string.append( day );
+		ch_date_string.append( "日" );
+		ch_date_string.append( hour );
+		ch_date_string.append( "时" );
+		ch_date_string.append( min );
+		ch_date_string.append( "分" );
+		ch_date_string.append( sec );
+		ch_date_string.append( "秒" );
+		return ch_date_string.toString();
+	}
+	
+	/**
+	 * 获取日期在一年中的周数
+	 * 结果从1开始
+	 * @param dateString yyyy-mm-dd
+	 * @return
+	 */
+	public  int getWeekNumOfYear( String dateString ){
+		try {
+			Date date = getDateFromString( dateString , "yyyy-MM-dd" );
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(date);
+			cal.setFirstDayOfWeek(2);//设置每周的第一天是星期一
+			return cal.get( Calendar.WEEK_OF_YEAR );
+		} catch (ParseException e) {
+			logger.warn( "系统getWeekNumOfYear日期格式转换发生异常");
+			logger.error(e);
+		} catch (Exception e) {
+			logger.warn( "系统getWeekNumOfYear发生异常");
+			logger.error(e);
+		}
+		return -1;
+	}
+	
+	/**
+	 * 获取日期在一年中的周数
+	 * 结果从1开始
+	 * @param dateString yyyy-mm-dd
+	 * @return
+	 */
+	public  int getWeekNumOfYear( Date date ){
+		try {
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(date);
+			cal.setFirstDayOfWeek(2);//设置每周的第一天是星期一
+			return cal.get( Calendar.WEEK_OF_YEAR );
+		} catch (Exception e) {
+			logger.warn( "系统getWeekNumOfYear发生异常");
+			logger.error(e);
+		}
+		return -1;
+	}
+	
+	/**
+	 * 判断是否周末
+	 * @param recordDate
+	 * @return
+	 */
+	public boolean isWeekend(Date date) {
+		Calendar cal = Calendar.getInstance();
+	    cal.setTime( date );
+	    if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
+	       return true;
+	    }
+		return false;
+	}
+	
+	public long getMinutes( Date date1, Date data2){
+		 long l=data2.getTime()-date1.getTime();
+		 long min=((l/(60*1000)));
+		 return min;
+	}
+
+	/**
+	 * 根据提供的年份月份,获取当月所有的日期字符串:yyyy-mm-dd
+	 * @param s_year
+	 * @param _month
+	 * @return
+	 */
+	public List<String> getDateStringFormMonth(String s_year, String _month) {
+		List<String> result = new ArrayList<String>();
+		Calendar cal = Calendar.getInstance();
+		int year = 0;
+		int month = 0;
+		int days = 0;
+		try{
+			year = Integer.parseInt( s_year );
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		try{
+			month = Integer.parseInt( _month );
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		cal.set(year, month-1, 1);
+		days = cal.getActualMaximum(Calendar.DATE);
+		for( int i =1; i<= days ; i++){
+			result.add( s_year + "-" + (month<10?"0"+month:month) + "-" + (i<10?"0"+i:i));
+		}
+		return result;
+	}
+	
+	/**
+	 * 根据提供的两个时间之间所有的日期字符串:yyyy-mm-dd
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 * @throws Exception 
+	 */
+	public List<String> listDateStringBetweenDate( Date startDate, Date endDate ) throws Exception {		
+		List<String> result = new ArrayList<String>();
+		Calendar cal = Calendar.getInstance();
+		startDate = getDateFromString( getDateStringFromDate( startDate, "yyyy-MM-dd" ) );
+		endDate = getDateFromString( getDateStringFromDate( endDate, "yyyy-MM-dd" ) + " 23:59:59" );	
+		cal.setTime( startDate );
+		while( cal.getTime().before(endDate)){
+			//logger.debug( getDateStringFromDate( cal.getTime(), "yyyy-MM-dd" ) );
+			result.add( getDateStringFromDate( cal.getTime(), "yyyy-MM-dd" ));
+			cal.add(Calendar.DATE, 1);
+		}
+		return result;
+	}
+	
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate
+	 * @return
+	 * @throws Exception 
+	 */
+	public Date getFirstDateInMonth(Date recordDate) throws Exception {
+		String year = format8.format(recordDate);
+		String month = format9.format(recordDate);
+		return getDateFromString( year + "-" + month + "-01" );
+	}
+	
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate yyyy-MM-dd
+	 * @return
+	 * @throws Exception 
+	 */
+	public String getFirstDateStringInMonth(Date recordDate) throws Exception {
+		String year = format8.format(recordDate);
+		String month = format9.format(recordDate);
+		return year + "-" + month + "-01";
+	}
+	
+	/**
+	 * 获取当月的最后一日
+	 * @param date
+	 * @return
+	 */
+	public static Date getLastDayOfMonth(Date date) {  
+        Calendar calendar = convert(date);  
+        calendar.set(Calendar.DATE, calendar.getMaximum(Calendar.DATE));  
+        return calendar.getTime();  
+    }  
+	/** 
+     * 将日期转换为日历 
+     * @param date 日期 
+     * @return 日历 
+     */  
+    private static Calendar convert(Date date) {  
+        Calendar calendar = Calendar.getInstance();  
+        calendar.setTime(date);  
+        return calendar;  
+    }  
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate
+	 * @return
+	 * @throws Exception 
+	 */
+	public Date getLastDateInMonth(Date recordDate) throws Exception {
+		Date lastDate = getLastDayOfMonth(recordDate);
+		return getDateFromString( getDateStringFromDate( lastDate, "yyyy-MM-dd" ) );
+	}
+	
+	/**
+	 * 获取日期所在月份的第一天
+	 * @param recordDate yyyy-MM-dd
+	 * @return
+	 * @throws Exception 
+	 */
+	public String getLastDateStringInMonth(Date recordDate) throws Exception {
+		Date lastDate = getLastDayOfMonth(recordDate);
+		return getDateStringFromDate( lastDate, "yyyy-MM-dd" );
+	}
+
+	/**
+	 * 获取今天开始的时间
+	 * @return
+	 */
+	public Date getTodayStartTime() {
+		String todayDateTime = getNowDate() + " 00:00:00";
+		try {
+			return getDateFromString( todayDateTime );
+		} catch (Exception e) {
+			return new Date();
+		}
+	}
+	
+	/**
+	 * 获取今天结束的时间
+	 * @return
+	 */
+	public Date getTodayEndTime() {
+		String todayDateTime = getNowDate() + " 23:59:59";
+		try {
+			return getDateFromString( todayDateTime );
+		} catch (Exception e) {
+			return new Date();
+		}
+	}
+
+	public boolean isTheSameDate( Date today, Date createTime ) {
+		if( today == null || createTime == null ){
+			return false;
+		}
+		String date1 = getDate( today, "yyyy-MM-dd" );
+		String date2 = getDate( createTime, "yyyy-MM-dd" );
+		if( date1.equalsIgnoreCase( date2 )){
+			return true;
+		}
+		return false;
+	}
+}

+ 24 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/AbstractFactory.java

@@ -0,0 +1,24 @@
+package com.x.bbs.assemble.control;
+
+import com.x.base.core.container.EntityManagerContainer;
+
+public abstract class AbstractFactory {
+
+	private Business business;
+
+	public AbstractFactory( Business business ) throws Exception {
+		try {
+			if ( null == business ) {
+				throw new Exception( "business can not be null.  " );
+			}
+			this.business = business;
+		} catch ( Exception e ) {
+			throw new Exception( "can not instantiating factory." );
+		}
+	}
+
+	public EntityManagerContainer entityManagerContainer() throws Exception {
+		return this.business.entityManagerContainer();
+	}
+
+}

+ 33 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/ApplicationServletContextListener.java

@@ -0,0 +1,33 @@
+package com.x.bbs.assemble.control;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+
+import com.x.base.core.project.Context;
+
+@WebListener
+public class ApplicationServletContextListener implements ServletContextListener {
+
+	@Override
+	public void contextInitialized(ServletContextEvent servletContextEvent) {
+		try {
+			ThisApplication.context = Context.concrete(servletContextEvent);
+			ThisApplication.init();
+			ThisApplication.context().regist();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void contextDestroyed(ServletContextEvent servletContextEvent) {
+		try {
+			ThisApplication.destroy();
+			ThisApplication.context.destrory(servletContextEvent);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}

+ 163 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/Business.java

@@ -0,0 +1,163 @@
+package com.x.bbs.assemble.control;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.bbs.assemble.control.factory.BBSConfigSettingFactory;
+import com.x.bbs.assemble.control.factory.BBSForumInfoFactory;
+import com.x.bbs.assemble.control.factory.BBSOperationRecordFactory;
+import com.x.bbs.assemble.control.factory.BBSPermissionInfoFactory;
+import com.x.bbs.assemble.control.factory.BBSPermissionRoleFactory;
+import com.x.bbs.assemble.control.factory.BBSReplyInfoFactory;
+import com.x.bbs.assemble.control.factory.BBSRoleInfoFactory;
+import com.x.bbs.assemble.control.factory.BBSSectionInfoFactory;
+import com.x.bbs.assemble.control.factory.BBSSubjectAttachmentFactory;
+import com.x.bbs.assemble.control.factory.BBSSubjectInfoFactory;
+import com.x.bbs.assemble.control.factory.BBSSubjectVoteResultFactory;
+import com.x.bbs.assemble.control.factory.BBSUserInfoFactory;
+import com.x.bbs.assemble.control.factory.BBSUserRoleFactory;
+import com.x.bbs.assemble.control.factory.BBSVoteOptionFactory;
+import com.x.bbs.assemble.control.factory.BBSVoteRecordFactory;
+import com.x.organization.core.express.Organization;
+
+public class Business {
+
+	private EntityManagerContainer emc;
+
+	public Business(EntityManagerContainer emc) throws Exception {
+		this.emc = emc;
+	}
+
+	public EntityManagerContainer entityManagerContainer() {
+		return this.emc;
+	}
+
+	private Organization organization;
+	private BBSForumInfoFactory forumInfoFactory;
+	private BBSSectionInfoFactory sectionInfoFactory;
+	private BBSSubjectInfoFactory subjectInfoFactory;
+	private BBSVoteOptionFactory voteOptionFactory;
+	private BBSSubjectVoteResultFactory subjectVoteResultFactory;
+	private BBSVoteRecordFactory voteRecordFactory;
+	private BBSReplyInfoFactory replyInfoFactory;
+	private BBSSubjectAttachmentFactory subjectAttachmentFactory;
+	private BBSOperationRecordFactory operationRecordFactory;
+
+	private BBSUserInfoFactory userInfoFactory;
+	private BBSRoleInfoFactory roleInfoFactory;
+	private BBSPermissionInfoFactory permissionInfoFactory;
+	private BBSPermissionRoleFactory permissionRoleFactory;
+	private BBSUserRoleFactory userRoleFactory;
+
+	private BBSConfigSettingFactory configSettingFactory;
+
+	public Organization organization() throws Exception {
+		if (null == this.organization) {
+			this.organization = new Organization(ThisApplication.context());
+		}
+		return organization;
+	}
+
+	public BBSVoteRecordFactory voteRecordFactory() throws Exception {
+		if (null == this.voteRecordFactory) {
+			this.voteRecordFactory = new BBSVoteRecordFactory(this);
+		}
+		return voteRecordFactory;
+	}
+
+	public BBSSubjectVoteResultFactory subjectVoteResultFactory() throws Exception {
+		if (null == this.subjectVoteResultFactory) {
+			this.subjectVoteResultFactory = new BBSSubjectVoteResultFactory(this);
+		}
+		return subjectVoteResultFactory;
+	}
+
+	public BBSVoteOptionFactory voteOptionFactory() throws Exception {
+		if (null == this.voteOptionFactory) {
+			this.voteOptionFactory = new BBSVoteOptionFactory(this);
+		}
+		return voteOptionFactory;
+	}
+
+	public BBSConfigSettingFactory configSettingFactory() throws Exception {
+		if (null == this.configSettingFactory) {
+			this.configSettingFactory = new BBSConfigSettingFactory(this);
+		}
+		return configSettingFactory;
+	}
+
+	public BBSSubjectAttachmentFactory subjectAttachmentFactory() throws Exception {
+		if (null == this.subjectAttachmentFactory) {
+			this.subjectAttachmentFactory = new BBSSubjectAttachmentFactory(this);
+		}
+		return subjectAttachmentFactory;
+	}
+
+	public BBSUserInfoFactory userInfoFactory() throws Exception {
+		if (null == this.userInfoFactory) {
+			this.userInfoFactory = new BBSUserInfoFactory(this);
+		}
+		return userInfoFactory;
+	}
+
+	public BBSRoleInfoFactory roleInfoFactory() throws Exception {
+		if (null == this.roleInfoFactory) {
+			this.roleInfoFactory = new BBSRoleInfoFactory(this);
+		}
+		return roleInfoFactory;
+	}
+
+	public BBSPermissionInfoFactory permissionInfoFactory() throws Exception {
+		if (null == this.permissionInfoFactory) {
+			this.permissionInfoFactory = new BBSPermissionInfoFactory(this);
+		}
+		return permissionInfoFactory;
+	}
+
+	public BBSPermissionRoleFactory permissionRoleFactory() throws Exception {
+		if (null == this.permissionRoleFactory) {
+			this.permissionRoleFactory = new BBSPermissionRoleFactory(this);
+		}
+		return permissionRoleFactory;
+	}
+
+	public BBSUserRoleFactory userRoleFactory() throws Exception {
+		if (null == this.userRoleFactory) {
+			this.userRoleFactory = new BBSUserRoleFactory(this);
+		}
+		return userRoleFactory;
+	}
+
+	public BBSForumInfoFactory forumInfoFactory() throws Exception {
+		if (null == this.forumInfoFactory) {
+			this.forumInfoFactory = new BBSForumInfoFactory(this);
+		}
+		return forumInfoFactory;
+	}
+
+	public BBSSectionInfoFactory sectionInfoFactory() throws Exception {
+		if (null == this.sectionInfoFactory) {
+			this.sectionInfoFactory = new BBSSectionInfoFactory(this);
+		}
+		return sectionInfoFactory;
+	}
+
+	public BBSSubjectInfoFactory subjectInfoFactory() throws Exception {
+		if (null == this.subjectInfoFactory) {
+			this.subjectInfoFactory = new BBSSubjectInfoFactory(this);
+		}
+		return subjectInfoFactory;
+	}
+
+	public BBSReplyInfoFactory replyInfoFactory() throws Exception {
+		if (null == this.replyInfoFactory) {
+			this.replyInfoFactory = new BBSReplyInfoFactory(this);
+		}
+		return replyInfoFactory;
+	}
+
+	public BBSOperationRecordFactory operationRecordFactory() throws Exception {
+		if (null == this.operationRecordFactory) {
+			this.operationRecordFactory = new BBSOperationRecordFactory(this);
+		}
+		return operationRecordFactory;
+	}
+}

+ 102 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/MessageFactory.java

@@ -0,0 +1,102 @@
+package com.x.bbs.assemble.control;
+
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.message.MessageConnector;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.queue.MessageWo;
+import org.apache.commons.lang3.StringUtils;
+import java.util.List;
+
+public class MessageFactory {
+
+	private static Logger logger = LoggerFactory.getLogger( MessageFactory.class );
+
+	/**
+	 * 新的回复,通知相关管理员
+	 * @param persons
+	 * @param messageWo
+	 * @throws Exception
+	 */
+	public static void notifyManager_forNewReply(List<String> persons, MessageWo messageWo ) throws Exception {
+		if(ListTools.isNotEmpty( persons )){
+			for( String person : persons ){
+				notifyManager_forNewReply( person, messageWo );
+			}
+		}
+	}
+
+	/**
+	 * 新的回复,通知主题创建者
+	 * @param persons
+	 * @param messageWo
+	 * @throws Exception
+	 */
+	public static void notifySubjectCreator_forNewReply(List<String> persons, MessageWo messageWo ) throws Exception {
+		if(ListTools.isNotEmpty( persons )){
+			for( String person : persons ){
+				notifySubjectCreator_forNewReply( person, messageWo );
+			}
+
+		}
+	}
+
+	/**
+	 * 新的回复,通知相关管理员
+	 * @param person
+	 * @param messageWo
+	 * @throws Exception
+	 */
+	public static void notifyManager_forNewReply( String person, MessageWo messageWo ) throws Exception {
+		if(StringUtils.isNotEmpty( person ) ){
+			String personName = StringUtils.isNotEmpty( messageWo.getCreatePerson() )?"":messageWo.getCreatePerson().split("@")[0];
+			String title = personName + "发表了新的回复:" + messageWo.getTitle();
+			logger.debug("bbs send notification:new reply for subject [" +  messageWo.getTitle() + "], target:" + person );
+			MessageConnector.send( MessageConnector.TYPE_BBS_REPLYCREATE,  title, person, messageWo );
+		}
+	}
+
+	/**
+	 * 新的回复,通知主题创建者
+	 * @param person
+	 * @param messageWo
+	 * @throws Exception
+	 */
+	public static void notifySubjectCreator_forNewReply( String person, MessageWo messageWo ) throws Exception {
+		if(StringUtils.isNotEmpty( person ) ){
+			String personName = StringUtils.isNotEmpty( messageWo.getCreatePerson() )?"":messageWo.getCreatePerson().split("@")[0];
+			String title = personName + "回复了您发表的主题:" + messageWo.getTitle();
+			logger.debug("bbs send notification:new reply for subject [" +  messageWo.getTitle() + "], target:" + person );
+			MessageConnector.send( MessageConnector.TYPE_BBS_REPLYCREATE,  title, person, messageWo );
+		}
+	}
+
+	/**
+	 * 新的主题发表,通知相关管理员
+	 * @param persons
+	 * @param messageWo
+	 * @throws Exception
+	 */
+	public static void notifyManager_forNewSubject(List<String> persons, MessageWo messageWo ) throws Exception {
+		if(ListTools.isNotEmpty( persons )){
+			for( String person : persons ){
+				notifyManager_forNewSubject( person, messageWo );
+			}
+		}
+	}
+
+	/**
+	 * 新的主题发表,通知相关管理员
+	 * @param person
+	 * @param messageWo
+	 * @throws Exception
+	 */
+	public static void notifyManager_forNewSubject( String person, MessageWo messageWo ) throws Exception {
+		if(StringUtils.isNotEmpty( person ) ){
+			String personName = StringUtils.isNotEmpty( messageWo.getCreatePerson() )?"":messageWo.getCreatePerson().split("@")[0];
+			String title = personName + "发表了新的主题:" + messageWo.getTitle();
+			logger.debug("bbs send notification:new reply for subject [" +  messageWo.getTitle() + "], target:" + person );
+			MessageConnector.send( MessageConnector.TYPE_BBS_SUBJECTCREATE,  title, person, messageWo );
+		}
+	}
+}

+ 153 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/ThisApplication.java

@@ -0,0 +1,153 @@
+package com.x.bbs.assemble.control;
+
+import java.util.List;
+
+import com.x.base.core.project.Context;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.message.MessageConnector;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.queue.QueueNewReplyNotify;
+import com.x.bbs.assemble.control.queue.QueueNewSubjectNotify;
+import com.x.bbs.assemble.control.schedule.SubjectReplyTotalStatisticTask;
+import com.x.bbs.assemble.control.schedule.SubjectTotalStatisticTask;
+import com.x.bbs.assemble.control.schedule.UserSubjectReplyPermissionStatisticTask;
+import com.x.bbs.assemble.control.service.BBSConfigSettingService;
+import com.x.bbs.assemble.control.service.BBSForumInfoServiceAdv;
+import com.x.bbs.assemble.control.service.BBSPermissionInfoService;
+import com.x.bbs.assemble.control.service.BBSRoleInfoService;
+import com.x.bbs.assemble.control.service.BBSSectionInfoServiceAdv;
+import com.x.bbs.assemble.control.service.UserManagerService;
+import com.x.bbs.entity.BBSForumInfo;
+import com.x.bbs.entity.BBSSectionInfo;
+
+public class ThisApplication {
+	
+	protected static Context context;
+	public static final String BBSMANAGER = "BBSManager@CMSManagerSystemRole@R";
+	public static QueueNewReplyNotify queueNewReplyNotify;
+	public static QueueNewSubjectNotify queueNewSubjectNotify;
+
+	public static Context context() {
+		return context;
+	}
+
+	public static void init() throws Exception {
+		try {
+			initAllSystemConfig();
+			queueNewReplyNotify = new QueueNewReplyNotify();
+			queueNewSubjectNotify = new QueueNewSubjectNotify();
+
+			MessageConnector.start(context());
+
+			context().startQueue( queueNewReplyNotify );
+			context().startQueue( queueNewSubjectNotify );
+
+			context.schedule( SubjectTotalStatisticTask.class, "0 10 * * * ?");
+			context.schedule( SubjectReplyTotalStatisticTask.class, "0 40 * * * ?");
+			context.schedule( UserSubjectReplyPermissionStatisticTask.class, "0 0/30 * * * ?");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public static void destroy() {
+		try {
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public static String getRoleAndPermissionCacheKey( String personName ) {
+		return "RoleAndPermission.withPerson." + personName;
+	}
+	
+	private static void initAllSystemConfig() {
+		BBSPermissionInfoService permissionInfoService = new BBSPermissionInfoService();
+		BBSRoleInfoService roleInfoService = new BBSRoleInfoService();
+		BBSForumInfoServiceAdv forumInfoServiceAdv = new BBSForumInfoServiceAdv();
+		BBSSectionInfoServiceAdv sectionInfoServiceAdv = new BBSSectionInfoServiceAdv();
+		BBSConfigSettingService configSettingService = new BBSConfigSettingService();
+		List<BBSForumInfo> forumInfoList = null;
+		List<BBSSectionInfo> sectionInfoList = null;
+
+		try {
+			configSettingService.initAllSystemConfig();
+		} catch (Exception e) {
+			LoggerFactory.getLogger(ThisApplication.class)
+					.warn("BBS system check all config setting got an exception.");
+			LoggerFactory.getLogger(ThisApplication.class).error(e);
+		}
+
+		try {
+			forumInfoList = forumInfoServiceAdv.listAll();
+			if (forumInfoList != null) {
+				for (BBSForumInfo forumInfo : forumInfoList) {
+					permissionInfoService.createForumPermission(forumInfo);
+					roleInfoService.createForumRole( null, forumInfo);
+				}
+			}
+		} catch (Exception e) {
+			LoggerFactory.getLogger(ThisApplication.class)
+					.warn("BBS system check all forum permission and role got an exception.");
+			LoggerFactory.getLogger(ThisApplication.class).error(e);
+		}
+
+		try {
+			sectionInfoList = sectionInfoServiceAdv.listAll();
+			if (sectionInfoList != null) {
+				for (BBSSectionInfo sectionInfo : sectionInfoList) {
+					permissionInfoService.createSectionPermission(sectionInfo);
+					roleInfoService.createSectionRole( "System", sectionInfo);
+				}
+			}
+		} catch (Exception e) {
+			LoggerFactory.getLogger(ThisApplication.class)
+					.warn("BBS system check all section permission and role got an exception.");
+			LoggerFactory.getLogger(ThisApplication.class).error(e);
+		}
+	}
+	
+	/**
+	 * 判断用户是否有BBS系统管理权限
+	 * 1、系统管理员Manager或者xadmin
+	 * 2、拥有BBSManager角色的人员
+	 * @param effectivePerson
+	 * @return
+	 */
+	public static Boolean isBBSManager( EffectivePerson effectivePerson ) {
+		UserManagerService userManagerService = new UserManagerService();
+		try {
+			if ( userManagerService.isHasPlatformRole( effectivePerson.getDistinguishedName(), ThisApplication.BBSMANAGER  )
+				|| effectivePerson.isManager()) {
+				return true;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+	
+	/**
+	 * 判断用户是否有权限对指定的论坛进行管理
+	 * 1、系统管理员、BBS管理员
+	 * 2、指定论坛设置的管理员
+	 * @param effectivePerson
+	 * @param forumInfo
+	 * @return
+	 */
+	public static Boolean isForumManager( EffectivePerson effectivePerson, BBSForumInfo forumInfo ) {
+		if( isBBSManager( effectivePerson ) ) {
+			return true;
+		}
+		if ( forumInfo != null && ListTools.isNotEmpty( forumInfo.getForumManagerList() ) ) {
+			for (String name : forumInfo.getForumManagerList()) {
+				if ( effectivePerson.getDistinguishedName().equals( name ) ) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+	
+}

+ 93 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSConfigSettingFactory.java

@@ -0,0 +1,93 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSConfigSetting;
+import com.x.bbs.entity.BBSConfigSetting_;
+
+
+/**
+ * 类   名:BBSConfigSettingFactory<br/>
+ * 实体类:BBSConfigSetting<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSConfigSettingFactory extends AbstractFactory {
+
+	public BBSConfigSettingFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSConfigSetting实体信息对象" )
+	public BBSConfigSetting get( String id ) throws Exception {
+		return this.entityManagerContainer().find(id, BBSConfigSetting.class, ExceptionWhen.none);
+	}
+	
+	//@MethodDescribe( "列示全部的BBSConfigSetting实体信息列表" )
+	@SuppressWarnings("unused")
+	public List<BBSConfigSetting> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSConfigSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSConfigSetting> cq = cb.createQuery(BBSConfigSetting.class);
+		Root<BBSConfigSetting> root = cq.from( BBSConfigSetting.class);
+		return em.createQuery(cq).getResultList();
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSConfigSetting实体信息列表" )
+	public List<BBSConfigSetting> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSConfigSetting>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSConfigSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSConfigSetting> cq = cb.createQuery(BBSConfigSetting.class);
+		Root<BBSConfigSetting> root = cq.from(BBSConfigSetting.class);
+		Predicate p = root.get(BBSConfigSetting_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe( "根据指定的配置编码获取配置的值" )
+	public String getValueWithConfigCode(String configCode) throws Exception {
+		if( configCode == null || configCode.isEmpty() ){
+			throw new Exception( "config code is null, can not find any system setting!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSConfigSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSConfigSetting> root = cq.from(BBSConfigSetting.class);
+		Predicate p = cb.equal( root.get( BBSConfigSetting_.configCode ), configCode );
+		cq.select(root.get(BBSConfigSetting_.configValue));
+		List<String> valueList = em.createQuery(cq.where(p)).getResultList();
+		if( valueList != null && valueList.size() > 0 ){
+			return valueList.get(0);
+		}
+		return null;
+	}
+
+	public BBSConfigSetting getWithConfigCode(String configCode) throws Exception {
+		if( configCode == null || configCode.isEmpty() ){
+			throw new Exception( "config code is null, can not find any system setting!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSConfigSetting.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSConfigSetting> cq = cb.createQuery(BBSConfigSetting.class);
+		Root<BBSConfigSetting> root = cq.from(BBSConfigSetting.class);
+		Predicate p = cb.equal( root.get( BBSConfigSetting_.configCode ), configCode );
+		List<BBSConfigSetting> valueList = em.createQuery(cq.where(p)).getResultList();
+		if( valueList != null && valueList.size() > 0 ){
+			return valueList.get(0);
+		}
+		return null;
+	}
+}

+ 96 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSForumInfoFactory.java

@@ -0,0 +1,96 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSForumInfo;
+import com.x.bbs.entity.BBSForumInfo_;
+
+/**
+ * 类   名:BBSForumInfoFactory<br/>
+ * 实体类:BBSForumInfo<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-08-10 17:17:26
+**/
+public class BBSForumInfoFactory extends AbstractFactory {
+
+	public BBSForumInfoFactory(Business business) throws Exception {
+		super(business);
+	}
+
+	//@MethodDescribe( "获取指定Id的BBSForumInfo实体信息对象" )
+	public BBSForumInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSForumInfo.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSForumInfo实体信息列表" )
+	public List<BBSForumInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSForumInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSForumInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSForumInfo> cq = cb.createQuery(BBSForumInfo.class);
+		Root<BBSForumInfo> root = cq.from(BBSForumInfo.class);
+		Predicate p = root.get(BBSForumInfo_.id).in(ids);
+		cq.orderBy( cb.asc( root.get( BBSForumInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( 1000 ).getResultList();
+	}
+	
+	//@MethodDescribe( "列示全部的BBSForumInfo实体信息列表" )
+	public List<BBSForumInfo> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSForumInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSForumInfo> cq = cb.createQuery(BBSForumInfo.class);
+		Root<BBSForumInfo> root = cq.from(BBSForumInfo.class);
+		cq.orderBy( cb.asc( root.get( BBSForumInfo_.orderNumber ) ) );
+		return em.createQuery( cq ).setMaxResults( 1000 ).getResultList();
+	}
+	
+	//@MethodDescribe( "根据用户权限列示全部的BBSForumInfo实体信息列表" )
+	public List<BBSForumInfo> listAllViewAbleForumWithMyPermission( List<String> viewAbleForumIds ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSForumInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSForumInfo> cq = cb.createQuery(BBSForumInfo.class);
+		Root<BBSForumInfo> root = cq.from(BBSForumInfo.class);
+		Predicate p = cb.equal( root.get( BBSForumInfo_.forumVisible ), "所有人" );
+		if( viewAbleForumIds != null && !viewAbleForumIds.isEmpty() ){
+			p = cb.or( p, root.get( BBSForumInfo_.id ).in( viewAbleForumIds ) );
+		}
+		cq.orderBy( cb.asc( root.get( BBSForumInfo_.orderNumber ) ) );
+		return em.createQuery( cq.where(p) ).setMaxResults( 1000 ).getResultList();
+	}
+	
+//	@MethodDescribe( "列示全部可见性为所有人的BBSForumInfo实体信息ID列表" )
+	public List<String> listAllPublicForumIds() throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSForumInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSForumInfo> root = cq.from(BBSForumInfo.class);
+		Predicate p = cb.equal( root.get(BBSForumInfo_.forumStatus ), "启用" );
+		p = cb.and( p, cb.equal( root.get(BBSForumInfo_.forumVisible ), "所有人" ) );
+		cq.select( root.get( BBSForumInfo_.id ) );
+		return em.createQuery( cq.where(p) ).setMaxResults( 1000 ).getResultList();
+	}
+
+	//@MethodDescribe( "列示已经启用的BBSForumInfo实体信息ID列表" )
+	public List<BBSForumInfo> listAllOpenForumInfo() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSForumInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSForumInfo> cq = cb.createQuery(BBSForumInfo.class);
+		Root<BBSForumInfo> root = cq.from(BBSForumInfo.class);
+		Predicate p = cb.equal( root.get(BBSForumInfo_.forumStatus ), "启用" );
+		cq.orderBy( cb.asc( root.get( BBSForumInfo_.orderNumber ) ) );
+		return em.createQuery( cq.where(p) ).setMaxResults( 1000 ).getResultList();
+	}
+}

+ 59 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSOperationRecordFactory.java

@@ -0,0 +1,59 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSOperationRecord;
+import com.x.bbs.entity.BBSOperationRecord_;
+
+/**
+ * 类   名:BBSOperationRecordFactory<br/>
+ * 实体类:BBSOperationRecord<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSOperationRecordFactory extends AbstractFactory {
+
+	public BBSOperationRecordFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSOperationRecord实体信息对象" )
+	public BBSOperationRecord get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSOperationRecord.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSOperationRecord实体信息列表" )
+	public List<BBSOperationRecord> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSOperationRecord>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSOperationRecord.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSOperationRecord> cq = cb.createQuery(BBSOperationRecord.class);
+		Root<BBSOperationRecord> root = cq.from(BBSOperationRecord.class);
+		Predicate p = root.get(BBSOperationRecord_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe( "获取所有有操作的用户姓名列表,去重复" )
+	public List<String> distinctAllOperationUserNames() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSOperationRecord.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSOperationRecord> root = cq.from(BBSOperationRecord.class);
+		Predicate p = cb.isNotNull( root.get(BBSOperationRecord_.id) );
+		cq.distinct(true).select( root.get(BBSOperationRecord_.operatorName) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 152 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSPermissionInfoFactory.java

@@ -0,0 +1,152 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSPermissionInfo;
+import com.x.bbs.entity.BBSPermissionInfo_;
+
+/**
+ * 类   名:BBSPermissionInfoFactory<br/>
+ * 实体类:BBSPermissionInfo<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-08-10 17:17:26
+**/
+public class BBSPermissionInfoFactory extends AbstractFactory {
+
+	public BBSPermissionInfoFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSPermissionInfo实体信息对象" )
+	public BBSPermissionInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSPermissionInfo.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSPermissionInfo实体信息列表" )
+	public List<BBSPermissionInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSPermissionInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionInfo> cq = cb.createQuery(BBSPermissionInfo.class);
+		Root<BBSPermissionInfo> root = cq.from(BBSPermissionInfo.class);
+		Predicate p = root.get(BBSPermissionInfo_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "列示全部的BBSPermissionInfo实体信息列表" )
+	public List<BBSPermissionInfo> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionInfo> cq = cb.createQuery(BBSPermissionInfo.class);
+		return em.createQuery( cq ).setMaxResults( 1000 ).getResultList();
+	}
+
+	//@MethodDescribe( "查询指定CODE的权限信息对象" )
+	public BBSPermissionInfo getPermissionByCode( String permissionCode ) throws Exception {
+		if( permissionCode == null || permissionCode.isEmpty() ){
+			throw new Exception("permissionCode is null!");
+		}
+		List<BBSPermissionInfo> permissionInfoList = null;
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionInfo> cq = cb.createQuery(BBSPermissionInfo.class);
+		Root<BBSPermissionInfo> root = cq.from(BBSPermissionInfo.class);
+		Predicate p = cb.equal( root.get(BBSPermissionInfo_.permissionCode), permissionCode );
+		permissionInfoList = em.createQuery(cq.where(p)).getResultList();
+		if( permissionInfoList != null && permissionInfoList.size() > 0 ){
+			return permissionInfoList.get(0);
+		}else{
+			return null;
+		}
+	}
+
+	//@MethodDescribe( "根据论坛ID查询指定论坛所有相关的权限信息列表" )
+	public List<String> listPermissionByForumId(String forumId) throws Exception {
+		if( forumId == null || forumId.isEmpty() ){
+			throw new Exception("forumId is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSPermissionInfo> root = cq.from( BBSPermissionInfo.class );
+		Predicate p = cb.equal( root.get( BBSPermissionInfo_.forumId ), forumId );
+		p = cb.and( p, cb.equal( root.get( BBSPermissionInfo_.permissionType ), "论坛权限" ));
+		cq.select( root.get( BBSPermissionInfo_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+	
+	/**
+	 * 根据版块ID查询指定版块所有相关的权限信息列表
+	 * @param sectionId
+	 * @param queryMainSection 是否查询主版块ID
+	 * @return
+	 * @throws Exception
+	 */
+	public List<String> listPermissionBySectionId( String sectionId, Boolean queryMainSection ) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception("sectionId is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSPermissionInfo> root = cq.from( BBSPermissionInfo.class );
+		Predicate p = cb.equal( root.get( BBSPermissionInfo_.sectionId ), sectionId );
+		if( queryMainSection ) {
+			p = cb.or( p, cb.equal( root.get( BBSPermissionInfo_.mainSectionId ), sectionId ) );
+		}
+		cq.select( root.get( BBSPermissionInfo_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	//@MethodDescribe( "根据权限编码列表获取权限信息列表" )
+	public List<BBSPermissionInfo> listByPermissionCodes( List<String> permissionCodes ) throws Exception {
+		if( permissionCodes == null || permissionCodes.size() == 0 ){
+			return new ArrayList<BBSPermissionInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionInfo> cq = cb.createQuery(BBSPermissionInfo.class);
+		Root<BBSPermissionInfo> root = cq.from(BBSPermissionInfo.class);
+		Predicate p = root.get(BBSPermissionInfo_.permissionCode).in( permissionCodes );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe( "根据主版块ID获取所有的权限信息列表" )
+	public List<BBSPermissionInfo> listPermissionByMainSectionId( String mainSectionId ) throws Exception {
+		if( mainSectionId == null || mainSectionId.isEmpty() ){
+			throw new Exception("mainSectionId is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionInfo> cq = cb.createQuery(BBSPermissionInfo.class);
+		Root<BBSPermissionInfo> root = cq.from(BBSPermissionInfo.class);
+		Predicate p = cb.equal( root.get(BBSPermissionInfo_.mainSectionId ), mainSectionId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	public List<String> listPermissionIdsByMainSectionId( String mainSectionId ) throws Exception {
+		if( mainSectionId == null || mainSectionId.isEmpty() ){
+			throw new Exception("mainSectionId is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSPermissionInfo> root = cq.from(BBSPermissionInfo.class);
+		Predicate p = cb.equal( root.get(BBSPermissionInfo_.mainSectionId ), mainSectionId );
+		cq.select( root.get( BBSPermissionInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 194 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSPermissionRoleFactory.java

@@ -0,0 +1,194 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSPermissionRole;
+import com.x.bbs.entity.BBSPermissionRole_;
+
+/**
+ * 类   名:BBSPermissionRoleFactory<br/>
+ * 实体类:BBSPermissionRole<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-08-10 17:17:26
+**/
+public class BBSPermissionRoleFactory extends AbstractFactory {
+
+	public BBSPermissionRoleFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSPermissionRole实体信息对象" )
+	public BBSPermissionRole get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSPermissionRole.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSPermissionRole实体信息列表" )
+	public List<BBSPermissionRole> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSPermissionRole>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionRole.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionRole> cq = cb.createQuery(BBSPermissionRole.class);
+		Root<BBSPermissionRole> root = cq.from(BBSPermissionRole.class);
+		Predicate p = root.get(BBSPermissionRole_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "列示全部的BBSPermissionRole实体信息列表" )
+	public List<BBSPermissionRole> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSPermissionRole.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionRole> cq = cb.createQuery(BBSPermissionRole.class);
+		return em.createQuery( cq ).setMaxResults( 1000 ).getResultList();
+	}
+
+	//@MethodDescribe( "根据角色编码列示该角色包含的所有BBSPermissionRole实体信息ID列表" )
+	public List<String> listPermissionByRoleCode(String roleCode) throws Exception {
+		if( roleCode == null || roleCode.isEmpty() ){
+			throw new Exception("roleCode is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = cb.equal( root.get( BBSPermissionRole_.roleCode ), roleCode );
+		cq.select( root.get( BBSPermissionRole_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	//@MethodDescribe( "根据角色编码和权限编码判断角色和权限的绑定信息对象是否存在" )
+	public boolean exsistPermissionRole( String roleCode, String permissionCode ) throws Exception {
+		if( roleCode == null || roleCode.isEmpty() ){
+			throw new Exception("roleCode is null!");
+		}
+		if( permissionCode == null || permissionCode.isEmpty() ){
+			throw new Exception("permissionCode is null!");
+		}
+		List<BBSPermissionRole> roleInfoList = null;
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionRole> cq = cb.createQuery( BBSPermissionRole.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = cb.equal( root.get( BBSPermissionRole_.roleCode ), roleCode );
+		p = cb.and( p, cb.equal( root.get( BBSPermissionRole_.permissionCode ), permissionCode ));
+		roleInfoList = em.createQuery( cq.where(p) ).getResultList();
+		if( roleInfoList != null && roleInfoList.size() > 0 ){
+			return true;
+		}else{
+			return false;
+		}
+	}
+	
+	//@MethodDescribe( "根据角色编码和权限编码查询角色和权限的绑定信息对象" )
+	public BBSPermissionRole getByRoleAndPermission(String roleCode, String permissionCode) throws Exception {
+		if( roleCode == null || roleCode.isEmpty() ){
+			throw new Exception("roleCode is null!");
+		}
+		if( permissionCode == null || permissionCode.isEmpty() ){
+			throw new Exception("permissionCode is null!");
+		}
+		List<BBSPermissionRole> roleInfoList = null;
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionRole> cq = cb.createQuery( BBSPermissionRole.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = cb.equal( root.get( BBSPermissionRole_.roleCode ), roleCode );
+		p = cb.and( p, cb.equal( root.get( BBSPermissionRole_.permissionCode ), permissionCode ));
+		roleInfoList = em.createQuery( cq.where(p) ).getResultList();
+		if( roleInfoList != null && roleInfoList.size() > 0 ){
+			return roleInfoList.get( 0 );
+		}else{
+			return null;
+		}
+	}
+		
+	//@MethodDescribe( "根据角色ID列表列示权限ID信息列表" )
+	public List<String> listPermissionCodesByRoleCodes(List<String> roleCodes) throws Exception {
+		if( roleCodes == null || roleCodes.isEmpty() ){
+			throw new Exception("roleCodes is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = root.get( BBSPermissionRole_.roleCode ).in( roleCodes );
+		cq.select( root.get( BBSPermissionRole_.permissionCode ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	//@MethodDescribe( "根据权限编码列示BBSPermissionRole实体信息列表" )
+	public List<BBSPermissionRole> listByPermissionCode(String permissionCode) throws Exception {
+		if( permissionCode == null || permissionCode.isEmpty() ){
+			throw new Exception("permissionCode is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionRole> cq = cb.createQuery( BBSPermissionRole.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = cb.equal( root.get( BBSPermissionRole_.permissionCode ), permissionCode );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+	
+	//@MethodDescribe( "根据指定的权限编码列表查询权限信息对象列表" )
+	public List<BBSPermissionRole> listPermissionByCodes( List<String> permissionCodes ) throws Exception {
+		if( permissionCodes == null || permissionCodes.isEmpty() ){
+			throw new Exception( "permissionCodes is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSPermissionRole> cq = cb.createQuery( BBSPermissionRole.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = root.get( BBSPermissionRole_.permissionCode ).in( permissionCodes );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	public List<String> listByForumId(String forumId) throws Exception {
+		if( StringUtils.isEmpty( forumId) ){
+			throw new Exception( "forumId is empty!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = cb.equal( root.get( BBSPermissionRole_.forumId ), forumId );
+		cq.select( root.get( BBSPermissionRole_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	/**
+	 * 根据版块信息ID查询所有的权限角色关联信息
+	 * @param sectionId
+	 * @param  queryMainSectionId 是否查询主版块ID
+	 * @return
+	 * @throws Exception 
+	 */
+	public List<String> listBySectionId( String sectionId, Boolean queryMainSectionId ) throws Exception {
+		if( StringUtils.isEmpty( sectionId) ){
+			throw new Exception( "sectionId is empty!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSPermissionRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSPermissionRole> root = cq.from( BBSPermissionRole.class );
+		Predicate p = cb.equal( root.get( BBSPermissionRole_.sectionId ), sectionId );
+		if( queryMainSectionId ) {
+			p = cb.or( p, cb.equal( root.get( BBSPermissionRole_.mainSectionId ), sectionId ) );
+		}
+		cq.select( root.get( BBSPermissionRole_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}	
+}

+ 390 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSReplyInfoFactory.java

@@ -0,0 +1,390 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.common.date.DateOperation;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSReplyInfo;
+import com.x.bbs.entity.BBSReplyInfo_;
+
+/**
+ * 类   名:BBSReplyInfoFactory<br/>
+ * 实体类:BBSReplyInfo<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSReplyInfoFactory extends AbstractFactory {
+
+	public BBSReplyInfoFactory( Business business ) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSReplyInfo实体信息对象" )
+	public BBSReplyInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSReplyInfo.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSReplyInfo实体信息列表" )
+	public List<BBSReplyInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSReplyInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSReplyInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSReplyInfo> cq = cb.createQuery(BBSReplyInfo.class);
+		Root<BBSReplyInfo> root = cq.from(BBSReplyInfo.class);
+		Predicate p = root.get(BBSReplyInfo_.id).in(ids);
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	//@MethodDescribe( "根据主贴ID统计主贴的回复数量" )
+	public Long countBySubjectId( String subjectId ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class);
+		Predicate p = cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId );
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据版块信息查询版块内主题数量,包括子版块内的主题数量" )
+	public Long countBySectionId( String sectionId ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class);
+		Predicate p = cb.equal( root.get( BBSReplyInfo_.mainSectionId ), sectionId );
+		p = cb.or( p, cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId ) );
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据版块信息查询论坛内主题数量" )
+	public Long countByForumId(String forumId) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class);
+		Predicate p = cb.equal( root.get( BBSReplyInfo_.forumId ), forumId );
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据主题ID获取该主题所有的回复信息对象列表" )
+	public List<BBSReplyInfo> listWithSubjectForPage( String subjectId, Integer maxCount ) throws Exception {
+		if( subjectId == null ){
+			throw new Exception( "subjectId can not null." );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSReplyInfo> cq = cb.createQuery( BBSReplyInfo.class );
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class );
+		Predicate p = cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId );
+		cq.orderBy( cb.asc( root.get( BBSReplyInfo_.orderNumber ) ) );
+		if( maxCount == null ){
+			return em.createQuery(cq.where(p)).getResultList();
+		}else{
+			return em.createQuery(cq.where(p)).setMaxResults( maxCount ).getResultList();
+		}
+	}
+
+	//@MethodDescribe( "根据主题ID获取该主题最大的回复编号(楼层)" )
+	public Integer getMaxOrderNumber( String subjectId ) throws Exception {
+		if( subjectId == null ){
+			throw new Exception( "subjectId can not null." );
+		}
+		List<BBSReplyInfo> replyInfoList = null;
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSReplyInfo> cq = cb.createQuery( BBSReplyInfo.class );
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class );
+		Predicate p = cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId );
+		cq.orderBy( cb.desc( root.get( BBSReplyInfo_.orderNumber ) ) );
+		replyInfoList = em.createQuery(cq.where(p)).setMaxResults( 1 ).getResultList();
+		if( ListTools.isNotEmpty( replyInfoList ) ){
+			return replyInfoList.get(0).getOrderNumber();
+		}else{
+			return 0;
+		}
+	}
+
+	//@MethodDescribe( "根据指定用户姓名、论坛ID,主版块ID, 版块ID查询符合条件的所有回复的数量" )
+	public Long countReplyForPage( String creatorName, String forumId, String mainSectionId, String sectionId, String subjectId ) throws Exception {
+		Boolean allFilterNull = true;
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			allFilterNull = false;
+		}
+		if( allFilterNull ){
+			throw new Exception( "count filter can not all null." );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class);
+		Predicate p = cb.isNotNull( root.get( BBSReplyInfo_.id ) );
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.creatorName ), creatorName ) );
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.forumId ), forumId ) );
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.mainSectionId ), mainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId ) );
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据指定用户姓名、论坛ID,主版块ID, 版块ID查询符合条件的所有回复对象列表" )
+	public List<BBSReplyInfo> listReplyForPage( String creatorName, String forumId, String mainSectionId, String sectionId, String subjectId, Integer maxCount ) throws Exception {
+		Boolean allFilterNull = true;
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			allFilterNull = false;
+		}
+		if( allFilterNull ){
+			throw new Exception( "list filter can not all null." );
+		}
+		if( maxCount == null ){
+			maxCount = 20;
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSReplyInfo> cq = cb.createQuery( BBSReplyInfo.class );
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class );
+		Predicate p = cb.isNotNull( root.get( BBSReplyInfo_.id ) );
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.creatorName ), creatorName ) );
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.forumId ), forumId ) );
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.mainSectionId ), mainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId ) );
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId ) );
+		}
+		cq.orderBy( cb.asc( root.get( BBSReplyInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( maxCount ).getResultList();
+	}
+	
+	//@MethodDescribe( "(今日)根据指定用户姓名、论坛ID,主版块ID, 版块ID查询符合条件的所有回复的数量" )
+	public Long countReplyForTodayByUserName( String creatorName, String forumId, String mainSectionId, String sectionId, String subjectId ) throws Exception {
+		Boolean allFilterNull = true;
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			allFilterNull = false;
+		}
+		if( allFilterNull ){
+			throw new Exception( "list filter can not all null." );
+		}
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class);
+		Predicate p = cb.greaterThanOrEqualTo( root.get( BBSReplyInfo_.createTime ), dateOperation.getTodayStartTime() );
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.creatorName ), creatorName ) );
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.forumId ), forumId ) );
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.mainSectionId ), mainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId ) );
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "(今日)根据指定用户姓名、论坛ID,主版块ID, 版块ID查询符合条件的所有回复对象列表" )
+	public List<BBSReplyInfo> listReplyForTodayByUserName( String creatorName, String forumId, String mainSectionId, String sectionId, String subjectId, Integer maxCount ) throws Exception {
+		Boolean allFilterNull = true;
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			allFilterNull = false;
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			allFilterNull = false;
+		}
+		if( allFilterNull ){
+			throw new Exception( "list filter can not all null." );
+		}
+		if( maxCount == null ){
+			maxCount = 20;
+		}
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSReplyInfo> cq = cb.createQuery( BBSReplyInfo.class );
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class );
+		Predicate p = cb.greaterThanOrEqualTo( root.get( BBSReplyInfo_.createTime ), dateOperation.getTodayStartTime() );
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.creatorName ), creatorName ) );
+		}
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.forumId ), forumId ) );
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.mainSectionId ), mainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId ) );
+		}
+		if( StringUtils.isNotEmpty( subjectId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.subjectId ), subjectId ) );
+		}
+		cq.orderBy( cb.asc( root.get( BBSReplyInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( maxCount ).getResultList();
+	}
+
+	public Long countReplyForTodayBySectionId( String sectionId ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from(BBSReplyInfo.class);
+		Predicate p = cb.greaterThanOrEqualTo( root.get( BBSReplyInfo_.createTime ), dateOperation.getTodayStartTime() );
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			Predicate or = cb.equal( root.get( BBSReplyInfo_.mainSectionId ), sectionId );
+			or = cb.or( or, cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId ) );
+			p = cb.and( p, or );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	public Long countForTodayByForumId( String forumId ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from(BBSReplyInfo.class);
+		Predicate p = cb.greaterThanOrEqualTo( root.get( BBSReplyInfo_.createTime ), dateOperation.getTodayStartTime() );
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSReplyInfo_.forumId ), forumId ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	/**
+	 * 查询指定的版块内时间范围内发表的回帖数量
+	 * @param sectionId
+	 * @param todayStartTime
+	 * @param todayEndTime
+	 * @param queryMainSection  是否也查询主版块是sectionId的数据
+	 * @return
+	 * @throws Exception 
+	 */
+	public Long countReplyByDate(String sectionId, Date todayStartTime, Date todayEndTime, boolean queryMainSection ) throws Exception {
+		if( StringUtils.isEmpty( sectionId ) ){
+			throw new Exception("sectionId is null");
+		}
+		if( todayStartTime == null ) {
+			todayStartTime = new DateOperation().getTodayStartTime();
+		}
+		if( todayEndTime == null ) {
+			todayEndTime = new DateOperation().getTodayEndTime();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSReplyInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class );
+		Predicate p = cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId );
+		if( queryMainSection ) {
+			p = cb.or( p, cb.equal( root.get( BBSReplyInfo_.mainSectionId ), sectionId ));
+		}		
+		Predicate p_time = cb.between( root.get( BBSReplyInfo_.createTime ), todayStartTime, todayEndTime ) ;
+		p = cb.and( p, p_time );
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	public List<String> listIdsByMainAndSubSectionId( String sectionId ) throws Exception {
+		if( StringUtils.isEmpty( sectionId ) ){
+			throw new Exception( "sectionId is empty!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSReplyInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSReplyInfo> root = cq.from( BBSReplyInfo.class );
+		Predicate p = cb.equal( root.get( BBSReplyInfo_.mainSectionId ), sectionId );
+		p = cb.or( p, cb.equal( root.get( BBSReplyInfo_.sectionId ), sectionId ) );
+		cq.select( root.get( BBSReplyInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 125 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSRoleInfoFactory.java

@@ -0,0 +1,125 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSRoleInfo;
+import com.x.bbs.entity.BBSRoleInfo_;
+
+/**
+ * 类   名:BBSRoleInfoFactory<br/>
+ * 实体类:BBSRoleInfo<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-08-10 17:17:26
+**/
+public class BBSRoleInfoFactory extends AbstractFactory {
+
+	public BBSRoleInfoFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSRoleInfo实体信息对象" )
+	public BBSRoleInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSRoleInfo.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSRoleInfo实体信息列表" )
+	public List<BBSRoleInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSRoleInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSRoleInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSRoleInfo> cq = cb.createQuery(BBSRoleInfo.class);
+		Root<BBSRoleInfo> root = cq.from(BBSRoleInfo.class);
+		Predicate p = root.get(BBSRoleInfo_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "列示全部的BBSRoleInfo实体信息列表" )
+	public List<BBSRoleInfo> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSRoleInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSRoleInfo> cq = cb.createQuery(BBSRoleInfo.class);
+		return em.createQuery( cq ).setMaxResults( 1000 ).getResultList();
+	}
+
+	//@MethodDescribe( "根据角色编码获取指定的BBSRoleInfo实体信息列表" )
+	public BBSRoleInfo getRoleByCode( String roleCode ) throws Exception {
+		if( roleCode == null || roleCode.isEmpty() ){
+			throw new Exception("roleCode is null!");
+		}
+		List<BBSRoleInfo> roleInfoList = null;
+		EntityManager em = this.entityManagerContainer().get( BBSRoleInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSRoleInfo> cq = cb.createQuery( BBSRoleInfo.class );
+		Root<BBSRoleInfo> root = cq.from( BBSRoleInfo.class );
+		Predicate p = cb.equal( root.get( BBSRoleInfo_.roleCode ), roleCode );
+		roleInfoList = em.createQuery( cq.where(p) ).getResultList();
+		if( roleInfoList != null && roleInfoList.size() > 0 ){
+			return roleInfoList.get(0);
+		}else{
+			return null;
+		}
+	}
+
+	//@MethodDescribe( "根据论坛ID获取指定论坛包含的所有BBSRoleInfo实体信息列表" )
+	public List<String> listRoleByForumId( String forumId ) throws Exception {
+		if( forumId == null || forumId.isEmpty() ){
+			throw new Exception("forumId is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSRoleInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSRoleInfo> root = cq.from( BBSRoleInfo.class );
+		Predicate p = cb.equal( root.get( BBSRoleInfo_.forumId ), forumId );
+		cq.select( root.get( BBSRoleInfo_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+	
+	/**
+	 * 根据版块ID获取指定版块包含的所有BBSRoleInfo实体信息列表
+	 * @param sectionId
+	 * @param queryMainSectionId 是否查询主版块ID
+	 * @return
+	 * @throws Exception
+	 */
+	public List<String> listRoleBySectionId( String sectionId, Boolean queryMainSectionId ) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception("sectionId is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSRoleInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSRoleInfo> root = cq.from( BBSRoleInfo.class );
+		Predicate p = cb.equal( root.get( BBSRoleInfo_.sectionId ), sectionId );
+		if( queryMainSectionId ) {
+			p = cb.or( p, cb.equal( root.get( BBSRoleInfo_.mainSectionId ), sectionId ) );
+		}
+		cq.select( root.get( BBSRoleInfo_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	public List<String> listRoleByMainSectionId(String sectionId) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception("sectionId is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSRoleInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSRoleInfo> root = cq.from( BBSRoleInfo.class );
+		Predicate p = cb.equal( root.get( BBSRoleInfo_.mainSectionId ), sectionId );
+		cq.select( root.get( BBSRoleInfo_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+}

+ 276 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSectionInfoFactory.java

@@ -0,0 +1,276 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSSectionInfo;
+import com.x.bbs.entity.BBSSectionInfo_;
+
+/**
+ * 类   名:BBSSectionInfoFactory<br/>
+ * 实体类:BBSSectionInfo<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSSectionInfoFactory extends AbstractFactory {
+
+	public BBSSectionInfoFactory( Business business ) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSSectionInfo实体信息对象" )
+	public BBSSectionInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSSectionInfo.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSSectionInfo实体信息列表" )
+	public List<BBSSectionInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSSectionInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSectionInfo> cq = cb.createQuery(BBSSectionInfo.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = root.get(BBSSectionInfo_.id).in(ids);
+		cq.orderBy( cb.asc( root.get( BBSSectionInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "列示全部的BBSSectionInfo实体信息列表" )
+	public List<BBSSectionInfo> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSectionInfo> cq = cb.createQuery(BBSSectionInfo.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		cq.orderBy( cb.asc( root.get( BBSSectionInfo_.orderNumber ) ) );
+		return em.createQuery( cq ).getResultList();
+	}
+
+	//@MethodDescribe( "根据论坛ID查询所有的主版块信息列表" )
+	public List<BBSSectionInfo> listMainSectionByForumId( String forumId ) throws Exception {
+		if( forumId  == null || forumId.isEmpty() ){
+			throw new Exception( "forumId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSectionInfo> cq = cb.createQuery(BBSSectionInfo.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.forumId ), forumId );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "主版块" ));
+		cq.orderBy( cb.asc( root.get( BBSSectionInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据主版块ID查询所有的子版块信息列表" )
+	public List<BBSSectionInfo> listSubSectionByMainSectionId( String sectionId ) throws Exception {
+		if( sectionId  == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSectionInfo> cq = cb.createQuery(BBSSectionInfo.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.mainSectionId ), sectionId );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "子版块" ));
+		cq.orderBy( cb.asc( root.get( BBSSectionInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据主版块ID查询所有的子版块信息Id列表" )
+	public List<String> listSubSectionIdsByMainSectionId( String sectionId ) throws Exception {
+		if( sectionId  == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.mainSectionId ), sectionId );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "子版块" ));
+		cq.select( root.get( BBSSectionInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据论坛ID表查该论坛所包含的主版块数量" )
+	public Long countMainSectionByForumId( String forumId ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSectionInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSectionInfo> root = cq.from( BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.forumId ), forumId );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "主版块" ));
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据论坛ID表查该论坛所包含的主版块和子版块数量总和" )
+	public Long countAllSectionByForumId( String forumId ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSectionInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSectionInfo> root = cq.from( BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.forumId ), forumId );
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据版块ID查询该版块所包含的子版块数量" )
+	public Long countSubSectionByMainSectionId(String sectionId) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSectionInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSectionInfo> root = cq.from( BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.mainSectionId ), sectionId );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionStatus ), "启用" ));
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "子版块" ));
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据论坛ID查询该论坛所包含的所有主版块以及子版块信息列表" )
+	public List<BBSSectionInfo> listAllSectionByForumId( String forumId ) throws Exception {
+		if( forumId  == null || forumId.isEmpty() ){
+			throw new Exception( "forumId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSectionInfo> cq = cb.createQuery(BBSSectionInfo.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.forumId ), forumId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据论坛ID查询该论坛所包含的所有主版块以及子版块信息列表" )
+	public List<String> listAllSectionIdsByForumId( String forumId ) throws Exception {
+		if( forumId  == null || forumId.isEmpty() ){
+			throw new Exception( "forumId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.forumId ), forumId );
+		cq.select( root.get( BBSSectionInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据论坛ID以及用户可访问的版块ID查询用户可访问的所有的主版块信息列表" )
+	public List<BBSSectionInfo> viewMainSectionByForumId( String forumId, List<String> viewableSectionIds ) throws Exception {
+		if( forumId  == null || forumId.isEmpty() ){
+			throw new Exception( "forumId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSectionInfo> cq = cb.createQuery(BBSSectionInfo.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.forumId ), forumId );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "主版块" ));	
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionStatus ), "启用" ));
+		Predicate or = cb.equal( root.get( BBSSectionInfo_.sectionVisible ), "所有人" );
+		if( ListTools.isNotEmpty( viewableSectionIds ) ){
+			or = cb.or(p, root.get( BBSSectionInfo_.id ).in( viewableSectionIds ) );
+		}
+		p = cb.and( p, or );
+		cq.orderBy( cb.asc( root.get( BBSSectionInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据版块ID以及用户可访问的版块ID列表查询所有用户可访问的子版块信息列表" )
+	public List<BBSSectionInfo> viewSubSectionByMainSectionId( String sectionId, List<String> viewableSectionIds ) throws Exception {
+		if( sectionId  == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSectionInfo> cq = cb.createQuery(BBSSectionInfo.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.mainSectionId ), sectionId );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "子版块" ));
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionStatus ), "启用" ));
+		Predicate or = cb.equal( root.get( BBSSectionInfo_.sectionVisible ), "所有人" );
+		if( ListTools.isNotEmpty( viewableSectionIds ) ){
+			or = cb.or(p, root.get( BBSSectionInfo_.id ).in( viewableSectionIds ) );
+		}
+		p = cb.and( p, or );
+		cq.orderBy( cb.asc( root.get( BBSSectionInfo_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe( "根据论坛ID列表查询指定论坛范围内所有公开访问的主版块列表" )
+	public List<String> listVisibleToAllUserMainSectionIds( List<String> forumIds ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "主版块" );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionVisible ), "所有人" ));
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionStatus ), "启用" ));
+		if( ListTools.isNotEmpty( forumIds ) ){
+			p = cb.and(p, root.get( BBSSectionInfo_.forumId ).in( forumIds ));
+		}
+		cq.select( root.get( BBSSectionInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据论坛ID列表,主版块ID列表查询指定论坛和主版块范围内所有公开访问的子版块列表" )
+	public List<String> listVisibleToAllUserSectionIds( List<String> forumIds, List<String> mainSectionIds ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.sectionLevel ), "子版块" );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionVisible ), "所有人" ));
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionStatus ), "启用" ));
+		if( ListTools.isNotEmpty( forumIds ) ){
+			p = cb.and(p, root.get( BBSSectionInfo_.forumId ).in( forumIds ));
+		}
+		if( ListTools.isNotEmpty( mainSectionIds ) ){
+			p = cb.and(p, root.get( BBSSectionInfo_.mainSectionId ).in( mainSectionIds ) );
+		}
+		cq.select( root.get( BBSSectionInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe( "根据论坛ID列表查询指定论坛范围内所有公开访问的主版块和子版块信息列表" )
+	public List<String> viewSectionByForumId( List<String> viewforumIds, Boolean publicStatus ) throws Exception {
+		if( viewforumIds  == null || viewforumIds.isEmpty() ){
+			throw new Exception( "viewforumIds is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = root.get( BBSSectionInfo_.forumId ).in( viewforumIds );
+		p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionStatus ), "启用" ));
+		if( publicStatus != null && publicStatus ){
+			p = cb.and(p, cb.equal( root.get( BBSSectionInfo_.sectionVisible ), "所有人" ));
+		}
+		cq.select( root.get( BBSSectionInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public List<String> listByForumId( String forumId ) throws Exception {
+		if( forumId  == null || forumId.isEmpty() ){
+			throw new Exception( "forumId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSectionInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSSectionInfo> root = cq.from(BBSSectionInfo.class);
+		Predicate p = cb.equal( root.get( BBSSectionInfo_.forumId ), forumId);
+		cq.select( root.get( BBSSectionInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}	
+}

+ 94 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSubjectAttachmentFactory.java

@@ -0,0 +1,94 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSSubjectAttachment;
+import com.x.bbs.entity.BBSSubjectAttachment_;
+
+/**
+ * 类   名:BBSSubjectAttachmentFactory<br/>
+ * 实体类:BBSSubjectAttachment<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-08-10 17:17:26
+**/
+public class BBSSubjectAttachmentFactory extends AbstractFactory {
+
+	public BBSSubjectAttachmentFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSSubjectAttachment实体信息对象" )
+	public BBSSubjectAttachment get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSSubjectAttachment.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSSubjectAttachment实体信息列表" )
+	public List<BBSSubjectAttachment> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSSubjectAttachment>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectAttachment.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectAttachment> cq = cb.createQuery(BBSSubjectAttachment.class);
+		Root<BBSSubjectAttachment> root = cq.from(BBSSubjectAttachment.class);
+		Predicate p = root.get(BBSSubjectAttachment_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据主题ID列示BBSSubjectAttachment实体信息列表" )
+	public List<BBSSubjectAttachment> listBySubjectId( String subjectId ) throws Exception {
+		if( subjectId == null || subjectId.isEmpty() ){
+			throw new Exception("subject id is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectAttachment.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectAttachment> cq = cb.createQuery(BBSSubjectAttachment.class);
+		Root<BBSSubjectAttachment> root = cq.from(BBSSubjectAttachment.class);
+		Predicate p = cb.equal( root.get(BBSSubjectAttachment_.subjectId ), subjectId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "列示全部的BBSSubjectAttachment实体信息列表" )
+	public List<BBSSubjectAttachment> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectAttachment.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectAttachment> cq = cb.createQuery(BBSSubjectAttachment.class);
+		return em.createQuery( cq ).setMaxResults( 1000 ).getResultList();
+	}
+
+	/**
+	 * 根据指定的版块ID查询所有的附件信息ID列表
+	 * @param sectionId
+	 * @param queryMainSectionId 是否查询主版块ID
+	 * @return
+	 * @throws Exception 
+	 */
+	public List<String> listBySectionId(String sectionId, Boolean queryMainSectionId ) throws Exception {
+		if( StringUtils.isNotEmpty( sectionId )){
+			throw new Exception("sectionId id is empty!");
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectAttachment.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSSubjectAttachment> root = cq.from(BBSSubjectAttachment.class);
+		Predicate p = cb.equal( root.get(BBSSubjectAttachment_.sectionId ), sectionId );
+		if( queryMainSectionId ) {
+			p = cb.or( p, cb.equal( root.get(BBSSubjectAttachment_.mainSectionId ), sectionId ) );
+		}
+		cq.select( root.get( BBSSubjectAttachment_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 773 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSubjectInfoFactory.java

@@ -0,0 +1,773 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.common.date.DateOperation;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSSubjectContent;
+import com.x.bbs.entity.BBSSubjectContent_;
+import com.x.bbs.entity.BBSSubjectInfo;
+import com.x.bbs.entity.BBSSubjectInfo_;
+
+/**
+ * 类   名:BBSSubjectInfoFactory<br/>
+ * 实体类:BBSSubjectInfo<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSSubjectInfoFactory extends AbstractFactory {
+
+	public BBSSubjectInfoFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSSubjectInfo实体信息对象" )
+	public BBSSubjectInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSSubjectInfo.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSSubjectInfo实体信息列表" )
+	public List<BBSSubjectInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSSubjectInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = root.get(BBSSubjectInfo_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据版块信息查询所有需要展现的所有置顶主题列表" )
+	public List<String> listAllTopSubject( String forumId, String mainSectionId, String sectionId, String creatorName ) throws Exception {
+		if( forumId == null || forumId.isEmpty() ){
+			throw new Exception( "forumId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class);
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class );
+		cq.select(root.get( BBSSubjectInfo_.id));
+		
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) );
+		
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p,  cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName ) );
+		}
+		
+		Predicate top_or = null;
+		Predicate top_toforum_or = null;
+		Predicate top_tomainsection_or = null;
+		Predicate top_tosection_or = null;
+		if( StringUtils.isNotEmpty( forumId ) ){
+			top_toforum_or = cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId );
+			top_toforum_or = cb.and( top_toforum_or, cb.isTrue( root.get( BBSSubjectInfo_.topToForum )) );
+			top_or = top_toforum_or;
+		}
+		
+		if( StringUtils.isNotEmpty( mainSectionId ) ){//在指定的主版块中的所有置顶主题
+			top_tomainsection_or = cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), mainSectionId );
+			top_tomainsection_or = cb.and( top_tomainsection_or, cb.isTrue( root.get( BBSSubjectInfo_.topToMainSection )) );
+			if( top_or != null ){
+				top_or = cb.or( top_or, top_tomainsection_or );
+			}else{
+				top_or = top_tomainsection_or;
+			}
+		}
+		
+		if( StringUtils.isNotEmpty( sectionId ) ){//在指定的版块中的所有置顶主题
+			top_tosection_or = cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId );
+			top_tosection_or = cb.and( top_tosection_or, cb.isTrue( root.get( BBSSubjectInfo_.topToSection )) );
+			if( top_or != null ){
+				top_or = cb.or( top_or, top_tosection_or );
+			}else{
+				top_or = top_tosection_or;
+			}
+		}
+		
+		if( top_or != null ){
+			p = cb.and( p, top_or );
+		}
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据版块信息查询论坛内主题数量" )
+	public Long countByForumId( String forumId, Boolean withTopSubject ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class);
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId );
+		if( withTopSubject != null ){
+			if( !withTopSubject ){
+				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}else{
+				p = cb.and( p, cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}
+		}		
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据版块信息查询论坛内主题列表" )
+	public List<BBSSubjectInfo> listByForumId( String forumId, Boolean withTopSubject ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class);
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId );
+		if( withTopSubject != null ){
+			if( !withTopSubject ){
+				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}else{
+				p = cb.and( p, cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}
+		}	
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据版块信息查询版块内主题数量,包括子版块内的主题数量" )
+	public Long countByMainAndSubSectionId( String sectionId, Boolean withTopSubject ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class);
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), sectionId );
+		p = cb.or( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId ) );
+		if( withTopSubject != null ){
+			if( !withTopSubject ){
+				Predicate p1 = cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) );
+				p = cb.and( p, p1 );
+			}else{
+				Predicate p1 = cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) );
+				p = cb.and( p, p1 );
+			}
+		}
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据版块ID查询所有主题列表,包括子版块内的主题" )
+	public List<BBSSubjectInfo> listByMainAndSubSectionId( String sectionId, Boolean withTopSubject ) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), sectionId );
+		p = cb.or( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId ) );
+		if( withTopSubject != null ){
+			if( !withTopSubject ){
+				Predicate p1 = cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) );
+				p = cb.and( p, p1 );
+			}else{
+				Predicate p1 = cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) );
+				p = cb.and( p, p1 );
+			}
+		}
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	/**
+	 * 根据版块ID查询所有主题ID列表,包括子版块内的主题
+	 * @param sectionId
+	 * @param withTopSubject 是否包括置顶主题
+	 * @return
+	 * @throws Exception
+	 */
+	public List<String> listIdsByMainAndSubSectionId( String sectionId, Boolean withTopSubject ) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery(String.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), sectionId );
+		p = cb.or( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId ) );
+		if( withTopSubject != null ){
+			if( !withTopSubject ){
+				Predicate p1 = cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) );
+				p = cb.and( p, p1 );
+			}else{
+				Predicate p1 = cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) );
+				p = cb.and( p, p1 );
+			}
+		}
+		cq.select( root.get( BBSSubjectInfo_.id ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据版块ID查询所有主题数量,不包括子版块内的主题" )
+	public Long countSubjectIdsBySection( String sectionId ) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.equal(  root.get(BBSSubjectInfo_.sectionId), sectionId);
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据版块ID查询所有主题列表,不包括子版块内的主题" )
+	public List<BBSSubjectInfo> listSubjectBySection( String sectionId ) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.equal(  root.get(BBSSubjectInfo_.sectionId), sectionId);
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.latestReplyTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults(100).getResultList();
+	}
+	
+	//@MethodDescribe( "根据版块ID查询所有主题列表,不包括子版块内的主题" )
+	public List<String> listSubjectIdsBySection( String sectionId, Integer maxResults ) throws Exception {
+		if( sectionId == null || sectionId.isEmpty() ){
+			throw new Exception( "sectionId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.equal(  root.get(BBSSubjectInfo_.sectionId), sectionId);
+		cq.select( root.get(BBSSubjectInfo_.id) );
+		if( maxResults == null || maxResults == 0 ){
+			return em.createQuery(cq.where(p)).getResultList();
+		}else{
+			return em.createQuery(cq.where(p)).setMaxResults( maxResults ).getResultList();
+		}
+	}
+	
+	//@MethodDescribe( "根据版块ID, 主版块ID,版块ID,创建者姓名查询符合要求所有主题列表,不包括子版块内的主题数量" )
+	public Long countSubjectInSectionForPage( String forumId, String mainSectionId, String sectionId, String creatorName, Boolean needPicture, Boolean isTopSubject, List<String> viewSectionIds ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isNotNull( root.get(BBSSubjectInfo_.id ) );
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId));
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), mainSectionId));
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId));
+		}
+		if( needPicture != null && needPicture ){
+			p = cb.and( p, cb.isNotNull( root.get( BBSSubjectInfo_.picId ) ),  cb.notEqual( root.get( BBSSubjectInfo_.picId ), ""));
+		}
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName ) );
+		}
+		if( ListTools.isNotEmpty( viewSectionIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.sectionId ).in( viewSectionIds ) );
+		}
+		if( isTopSubject != null ){
+			if( isTopSubject ){
+				p = cb.and( p, cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}else{
+				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}
+		}
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "根据版块ID, 主版块ID,版块ID,创建者姓名查询符合要求所有主题列表,不包括子版块内的主题" )
+	public List<BBSSubjectInfo> listSubjectInSectionForPage( String forumId, String mainSectionId, String sectionId, String creatorName, Boolean needPicture, Boolean isTopSubject, Integer maxRecordCount, List<String> viewSectionIds ) throws Exception {
+		if( maxRecordCount == null ){
+			throw new Exception( "maxRecordCount is null." );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isNotNull( root.get(BBSSubjectInfo_.id ) );
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId));
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), mainSectionId));
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId));
+		}
+		if( needPicture != null && needPicture ){
+			p = cb.and( p, cb.isNotNull( root.get( BBSSubjectInfo_.picId ) ),  cb.notEqual( root.get( BBSSubjectInfo_.picId ), ""));
+		}
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName ) );
+		}
+		if( ListTools.isNotEmpty( viewSectionIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.sectionId ).in( viewSectionIds ) );
+		}
+		if( isTopSubject != null ){
+			if( isTopSubject ){
+				p = cb.and( p, cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}else{
+				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}
+		}
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.latestReplyTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( maxRecordCount ).getResultList();
+	}	
+
+	//@MethodDescribe( "根据指定的主题ID获取上一个主题的ID,根据最新回帖时间排序" )
+	public List<BBSSubjectInfo> listLastSubject( Date latestReplyTime ) throws Exception {
+		if( latestReplyTime == null ){
+			throw new Exception( "latestReplyTime is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery( BBSSubjectInfo.class );
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class );
+		Predicate p = cb.greaterThan( root.get( BBSSubjectInfo_.latestReplyTime ), latestReplyTime );
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.latestReplyTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults(1).getResultList();
+	}
+	
+	//@MethodDescribe( "根据最后回帖时间,查询是否还有更早的回帖,数量查询" )
+	public Long countLastSubject( Date latestReplyTime ) throws Exception {
+		if( latestReplyTime == null ){
+			throw new Exception( "latestReplyTime is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery< Long> cq = cb.createQuery(  Long.class );
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class );
+		Predicate p = cb.greaterThan( root.get( BBSSubjectInfo_.latestReplyTime ), latestReplyTime );
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据指定的主题ID获取下一个主题的ID,根据最新回帖时间排序" )
+	public List<BBSSubjectInfo> listNextSubject( Date latestReplyTime ) throws Exception {
+		if( latestReplyTime == null ){
+			throw new Exception( "latestReplyTime is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery( BBSSubjectInfo.class );
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class );
+		Predicate p = cb.lessThan( root.get( BBSSubjectInfo_.latestReplyTime ), latestReplyTime );
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.latestReplyTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults(1).getResultList();
+	}
+	
+	//@MethodDescribe( "根据最后回帖时间,查询是否还有更晚的回帖,数量查询" )
+	public Long countNextSubject( Date latestReplyTime ) throws Exception {
+		if( latestReplyTime == null ){
+			throw new Exception( "latestReplyTime is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery< Long> cq = cb.createQuery(  Long.class );
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class );
+		Predicate p = cb.lessThan( root.get( BBSSubjectInfo_.latestReplyTime ), latestReplyTime );
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据论坛ID,主版块ID,版块ID查询指定用户发表的主题数量" )
+	public Long countUserSubjectForPage( String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, String creatorName ) throws Exception {
+		if( creatorName == null || creatorName.isEmpty() ){
+			throw new Exception( "creatorName can not null." );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName );
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId));
+		}
+		if( needPicture != null ){
+			if( needPicture ){
+				p = cb.and( p, cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}else{
+				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), mainSectionId));
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId));
+		}
+		if( needPicture != null && needPicture ){
+			p = cb.and( p, cb.isNotNull( root.get( BBSSubjectInfo_.picId ) ),  cb.notEqual( root.get( BBSSubjectInfo_.picId ), ""));
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据论坛ID,主版块ID,版块ID查询指定用户发表的主题列表, 分页" )
+	public List<BBSSubjectInfo> listUserSubjectForPage( String forumId, String mainSectionId, String sectionId, Boolean needPicture, Boolean withTopSubject, Integer maxRecordCount, String creatorName ) throws Exception {
+		if( creatorName == null || creatorName.isEmpty() ){
+			throw new Exception( "creatorName can not null." );
+		}
+		if( maxRecordCount == null ){
+			maxRecordCount = 20;
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName );
+		if( needPicture != null ){
+			if( needPicture ){
+				p = cb.and( p, cb.isTrue( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}else{
+				p = cb.and( p, cb.isFalse( root.get( BBSSubjectInfo_.isTopSubject ) ) );
+			}
+		}
+		if( forumId != null ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId));
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), mainSectionId));
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId));
+		}
+		if( needPicture != null && needPicture ){
+			p = cb.and( p, cb.isNotNull( root.get( BBSSubjectInfo_.picId ) ),  cb.notEqual( root.get( BBSSubjectInfo_.picId ), ""));
+		}
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.createTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( maxRecordCount ).getResultList();
+	}
+
+	//@MethodDescribe( "查询指定用户今天发表的主题数量" )
+	public Long countSubjectForTodayByUserName( String userName ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.greaterThanOrEqualTo( root.get( BBSSubjectInfo_.createTime ), dateOperation.getTodayStartTime() );
+		if( StringUtils.isNotEmpty( userName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), userName ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+	
+	//@MethodDescribe( "查询指定用户发表的精华主题数量" )
+	public Long countCreamSubjectByUserName( String userName ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.isCreamSubject ) );
+		if( StringUtils.isNotEmpty( userName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), userName ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "查询指定用户发表的原创主题数量" )
+	public Long countOriginalSubjectByUserName( String userName ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.isCreamSubject ) );
+		if( StringUtils.isNotEmpty( userName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), userName ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "查询指定版块中当天发表的主题数量" )
+	public Long countSubjectForTodayBySectionId( String sectionId ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.greaterThanOrEqualTo( root.get( BBSSubjectInfo_.createTime ), dateOperation.getTodayStartTime() );
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			Predicate or = cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), sectionId );
+			or = cb.or( or, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId ) );
+			p = cb.and( p, or );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "查询指定信封中当天发表的主题数量" )
+	public Long countForTodayByForumId( String forumId ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.greaterThanOrEqualTo( root.get( BBSSubjectInfo_.createTime ), dateOperation.getTodayStartTime() );
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.or( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据指定的论坛ID列表,主版块ID列表,版块ID列表查询推荐到BBS首页的主题列表" )
+	public List<BBSSubjectInfo> listRecommendedSubjectForBBSIndex( List<String> forumIds, List<String> mainSectionIds, List<String> sectionIds, Integer count ) throws Exception {
+		if( count == null ){
+			count = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.recommendToBBSIndex ) );
+		if( ListTools.isNotEmpty( forumIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.forumId ).in( forumIds ) );
+		}
+		if( ListTools.isNotEmpty( mainSectionIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.mainSectionId ).in( mainSectionIds ) );
+		}
+		if( ListTools.isNotEmpty( sectionIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.sectionId ).in( sectionIds ) );
+		}
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.updateTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( count ).getResultList();
+	}
+	
+	//@MethodDescribe( "根据指定的论坛ID列表,主版块ID列表,版块ID列表查询推荐到论坛首页的主题列表" )
+	public List<BBSSubjectInfo> listRecommendedSubjectForForumIndex( List<String> forumIds, List<String> mainSectionIds, List<String> sectionIds, Integer count) throws Exception {
+		if( count == null ){
+			count = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.recommendToForumIndex ) );
+		if( ListTools.isNotEmpty( forumIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.forumId ).in( forumIds ) );
+		}
+		if( ListTools.isNotEmpty( mainSectionIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.mainSectionId ).in( mainSectionIds ) );
+		}
+		if( ListTools.isNotEmpty( sectionIds ) ){
+			p = cb.and( p, root.get( BBSSubjectInfo_.sectionId ).in( sectionIds ) );
+		}
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.updateTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( count ).getResultList();
+	}
+
+	//@MethodDescribe( "根据指定的版块ID列表搜索符合条件的主题数量" )
+	public Long countSubjectSearchInSectionForPage( String searchContent, List<String> viewSectionIds ) throws Exception {
+		if( searchContent == null || searchContent.isEmpty() ){
+			throw new Exception( "searchContent can not null." );
+		}
+		if( viewSectionIds == null || viewSectionIds.isEmpty() ){
+			throw new Exception( "viewSectionIds can not null." );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = root.get( BBSSubjectInfo_.sectionId ).in( viewSectionIds );
+		Predicate or = cb.like( root.get( BBSSubjectInfo_.title ), "%"+searchContent+"%" );
+		or = cb.or( or, cb.like( root.get( BBSSubjectInfo_.sectionName ), "%"+searchContent+"%" ) );
+		or = cb.or( or, cb.like( root.get( BBSSubjectInfo_.forumName ), "%"+searchContent+"%" ) );
+		or = cb.or( or, cb.like( root.get( BBSSubjectInfo_.creatorName ), "%"+searchContent+"%" ) );
+		p = cb.and( p, or );
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据指定的版块ID列表搜索符合条件的主题列表,分页" )
+	public List<BBSSubjectInfo> listSubjectSearchInSectionForPage( String searchContent, List<String> viewSectionIds, Integer count ) throws Exception {
+		if( searchContent == null || searchContent.isEmpty() ){
+			throw new Exception( "searchContent can not null." );
+		}
+		if( viewSectionIds == null || viewSectionIds.isEmpty() ){
+			throw new Exception( "viewSectionIds can not null." );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = root.get( BBSSubjectInfo_.sectionId ).in( viewSectionIds );
+		Predicate or = cb.like( root.get( BBSSubjectInfo_.title ), "%"+searchContent+"%" );
+		or = cb.or( or, cb.like( root.get( BBSSubjectInfo_.sectionName ), "%"+searchContent+"%" ) );
+		or = cb.or( or, cb.like( root.get( BBSSubjectInfo_.forumName ), "%"+searchContent+"%" ) );
+		or = cb.or( or, cb.like( root.get( BBSSubjectInfo_.creatorName ), "%"+searchContent+"%" ) );
+		p = cb.and( p, or );
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.updateTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( count ).getResultList();
+	}
+
+	//@MethodDescribe( "根据指定的版块ID、主版块ID、版块ID和指定的人员查询精华主题数量" )
+	public Long countCreamedSubjectInSectionForPage( String forumId, String mainSectionId, String sectionId, String creatorName ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.isCreamSubject ) );
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId ) );
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), mainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId ) );
+		}
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName ) );
+		}
+		cq.select( cb.count( root ) );		
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据指定的版块ID、主版块ID、版块ID和指定的人员查询精华主题列表,分页" )
+	public List<BBSSubjectInfo> listCreamedSubjectInSectionForPage( String forumId, String mainSectionId, String sectionId, String creatorName, Integer count ) throws Exception {
+		if( count == null ){
+			count = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.isCreamSubject ) );
+		if( StringUtils.isNotEmpty( forumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), forumId ) );
+		}
+		if( StringUtils.isNotEmpty( mainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), mainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( sectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId ) );
+		}
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName ) );
+		}
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.updateTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( count ).getResultList();
+	}
+
+	//@MethodDescribe( "根据指定的版块ID、主版块ID、版块ID和指定的人员查询推荐到BBS首页的主题数量" )
+	public Long countRecommendedSubjectInSectionForPage( String searchForumId, String searchMainSectionId, String searchSectionId, String creatorName ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.recommendToBBSIndex ) );
+		if( StringUtils.isNotEmpty( searchForumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), searchForumId ) );
+		}
+		if( StringUtils.isNotEmpty( searchMainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), searchMainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( searchSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), searchSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName ) );
+		}
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	//@MethodDescribe( "根据指定的版块ID、主版块ID、版块ID和指定的人员查询推荐到BBS首页的主题列表" )
+	public List<BBSSubjectInfo> listRecommendedSubjectInSectionForPage( String searchForumId, String searchMainSectionId,
+			String searchSectionId, String creatorName, Integer count) throws Exception {
+		if( count == null ){
+			count = 10;
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSSubjectInfo.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectInfo> cq = cb.createQuery(BBSSubjectInfo.class);
+		Root<BBSSubjectInfo> root = cq.from(BBSSubjectInfo.class);
+		Predicate p = cb.isTrue( root.get( BBSSubjectInfo_.recommendToBBSIndex ) );
+		if( StringUtils.isNotEmpty( searchForumId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.forumId ), searchForumId ) );
+		}
+		if( StringUtils.isNotEmpty( searchMainSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), searchMainSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( searchSectionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.sectionId ), searchSectionId ) );
+		}
+		if( StringUtils.isNotEmpty( creatorName ) ){
+			p = cb.and( p, cb.equal( root.get( BBSSubjectInfo_.creatorName ), creatorName ) );
+		}
+		cq.orderBy( cb.desc( root.get( BBSSubjectInfo_.updateTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( count ).getResultList();
+	}
+	
+	public List<BBSSubjectContent> getSubjectContent( String id ) throws Exception {
+		if( id == null || id.isEmpty() ){
+			throw new Exception("id is null");
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectContent.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSSubjectContent> cq = cb.createQuery(BBSSubjectContent.class);
+		Root<BBSSubjectContent> root = cq.from( BBSSubjectContent.class );
+		Predicate p = cb.equal( root.get( BBSSubjectContent_.id ), id );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	/**
+	 * 查询指定的版块内时间范围内发表的主题数量
+	 * @param sectionId
+	 * @param todayStartTime
+	 * @param todayEndTime
+	 * @param queryMainSection  是否也查询主版块是sectionId的数据
+	 * @return
+	 * @throws Exception 
+	 */
+	public Long countSubjectByDate(String sectionId, Date todayStartTime, Date todayEndTime, boolean queryMainSection) throws Exception {
+		if( StringUtils.isEmpty( sectionId ) ){
+			throw new Exception("sectionId is null");
+		}
+		if( todayStartTime == null ) {
+			todayStartTime = new DateOperation().getTodayStartTime();
+		}
+		if( todayEndTime == null ) {
+			todayEndTime = new DateOperation().getTodayEndTime();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSSubjectInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSSubjectInfo> root = cq.from( BBSSubjectInfo.class );
+		Predicate p = cb.equal( root.get( BBSSubjectInfo_.sectionId ), sectionId );
+		if( queryMainSection ) {
+			p = cb.or( p, cb.equal( root.get( BBSSubjectInfo_.mainSectionId ), sectionId ));
+		}
+		Predicate p_time = cb.between( root.get( BBSSubjectInfo_.createTime ), todayStartTime, todayEndTime ) ;
+		p = cb.and( p, p_time );
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+}

+ 36 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSSubjectVoteResultFactory.java

@@ -0,0 +1,36 @@
+package com.x.bbs.assemble.control.factory;
+
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSSubjectVoteResult;
+
+/**
+ * 类   名:BBSSubjectVoteResultFactory<br/>
+ * 实体类:BBSSubjectVoteResult<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSSubjectVoteResultFactory extends AbstractFactory {
+
+	public BBSSubjectVoteResultFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSSubjectVoteResult实体信息对象" )
+	public BBSSubjectVoteResult get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSSubjectVoteResult.class );
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSSubjectVoteResult实体信息对象" )
+	public String getStatisticResult( String id ) throws Exception {
+		if( id == null || id.isEmpty() ){
+			return null;
+		}
+		BBSSubjectVoteResult subjectVoteResult = this.entityManagerContainer().find( id, BBSSubjectVoteResult.class );
+		if( subjectVoteResult != null ){
+			return subjectVoteResult.getStatisticContent();
+		}
+		return null;
+	}
+}

+ 61 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSUserInfoFactory.java

@@ -0,0 +1,61 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSUserInfo;
+import com.x.bbs.entity.BBSUserInfo_;
+
+/**
+ * 类   名:BBSUserInfoFactory<br/>
+ * 实体类:BBSUserInfo<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-08-10 17:17:26
+**/
+public class BBSUserInfoFactory extends AbstractFactory {
+
+	public BBSUserInfoFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSUserInfo实体信息对象" )
+	public BBSUserInfo get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSUserInfo.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSUserInfo实体信息列表" )
+	public List<BBSUserInfo> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSUserInfo>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSUserInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSUserInfo> cq = cb.createQuery(BBSUserInfo.class);
+		Root<BBSUserInfo> root = cq.from(BBSUserInfo.class);
+		Predicate p = root.get(BBSUserInfo_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "列示指定姓名的BBSUserInfo实体信息列表" )
+	public List<BBSUserInfo> listByUserName( String userName ) throws Exception {
+		if( userName == null || userName.isEmpty() ){
+			throw new Exception( "userName is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSUserInfo.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSUserInfo> cq = cb.createQuery(BBSUserInfo.class);
+		Root<BBSUserInfo> root = cq.from(BBSUserInfo.class);
+		Predicate p = cb.equal( root.get(BBSUserInfo_.userName), userName );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 172 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSUserRoleFactory.java

@@ -0,0 +1,172 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSUserRole;
+import com.x.bbs.entity.BBSUserRole_;
+
+/**
+ * 类   名:BBSUserRoleFactory<br/>
+ * 实体类:BBSUserRole<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-08-10 17:17:26
+**/
+public class BBSUserRoleFactory extends AbstractFactory {
+
+	public BBSUserRoleFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSUserRole实体信息对象" )
+	public BBSUserRole get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSUserRole.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSUserRole实体信息列表" )
+	public List<BBSUserRole> list(List<String> ids) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSUserRole>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSUserRole.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSUserRole> cq = cb.createQuery(BBSUserRole.class);
+		Root<BBSUserRole> root = cq.from(BBSUserRole.class);
+		Predicate p = root.get(BBSUserRole_.id).in(ids);
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "列示全部的BBSUserRole实体信息列表" )
+	public List<BBSUserRole> listAll() throws Exception {
+		EntityManager em = this.entityManagerContainer().get(BBSUserRole.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSUserRole> cq = cb.createQuery(BBSUserRole.class);
+		return em.createQuery( cq ).setMaxResults( 5000 ).getResultList();
+	}
+
+	//@MethodDescribe( "根据绑定对象唯一标识以及绑定对象类别查询所有绑定的角色ID列表" )
+	public List<String> listRoleIdsByObjectUniqueId( String uniqueId, String objectType ) throws Exception {
+		if( uniqueId == null || uniqueId.isEmpty() ){
+			throw new Exception("uniqueId is null!");
+		}
+		if( objectType == null || objectType.isEmpty() ){
+			throw new Exception("objectType is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSUserRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSUserRole> root = cq.from( BBSUserRole.class );
+		Predicate p = cb.equal( root.get( BBSUserRole_.uniqueId ), uniqueId );
+		p = cb.and( p, cb.equal( root.get( BBSUserRole_.objectType ), objectType ));
+		cq.select( root.get( BBSUserRole_.roleId ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+	
+	//@MethodDescribe( "根据绑定对象唯一标识以及绑定对象类别查询所有绑定的角色编码列表" )
+	public List<String> listRoleCodeByObjectUniqueId( String uniqueId, String objectType ) throws Exception {
+		if( uniqueId == null || uniqueId.isEmpty() ){
+			throw new Exception("uniqueId is null!");
+		}
+		if( objectType == null || objectType.isEmpty() ){
+			throw new Exception("objectType is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSUserRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSUserRole> root = cq.from( BBSUserRole.class );
+		Predicate p = cb.equal( root.get( BBSUserRole_.uniqueId ), uniqueId );
+		p = cb.and( p, cb.equal( root.get( BBSUserRole_.objectType ), objectType ));
+		cq.select( root.get( BBSUserRole_.roleCode ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	//@MethodDescribe( "根据角色编码查询所有的人员角色绑定信息对象ID列表" )
+	public List<String> listIdsByRoleCode( String roleCode ) throws Exception {
+		if( roleCode == null || roleCode.isEmpty() ){
+			throw new Exception("roleCode is null!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSUserRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSUserRole> root = cq.from( BBSUserRole.class );
+		Predicate p = cb.equal( root.get( BBSUserRole_.roleCode ), roleCode );
+		cq.select( root.get( BBSUserRole_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	//@MethodDescribe( "根据指定的绑定对象唯一标识列表查询在该对象上绑定的所有角色ID列表" )
+	public List<String> listRoleIdsByObjectUnique(List<String> objectUniqueIds) throws Exception {
+		if( objectUniqueIds == null || objectUniqueIds.isEmpty() ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSUserRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSUserRole> root = cq.from( BBSUserRole.class );
+		Predicate p = root.get( BBSUserRole_.uniqueId ).in( objectUniqueIds );
+		cq.select( root.get( BBSUserRole_.roleId ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+	
+	//@MethodDescribe( "根据指定的绑定对象唯一标识列表查询在该对象上绑定的所有角色编码列表" )
+	public List<String> listRoleCodesByObjectUnique( List<String> objectUniqueIds ) throws Exception {
+		if( objectUniqueIds == null || objectUniqueIds.isEmpty() ){
+			return null;
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSUserRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSUserRole> root = cq.from( BBSUserRole.class );
+		Predicate p = root.get( BBSUserRole_.uniqueId ).in( objectUniqueIds );
+		cq.select( root.get( BBSUserRole_.roleCode ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	public List<String> listByForumId(String forumId) throws Exception {
+		if( StringUtils.isEmpty( forumId ) ){
+			throw new Exception("forumId is empty!!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSUserRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSUserRole> root = cq.from( BBSUserRole.class );
+		Predicate p = cb.equal( root.get( BBSUserRole_.forumId ), forumId );
+		cq.select( root.get( BBSUserRole_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+
+	/**
+	 * 根据版块信息ID查询所有的用户角色关联信息
+	 * @param sectionId
+	 * @param queryMainSectionId
+	 * @return
+	 * @throws Exception 
+	 */
+	public List<String> listBySectionId(String sectionId, Boolean queryMainSectionId) throws Exception {
+		if( StringUtils.isEmpty( sectionId ) ){
+			throw new Exception("sectionId is empty!!");
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSUserRole.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class );
+		Root<BBSUserRole> root = cq.from( BBSUserRole.class );
+		Predicate p = cb.equal( root.get( BBSUserRole_.sectionId ), sectionId );
+		if( queryMainSectionId ) {
+			p = cb.or( p, cb.equal( root.get( BBSUserRole_.mainSectionId ), sectionId ) );
+		}
+		cq.select( root.get( BBSUserRole_.id ) );
+		return em.createQuery( cq.where(p) ).getResultList();
+	}
+}

+ 103 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSVoteOptionFactory.java

@@ -0,0 +1,103 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSVoteOption;
+import com.x.bbs.entity.BBSVoteOptionGroup;
+import com.x.bbs.entity.BBSVoteOptionGroup_;
+import com.x.bbs.entity.BBSVoteOption_;
+
+/**
+ * 类   名:BBSVoteOptionFactory<br/>
+ * 实体类:BBSVoteOption<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSVoteOptionFactory extends AbstractFactory {
+
+	public BBSVoteOptionFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSVoteOption实体信息对象" )
+	public BBSVoteOption get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSVoteOption.class, ExceptionWhen.none );
+	}
+	
+	//@MethodDescribe( "列示指定Id的BBSVoteOption实体信息列表" )
+	public List<BBSVoteOption> list( List<String> ids ) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSVoteOption>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSVoteOption.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteOption> cq = cb.createQuery(BBSVoteOption.class);
+		Root<BBSVoteOption> root = cq.from(BBSVoteOption.class);
+		Predicate p = root.get(BBSVoteOption_.id).in(ids);
+		cq.orderBy( cb.desc( root.get( BBSVoteOption_.orderNumber ) ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据主题信息ID查询所有投票选择项信息ID列表" )
+	public List<String> listVoteOptionIdsBySubject( String subjectId ) throws Exception {
+		if( subjectId == null || subjectId.isEmpty() ){
+			throw new Exception( "subjectId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteOption.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class);
+		Root<BBSVoteOption> root = cq.from( BBSVoteOption.class );
+		Predicate p = cb.equal( root.get( BBSVoteOption_.subjectId ), subjectId );
+		cq.select( root.get( BBSVoteOption_.id ) );
+		return em.createQuery( cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据主题信息ID查询所有投票选择项信息列表" )
+	public List<BBSVoteOption> listVoteOptionBySubject( String subjectId ) throws Exception {
+		if( subjectId == null || subjectId.isEmpty() ){
+			throw new Exception( "subjectId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteOption.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteOption> cq = cb.createQuery( BBSVoteOption.class);
+		Root<BBSVoteOption> root = cq.from( BBSVoteOption.class );
+		Predicate p = cb.equal( root.get( BBSVoteOption_.subjectId ), subjectId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	//@MethodDescribe( "根据主题信息ID查询所有投票选择项分组信息列表" )
+	public List<BBSVoteOptionGroup> listVoteOptionGroupBySubject( String subjectId ) throws Exception {
+		if( subjectId == null || subjectId.isEmpty() ){
+			throw new Exception( "subjectId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteOptionGroup.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteOptionGroup> cq = cb.createQuery( BBSVoteOptionGroup.class);
+		Root<BBSVoteOptionGroup> root = cq.from( BBSVoteOptionGroup.class );
+		Predicate p = cb.equal( root.get( BBSVoteOptionGroup_.subjectId ), subjectId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public List<BBSVoteOption> listVoteOptionByGroupId(String groupId) throws Exception {
+		if( groupId == null || groupId.isEmpty() ){
+			throw new Exception( "groupId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteOption.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteOption> cq = cb.createQuery( BBSVoteOption.class);
+		Root<BBSVoteOption> root = cq.from( BBSVoteOption.class );
+		Predicate p = cb.equal( root.get( BBSVoteOption_.optionGroupId ), groupId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 162 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/factory/BBSVoteRecordFactory.java

@@ -0,0 +1,162 @@
+package com.x.bbs.assemble.control.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.project.exception.ExceptionWhen;
+import com.x.bbs.assemble.control.AbstractFactory;
+import com.x.bbs.assemble.control.Business;
+import com.x.bbs.entity.BBSVoteRecord;
+import com.x.bbs.entity.BBSVoteRecord_;
+
+/**
+ * 类   名:BBSVoteRecordFactory<br/>
+ * 实体类:BBSVoteRecord<br/>
+ * 作   者:Liyi<br/>
+ * 单   位:O2 Team<br/>
+ * 日   期:2016-05-20 17:17:26
+**/
+public class BBSVoteRecordFactory extends AbstractFactory {
+
+	public BBSVoteRecordFactory(Business business) throws Exception {
+		super(business);
+	}
+	
+	//@MethodDescribe( "获取指定Id的BBSVoteRecord实体信息对象" )
+	public BBSVoteRecord get( String id ) throws Exception {
+		return this.entityManagerContainer().find( id, BBSVoteRecord.class, ExceptionWhen.none );
+	}
+	
+//	@MethodDescribe( "列示指定Id的BBSVoteRecord实体信息列表" )
+	public List<BBSVoteRecord> list( List<String> ids ) throws Exception {
+		if( ids == null || ids.size() == 0 ){
+			return new ArrayList<BBSVoteRecord>();
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSVoteRecord.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteRecord> cq = cb.createQuery(BBSVoteRecord.class);
+		Root<BBSVoteRecord> root = cq.from(BBSVoteRecord.class);
+		Predicate p = root.get(BBSVoteRecord_.id).in(ids);
+		cq.orderBy( cb.desc( root.get( BBSVoteRecord_.sequence ) ) );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据主题信息ID查询所有投票记录信息ID列表" )
+	public List<String> listVoteRecordBySubjectIds( String subjectId ) throws Exception {
+		if( subjectId == null || subjectId.isEmpty() ){
+			throw new Exception( "subjectId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteRecord.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<String> cq = cb.createQuery( String.class);
+		Root<BBSVoteRecord> root = cq.from( BBSVoteRecord.class );
+		cq.select(root.get( BBSVoteRecord_.id));
+		Predicate p = cb.equal( root.get( BBSVoteRecord_.subjectId ), subjectId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+	
+	//@MethodDescribe( "根据主题信息ID查询所有投票记录信息ID列表" )
+	public List<BBSVoteRecord> listVoteRecordBySubject( String subjectId ) throws Exception {
+		if( subjectId == null || subjectId.isEmpty() ){
+			throw new Exception( "subjectId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteRecord.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteRecord> cq = cb.createQuery( BBSVoteRecord.class);
+		Root<BBSVoteRecord> root = cq.from( BBSVoteRecord.class );
+		Predicate p = cb.equal( root.get( BBSVoteRecord_.subjectId ), subjectId );
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+
+	public Long getVoteCountByUserAndSubject(String personName, String subjectId) throws Exception {
+		if( personName == null || personName.isEmpty() ){
+			throw new Exception( "personName is null!" );
+		}
+		if( subjectId == null || subjectId.isEmpty() ){
+			throw new Exception( "subjectId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteRecord.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery( Long.class);
+		Root<BBSVoteRecord> root = cq.from( BBSVoteRecord.class );
+		Predicate p = cb.equal( root.get( BBSVoteRecord_.votorName ), personName );
+		p = cb.and( p, cb.equal( root.get( BBSVoteRecord_.subjectId ), subjectId ) );
+		cq.select( cb.count( root ));
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	public Long getVoteCountByUserAndOption(String personName, String optionId) throws Exception {
+		if( personName == null || personName.isEmpty() ){
+			throw new Exception( "personName is null!" );
+		}
+		if( optionId == null || optionId.isEmpty() ){
+			throw new Exception( "subjectId is null!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteRecord.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery( Long.class);
+		Root<BBSVoteRecord> root = cq.from( BBSVoteRecord.class );
+		Predicate p = cb.equal( root.get( BBSVoteRecord_.votorName ), personName );
+		p = cb.and( p, cb.equal( root.get( BBSVoteRecord_.optionId ), optionId ) );
+		cq.select( cb.count( root ));
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	public Long countVoteRecordForSubject( String subjectId, String voteOptionId ) throws Exception {
+		EntityManager em = this.entityManagerContainer().get( BBSVoteRecord.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+		Root<BBSVoteRecord> root = cq.from( BBSVoteRecord.class);
+		Predicate p = cb.equal( root.get( BBSVoteRecord_.subjectId ), subjectId );
+		if( StringUtils.isNotEmpty( voteOptionId ) ){
+			p = cb.and( p, cb.equal( root.get( BBSVoteRecord_.optionId ), voteOptionId ));
+		}
+		cq.select( cb.count( root ) );
+		return em.createQuery(cq.where(p)).getSingleResult();
+	}
+
+	public List<BBSVoteRecord> listVoteRecordForPage(String subjectId, String voteOptionId, Integer maxRecordCount) throws Exception {
+		if( maxRecordCount == null ){
+			throw new Exception( "maxRecordCount is null." );
+		}
+		EntityManager em = this.entityManagerContainer().get(BBSVoteRecord.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteRecord> cq = cb.createQuery(BBSVoteRecord.class);
+		Root<BBSVoteRecord> root = cq.from(BBSVoteRecord.class);
+		Predicate p = cb.isNotNull( root.get( BBSVoteRecord_.id ) );
+		p = cb.and( p, cb.equal( root.get( BBSVoteRecord_.optionId ), voteOptionId ));
+		cq.orderBy( cb.desc( root.get( BBSVoteRecord_.createTime ) ) );
+		return em.createQuery(cq.where(p)).setMaxResults( maxRecordCount ).getResultList();
+	}
+
+	/**
+	 * 根据人员和选项组查询人员选择过的所有选项列表
+	 * @param personName
+	 * @param optionGroupId
+	 * @return
+	 * @throws Exception
+	 */
+	public List<BBSVoteRecord> listVoteCountByUserAndGroup(String personName, String optionGroupId) throws Exception {
+		if( StringUtils.isEmpty( personName ) ){
+			throw new Exception( "personName is empty!" );
+		}
+		if( StringUtils.isEmpty( optionGroupId ) ){
+			throw new Exception( "optionGroupId is empty!" );
+		}
+		EntityManager em = this.entityManagerContainer().get( BBSVoteRecord.class );
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<BBSVoteRecord> cq = cb.createQuery( BBSVoteRecord.class);
+		Root<BBSVoteRecord> root = cq.from( BBSVoteRecord.class );
+		Predicate p = cb.equal( root.get( BBSVoteRecord_.votorName ), personName );
+		p = cb.and( p, cb.equal( root.get( BBSVoteRecord_.optionGroupId ), optionGroupId ));
+		return em.createQuery(cq.where(p)).getResultList();
+	}
+}

+ 60 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/ActionApplication.java

@@ -0,0 +1,60 @@
+package com.x.bbs.assemble.control.jaxrs;
+
+import java.util.Set;
+
+import javax.ws.rs.ApplicationPath;
+
+import com.x.base.core.project.jaxrs.AbstractActionApplication;
+import com.x.bbs.assemble.control.jaxrs.attachment.AttachmentAction;
+import com.x.bbs.assemble.control.jaxrs.attachment.PictureAction;
+import com.x.bbs.assemble.control.jaxrs.configsetting.BBSConfigSettingAction;
+import com.x.bbs.assemble.control.jaxrs.configsetting.BBSConfigSettingAnonymousAction;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.ForumInfoAction;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.ForumInfoManagerUserAction;
+import com.x.bbs.assemble.control.jaxrs.image.ImageBase64Action;
+import com.x.bbs.assemble.control.jaxrs.login.LoginAction;
+import com.x.bbs.assemble.control.jaxrs.login.LogoutAction;
+import com.x.bbs.assemble.control.jaxrs.login.MobileIndexAction;
+import com.x.bbs.assemble.control.jaxrs.permissioninfo.PermissionInfoAction;
+import com.x.bbs.assemble.control.jaxrs.permissioninfo.PermissionInfoAdminAction;
+import com.x.bbs.assemble.control.jaxrs.replyinfo.ReplyInfoAction;
+import com.x.bbs.assemble.control.jaxrs.replyinfo.ReplyInfoManagerUserAction;
+import com.x.bbs.assemble.control.jaxrs.roleinfo.RoleInfoAction;
+import com.x.bbs.assemble.control.jaxrs.sectioninfo.SectionInfoAction;
+import com.x.bbs.assemble.control.jaxrs.sectioninfo.SectionInfoManagerUserAction;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.SubjectAttachmentAction;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.SubjectInfoAction;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.SubjectInfoManagerUserAction;
+import com.x.bbs.assemble.control.jaxrs.userinfo.UserInfoAction;
+import com.x.bbs.assemble.control.jaxrs.uuid.UUIDAction;
+
+@ApplicationPath("jaxrs")
+public class ActionApplication extends AbstractActionApplication {
+
+	public Set<Class<?>> getClasses() {
+		this.classes.add(UUIDAction.class);
+		this.classes.add(LoginAction.class);
+		this.classes.add(LogoutAction.class);
+		this.classes.add(ForumInfoAction.class);
+		this.classes.add(ForumInfoManagerUserAction.class);
+		this.classes.add(SectionInfoAction.class);
+		this.classes.add(SectionInfoManagerUserAction.class);
+		this.classes.add(SubjectInfoAction.class);
+		this.classes.add(ImageBase64Action.class);
+		this.classes.add(SubjectInfoManagerUserAction.class);
+		this.classes.add(SubjectAttachmentAction.class);
+		this.classes.add(ReplyInfoAction.class);
+		this.classes.add(ReplyInfoManagerUserAction.class);
+		this.classes.add(PermissionInfoAction.class);
+		this.classes.add(PermissionInfoAdminAction.class);
+		this.classes.add(RoleInfoAction.class);
+		this.classes.add(UserInfoAction.class);
+		this.classes.add(MobileIndexAction.class);
+		this.classes.add(BBSConfigSettingAction.class);
+		this.classes.add(BBSConfigSettingAnonymousAction.class);
+		this.classes.add(AttachmentAction.class);
+		this.classes.add(PictureAction.class);
+		return this.classes;
+	}
+
+}

+ 14 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/BBSAnonyJaxrsFilter.java

@@ -0,0 +1,14 @@
+package com.x.bbs.assemble.control.jaxrs;
+
+import javax.servlet.annotation.WebFilter;
+
+import com.x.base.core.project.jaxrs.AnonymousCipherManagerUserJaxrsFilter;
+
+@WebFilter(urlPatterns = { 
+		"/jaxrs/image/encode/*", 
+		"/servlet/image/encode/*", 
+		"/jaxrs/setting/*",
+		"/jaxrs/uuid/*"
+		}, asyncSupported = true)
+public class BBSAnonyJaxrsFilter extends AnonymousCipherManagerUserJaxrsFilter {
+}

+ 25 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/BBSJaxrsFilter.java

@@ -0,0 +1,25 @@
+package com.x.bbs.assemble.control.jaxrs;
+
+import javax.servlet.annotation.WebFilter;
+
+import com.x.base.core.project.jaxrs.AnonymousCipherManagerUserJaxrsFilter;
+
+/**
+ * web服务过滤器,匿名用户可以访问的服务
+ * @author liyi *
+ */
+@WebFilter( urlPatterns = {
+		"/jaxrs/permission/*",
+		"/jaxrs/subjectattach/*",
+		"/jaxrs/forum/*",
+		"/jaxrs/section/*",
+		"/jaxrs/subject/*",
+		"/jaxrs/reply/*",
+		"/jaxrs/userinfo/*",
+		"/jaxrs/login/*",
+		"/jaxrs/logout/*",
+		"/jaxrs/mobile/*",
+		"/jaxrs/picture/*",
+		"/jaxrs/attachment/*"
+} , asyncSupported = true)
+public class BBSJaxrsFilter extends AnonymousCipherManagerUserJaxrsFilter {}

+ 15 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/BBSJaxrsManagerUserFilter.java

@@ -0,0 +1,15 @@
+package com.x.bbs.assemble.control.jaxrs;
+
+import javax.servlet.annotation.WebFilter;
+
+import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
+
+/**
+ * web服务过滤器,将指定的URL定义为需要用户认证的服务,如果用户未登录,则无法访问该服务
+ * @author liyi *
+ */
+@WebFilter( urlPatterns = {
+		"/jaxrs/user/*",
+		"/servlet/*"
+} , asyncSupported = true)
+public class BBSJaxrsManagerUserFilter extends ManagerUserJaxrsFilter {}

+ 34 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/MethodExcuteResult.java

@@ -0,0 +1,34 @@
+package com.x.bbs.assemble.control.jaxrs;
+
+public class MethodExcuteResult {
+	
+	private Boolean success = true;
+	private String message = "success";
+	private Exception error = null;
+	private Object backObject = null;
+	
+	public Boolean getSuccess() {
+		return success;
+	}
+	public void setSuccess(Boolean success) {
+		this.success = success;
+	}
+	public String getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message = message;
+	}
+	public Exception getError() {
+		return error;
+	}
+	public void error(Exception e) {
+		this.error = e;
+	}
+	public Object getBackObject() {
+		return backObject;
+	}
+	public void setBackObject(Object backObject) {
+		this.backObject = backObject;
+	}
+}

+ 105 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionAttachmentDelete.java

@@ -0,0 +1,105 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.annotation.CheckPersistType;
+import com.x.base.core.entity.annotation.CheckRemoveType;
+import com.x.base.core.project.config.StorageMapping;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionAttachmentIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionAttachmentNotExists;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionSubjectInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionSubjectQueryById;
+import com.x.bbs.entity.BBSSubjectAttachment;
+import com.x.bbs.entity.BBSSubjectInfo;
+
+public class ActionAttachmentDelete extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionAttachmentDelete.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String id) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		BBSSubjectAttachment subjectAttachment = null;
+		BBSSubjectInfo subjectInfo = null;
+		StorageMapping mapping = null;
+		boolean check = true;
+		if (id == null || id.isEmpty()) {
+			check = false;
+			Exception exception = new ExceptionAttachmentIdEmpty();
+			result.error(exception);
+			logger.error(exception, effectivePerson, request, null);
+		}
+		if (check) {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				subjectAttachment = emc.find(id, BBSSubjectAttachment.class);
+				if (null == subjectAttachment) {
+					check = false;
+					Exception exception = new ExceptionAttachmentNotExists(id);
+					result.error(exception);
+					logger.error(exception, effectivePerson, request, null);
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionSubjectInfoProcess(e, "根据指定ID查询附件信息时发生异常.ID:" + id);
+				result.error(exception);
+				logger.error(exception, effectivePerson, request, null);
+			}
+		}
+		if (check) {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				subjectInfo = emc.find(subjectAttachment.getSubjectId(), BBSSubjectInfo.class);
+				if (null == subjectInfo) {
+					logger.warn("subjectInfo{id:" + subjectAttachment.getSubjectId() + "} is not exists, anyone can delete the attachments.");
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionSubjectQueryById(e, subjectAttachment.getSubjectId());
+				result.error(exception);
+				logger.error(exception, effectivePerson, request, null);
+			}
+		}
+		if (check) {
+			if (subjectAttachment != null) {
+				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+					mapping = ThisApplication.context().storageMappings().get(BBSSubjectAttachment.class, subjectAttachment.getStorage());
+					// 对文件进行删除
+					subjectAttachment.deleteContent(mapping);
+					// 对数据库记录进行删除
+					subjectAttachment = emc.find(id, BBSSubjectAttachment.class);
+					subjectInfo = emc.find(subjectAttachment.getSubjectId(), BBSSubjectInfo.class);
+					emc.beginTransaction(BBSSubjectAttachment.class);
+					emc.beginTransaction(BBSSubjectInfo.class);
+					if (subjectInfo != null && ListTools.isNotEmpty(subjectInfo.getAttachmentList())) {
+						subjectInfo.getAttachmentList().remove(subjectAttachment.getId());
+						emc.check(subjectInfo, CheckPersistType.all);
+					}
+					emc.remove(subjectAttachment, CheckRemoveType.all);
+
+					Wo wo = new Wo();
+					wo.setId(id);
+					result.setData(wo);
+
+					emc.commit();
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionSubjectInfoProcess(e, "根据指定ID删除附件信息时发生异常.ID:" + subjectAttachment.getSubjectId());
+					result.error(exception);
+					logger.error(exception, effectivePerson, request, null);
+				}
+			}
+		}
+		return result;
+	}
+
+	public static class Wo extends WoId {
+	}
+
+}

+ 78 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionAttachmentGet.java

@@ -0,0 +1,78 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionAttachmentIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionAttachmentNotExists;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionSubjectInfoProcess;
+import com.x.bbs.entity.BBSSubjectAttachment;
+
+public class ActionAttachmentGet extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionAttachmentGet.class );
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wrap = null;
+		BBSSubjectAttachment attachmentInfo = null;
+		Boolean check = true;
+
+		if (check) {
+			if (id == null || id.isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionAttachmentIdEmpty();
+				result.error(exception);
+				logger.error(exception, effectivePerson, request, null);
+			}
+		}
+
+		if (check) {
+			try {
+				attachmentInfo = subjectInfoServiceAdv.getAttachment(id);
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionSubjectInfoProcess(e, "根据指定ID查询附件信息时发生异常.ID:" + id);
+				result.error(exception);
+				logger.error(exception, effectivePerson, request, null);
+			}
+		}
+
+		if (check) {
+			if (attachmentInfo != null) {
+				try {
+					wrap = Wo.copier.copy(attachmentInfo);
+					result.setData(wrap);
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionSubjectInfoProcess( e, "将查询结果转换为可以输出的数据信息时发生异常." );
+					result.error(exception);
+					logger.error(exception, effectivePerson, request, null);
+				}
+			} else {
+				Exception exception = new ExceptionAttachmentNotExists(id);
+				result.error(exception);
+				logger.error(exception, effectivePerson, request, null);
+			}
+		}
+		return result;
+	}
+
+	public static class Wo extends BBSSubjectAttachment{
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		public static List<String> Excludes = new ArrayList<String>();
+		
+		public static WrapCopier< BBSSubjectAttachment, Wo > copier = WrapCopierFactory.wo( BBSSubjectAttachment.class, Wo.class, null, JpaObject.FieldsInvisible);
+	}
+}

+ 63 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionAttachmentListBySubjectId.java

@@ -0,0 +1,63 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionSubjectNotExists;
+import com.x.bbs.assemble.control.jaxrs.subjectinfo.exception.ExceptionSubjectQueryById;
+import com.x.bbs.entity.BBSSubjectAttachment;
+import com.x.bbs.entity.BBSSubjectInfo;
+
+public class ActionAttachmentListBySubjectId extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionAttachmentListBySubjectId.class );
+	
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson, String subjectId ) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<List<Wo>>();
+		List<Wo> wrapOutSubjectAttachmentList = null;
+		List<BBSSubjectAttachment> fileInfoList = null;
+		BBSSubjectInfo subjectInfo = null;
+		try {
+			subjectInfo = subjectInfoServiceAdv.get(subjectId);
+			if (subjectInfo != null) {
+				if ( subjectInfo.getAttachmentList() != null && subjectInfo.getAttachmentList().size() > 0 ) {
+					fileInfoList = subjectInfoServiceAdv.listAttachmentByIds( subjectInfo.getAttachmentList() );
+				} else {
+					fileInfoList = new ArrayList<BBSSubjectAttachment>();
+				}
+				wrapOutSubjectAttachmentList = Wo.copier.copy( fileInfoList );
+			} else {
+				Exception exception = new ExceptionSubjectNotExists(subjectId);
+				result.error(exception);
+				logger.error(exception, effectivePerson, request, null);
+			}
+			if (wrapOutSubjectAttachmentList == null) {
+				wrapOutSubjectAttachmentList = new ArrayList<Wo>();
+			}
+			result.setData(wrapOutSubjectAttachmentList);
+		} catch (Throwable th) {
+			Exception exception = new ExceptionSubjectQueryById(th, subjectId);
+			result.error(exception);
+			logger.error(exception, effectivePerson, request, null);
+		}
+		return result;
+	}
+
+	public static class Wo extends BBSSubjectAttachment{
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		public static List<String> Excludes = new ArrayList<String>();
+		
+		public static WrapCopier< BBSSubjectAttachment, Wo > copier = WrapCopierFactory.wo( BBSSubjectAttachment.class, Wo.class, null, JpaObject.FieldsInvisible);
+	}
+}

+ 36 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionDownloadWithId.java

@@ -0,0 +1,36 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.project.config.StorageMapping;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoFile;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.entity.BBSSubjectAttachment;
+
+public class ActionDownloadWithId extends BaseAction {
+	
+	ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		BBSSubjectAttachment attachment = subjectInfoServiceAdv.getAttachment(id);
+		
+		if ( null == attachment ) {
+			throw new Exception("附件不存在。id:" + id ) ;
+		}else {
+			StorageMapping mapping = ThisApplication.context().storageMappings().get(BBSSubjectAttachment.class, attachment.getStorage());
+			Wo wo = new Wo(attachment.readContent(mapping), 
+					this.contentType(false, attachment.getName()), 
+					this.contentDisposition(false, attachment.getName()));
+			result.setData(wo);
+		}
+		return result;
+	}
+
+	public static class Wo extends WoFile {
+		public Wo(byte[] bytes, String contentType, String contentDisposition) {
+			super(bytes, contentType, contentDisposition);
+		}
+	}
+
+}

+ 35 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionDownloadWithIdStream.java

@@ -0,0 +1,35 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.project.config.StorageMapping;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoFile;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.entity.BBSSubjectAttachment;
+
+public class ActionDownloadWithIdStream extends BaseAction {
+
+	ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String id, Boolean stream) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		BBSSubjectAttachment attachment = subjectInfoServiceAdv.getAttachment(id);
+		
+		if ( null == attachment ) {
+			throw new Exception("附件不存在。id:" + id ) ;
+		}else {
+			StorageMapping mapping = ThisApplication.context().storageMappings().get(BBSSubjectAttachment.class, attachment.getStorage());
+			Wo wo = new Wo(attachment.readContent(mapping), 
+					this.contentType(stream, attachment.getName()), 
+					this.contentDisposition(stream, attachment.getName()));
+			result.setData(wo);
+		}
+		return result;
+	}
+
+	public static class Wo extends WoFile {
+		public Wo(byte[] bytes, String contentType, String contentDisposition) {
+			super(bytes, contentType, contentDisposition);
+		}
+	}
+}

+ 98 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionSectionIconUpdate.java

@@ -0,0 +1,98 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.imgscalr.Scalr;
+
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.WrapOutId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.entity.BBSSectionInfo;
+
+public class ActionSectionIconUpdate extends BaseAction {
+	
+	private static Logger logger = LoggerFactory.getLogger(ActionSectionIconUpdate.class);
+
+	protected ActionResult<WrapOutId> execute( HttpServletRequest request, EffectivePerson effectivePerson, 
+			String sectionId, byte[] bytes, FormDataContentDisposition disposition) {
+		ActionResult<WrapOutId> result = new ActionResult<>();
+		BBSSectionInfo sectionInfo = null;
+		String icon = null;
+		Boolean check = true;		
+		String hostIp = request.getRemoteAddr();
+		String hostName = request.getRemoteAddr();
+		
+		if( check ){
+			if( StringUtils.isEmpty(sectionId) ){
+				check = false;
+				Exception exception = new ExceptionURLParameterGet( new Exception("未获取到版块ID") );
+				result.error( exception );
+			}
+		}
+		
+		if (check) {
+			try {
+				sectionInfo = sectionInfoService.get(sectionId);
+				if (sectionInfo == null) {
+					check = false;
+					result.error(new Exception("版块信息不存在,无法继续进行图标更新操作!ID:" + sectionId));
+				}
+			} catch (Exception e) {
+				check = false;
+				result.error(e);
+				logger.warn("system query section info with id got an exception!id:" + sectionId);
+				logger.error(e);
+			}
+		}
+		
+		if( check ){
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			try ( InputStream input = new ByteArrayInputStream(bytes)) {
+				BufferedImage image = ImageIO.read(input);
+				BufferedImage scalrImage = Scalr.resize(image, 72, 72);
+				ImageIO.write(scalrImage, "png", baos);
+				icon = Base64.encodeBase64String(baos.toByteArray());
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+				logger.error( e, effectivePerson, request, null );
+			}
+		}
+		
+		if (check) {
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				sectionInfo = emc.find(sectionId, BBSSectionInfo.class);
+				if (sectionInfo != null) {
+					emc.beginTransaction(BBSSectionInfo.class);
+					sectionInfo.setIcon(icon);
+					emc.commit();
+					operationRecordService.sectionIconOperation(effectivePerson.getDistinguishedName(), sectionInfo, "UPLOAD", hostIp, hostName);
+					WrapOutId wrap = new WrapOutId(sectionInfo.getId());
+					result.setData( wrap );
+				} else {
+					check = false;
+					result.error(new Exception("版块信息不存在,无法保存版块图信息!ID:" + sectionId));
+				}
+			} catch (Exception e) {
+				check = false;
+				result.error(e);
+				logger.warn("system save image for section icon got an exception.");
+				logger.error(e);
+			}
+		}
+		return result;
+	}
+}

+ 136 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionUpload.java

@@ -0,0 +1,136 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+
+import com.x.base.core.project.config.StorageMapping;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.entity.BBSSubjectAttachment;
+import com.x.bbs.entity.BBSSubjectInfo;
+
+public class ActionUpload extends BaseAction {
+	
+	private static Logger logger = LoggerFactory.getLogger(ActionUpload.class);
+
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, 
+			String subjectId, String site, byte[] bytes, FormDataContentDisposition disposition) {
+		ActionResult<Wo> result = new ActionResult<>();
+		BBSSubjectAttachment attachment = null;
+		BBSSubjectInfo subject = null;
+		StorageMapping mapping = null;
+		String fileName = null;
+		Boolean check = true;		
+		
+		if( check ){
+			if( StringUtils.isEmpty(subjectId) ){
+				check = false;
+				Exception exception = new ExceptionURLParameterGet( new Exception("未获取到主贴ID") );
+				result.error( exception );
+			}
+		}
+		
+		if( check ){
+			//判断文档是否已经存在
+			try {
+				subject = subjectInfoServiceAdv.get( subjectId );
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+				logger.error( e, effectivePerson, request, null );
+			}
+		}
+		
+		if( check ){
+			try {
+				fileName = FilenameUtils.getName(new String(disposition.getFileName().getBytes(DefaultCharset.name_iso_8859_1), DefaultCharset.name));
+				/** 禁止不带扩展名的文件上传 */
+				if (StringUtils.isEmpty(fileName)) {
+					check = false;
+					Exception exception = new ExceptionEmptyExtension( fileName );
+					result.error( exception );
+				} 
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+			}
+		}
+		
+		if( check ){
+			
+			try {
+				mapping = ThisApplication.context().storageMappings().random( BBSSubjectAttachment.class );
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+				logger.warn( "系统在获取存储的时候发生异常!" );
+				logger.error( e, effectivePerson, request, null );
+			}
+		}
+		if( check ){
+			try {
+				attachment = this.concreteAttachment( mapping, subject, fileName, effectivePerson, site );
+				attachment.saveContent(mapping, bytes, fileName);
+				attachment = subjectInfoServiceAdv.saveAttachment( subjectId, attachment );
+				Wo wo = new Wo();
+				wo.setId( attachment.getId() );
+				result.setData(wo);
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+				logger.warn( "系统在保存文件和更新数据时候发生异常!" );
+				logger.error( e, effectivePerson, request, null );
+			}
+		}
+		logger.info(result.getMessage());
+		return result;
+	}
+
+	private BBSSubjectAttachment concreteAttachment(StorageMapping mapping, BBSSubjectInfo subject, String name, EffectivePerson effectivePerson, String site) throws Exception {
+		BBSSubjectAttachment attachment = new BBSSubjectAttachment();
+		String fileName = UUID.randomUUID().toString();
+		String extension = FilenameUtils.getExtension( name );
+		if ( StringUtils.isNotEmpty(extension)) {
+			fileName = fileName + "." + extension;
+		}else{
+			throw new Exception("file extension is empty.");
+		}
+		if( name.indexOf( "\\" ) >0 ){
+			name = StringUtils.substringAfterLast( name, "\\");
+		}
+		if( name.indexOf( "/" ) >0 ){
+			name = StringUtils.substringAfterLast( name, "/");
+		}
+		attachment.setExtension(extension);
+		attachment.setName(name);
+		attachment.setFileName(fileName);
+		attachment.setExtension(extension);
+		attachment.setFileHost( mapping.getHost() );
+		attachment.setFilePath( "" );
+		attachment.setStorage( mapping.getName() );
+		attachment.setSite(site);
+		attachment.setCreateTime( new Date() );
+		attachment.setCreatorUid( effectivePerson.getDistinguishedName() );
+		if( subject != null ){
+			attachment.setDescription( subject.getTitle() );
+		}
+		attachment.setLastUpdateTime( new Date() );
+		attachment.setLength( 0L );
+		return attachment;
+	}
+
+	public static class Wo extends WoId {
+
+	}
+}

+ 48 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionUploadAndEncode.java

@@ -0,0 +1,48 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.codec.binary.Base64;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.imgscalr.Scalr;
+
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.WrapOutString;
+
+public class ActionUploadAndEncode extends BaseAction {
+
+	protected ActionResult<WrapOutString> execute( HttpServletRequest request, EffectivePerson effectivePerson, 
+			Integer size, byte[] bytes, FormDataContentDisposition disposition) {
+		ActionResult<WrapOutString> result = new ActionResult<>();
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		
+		try ( InputStream input = new ByteArrayInputStream(bytes)) {
+			BufferedImage image = ImageIO.read(input);
+			int width = image.getWidth();
+			int height = image.getHeight();
+			if (size > 0) {
+				if (width * height > size * size) {
+					image = Scalr.resize(image, size);
+				}
+			}
+			ImageIO.write(image, "png", baos);
+			byte[] byteArray = baos.toByteArray();
+			WrapOutString wrap = new WrapOutString();
+			wrap.setValue(Base64.encodeBase64String(byteArray));
+			result.setData( wrap);
+		} catch (IOException e) {
+			e.printStackTrace();
+			result.error(e);
+		}
+		return result;
+	}
+
+}

+ 143 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ActionUploadCallback.java

@@ -0,0 +1,143 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+
+import com.x.base.core.project.config.StorageMapping;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoCallback;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.DefaultCharset;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.entity.BBSSubjectAttachment;
+import com.x.bbs.entity.BBSSubjectInfo;
+
+public class ActionUploadCallback extends BaseAction {
+	
+	private static Logger logger = LoggerFactory.getLogger(ActionUploadCallback.class);
+
+	protected ActionResult<Wo<WoObject>> execute( HttpServletRequest request, EffectivePerson effectivePerson, 
+			String subjectId, String callback, String site, byte[] bytes, FormDataContentDisposition disposition) {
+		ActionResult<Wo<WoObject>> result = new ActionResult<>();
+		BBSSubjectAttachment attachment = null;
+		BBSSubjectInfo subject = null;
+		StorageMapping mapping = null;
+		String fileName = null;
+		Boolean check = true;		
+		
+		if( check ){
+			if( StringUtils.isEmpty(subjectId) ){
+				check = false;
+				Exception exception = new ExceptionURLParameterGetCallback( callback,  new Exception("未获取到主贴ID") );
+				result.error( exception );
+			}
+		}
+		
+		if( check ){
+			//判断文档是否已经存在
+			try {
+				subject = subjectInfoServiceAdv.get( subjectId );
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+				logger.error( e, effectivePerson, request, null );
+			}
+		}
+		
+		if( check ){
+			try {
+				fileName = FilenameUtils.getName(new String(disposition.getFileName().getBytes(DefaultCharset.name_iso_8859_1), DefaultCharset.name));
+				/** 禁止不带扩展名的文件上传 */
+				if (StringUtils.isEmpty(fileName)) {
+					check = false;
+					Exception exception = new ExceptionEmptyExtension( fileName );
+					result.error( exception );
+				} 
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+			}
+		}
+		
+		if( check ){
+			
+			try {
+				mapping = ThisApplication.context().storageMappings().random( BBSSubjectAttachment.class );
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+				logger.warn( "系统在获取存储的时候发生异常!" );
+				logger.error( e, effectivePerson, request, null );
+			}
+		}
+		if( check ){
+			try {
+				attachment = this.concreteAttachment( mapping, subject, fileName, effectivePerson, site );
+				attachment.saveContent(mapping, bytes, fileName);
+				attachment = subjectInfoServiceAdv.saveAttachment( subjectId, attachment );
+				WoObject woObject = new WoObject();
+				woObject.setId(attachment.getId());
+				Wo<WoObject> wo = new Wo<>(callback, woObject);
+				result.setData(wo);
+			} catch (Exception e) {
+				check = false;
+				result.error( e );
+				logger.warn( "系统在保存文件和更新数据时候发生异常!" );
+				logger.error( e, effectivePerson, request, null );
+			}
+		}
+		logger.info(result.getMessage());
+		return result;
+	}
+
+	private BBSSubjectAttachment concreteAttachment(StorageMapping mapping, BBSSubjectInfo subject, String name, EffectivePerson effectivePerson, String site) throws Exception {
+		BBSSubjectAttachment attachment = new BBSSubjectAttachment();
+		String fileName = UUID.randomUUID().toString();
+		String extension = FilenameUtils.getExtension( name );
+		if ( StringUtils.isNotEmpty(extension)) {
+			fileName = fileName + "." + extension;
+		}else{
+			throw new Exception("file extension is empty.");
+		}
+		if( name.indexOf( "\\" ) >0 ){
+			name = StringUtils.substringAfterLast( name, "\\");
+		}
+		if( name.indexOf( "/" ) >0 ){
+			name = StringUtils.substringAfterLast( name, "/");
+		}
+		attachment.setExtension(extension);
+		attachment.setName(name);
+		attachment.setFileName(fileName);
+		attachment.setExtension(extension);
+		attachment.setFileHost( mapping.getHost() );
+		attachment.setFilePath( "" );
+		attachment.setStorage( mapping.getName() );
+		attachment.setSite(site);
+		attachment.setCreateTime( new Date() );
+		attachment.setCreatorUid( effectivePerson.getDistinguishedName() );
+		if( subject != null ){
+			attachment.setDescription( subject.getTitle() );
+		}
+		attachment.setLastUpdateTime( new Date() );
+		attachment.setLength( 0L );
+		return attachment;
+	}
+
+	public static class Wo<T> extends WoCallback<T> {
+		public Wo(String callbackName, T t) {
+			super(callbackName, t);
+		}
+	}
+
+	public static class WoObject extends WoId {
+	}
+}

+ 175 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/AttachmentAction.java

@@ -0,0 +1,175 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+@Path("attachment")
+@JaxrsDescribe("附件操作")
+public class AttachmentAction extends StandardJaxrsAction {
+	private static Logger logger = LoggerFactory.getLogger(AttachmentAction.class);
+
+	@JaxrsMethodDescribe(value = "上传附件.", action = StandardJaxrsAction.class)
+	@POST
+	@Path("upload/subject/{subjectId}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.MULTIPART_FORM_DATA)
+	public void upload(@Suspended final AsyncResponse asyncResponse, 
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("主贴ID") @PathParam("subjectId") String subjectId, 
+			@JaxrsParameterDescribe("位置") @FormDataParam("site") String site, 
+			@FormDataParam(FILE_FIELD) final byte[] bytes,
+			@FormDataParam(FILE_FIELD) final FormDataContentDisposition disposition) {
+		ActionResult<ActionUpload.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUpload().execute(request, effectivePerson, subjectId, site, bytes, disposition);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "上传附件(带回调).", action = ActionUploadCallback.class)
+	@POST
+	@Path("upload/subject/{subjectId}/callback/{callback}")
+	@Produces(HttpMediaType.TEXT_HTML_UTF_8)
+	@Consumes(MediaType.MULTIPART_FORM_DATA)
+	public void uploadCallback(@Suspended final AsyncResponse asyncResponse, 
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("主贴ID") @PathParam("subjectId") String subjectId, 
+			@JaxrsParameterDescribe("回调函数名") @PathParam("callback") String callback,
+			@JaxrsParameterDescribe("位置") @FormDataParam("site") String site, 
+			@FormDataParam(FILE_FIELD) final byte[] bytes,
+			@FormDataParam(FILE_FIELD) final FormDataContentDisposition disposition) {
+		ActionResult<ActionUploadCallback.Wo<ActionUploadCallback.WoObject>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUploadCallback().execute(request, effectivePerson, subjectId, callback, site, bytes, disposition);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "根据附件Id获取单个附件信息.", action = ActionAttachmentGet.class)
+	@GET
+	@Path("{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getWithId(@Suspended final AsyncResponse asyncResponse, 
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("附件ID") @PathParam("id") String id) {
+		ActionResult<ActionAttachmentGet.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionAttachmentGet().execute(request, effectivePerson, id );
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "根据Subject获取Attachment列表.", action = ActionAttachmentListBySubjectId.class)
+	@GET
+	@Path("list/subject/{subjectId}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listWithSubjectId(@Suspended final AsyncResponse asyncResponse, 
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("贴子ID") @PathParam("subjectId") String subjectId) {
+		ActionResult<List<ActionAttachmentListBySubjectId.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionAttachmentListBySubjectId().execute(request, effectivePerson, subjectId);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "根据ID下载指定附件", action = StandardJaxrsAction.class)
+	@GET
+	@Path("download/{id}")
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void downloadWithSubject(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("附件标识") @PathParam("id") String id) {
+		ActionResult<ActionDownloadWithId.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDownloadWithId().execute(request, effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "根据Work下载附件,设定是否使用stream输出", action = ActionDownloadWithIdStream.class)
+	@GET
+	@Path("download/{id}/stream/{stream}")
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void downloadWithSubjectStream(@Suspended final AsyncResponse asyncResponse, 
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("附件标识") @PathParam("id") String id, 
+			@JaxrsParameterDescribe("用.APPLICATION_OCTET_STREAM头输出") @PathParam("stream") Boolean stream) {
+		ActionResult<ActionDownloadWithIdStream.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDownloadWithIdStream().execute(request, effectivePerson, id, stream);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "删除指定subject下指定的附件.", action = ActionAttachmentDelete.class)
+	@DELETE
+	@Path("{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void delete(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("附件标识") @PathParam("id") String id ) {
+		ActionResult<ActionAttachmentDelete.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionAttachmentDelete().execute(request, effectivePerson, id);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/BaseAction.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.bbs.assemble.control.service.BBSOperationRecordService;
+import com.x.bbs.assemble.control.service.BBSSectionInfoService;
+import com.x.bbs.assemble.control.service.BBSSubjectInfoServiceAdv;
+
+public class BaseAction extends StandardJaxrsAction {
+	protected BBSSubjectInfoServiceAdv subjectInfoServiceAdv = new BBSSubjectInfoServiceAdv();
+	protected BBSSectionInfoService sectionInfoService = new BBSSectionInfoService();
+	protected BBSOperationRecordService operationRecordService = new BBSOperationRecordService();
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionEmptyExtension.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionEmptyExtension extends PromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionEmptyExtension(String name) {
+		super("不能上传文件扩展名为空的文件: {}.", name);
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionEmptyExtensionCallback.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import com.x.base.core.project.exception.CallbackPromptException;
+
+class ExceptionEmptyExtensionCallback extends CallbackPromptException {
+
+	private static final long serialVersionUID = 4132300948670472899L;
+
+	ExceptionEmptyExtensionCallback(String callbackName, String name) {
+		super(callbackName, "不能上传文件扩展名为空的文件: {}.", name);
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionURLParameterGet.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionURLParameterGet extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+	
+	public ExceptionURLParameterGet( Throwable e ) {
+		super("系统在解析传入的URL参数时发生异常.", e);
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/ExceptionURLParameterGetCallback.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import com.x.base.core.project.exception.CallbackPromptException;
+
+class ExceptionURLParameterGetCallback extends CallbackPromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+	
+	public ExceptionURLParameterGetCallback( String callbackName, Throwable e ) {
+		super(callbackName, "系统在解析传入的URL参数时发生异常.", e);
+	}
+}

+ 76 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/attachment/PictureAction.java

@@ -0,0 +1,76 @@
+package com.x.bbs.assemble.control.jaxrs.attachment;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.http.WrapOutId;
+import com.x.base.core.project.http.WrapOutString;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+
+@Path("picture")
+@JaxrsDescribe("图片操作")
+public class PictureAction extends StandardJaxrsAction {
+	private static Logger logger = LoggerFactory.getLogger(PictureAction.class);
+
+	@JaxrsMethodDescribe(value = "将图片转为base64编码,并且进行尺寸转换.", action = ActionUploadAndEncode.class)
+	@POST
+	@Path("encode/base64/size/{size}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.MULTIPART_FORM_DATA)
+	public void pictureEncode(@Suspended final AsyncResponse asyncResponse, 
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("尺寸大小") @PathParam("size") Integer size,
+			@FormDataParam(FILE_FIELD) final byte[] bytes,
+			@FormDataParam(FILE_FIELD) final FormDataContentDisposition disposition) {
+		ActionResult<WrapOutString> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionUploadAndEncode().execute(request, effectivePerson, size, bytes, disposition);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+	
+	@JaxrsMethodDescribe(value = "更新版块图标.", action = ActionSectionIconUpdate.class)
+	@POST
+	@Path("section/{id}/icon")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.MULTIPART_FORM_DATA)
+	public void sectionIconUpdate(@Suspended final AsyncResponse asyncResponse, 
+			@Context HttpServletRequest request, 
+			@JaxrsParameterDescribe("版块ID") @PathParam("id") String id,
+			@FormDataParam(FILE_FIELD) final byte[] bytes,
+			@FormDataParam(FILE_FIELD) final FormDataContentDisposition disposition) {
+		ActionResult<WrapOutId> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionSectionIconUpdate().execute(request, effectivePerson, id, bytes, disposition);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 78 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGet.java

@@ -0,0 +1,78 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingNotExists;
+import com.x.bbs.entity.BBSConfigSetting;
+
+import net.sf.ehcache.Element;
+
+public class ActionGet extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionGet.class );
+	private String catchNamePrefix = this.getClass().getName();
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wrap = null;
+		BBSConfigSetting configSetting = null;
+		
+		if( id == null || id.isEmpty() ){
+			Exception exception = new ExceptionConfigSettingIdEmpty();
+			result.error( exception );
+		}else{
+			String cacheKey = catchNamePrefix + "#id#" + id;
+			Element element = null;
+			element = cache.get( cacheKey );
+			if( element != null ){
+				wrap = (Wo) element.getObjectValue();
+				result.setData( wrap );
+			}else{
+				try {
+					configSetting = configSettingService.get( id );
+					if( configSetting != null ){
+						wrap = Wo.copier.copy( configSetting );
+						cache.put( new Element( cacheKey, wrap ) );
+						result.setData(wrap);
+					}else{
+						Exception exception = new ExceptionConfigSettingNotExists( id );
+						result.error( exception );
+					}
+				} catch ( Exception e ) {
+					Exception exception = new ExceptionConfigSettingInfoProcess( e, "系统在根据ID获取BBS系统设置信息时发生异常!ID:" + id );
+					result.error( exception );
+					logger.error( e, effectivePerson, request, null);
+				}
+			}	
+		}
+		return result;
+	}
+
+	public static class Wo extends BBSConfigSetting{
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+
+		public static WrapCopier<BBSConfigSetting, Wo> copier = WrapCopierFactory.wo( BBSConfigSetting.class, Wo.class, null, JpaObject.FieldsInvisible);
+		
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+		
+	}
+}

+ 75 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGetAll.java

@@ -0,0 +1,75 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.SortTools;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingInfoProcess;
+import com.x.bbs.entity.BBSConfigSetting;
+
+import net.sf.ehcache.Element;
+
+public class ActionGetAll extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionGetAll.class );
+	private String catchNamePrefix = this.getClass().getName();
+	
+	@SuppressWarnings("unchecked")
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson ) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<List<Wo>>();
+		List<Wo> wraps = null;
+		List<BBSConfigSetting> configSettingList = null;
+		String cacheKey = catchNamePrefix + "#all";
+		Element element = null;
+		
+		element = cache.get( cacheKey );
+		
+		if( element != null ){
+			wraps = ( List<Wo> ) element.getObjectValue();
+			result.setData( wraps );
+		}else{
+			try {
+				configSettingList = configSettingService.listAll();
+				if( configSettingList != null ){
+					wraps = Wo.copier.copy( configSettingList );
+					SortTools.asc( wraps, true, "orderNumber");
+					cache.put( new Element( cacheKey, wraps ) );
+					result.setData( wraps );
+				}
+			} catch ( Exception e ) {
+				Exception exception = new ExceptionConfigSettingInfoProcess( e, "系统在获取所有BBS系统设置信息时发生异常." );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		return result;
+	}
+	
+	public static class Wo extends BBSConfigSetting{
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+
+		public static WrapCopier<BBSConfigSetting, Wo> copier = WrapCopierFactory.wo( BBSConfigSetting.class, Wo.class, null,JpaObject.FieldsInvisible);
+		
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+		
+	}
+
+}

+ 77 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGetBBSName.java

@@ -0,0 +1,77 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingNotExists;
+import com.x.bbs.entity.BBSConfigSetting;
+
+import net.sf.ehcache.Element;
+
+public class ActionGetBBSName extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionGetBBSName.class );
+	private String catchNamePrefix = this.getClass().getName();
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wrap = null;
+		BBSConfigSetting configSetting = null;
+		
+		String cacheKey = catchNamePrefix + "#code#BBS_LOGO_NAME";
+		Element element = null;
+		
+		element = cache.get( cacheKey );
+		if( element != null ){
+			wrap = (Wo) element.getObjectValue();
+			result.setData( wrap );
+		}else{
+			try {
+				configSetting = configSettingService.getWithConfigCode( "BBS_LOGO_NAME" );
+				if( configSetting != null ){
+					wrap = Wo.copier.copy( configSetting );
+					cache.put( new Element( cacheKey, wrap ) );
+					result.setData(wrap);
+				}else{
+					Exception exception = new ExceptionConfigSettingNotExists( "BBS_LOGO_NAME" );
+					result.error( exception );
+				}
+			} catch (Exception e) {
+				Exception exception = new ExceptionConfigSettingInfoProcess( e, "系统在根据编码获取BBS系统设置信息时发生异常!Code:" + "BBS_LOGO_NAME" );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}	
+		return result;
+	}
+
+	public static class Wo extends BBSConfigSetting{
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static List<String> Excludes = new ArrayList<String>();
+
+		public static WrapCopier<BBSConfigSetting, Wo> copier = WrapCopierFactory.wo( BBSConfigSetting.class, Wo.class, null, JpaObject.FieldsInvisible);
+		
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+		
+	}
+}

+ 109 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionGetWithCode.java

@@ -0,0 +1,109 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingCodeEmpty;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingNotExists;
+import com.x.bbs.entity.BBSConfigSetting;
+
+import net.sf.ehcache.Element;
+
+public class ActionGetWithCode extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionGetWithCode.class );
+	private String catchNamePrefix = this.getClass().getName();
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<Wo>();
+		Wo wrap = null;
+		Wi wi = null;
+		BBSConfigSetting configSetting = null;
+		String code = null;
+		String cacheKey = null;
+		Boolean check = true;
+		
+		try {
+			wi = this.convertToWrapIn( jsonElement, Wi.class );
+		} catch (Exception e ) {
+			check = false;
+			Exception exception = new ExceptionConfigSettingInfoProcess( e, "系统在将JSON信息转换为对象时发生异常。JSON:" + jsonElement.toString() );
+			result.error( exception );
+			logger.error( e, effectivePerson, request, null);
+		}
+		
+		if( check ){
+			
+			code = wi.getConfigCode();
+			cacheKey = catchNamePrefix + "#code#" + code;
+			
+			if( code == null || code.isEmpty() ){
+				Exception exception = new ExceptionConfigSettingCodeEmpty();
+				result.error( exception );
+			}else{
+				Element element = null;
+				element = cache.get( cacheKey );
+				if( element != null ){
+					wrap = ( Wo ) element.getObjectValue();
+					result.setData( wrap );
+				}else{
+					try {
+						configSetting = configSettingService.getWithConfigCode( code );
+						if( configSetting != null ){
+							wrap = Wo.copier.copy( configSetting );
+							cache.put( new Element( cacheKey, wrap ) );
+							result.setData(wrap);
+						}else{
+							Exception exception = new ExceptionConfigSettingNotExists( code );
+							result.error( exception );
+						}
+					} catch (Exception e) {
+						Exception exception = new ExceptionConfigSettingInfoProcess( e, "系统在根据编码获取BBS系统设置信息时发生异常!Code:" + code );
+						result.error( exception );
+						logger.error( e, effectivePerson, request, null);
+					}
+				}
+			}	
+		}
+		return result;
+	}
+
+	public static class Wi extends BBSConfigSetting {
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static List<String> Excludes = new ArrayList<String>(JpaObject.FieldsUnmodify);
+
+	}
+	
+	public static class Wo extends BBSConfigSetting{
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static List<String> Excludes = new ArrayList<String>();
+
+		public static WrapCopier<BBSConfigSetting, Wo> copier = WrapCopierFactory.wo( BBSConfigSetting.class, Wo.class, null, JpaObject.FieldsInvisible	);
+		
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+		
+	}
+}

+ 155 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/ActionUpdate.java

@@ -0,0 +1,155 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingCodeEmpty;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingNotExists;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingValueEmpty;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionInsufficientPermissions;
+import com.x.bbs.entity.BBSConfigSetting;
+
+public class ActionUpdate extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionUpdate.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson,
+			JsonElement jsonElement) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wrap = null;
+		BBSConfigSetting configSetting = null;
+		Wi wrapIn = null;
+		Boolean check = true;
+
+		try {
+			wrapIn = this.convertToWrapIn(jsonElement, Wi.class);
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new ExceptionConfigSettingInfoProcess(e,
+					"系统在将JSON信息转换为对象时发生异常。JSON:" + jsonElement.toString());
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+
+		if (check) {
+			try {
+				if (!userManagerService.isHasPlatformRole( effectivePerson.getDistinguishedName(),
+						ThisApplication.BBSMANAGER ) && !effectivePerson.isManager()) {
+					check = false;
+					logger.warn("用户没有BBSManager角色,并且也不是系统管理员!USER:" + effectivePerson.getDistinguishedName());
+					Exception exception = new ExceptionInsufficientPermissions(effectivePerson.getDistinguishedName(),
+							ThisApplication.BBSMANAGER);
+					result.error(exception);
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionInsufficientPermissions(effectivePerson.getDistinguishedName(),
+						ThisApplication.BBSMANAGER);
+				result.error(exception);
+				result.error(e);
+			}
+		}
+		if (check) {
+			if (wrapIn.getConfigCode() == null || wrapIn.getConfigCode().isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionConfigSettingCodeEmpty();
+				result.error(exception);
+			}
+		}
+
+		if (check) {
+			if (wrapIn.getConfigValue() == null || wrapIn.getConfigValue().isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionConfigSettingValueEmpty();
+				result.error(exception);
+			}
+		}
+		if (check) {
+			try {
+				configSetting = configSettingService.getWithConfigCode(wrapIn.getConfigCode());
+				if (configSetting == null) {
+					check = false;
+					Exception exception = new ExceptionConfigSettingNotExists(wrapIn.getConfigCode());
+					result.error(exception);
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionConfigSettingInfoProcess(e,
+						"系统在根据编码获取BBS系统设置信息时发生异常!Code:" + wrapIn.getConfigCode());
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		if (check) {
+			try {
+				configSetting.setConfigValue(wrapIn.getConfigValue());
+				configSetting = configSettingService.update(configSetting);
+			} catch (Exception e) {
+				Exception exception = new ExceptionConfigSettingInfoProcess(e,
+						"根据ID更新BBS系统设置信息时发生异常.ID:" + wrapIn.getId());
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		if (check) {
+			if (configSetting != null) {
+				try {
+					wrap = Wo.copier.copy(configSetting);
+					result.setData(wrap);
+				} catch (Exception e) {
+					Exception exception = new ExceptionConfigSettingInfoProcess(e, "系统在转换所有BBS系统设置信息为输出对象时发生异常.");
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}
+		}
+		notifyCache();
+		return result;
+	}
+
+	private void notifyCache() throws Exception {
+		ApplicationCache.notify(BBSConfigSetting.class);
+	}
+
+	public static class Wi extends BBSConfigSetting {
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static List<String> Excludes = new ArrayList<String>(JpaObject.FieldsUnmodify);
+
+	}
+
+	public static class Wo extends BBSConfigSetting {
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static List<String> Excludes = new ArrayList<String>();
+
+		public static WrapCopier<BBSConfigSetting, Wo> copier = WrapCopierFactory.wo(BBSConfigSetting.class, Wo.class,
+				null, JpaObject.FieldsInvisible);
+
+		private Long rank = 0L;
+
+		public Long getRank() {
+			return rank;
+		}
+
+		public void setRank(Long rank) {
+			this.rank = rank;
+		}
+
+	}
+}

+ 128 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAction.java

@@ -0,0 +1,128 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingProcess;
+
+@Path("user/setting")
+@JaxrsDescribe("论坛设置操作")
+public class BBSConfigSettingAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(BBSConfigSettingAction.class);
+
+	@JaxrsMethodDescribe(value = "更新论坛设置对象, 配置信息不允许新建和删除操作.", action = ActionUpdate.class)
+	@PUT
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void update(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionUpdate.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionUpdate().execute(request, effectivePerson, jsonElement);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionConfigSettingProcess(e, "系统在更新配置信息时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "根据ID获取论坛设置对象.", action = ActionGet.class)
+	@GET
+	@Path("{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("配置信息ID") @PathParam("id") String id) {
+		ActionResult<ActionGet.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		if (id == null || id.isEmpty()) {
+			Exception exception = new ExceptionConfigSettingIdEmpty();
+			result.error(exception);
+		} else {
+			try {
+				result = new ActionGet().execute(request, effectivePerson, id);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionConfigSettingProcess(e, "系统在更新配置信息时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "获取所有论坛设置信息列表.", action = ActionGetAll.class)
+	@GET
+	@Path("all")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listAll(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<List<ActionGetAll.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGetAll().execute(request, effectivePerson);
+		} catch (Exception e) {
+			result = new ActionResult<>();
+			Exception exception = new ExceptionConfigSettingProcess(e, "系统在更新配置信息时发生异常!");
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "根据编码获取论坛设置对象.", action = ActionGetWithCode.class)
+	@Path("code")
+	@PUT
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getByCode(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionGetWithCode.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionGetWithCode().execute(request, effectivePerson, jsonElement);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionConfigSettingProcess(e, "系统在更新配置信息时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 49 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/BBSConfigSettingAnonymousAction.java

@@ -0,0 +1,49 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.configsetting.exception.ExceptionConfigSettingProcess;
+
+@Path("setting")
+@JaxrsDescribe("论坛配置查询(匿名)")
+public class BBSConfigSettingAnonymousAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(BBSConfigSettingAnonymousAction.class);
+
+	@JaxrsMethodDescribe(value = "获取BBS系统名称配置的论坛设置对象.", action = ActionGetBBSName.class)
+	@GET
+	@Path("bbsName")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void getBBSName(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<ActionGetBBSName.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionGetBBSName().execute(request, effectivePerson);
+		} catch (Exception e) {
+			result = new ActionResult<>();
+			Exception exception = new ExceptionConfigSettingProcess(e, "系统在更新配置信息时发生异常!");
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 18 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/BaseAction.java

@@ -0,0 +1,18 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting;
+
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.bbs.assemble.control.service.BBSConfigSettingService;
+import com.x.bbs.assemble.control.service.UserManagerService;
+import com.x.bbs.entity.BBSConfigSetting;
+
+import net.sf.ehcache.Ehcache;
+
+public class BaseAction extends StandardJaxrsAction{
+	
+	protected Ehcache cache = ApplicationCache.instance().getCache( BBSConfigSetting.class);
+	
+	protected UserManagerService userManagerService = new UserManagerService();
+	protected BBSConfigSettingService configSettingService = new BBSConfigSettingService();
+	
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingCodeEmpty.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionConfigSettingCodeEmpty extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionConfigSettingCodeEmpty() {
+		super("code为空, 无法进行查询或者保存." );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingIdEmpty.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionConfigSettingIdEmpty extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionConfigSettingIdEmpty() {
+		super("id为空, 无法进行查询." );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingInfoProcess.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionConfigSettingInfoProcess extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionConfigSettingInfoProcess( Throwable e, String message ) {
+		super( message, e );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingNotExists.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionConfigSettingNotExists extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionConfigSettingNotExists( String id ) {
+		super("指定ID的BBS系统设置不存在.ID:" + id );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingProcess.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionConfigSettingProcess extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionConfigSettingProcess( Throwable e, String message ) {
+		super( message, e );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionConfigSettingValueEmpty.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionConfigSettingValueEmpty extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionConfigSettingValueEmpty() {
+		super("配置内容value为空, 无法进行保存." );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/configsetting/exception/ExceptionInsufficientPermissions.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.configsetting.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionInsufficientPermissions extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionInsufficientPermissions( String name, String role ) {
+		super("操作权限不足。Name:" + name + ", Role:" + role );
+	}
+}

+ 121 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionDelete.java

@@ -0,0 +1,121 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumCanNotDelete;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoNotExists;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionInsufficientPermissions;
+import com.x.bbs.entity.BBSForumInfo;
+import com.x.bbs.entity.BBSSectionInfo;
+import com.x.bbs.entity.BBSSubjectInfo;
+
+public class ActionDelete extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionDelete.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String id) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wo = new Wo();
+		BBSForumInfo forumInfo = null;
+		Long sectionCount = 0L;
+		Boolean check = true;
+		String hostIp = request.getRemoteAddr();
+		String hostName = request.getRemoteAddr();
+
+		if (check) {
+			//删除操作权限判断
+			try {
+				if ( !ThisApplication.isBBSManager(effectivePerson) ) {
+					check = false;
+					logger.warn("用户没有BBSManager角色,并且也不是系统管理员!USER:" + effectivePerson.getDistinguishedName());
+					Exception exception = new ExceptionInsufficientPermissions(effectivePerson.getDistinguishedName(), ThisApplication.BBSMANAGER );
+					result.error(exception);
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionInsufficientPermissions(effectivePerson.getDistinguishedName(), ThisApplication.BBSMANAGER );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if (check) {
+			if (id == null || id.isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionForumInfoIdEmpty();
+				result.error(exception);
+			}
+		}
+		if (check) { // 查询论坛信息是否存在
+			try {
+				forumInfo = forumInfoServiceAdv.get(id);
+				if (forumInfo == null) {
+					check = false;
+					Exception exception = new ExceptionForumInfoNotExists(id);
+					result.error(exception);
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionForumInfoProcess(e, "系统在根据ID获取BBS论坛分区信息时发生异常!ID:" + id);
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if (check) {
+			// 查询论坛是否仍存在版块信息
+			try {
+				sectionCount = sectionInfoServiceAdv.countMainSectionByForumId(id);
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionForumInfoProcess(e, "系统在根据论坛ID查询版块信息数量时发生异常.ID:" + id);
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if (check) {
+			if (sectionCount > 0) {
+				check = false;
+				logger.warn("论坛[" + forumInfo.getForumName() + "]中仍存在" + sectionCount + "个版块,无法继续进行删除操作!ID=" + id);
+				Exception exception = new ExceptionForumCanNotDelete(
+						"论坛[" + forumInfo.getForumName() + "]中仍存在" + sectionCount + "个版块,无法继续进行删除操作!");
+				result.error(exception);
+			}
+		}
+		
+		if (check) {
+			//已经没有任何版块了,可以删除论坛信息以及论坛的权限信息
+			try {
+				forumInfoServiceAdv.delete(id);
+				
+				wo.setId( forumInfo.getId() );
+				
+				ApplicationCache.notify( BBSForumInfo.class );
+				ApplicationCache.notify( BBSSectionInfo.class );
+				ApplicationCache.notify( BBSSubjectInfo.class );
+				operationRecordService.forumOperation(effectivePerson.getDistinguishedName(), forumInfo, "DELETE", hostIp, hostName);
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionForumInfoProcess(e, "根据ID删除BBS论坛分区信息时发生异常.ID:" + id);
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		result.setData( wo );	
+		return result;
+	}
+
+	public static class Wo extends WoId {
+
+	}
+}

+ 174 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionGet.java

@@ -0,0 +1,174 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoNotExists;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+import com.x.bbs.entity.BBSForumInfo;
+import com.x.bbs.entity.BBSSectionInfo;
+
+import net.sf.ehcache.Element;
+
+public class ActionGet extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionGet.class );
+	
+	@SuppressWarnings("unchecked")
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Boolean check = true;
+		
+		if( check ){
+			if( id == null || id.isEmpty() ){
+				check = false;
+				Exception exception = new ExceptionForumInfoIdEmpty();
+				result.error( exception );
+			}
+		}
+		
+		if( check ){
+			String cacheKey = "forum#" + id;
+			Element element = cache.get( cacheKey );
+			if ((null != element) && (null != element.getObjectValue())) {
+				ActionResult<Wo> result_cache = (ActionResult<Wo>) element.getObjectValue();
+				result.setData( result_cache.getData() );
+				result.setCount( 1L);
+			} else {
+				//继续进行数据查询
+				result = getForumQueryResult( id, request, effectivePerson );
+				cache.put(new Element(cacheKey, result ));
+			}
+		}
+		return result;
+	}
+	
+	private ActionResult<Wo> getForumQueryResult(String id, HttpServletRequest request, EffectivePerson effectivePerson) {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wrap = null;
+		BBSForumInfo forumInfo = null;
+		Boolean check = true;
+		
+		if( check ){
+			try {
+				forumInfo = forumInfoServiceAdv.get( id );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionForumInfoProcess( e, "系统在根据ID获取BBS论坛分区信息时发生异常!ID:" + id );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		
+		if( check ){
+			if( forumInfo != null ){
+				try {
+					wrap = Wo.copier.copy( forumInfo );
+					wrap.setForumVisibleResult( wrap.getVisiblePermissionList() );
+					//TODO 为了不改变前端的逻辑,此处将List转为String进行输出,逗号分隔
+					wrap.setForumManagerName( wrap.transferStringListToString( wrap.getForumManagerList()) );
+					result.setData( wrap );
+					result.setCount(1L);
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionForumInfoProcess( e, "系统将论坛信息对象转换为输出数据时发生异常。" );
+					result.error( exception );
+					logger.error( e, effectivePerson, request, null);
+				}
+			}else{
+				Exception exception = new ExceptionForumInfoNotExists( id );
+				result.error( exception );
+			}
+		}
+		return result;
+	}
+
+	public static class Wo extends BBSForumInfo{
+		
+		@FieldDescribe("字符串形式输出的管理员信息,逗号(,)分隔.")
+		private String forumManagerName = null;
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		public static WrapCopier< BBSForumInfo, Wo > copier = WrapCopierFactory.wo( BBSForumInfo.class, Wo.class, null, JpaObject.FieldsInvisible);
+		
+		@FieldDescribe("版块访问权限列表,用于接收参数.")
+		private String forumVisibleResult ;
+		
+		//论坛版块列表
+		@FieldDescribe("版块列表.")
+		private List<WoSectionInfo> sections = null;
+
+		public List<WoSectionInfo> getSections() {
+			return sections;
+		}
+
+		public void setSections(List<WoSectionInfo> sections) {
+			this.sections = sections;
+		}
+
+		public String getForumManagerName() {
+			return forumManagerName;
+		}
+
+		public void setForumManagerName( String forumManagerName ) {
+			this.forumManagerName = forumManagerName;
+		}
+		
+		public String getForumVisibleResult() {
+			return forumVisibleResult;
+		}
+		public void setForumVisibleResult(String forumVisibleResult) {
+			this.forumVisibleResult = forumVisibleResult;
+		}
+		
+		public void setForumVisibleResult( List<String> list ) {
+			this.forumVisibleResult = transferStringListToString(list);
+		}
+		
+		public String transferStringListToString( List<String> list ) {
+			StringBuffer sb = new StringBuffer();
+			if( ListTools.isNotEmpty( list )) {
+				for( String str : list ) {
+					if( StringUtils.isNotEmpty( sb.toString() )) {
+						sb.append(",");
+					}
+					sb.append(str);
+				}
+			}
+			return sb.toString();
+		}
+	}
+	
+	public static class WoSectionInfo extends BBSSectionInfo{
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		//版块的子版块信息列表
+		@FieldDescribe("子版块列表.")
+		private List<WoSectionInfo> subSections = null;
+
+		public List<WoSectionInfo> getSubSections() {
+			return subSections;
+		}
+		public void setSubSections(List<WoSectionInfo> subSections) {
+			this.subSections = subSections;
+		}
+		
+	}
+
+
+}

+ 165 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionGetAll.java

@@ -0,0 +1,165 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+import com.x.bbs.entity.BBSForumInfo;
+import com.x.bbs.entity.BBSSectionInfo;
+
+import net.sf.ehcache.Element;
+
+public class ActionGetAll extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionGetAll.class );
+	
+	@SuppressWarnings("unchecked")
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson ) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		Boolean check = true;
+		
+		if( check ){
+			String cacheKey = "forum#all";
+			Element element = cache.get( cacheKey );
+			if ((null != element) && (null != element.getObjectValue())) {
+				ActionResult<List<Wo>> result_cache = (ActionResult<List<Wo>>) element.getObjectValue();
+				result.setData( result_cache.getData() );
+				result.setCount( 1L);
+			} else {
+				//继续进行数据查询
+				result = getForumAllQueryResult( request, effectivePerson );
+				cache.put(new Element(cacheKey, result ));
+			}
+		}
+		return result;
+	}
+
+	private ActionResult<List<Wo>> getForumAllQueryResult(HttpServletRequest request, EffectivePerson effectivePerson) {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		List<Wo> wraps = new ArrayList<>();
+		List<BBSForumInfo> forumInfoList = null;
+		Boolean check = true;
+		
+		if( check ){
+			//从数据库查询论坛列表
+			try {
+				forumInfoList = forumInfoServiceAdv.listAll();
+			} catch (Exception e) {
+				Exception exception = new ExceptionForumInfoProcess( e, "系统在获取所有BBS论坛分区信息时发生异常." );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}	
+		}
+		if( check ){
+			if( ListTools.isNotEmpty( forumInfoList ) ){
+				try {
+					wraps = Wo.copier.copy( forumInfoList );
+				} catch (Exception e) {
+					Exception exception = new ExceptionForumInfoProcess( e, "系统在转换所有BBS论坛分区信息为输出对象时发生异常." );
+					result.error( exception );
+					logger.error( e, effectivePerson, request, null);
+				}
+				
+			}
+		}
+		
+		//TODO 为了不改变前端的逻辑,此处将List转为String进行输出,逗号分隔
+		if( check ){
+			if( ListTools.isNotEmpty( wraps ) ){
+				for( Wo wo : wraps ) {
+					wo.setForumVisibleResult( wo.getVisiblePermissionList() );
+					wo.setForumManagerName( wo.transferStringListToString( wo.getForumManagerList() ));
+				}
+			}
+		}
+		result.setData( wraps );
+		result.setCount( Long.parseLong( wraps.size() + "") );
+		return result;
+	}
+
+	public static class Wo extends BBSForumInfo{
+		
+		@FieldDescribe("字符串形式输出的管理员信息,逗号(,)分隔.")
+		private String forumManagerName = null;
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		public static WrapCopier< BBSForumInfo, Wo > copier = WrapCopierFactory.wo( BBSForumInfo.class, Wo.class, null, JpaObject.FieldsInvisible);
+		
+		@FieldDescribe("版块访问权限列表,用于接收参数.")
+		private String forumVisibleResult ;
+		
+		//论坛版块列表
+		@FieldDescribe("版块列表.")
+		private List<WoSectionInfo> sections = null;
+
+		public List<WoSectionInfo> getSections() {
+			return sections;
+		}
+
+		public void setSections(List<WoSectionInfo> sections) {
+			this.sections = sections;
+		}
+
+		public String getForumManagerName() {
+			return forumManagerName;
+		}
+
+		public void setForumManagerName( String forumManagerName ) {
+			this.forumManagerName = forumManagerName;
+		}
+		
+		public String getForumVisibleResult() {
+			return forumVisibleResult;
+		}
+		public void setForumVisibleResult(String forumVisibleResult) {
+			this.forumVisibleResult = forumVisibleResult;
+		}
+		
+		public void setForumVisibleResult( List<String> list ) {
+			this.forumVisibleResult = transferStringListToString(list);
+		}
+		
+		public String transferStringListToString( List<String> list ) {
+			StringBuffer sb = new StringBuffer();
+			if( ListTools.isNotEmpty( list )) {
+				for( String str : list ) {
+					if( StringUtils.isNotEmpty( sb.toString() )) {
+						sb.append(",");
+					}
+					sb.append(str);
+				}
+			}
+			return sb.toString();
+		}
+		
+	}
+	
+	public static class WoSectionInfo extends BBSSectionInfo{
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		//版块的子版块信息列表
+		private List<WoSectionInfo> subSections = null;
+
+		public List<WoSectionInfo> getSubSections() {
+			return subSections;
+		}
+		public void setSubSections(List<WoSectionInfo> subSections) {
+			this.subSections = subSections;
+		}	
+	}
+}

+ 208 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionGetAllWithPermission.java

@@ -0,0 +1,208 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.assemble.control.jaxrs.MethodExcuteResult;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.ActionGetAll.WoSectionInfo;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+import com.x.bbs.entity.BBSForumInfo;
+
+import net.sf.ehcache.Element;
+
+public class ActionGetAllWithPermission extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionGetAllWithPermission.class );
+	
+	@SuppressWarnings("unchecked")
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson ) throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		Boolean check = true;
+		Boolean isBBSManager = false;
+		
+		if ( check ) {
+			isBBSManager = ThisApplication.isBBSManager(effectivePerson);
+		}
+		
+		if( check ) {
+			String cacheKey = getCacheKey( effectivePerson, isBBSManager );
+			Element element = cache.get( cacheKey );
+			
+			if ((null != element) && (null != element.getObjectValue())) {
+				ActionResult<List<Wo>> result_cache = (ActionResult<List<Wo>>) element.getObjectValue();
+				result.setData( result_cache.getData() );
+				result.setCount( result_cache.getCount() );
+			} else {
+				//继续进行数据查询;
+				result = getForumWithPermissionQueryResult( request, effectivePerson, isBBSManager );
+				cache.put(new Element(cacheKey, result ));
+			}
+		}		
+		return result;
+	}
+
+	@SuppressWarnings("unchecked")
+	private ActionResult<List<Wo>> getForumWithPermissionQueryResult(HttpServletRequest request, EffectivePerson effectivePerson, Boolean isBBSManager) {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		List<Wo> wraps = new ArrayList<>();
+		Boolean check = true;
+		List<BBSForumInfo> forumInfoList = null;
+		List<String> forumIds = null;
+		List<String> ids = new ArrayList<String>();
+		MethodExcuteResult methodExcuteResult = null;
+		
+		if( check ){
+			//查询公开的论坛
+			try {
+				forumIds = forumInfoServiceAdv.listAllPublicForumIds();
+				if( ListTools.isNotEmpty( forumIds ) ){
+					for( String id : forumIds ){
+						ids.add( id );
+					}
+				}
+			} catch (Exception e) {
+				Exception exception = new ExceptionForumInfoProcess( e, "系统查询所有公开的论坛信息列表时发生异常。" );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		
+		if( check ){
+			//查询有权限访问的论坛
+			methodExcuteResult = UserPermissionService.getViewForumIdsFromUserPermission( effectivePerson );
+			if( methodExcuteResult.getSuccess() ){
+				if( methodExcuteResult.getBackObject() != null ){
+					for( String id : ( List<String> )methodExcuteResult.getBackObject() ){
+						if( !ids.contains( id )){
+							ids.add( id );
+						}
+					}
+				}
+			}else{
+				result.error( methodExcuteResult.getError() );
+				logger.error( methodExcuteResult.getError(), effectivePerson, request, null);
+			}
+		}
+		
+		if( check ){//从数据库查询论坛列表
+			try {
+				forumInfoList = forumInfoServiceAdv.listAllViewAbleForumWithUserPermission( ids );
+				if( forumInfoList == null ){
+					forumInfoList = new ArrayList<BBSForumInfo>();
+				}
+			} catch (Exception e) {
+				Exception exception = new ExceptionForumInfoProcess( e, "根据ID列表查询论坛信息列表时发生异常。" );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		
+		if( check ){//转换论坛列表为输出格式
+			if( ListTools.isNotEmpty( forumInfoList ) ){
+				try {
+					wraps = Wo.copier.copy( forumInfoList );
+				} catch (Exception e) {
+					Exception exception = new ExceptionForumInfoProcess( e, "系统将论坛信息对象转换为输出数据时发生异常。" );
+					result.error( exception );
+					logger.error( e, effectivePerson, request, null);
+				}
+			}
+		}
+		//TODO 为了不改变前端的逻辑,此处将人员List转为String进行输出,逗号分隔
+		if( check ){
+			if( ListTools.isNotEmpty( wraps ) ){
+				for( Wo wo : wraps ) {
+					wo.setForumVisibleResult( wo.getVisiblePermissionList() );
+					wo.setForumManagerName( wo.transferStringListToString( wo.getForumManagerList() ));
+				}
+			}
+		}
+		result.setData( wraps );
+		return result;
+	}
+
+	private String getCacheKey(EffectivePerson effectivePerson, Boolean isBBSManager) {
+		StringBuffer sb = new StringBuffer();
+		if( StringUtils.isNotEmpty( effectivePerson.getDistinguishedName() )) {
+			sb.append( effectivePerson.getDistinguishedName() );
+		}
+		if( StringUtils.isNotEmpty( effectivePerson.getDistinguishedName() )) {
+			sb.append( "#" );
+			sb.append( isBBSManager );
+		}
+		sb.append( "#forum#view" );
+		return sb.toString();
+	}
+
+	public static class Wo extends BBSForumInfo{
+		
+		@FieldDescribe("字符串形式输出的管理员信息,逗号(,)分隔.")
+		private String forumManagerName = null;
+	
+		private static final long serialVersionUID = -5076990764713538973L;
+		
+		public static WrapCopier< BBSForumInfo, Wo > copier = WrapCopierFactory.wo( BBSForumInfo.class, Wo.class, null, JpaObject.FieldsInvisible);
+		
+		@FieldDescribe("版块访问权限列表,用于接收参数.")
+		private String forumVisibleResult ;
+		
+		//论坛版块列表
+		@FieldDescribe("版块列表.")
+		private List<WoSectionInfo> sections = null;
+
+		public List<WoSectionInfo> getSections() {
+			return sections;
+		}
+
+		public void setSections(List<WoSectionInfo> sections) {
+			this.sections = sections;
+		}
+
+		public String getForumManagerName() {
+			return forumManagerName;
+		}
+
+		public void setForumManagerName( String forumManagerName ) {
+			this.forumManagerName = forumManagerName;
+		}
+		
+		public String getForumVisibleResult() {
+			return forumVisibleResult;
+		}
+		public void setForumVisibleResult(String forumVisibleResult) {
+			this.forumVisibleResult = forumVisibleResult;
+		}
+		
+		public void setForumVisibleResult( List<String> list ) {
+			this.forumVisibleResult = transferStringListToString(list);
+		}
+		
+		public String transferStringListToString( List<String> list ) {
+			StringBuffer sb = new StringBuffer();
+			if( ListTools.isNotEmpty( list )) {
+				for( String str : list ) {
+					if( StringUtils.isNotEmpty( sb.toString() )) {
+						sb.append(",");
+					}
+					sb.append(str);
+				}
+			}
+			return sb.toString();
+		}
+		
+	}
+}

+ 271 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ActionSave.java

@@ -0,0 +1,271 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumNameEmpty;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumTypeCategoryEmpty;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumTypeCategoryInvalid;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionInsufficientPermissions;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionPersonNotExists;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionPersonQuery;
+import com.x.bbs.entity.BBSForumInfo;
+import com.x.bbs.entity.BBSSectionInfo;
+import com.x.bbs.entity.BBSSubjectInfo;
+
+public class ActionSave extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionSave.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson,
+			JsonElement jsonElement) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Boolean check = true;
+		Wo wo = new Wo();
+		String[] names = null;
+		String[] typeCategory = null;
+		String personName = null;
+		List<String> forumManagerList = new ArrayList<>();
+		Wi wrapIn = null;
+		BBSForumInfo forumInfo = new BBSForumInfo();
+		String hostIp = request.getRemoteAddr();
+		String hostName = request.getRemoteAddr();
+
+		if (check) {
+			//保存操作权限判断
+			try {
+				if ( !ThisApplication.isBBSManager(effectivePerson) ) {
+					check = false;
+					logger.warn("用户没有BBSManager角色,并且也不是系统管理员!USER:" + effectivePerson.getDistinguishedName());
+					Exception exception = new ExceptionInsufficientPermissions(effectivePerson.getDistinguishedName(), ThisApplication.BBSMANAGER );
+					result.error(exception);
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionInsufficientPermissions(effectivePerson.getDistinguishedName(), ThisApplication.BBSMANAGER );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		try {
+			wrapIn = this.convertToWrapIn( jsonElement, Wi.class );
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new ExceptionForumInfoProcess(e, "系统在将JSON信息转换为对象时发生异常。JSON:" + jsonElement.toString());
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+
+		// 校验论坛名称
+		if (check) {
+			if ( StringUtils.isEmpty( wrapIn.getForumName() ) ) {
+				check = false;
+				Exception exception = new ExceptionForumNameEmpty();
+				result.error(exception);
+			}
+		}
+		
+		// 校验论坛分类:信息|问题|投票,只能是这三类中的
+		if (check) {
+			if ( StringUtils.isEmpty( wrapIn.getTypeCategory() )) {
+				check = false;
+				Exception exception = new ExceptionForumTypeCategoryEmpty();
+				result.error(exception);
+			}
+		}
+		
+		if (check) {
+			if ( StringUtils.isNotEmpty( wrapIn.getForumManagerName() )) {
+				forumManagerList = ListTools.toList( wrapIn.getForumManagerName().split(",") );
+			}
+		}
+		
+		if (check) {
+			typeCategory = wrapIn.getTypeCategory().split("\\|");
+			if (typeCategory != null && typeCategory.length > 0) {
+				for (String category : typeCategory) {
+					if (!"信息".equals(category) && !"问题".equals(category) && !"投票".equals(category)) {
+						check = false;
+						Exception exception = new ExceptionForumTypeCategoryInvalid(category);
+						result.error(exception);
+					}
+				}
+			}
+		}
+		if (check) {
+			if ( StringUtils.isNotEmpty( wrapIn.getSubjectType() )) {
+				wrapIn.setSubjectType("新闻|讨论");
+			}
+		}
+		if (check) {
+			if ( StringUtils.isNotEmpty( wrapIn.getForumManagerName() )) {
+				// 判断指定的用户是否存在
+				names = wrapIn.getForumManagerName().split(",");
+				for (String name : names) {
+					try {
+						personName = userManagerService.getPersonNameByFlag(name);
+						if (personName == null) {
+							check = false;
+							Exception exception = new ExceptionPersonNotExists(name);
+							result.error(exception);
+							break;
+						}
+					} catch (Exception e) {
+						check = false;
+						Exception exception = new ExceptionPersonQuery(e, name);
+						result.error(exception);
+						logger.error(e, effectivePerson, request, null);
+						break;
+					}
+				}
+			} else {
+				wrapIn.setForumManagerName(effectivePerson.getDistinguishedName());
+			}
+		}
+		if (check) {
+			wrapIn.setCreatorName(effectivePerson.getDistinguishedName());
+		}
+		
+		if (check) {
+			if( StringUtils.isEmpty( wrapIn.getForumColor())) {
+				wrapIn.setForumColor( "#1462be" );
+			}
+		}
+		
+		if (check) {
+			forumInfo = Wi.copier.copy(wrapIn);
+			
+			List<String> arrayList = new ArrayList<>(); 
+			if( StringUtils.equals( wrapIn.getForumVisible(), "根据权限" )) {
+				if( StringUtils.isNotEmpty( wrapIn.getForumVisibleResult())) {
+					arrayList.clear();
+					Collections.addAll(arrayList, wrapIn.getForumVisibleResult().split( "," ));
+					forumInfo.setVisiblePermissionList( arrayList );
+				}
+			}else {
+				forumInfo.setVisiblePermissionList( new ArrayList<>() );
+			}
+		}
+		
+		if (check) {
+			try {				
+				forumInfo.setForumManagerList( forumManagerList );
+				if( StringUtils.isNotEmpty( wrapIn.getId() )) {
+					forumInfo.setId( wrapIn.getId() );
+				}
+				forumInfo = forumInfoServiceAdv.save( forumInfo );
+				wo.setId(forumInfo.getId());
+				
+				ApplicationCache.notify( BBSForumInfo.class );
+				ApplicationCache.notify( BBSSectionInfo.class );
+				ApplicationCache.notify( BBSSubjectInfo.class );
+				
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionForumInfoProcess(e, "系统在保存BBS论坛分区信息时发生异常.");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if( check ) {
+			try {
+				operationRecordService.forumOperation( effectivePerson.getDistinguishedName(), forumInfo, "SAVE", hostIp, hostName );
+			}catch( Exception e ) {
+				check = false;
+				Exception exception = new ExceptionForumInfoProcess(e, "系统在保存BBS论坛操作记录时发生异常.");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if (check) {
+			try {
+				// 论坛信息添加成功,继续添加权限和角色信息
+				permissionInfoService.createForumPermission( forumInfo );
+			} catch (Exception e) {
+				check = false;
+				logger.warn("system create forum permission info got an exception!");
+				logger.error(e);
+			}
+		}
+		
+		if (check) {
+			try {
+				// 论坛信息添加成功,继续添加权限和角色信息
+				roleInfoService.createForumRole( effectivePerson, forumInfo );
+			} catch (Exception e) {
+				check = false;
+				result.error(e);
+				logger.warn("system create forum role info got an exception!");
+				logger.error(e);
+			}
+		}
+		if (check) {// 检查论坛管理员权限的设置
+			try {
+				forumInfoServiceAdv.checkForumManager( forumInfo );
+			} catch (Exception e) {
+				logger.warn("system bind role for forum manager got an exception!");
+				logger.error(e);
+			}
+		}
+		result.setData(wo);
+		return result;
+	}
+
+	public static class Wi extends BBSForumInfo {
+		
+		@FieldDescribe("论坛管理员.")
+		private String forumManagerName = null;
+
+		@FieldDescribe("论坛可见范围.")
+		private String forumVisibleResult ;
+		
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static WrapCopier<Wi, BBSForumInfo> copier = WrapCopierFactory.wi(Wi.class, BBSForumInfo.class, null,
+				JpaObject.FieldsUnmodify);
+
+		public String getForumManagerName() {
+			return forumManagerName;
+		}
+
+		public void setForumManagerName(String forumManagerName) {
+			this.forumManagerName = forumManagerName;
+		}
+
+		public String getForumVisibleResult() {
+			return forumVisibleResult;
+		}
+
+		public void setForumVisibleResult(String forumVisibleResult) {
+			this.forumVisibleResult = forumVisibleResult;
+		}
+		
+	}
+
+	public static class Wo extends WoId {
+
+	}
+
+}

+ 26 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/BaseAction.java

@@ -0,0 +1,26 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.bbs.assemble.control.service.BBSForumInfoServiceAdv;
+import com.x.bbs.assemble.control.service.BBSOperationRecordService;
+import com.x.bbs.assemble.control.service.BBSPermissionInfoService;
+import com.x.bbs.assemble.control.service.BBSRoleInfoService;
+import com.x.bbs.assemble.control.service.BBSSectionInfoServiceAdv;
+import com.x.bbs.assemble.control.service.UserManagerService;
+import com.x.bbs.assemble.control.service.UserPermissionService;
+import com.x.bbs.entity.BBSForumInfo;
+
+import net.sf.ehcache.Ehcache;
+
+public class BaseAction extends StandardJaxrsAction{
+	
+	protected Ehcache cache = ApplicationCache.instance().getCache( BBSForumInfo.class);
+	protected UserPermissionService UserPermissionService = new UserPermissionService();
+	protected UserManagerService userManagerService = new UserManagerService();
+	protected BBSForumInfoServiceAdv forumInfoServiceAdv = new BBSForumInfoServiceAdv();
+	protected BBSPermissionInfoService permissionInfoService = new BBSPermissionInfoService();
+	protected BBSRoleInfoService roleInfoService = new BBSRoleInfoService();
+	protected BBSSectionInfoServiceAdv sectionInfoServiceAdv = new BBSSectionInfoServiceAdv();
+	protected BBSOperationRecordService operationRecordService = new BBSOperationRecordService();
+}

+ 95 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ForumInfoAction.java

@@ -0,0 +1,95 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+
+@Path("forum")
+@JaxrsDescribe("论坛信息管理")
+public class ForumInfoAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ForumInfoAction.class);
+
+	/**
+	 * 访问论坛信息,匿名用户可以访问
+	 * 
+	 * @param request
+	 * @return
+	 */
+	@JaxrsMethodDescribe(value = "获取登录者可以访问到的所有ForumInfo的信息列表.", action = ActionGetAllWithPermission.class)
+	@GET
+	@Path("view/all")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void viewAllWithMyPermission(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request) {
+		ActionResult<List<ActionGetAllWithPermission.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionGetAllWithPermission().execute(request, effectivePerson);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "获取登录者可以访问到的所有ForumInfo的信息列表时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	@JaxrsMethodDescribe(value = "根据指定ID获取论坛信息.", action = ActionGet.class)
+	@GET
+	@Path("{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("表单ID") @PathParam("id") String id) {
+		ActionResult<ActionGet.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+		if (check) {
+			if (id == null || id.isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionForumInfoIdEmpty();
+				result.error(exception);
+			}
+		}
+		if (check) {
+			try {
+				result = new ActionGet().execute(request, effectivePerson, id);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "根据指定ID获取论坛信息时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 133 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/ForumInfoManagerUserAction.java

@@ -0,0 +1,133 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+
+@Path("user/forum")
+@JaxrsDescribe("论坛信息查询(匿名)")
+public class ForumInfoManagerUserAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ForumInfoManagerUserAction.class);
+
+	/**
+	 * 访问论坛信息,登录用户访问
+	 * 
+	 * @param request
+	 * @return
+	 */
+	@JaxrsMethodDescribe(value = "获取所有论坛信息列表.", action = ActionGetAll.class)
+	@GET
+	@Path("all")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listAll(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<List<ActionGetAll.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionGetAll().execute(request, effectivePerson);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "获取所有ForumInfo的信息列表时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	/**
+	 * 保存论坛信息,登录用户访问
+	 * 
+	 * @param request
+	 * @return
+	 */
+	@JaxrsMethodDescribe(value = "创建新的论坛信息或者更新论坛信息.", action = ActionSave.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void post(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionSave.Wo> result = new ActionResult<>();
+		Boolean check = true;
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		if (check) {
+			try {
+				result = new ActionSave().execute(request, effectivePerson, jsonElement);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "创建新的论坛信息或者更新论坛信息时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+	/**
+	 * 删除论坛信息,登录用户访问
+	 * 
+	 * @param request
+	 * @return
+	 */
+	@JaxrsMethodDescribe(value = "根据ID删除指定的论坛信息,如果论坛里有版块或者贴子,则不允许删除.", action = ActionDelete.class)
+	@DELETE
+	@Path("{id}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void delete(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			@JaxrsParameterDescribe("表单ID") @PathParam("id") String id) {
+		ActionResult<ActionDelete.Wo> result = new ActionResult<>();
+		Boolean check = true;
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+
+		if (check) {
+			if (id == null || id.isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionForumInfoIdEmpty();
+				result.error(exception);
+			}
+		}
+		if (check) {
+			try {
+				result = new ActionDelete().execute(request, effectivePerson, id);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "系统在删除论坛信息时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumCanNotDelete.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionForumCanNotDelete extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionForumCanNotDelete( String message ) {
+		super( message );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumInfoIdEmpty.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionForumInfoIdEmpty extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionForumInfoIdEmpty() {
+		super("id为空, 无法进行查询." );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumInfoNotExists.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionForumInfoNotExists extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionForumInfoNotExists( String id ) {
+		super("指定ID的论坛分区不存在.ID:" + id );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumInfoProcess.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionForumInfoProcess extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionForumInfoProcess( Throwable e, String message ) {
+		super( message, e );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumNameEmpty.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionForumNameEmpty extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionForumNameEmpty() {
+		super("论坛分区名称forumName为空, 无法进行查询." );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumTypeCategoryEmpty.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionForumTypeCategoryEmpty extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionForumTypeCategoryEmpty() {
+		super("论坛分区主题分类typeCategory为空, 无法进行查询或者保存." );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionForumTypeCategoryInvalid.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionForumTypeCategoryInvalid extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionForumTypeCategoryInvalid( String type ) {
+		super("系统传入的[主题分类]不合法,无法进行数据保存!分类:" + type );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionInsufficientPermissions.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionInsufficientPermissions extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionInsufficientPermissions( String name, String role ) {
+		super("操作权限不足。Name:" + name + ", Role:" + role );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionPersonNotExists.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionPersonNotExists extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionPersonNotExists( String name ) {
+		super("人员不存在.Name:" + name );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/foruminfo/exception/ExceptionPersonQuery.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.foruminfo.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionPersonQuery extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionPersonQuery( Throwable e, String name ) {
+		super("系统根据人员唯一标识查询人员信息时发生异常.Name:" + name,e );
+	}
+}

+ 144 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/ActionImageBase64.java

@@ -0,0 +1,144 @@
+package com.x.bbs.assemble.control.jaxrs.image;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.codec.binary.Base64;
+import org.imgscalr.Scalr;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.image.exception.ExceptionURLEmpty;
+import com.x.bbs.assemble.control.jaxrs.image.exception.ExceptionWrapInConvert;
+
+import net.sf.ehcache.Element;
+
+public class ActionImageBase64 extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionImageBase64.class);
+	private String catchNamePrefix = this.getClass().getName();
+
+	protected ActionResult<String> execute(HttpServletRequest request, EffectivePerson effectivePerson,
+			JsonElement jsonElement) throws Exception {
+		ActionResult<String> result = new ActionResult<>();
+		Wi wrapIn = null;
+		EffectivePerson currentPerson = this.effectivePerson(request);
+		String wrap = null;
+		URL url = null;
+		BufferedImage image = null;
+		Boolean check = true;
+
+		try {
+			wrapIn = this.convertToWrapIn(jsonElement, Wi.class);
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new ExceptionWrapInConvert(e, jsonElement);
+			result.error(exception);
+			logger.error(e, currentPerson, request, null);
+		}
+
+		if (check) {
+			if (wrapIn.getUrl() != null || wrapIn.getUrl().isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionURLEmpty();
+				result.error(exception);
+			}
+		}
+		if (check) {
+			if (wrapIn.getSize() != null || wrapIn.getSize() == 0) {
+				wrapIn.setSize(800);
+			}
+		}
+
+		String cacheKey = catchNamePrefix + "#url#" + wrapIn.getUrl() + "#size#" + wrapIn.getSize();
+		Element element = null;
+		element = cache.get(cacheKey);
+		if (element != null) {
+			wrap = (String) element.getObjectValue();
+			result.setData(wrap);
+		} else {
+			if (check) {
+				try {
+					url = new URL(wrapIn.getUrl());
+				} catch (MalformedURLException e) {
+					check = false;
+					Exception exception = new ExceptionURLEmpty(e, wrapIn.getUrl());
+					result.error(exception);
+					logger.error(e, currentPerson, request, null);
+				}
+			}
+			if (check) {
+				try {
+					image = ImageIO.read(url);
+					if (image == null) {
+						check = false;
+						result.error(new Exception("system can not read image in url."));
+					}
+				} catch (IOException e) {
+					check = false;
+					result.error(e);
+					logger.warn("system read picture with url got an exception!url:" + url);
+					logger.error(e);
+				}
+			}
+			if (check) {
+				int width = image.getWidth();
+				int height = image.getHeight();
+				if (width * height > wrapIn.getSize() * wrapIn.getSize()) {
+					image = Scalr.resize(image, wrapIn.getSize());
+				}
+			}
+			if (check) {
+				try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+					ImageIO.write(image, "png", baos);
+					wrap = Base64.encodeBase64String(baos.toByteArray());
+					cache.put(new Element(cacheKey, wrap));
+					result.setData(wrap);
+				} catch (Exception e) {
+					check = false;
+					result.error(e);
+					logger.warn("system encode picture in base64 got an exception!");
+					logger.error(e);
+				}
+			}
+		}
+		return result;
+	}
+
+	public static class Wi extends GsonPropertyObject {
+
+		@FieldDescribe("地址")
+		private String url;
+
+		@FieldDescribe("像素大小")
+		private Integer size;
+
+		public String getUrl() {
+			return url;
+		}
+
+		public void setUrl(String url) {
+			this.url = url;
+		}
+
+		public Integer getSize() {
+			return size;
+		}
+
+		public void setSize(Integer size) {
+			this.size = size;
+		}
+
+	}
+}

+ 23 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/BaseAction.java

@@ -0,0 +1,23 @@
+package com.x.bbs.assemble.control.jaxrs.image;
+
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.bbs.assemble.control.service.BBSForumInfoServiceAdv;
+import com.x.bbs.assemble.control.service.BBSOperationRecordService;
+import com.x.bbs.assemble.control.service.BBSPermissionInfoService;
+import com.x.bbs.assemble.control.service.BBSRoleInfoService;
+import com.x.bbs.assemble.control.service.BBSSectionInfoServiceAdv;
+import com.x.bbs.assemble.control.service.UserManagerService;
+
+import net.sf.ehcache.Ehcache;
+
+public class BaseAction extends StandardJaxrsAction{
+	
+	protected Ehcache cache = ApplicationCache.instance().getCache( BaseAction.class);
+	protected UserManagerService userManagerService = new UserManagerService();
+	protected BBSForumInfoServiceAdv forumInfoServiceAdv = new BBSForumInfoServiceAdv();
+	protected BBSPermissionInfoService permissionInfoService = new BBSPermissionInfoService();
+	protected BBSRoleInfoService roleInfoService = new BBSRoleInfoService();
+	protected BBSSectionInfoServiceAdv sectionInfoServiceAdv = new BBSSectionInfoServiceAdv();
+	protected BBSOperationRecordService operationRecordService = new BBSOperationRecordService();
+}

+ 56 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/ImageBase64Action.java

@@ -0,0 +1,56 @@
+package com.x.bbs.assemble.control.jaxrs.image;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+
+@Path("image/encode")
+@JaxrsDescribe("图片编码服务")
+public class ImageBase64Action extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ImageBase64Action.class);
+
+	@Path("base64")
+	@JaxrsMethodDescribe(value = "将URL指向的图片转换成base64String.", action = ActionImageBase64.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void convert(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<String> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionImageBase64().execute(request, effectivePerson, jsonElement);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "获取所有ForumInfo的信息列表时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 16 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/exception/ExceptionURLEmpty.java

@@ -0,0 +1,16 @@
+package com.x.bbs.assemble.control.jaxrs.image.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionURLEmpty extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionURLEmpty() {
+		super("URL为空!" );
+	}
+
+	public ExceptionURLEmpty( Throwable e, String url) {
+		super("URL不合法! URL:" + url, e );
+	}
+}

+ 13 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/image/exception/ExceptionWrapInConvert.java

@@ -0,0 +1,13 @@
+package com.x.bbs.assemble.control.jaxrs.image.exception;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionWrapInConvert extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionWrapInConvert( Throwable e, JsonElement jsonElement) {
+		super( "系统在将JSON信息转换为对象时发生异常。JSON:" + jsonElement.toString(), e);
+	}
+}

+ 81 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/ActionLogin.java

@@ -0,0 +1,81 @@
+package com.x.bbs.assemble.control.jaxrs.login;
+
+import java.io.Serializable;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.ThisApplication;
+import com.x.bbs.assemble.control.jaxrs.login.exception.ExceptionInsufficientPermissions;
+import com.x.bbs.assemble.control.jaxrs.login.exception.ExceptionUserLogin;
+import com.x.bbs.assemble.control.service.bean.RoleAndPermission;
+
+/**
+ * 手机用户访问论坛信息,首页所有的信息整合在一起 匿名用户可以访问
+ * 
+ * @param request
+ * @return
+ */
+public class ActionLogin extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionLogin.class);
+
+	public ActionResult<RoleAndPermission> execute(@Context HttpServletRequest request,
+			EffectivePerson effectivePerson) {
+
+		ActionResult<RoleAndPermission> result = new ActionResult<>();
+		Boolean isBBSManager = false;
+		String hostIp = request.getRemoteAddr();
+		String hostName = request.getRemoteAddr();
+		Boolean check = true;
+
+		if (check) {
+			if ("anonymous".equalsIgnoreCase(effectivePerson.getTokenType().name())) {
+				try {
+					operationRecordService.loginOperation("anonymous", hostIp, hostName);
+					result.setData(new RoleAndPermission());
+				} catch (Exception e) {
+					Exception exception = new ExceptionUserLogin(e, "anonymous");
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			} else {
+				RoleAndPermission roleAndPermission = null;
+				try {
+					operationRecordService.loginOperation(effectivePerson.getDistinguishedName(), hostIp, hostName);
+					roleAndPermission = userPermissionService
+							.getUserRoleAndPermissionForLogin(effectivePerson.getDistinguishedName());
+				} catch (Exception e) {
+					Exception exception = new ExceptionUserLogin(e, effectivePerson.getDistinguishedName());
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+				try {
+					isBBSManager = userManagerService.isHasPlatformRole(effectivePerson.getDistinguishedName(),
+							ThisApplication.BBSMANAGER);
+				} catch (Exception e) {
+					Exception exception = new ExceptionInsufficientPermissions(effectivePerson.getDistinguishedName(),
+							ThisApplication.BBSMANAGER);
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+				if (roleAndPermission != null) {
+					roleAndPermission.setIsBBSManager(isBBSManager);
+				}
+				result.setData(roleAndPermission);
+			}
+		}
+		return result;
+	}
+
+//	public static class Wi extends GsonPropertyObject implements Serializable {
+//
+//		private static final long serialVersionUID = -5076990764713538973L;
+//
+//	}
+}

+ 35 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/ActionLogout.java

@@ -0,0 +1,35 @@
+package com.x.bbs.assemble.control.jaxrs.login;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.service.BBSUserInfoService;
+import com.x.bbs.assemble.control.service.bean.RoleAndPermission;
+
+/**
+ * 手机用户访问论坛信息,首页所有的信息整合在一起 匿名用户可以访问
+ * 
+ * @param request
+ * @return
+ */
+public class ActionLogout extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionLogout.class);
+	
+	public ActionResult<RoleAndPermission> execute( @Context HttpServletRequest request, EffectivePerson effectivePerson ) {
+		ActionResult<RoleAndPermission> result = new ActionResult<>();
+		EffectivePerson currentPerson = this.effectivePerson(request);
+		try {
+			new BBSUserInfoService().logout(currentPerson.getDistinguishedName());
+		} catch (Exception e) {
+			logger.warn("system logout got an exception");
+			logger.error(e);
+		}
+		return result;
+	}
+
+}

+ 218 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/ActionMobileIndex.java

@@ -0,0 +1,218 @@
+package com.x.bbs.assemble.control.jaxrs.login;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.bbs.entity.BBSForumInfo;
+import com.x.bbs.entity.BBSPermissionInfo;
+import com.x.bbs.entity.BBSSectionInfo;
+
+public class ActionMobileIndex extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionMobileIndex.class);
+	private WrapCopier<BBSForumInfo, Wo> forum_wrapout_copier = WrapCopierFactory.wo(BBSForumInfo.class, Wo.class,
+			null, JpaObject.FieldsInvisible);
+
+	protected ActionResult<List<Wo>> execute(HttpServletRequest request, EffectivePerson effectivePerson)
+			throws Exception {
+		ActionResult<List<Wo>> result = new ActionResult<>();
+		List<Wo> wraps = new ArrayList<>();
+		List<BBSPermissionInfo> permissionList = null;
+		Boolean check = true;
+		EffectivePerson currentPerson = this.effectivePerson(request);
+
+		if (check) {
+			try {
+				permissionList = getPermissionListByUser(currentPerson);
+			} catch (Exception e) {
+				permissionList = null;
+			}
+		}
+
+		// 根据登录的用户查询用户可以访问到的所有论坛信息列表
+		if (check) {
+			wraps = getForumInfoListByPerson(currentPerson, permissionList);
+		}
+
+		if (check) {
+			if ( ListTools.isNotEmpty( wraps )) {// 在每个论坛里查询用户可以访问到的所有版块信息
+				for (Wo wrapOutForumInfoForIndex : wraps) {
+					composeMainSectionForForumInIndex(wrapOutForumInfoForIndex, permissionList);
+				}
+			}
+		}
+		result.setData(wraps);
+		return result;
+	}
+
+	private Wo composeMainSectionForForumInIndex(Wo wrapOutForumInfoForIndex, List<BBSPermissionInfo> permissionList) {
+		if (wrapOutForumInfoForIndex == null) {
+			return null;
+		}
+		List<String> sectionIds = new ArrayList<String>();
+		List<BBSSectionInfo> sectionInfoList = null;
+		List<WoSectionInfoForIndex> wrapSectionInfoList = null;
+		List<BBSPermissionInfo> sectionViewPermissionList = null;
+
+		try {
+			sectionViewPermissionList = permissionInfoService.filterPermissionListByPermissionFunction("SECTION_VIEW",
+					permissionList);
+		} catch (Exception e) {
+			logger.warn("system filter SECTION_VIEW permission from user permission list got an exception!");
+			logger.error(e);
+			sectionViewPermissionList = null;
+		}
+
+		if ( ListTools.isNotEmpty( sectionViewPermissionList )) {
+			for (BBSPermissionInfo permission : sectionViewPermissionList) {
+				if (permission.getMainSectionId() != null && !sectionIds.contains(permission.getMainSectionId())) {
+					sectionIds.add(permission.getMainSectionId());
+				}
+			}
+		}
+		try {
+			sectionInfoList = sectionInfoServiceAdv.viewMainSectionByForumId(wrapOutForumInfoForIndex.getId(),
+					sectionIds);
+		} catch (Exception e) {
+			logger.warn("system query all mainSection info got an exception!");
+			logger.error(e);
+		}
+		if ( ListTools.isNotEmpty( sectionInfoList )) {
+			try {
+				wrapSectionInfoList = WoSectionInfoForIndex.copier.copy(sectionInfoList);
+				wrapOutForumInfoForIndex.setSectionInfoList(wrapSectionInfoList);
+			} catch (Exception e) {
+				logger.warn("system copy forum list to wraps got an exception!");
+				logger.error(e);
+			}
+		}
+		return wrapOutForumInfoForIndex;
+	}
+
+	/**
+	 * 根据登录者权限获取可以访问到的所有论坛信息列表
+	 * 
+	 * @param currentPerson
+	 * @param permissionList
+	 * @return
+	 */
+	private List<Wo> getForumInfoListByPerson(EffectivePerson currentPerson, List<BBSPermissionInfo> permissionList) {
+		if (currentPerson == null) {
+			return null;
+		}
+		List<String> forumIds = new ArrayList<String>();
+		List<BBSForumInfo> forumInfoList = null;
+		List<BBSPermissionInfo> forumViewPermissionList = null;
+		List<Wo> wraps = new ArrayList<>();
+
+		try {
+			forumViewPermissionList = permissionInfoService.filterPermissionListByPermissionFunction("FORUM_VIEW",
+					permissionList);
+		} catch (Exception e) {
+			logger.warn("system filter FORUM_VIEW permission from user permission list got an exception!");
+			logger.error(e);
+			forumViewPermissionList = null;
+		}
+
+		if ( ListTools.isNotEmpty( forumViewPermissionList )) {
+			for (BBSPermissionInfo permission : forumViewPermissionList) {
+				forumIds.add(permission.getForumId());
+			}
+		}
+
+		try {
+			forumInfoList = forumInfoServiceAdv.listAllViewAbleForumWithUserPermission(forumIds);
+			if (forumInfoList == null) {
+				forumInfoList = new ArrayList<BBSForumInfo>();
+			}
+		} catch (Exception e) {
+			logger.warn("system query all forum info got an exception!");
+			logger.error(e);
+			return null;
+		}
+
+		if ( ListTools.isNotEmpty( forumInfoList )) {
+			try {
+				wraps = forum_wrapout_copier.copy(forumInfoList);
+			} catch (Exception e) {
+				logger.warn("system copy forum list to wraps got an exception!");
+				logger.error(e);
+				return null;
+			}
+
+		}
+		return wraps;
+	}
+
+	/**
+	 * 根据人员信息查询该用户拥有的所有权限列表
+	 * 
+	 * @param currentPerson
+	 * @return
+	 */
+	private List<BBSPermissionInfo> getPermissionListByUser(EffectivePerson currentPerson) {
+		List<BBSPermissionInfo> permissionList = null;
+		// 如果不是匿名用户,则查询该用户所有能访问的论坛信息
+		if ( currentPerson != null && !"anonymous".equalsIgnoreCase(currentPerson.getTokenType().name())) {
+			try {
+				permissionList = userPermissionService.getUserPermissionInfoList(currentPerson.getDistinguishedName());
+			} catch (Exception e) {
+				logger.warn(
+						"system get all user permission list from ThisApplication.userPermissionInfoMap got an exception!");
+				logger.error(e);
+				permissionList = null;
+			}
+		}
+		return permissionList;
+	}
+
+	public static class Wo extends BBSForumInfo {
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static List<String> Excludes = new ArrayList<String>();
+
+		public static WrapCopier<BBSForumInfo, Wo> copier = WrapCopierFactory.wo(BBSForumInfo.class, Wo.class, null,
+				JpaObject.FieldsInvisible);
+
+		// 论坛版块列表
+		private List<WoSectionInfoForIndex> sectionInfoList = null;
+
+		public List<WoSectionInfoForIndex> getSectionInfoList() {
+			return sectionInfoList;
+		}
+
+		public void setSectionInfoList(List<WoSectionInfoForIndex> sectionInfoList) {
+			this.sectionInfoList = sectionInfoList;
+		}
+	}
+
+	public static class WoSectionInfoForIndex extends BBSSectionInfo {
+
+		private static final long serialVersionUID = -5076990764713538973L;
+
+		public static WrapCopier<BBSSectionInfo, WoSectionInfoForIndex> copier = WrapCopierFactory
+				.wo(BBSSectionInfo.class, WoSectionInfoForIndex.class, null, JpaObject.FieldsInvisible);
+		// 版块的子版块信息列表
+		private List<WoSectionInfoForIndex> subSections = null;
+
+		public List<WoSectionInfoForIndex> getSubSections() {
+			return subSections;
+		}
+
+		public void setSubSections(List<WoSectionInfoForIndex> subSections) {
+			this.subSections = subSections;
+		}
+	}
+
+}

+ 25 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/BaseAction.java

@@ -0,0 +1,25 @@
+package com.x.bbs.assemble.control.jaxrs.login;
+
+import com.x.base.core.project.cache.ApplicationCache;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.bbs.assemble.control.service.BBSForumInfoServiceAdv;
+import com.x.bbs.assemble.control.service.BBSOperationRecordService;
+import com.x.bbs.assemble.control.service.BBSPermissionInfoService;
+import com.x.bbs.assemble.control.service.BBSRoleInfoService;
+import com.x.bbs.assemble.control.service.BBSSectionInfoServiceAdv;
+import com.x.bbs.assemble.control.service.UserManagerService;
+import com.x.bbs.assemble.control.service.UserPermissionService;
+
+import net.sf.ehcache.Ehcache;
+
+public class BaseAction extends StandardJaxrsAction{
+	
+	protected UserPermissionService userPermissionService = new UserPermissionService();
+	protected Ehcache cache = ApplicationCache.instance().getCache( BaseAction.class);
+	protected UserManagerService userManagerService = new UserManagerService();
+	protected BBSForumInfoServiceAdv forumInfoServiceAdv = new BBSForumInfoServiceAdv();
+	protected BBSPermissionInfoService permissionInfoService = new BBSPermissionInfoService();
+	protected BBSRoleInfoService roleInfoService = new BBSRoleInfoService();
+	protected BBSSectionInfoServiceAdv sectionInfoServiceAdv = new BBSSectionInfoServiceAdv();
+	protected BBSOperationRecordService operationRecordService = new BBSOperationRecordService();
+}

+ 53 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/LoginAction.java

@@ -0,0 +1,53 @@
+package com.x.bbs.assemble.control.jaxrs.login;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+import com.x.bbs.assemble.control.service.bean.RoleAndPermission;
+
+@Path("login")
+@JaxrsDescribe("登入信息服务")
+public class LoginAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(LoginAction.class);
+
+	@JaxrsMethodDescribe(value = "用户进入系统,获取并且更新用户权限角色信息.", action = ActionLogin.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void login(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<RoleAndPermission> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionLogin().execute(request, effectivePerson);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "获取所有ForumInfo的信息列表时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 52 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/LogoutAction.java

@@ -0,0 +1,52 @@
+package com.x.bbs.assemble.control.jaxrs.login;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+import com.x.bbs.assemble.control.service.bean.RoleAndPermission;
+
+@Path("logout")
+@JaxrsDescribe("登出服务")
+public class LogoutAction extends StandardJaxrsAction {
+	private static Logger logger = LoggerFactory.getLogger(LogoutAction.class);
+
+	@JaxrsMethodDescribe(value = "退出系统.", action = ActionLogout.class)
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void login(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request) {
+		ActionResult<RoleAndPermission> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionLogout().execute(request, effectivePerson);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "获取所有ForumInfo的信息列表时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+}

+ 63 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/MobileIndexAction.java

@@ -0,0 +1,63 @@
+package com.x.bbs.assemble.control.jaxrs.login;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.foruminfo.exception.ExceptionForumInfoProcess;
+
+@Path("mobile")
+@JaxrsDescribe("手机APP论坛首页信息内容查询")
+public class MobileIndexAction extends StandardJaxrsAction {
+
+	private static Logger logger = LoggerFactory.getLogger(MobileIndexAction.class);
+
+	/**
+	 * 手机用户访问论坛信息,首页所有的信息整合在一起 匿名用户可以访问
+	 * 
+	 * @param request
+	 * @return
+	 */
+	@JaxrsMethodDescribe(value = "获取登录者可以访问到的所有ForumInfo的信息列表.", action = ActionMobileIndex.class)
+	@GET
+	@Path("view/all")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void viewAllWithMyPermission(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request) {
+		ActionResult<List<ActionMobileIndex.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionMobileIndex().execute(request, effectivePerson);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionForumInfoProcess(e, "获取所有ForumInfo的信息列表时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/exception/ExceptionInsufficientPermissions.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.login.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionInsufficientPermissions extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionInsufficientPermissions( String name, String role ) {
+		super("操作权限不足。Name:" + name + ", Role:" + role );
+	}
+}

+ 12 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/login/exception/ExceptionUserLogin.java

@@ -0,0 +1,12 @@
+package com.x.bbs.assemble.control.jaxrs.login.exception;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ExceptionUserLogin extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionUserLogin( Throwable e, String name ) {
+		super("用户进行系统登入时发生异常! Person:" + name, e );
+	}
+}

+ 138 - 0
o2server/x_bbs_assemble_control/src/main/webapp/describe/sources/com/x/bbs/assemble/control/jaxrs/permissioninfo/ActionCheckReplyPublishable.java

@@ -0,0 +1,138 @@
+package com.x.bbs.assemble.control.jaxrs.permissioninfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.bbs.assemble.control.jaxrs.permissioninfo.exception.ExceptionPermissionInfoProcess;
+import com.x.bbs.assemble.control.jaxrs.permissioninfo.exception.ExceptionSectionNotExists;
+import com.x.bbs.assemble.control.jaxrs.permissioninfo.exception.ExceptionSubjectIdEmpty;
+import com.x.bbs.assemble.control.jaxrs.permissioninfo.exception.ExceptionSubjectNotExists;
+import com.x.bbs.assemble.control.service.bean.RoleAndPermission;
+import com.x.bbs.entity.BBSSectionInfo;
+import com.x.bbs.entity.BBSSubjectInfo;
+
+public class ActionCheckReplyPublishable extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionCheckReplyPublishable.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String subjectId) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Wo wrap = new Wo();
+		RoleAndPermission roleAndPermission = null;
+		BBSSubjectInfo subjectInfo = null;
+		BBSSectionInfo sectionInfo = null;
+		Boolean hasPermission = false;
+		Boolean publishAble = true;
+		Boolean check = true;
+		String checkUserPermission = null;
+		if (check) {
+			if (subjectId == null || subjectId.isEmpty()) {
+				check = false;
+				publishAble = false;
+				Exception exception = new ExceptionSubjectIdEmpty();
+				result.error(exception);
+			}
+		}
+		if (check) {// 获取用户的权限列表
+			if ("anonymous".equalsIgnoreCase(effectivePerson.getTokenType().name())) {
+				roleAndPermission = new RoleAndPermission();
+			} else {
+				try {
+					roleAndPermission = UserPermissionService.getUserRoleAndPermission(effectivePerson.getDistinguishedName());
+				} catch (Exception e) {
+					check = false;
+					publishAble = false;
+					Exception exception = new ExceptionPermissionInfoProcess(e,
+							"获取用户的论坛访问权限列表时发生异常.Person:" + effectivePerson.getDistinguishedName());
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}
+		}
+		if (check) {
+			try {
+				subjectInfo = subjectInfoService.get(subjectId);
+			} catch (Exception e) {
+				check = false;
+				publishAble = false;
+				Exception exception = new ExceptionPermissionInfoProcess(e, "根据指定ID查询主题信息时发生异常.ID:" + subjectId);
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		if (check) {
+			if (subjectInfo == null) {
+				check = false;
+				publishAble = false;
+				Exception exception = new ExceptionSubjectNotExists(subjectId);
+				result.error(exception);
+			} else {
+				if (subjectInfo.getStopReply()) {
+					publishAble = false;
+				}
+				if (!"启用".equals(subjectInfo.getSubjectStatus())) {
+					publishAble = false;
+				}
+			}
+		}
+		if (check && publishAble) { // 再判断用户是否可以在主题所在的版块进行回复
+			try {
+				sectionInfo = sectionInfoService.get(subjectInfo.getSectionId());
+			} catch (Exception e) {
+				check = false;
+				publishAble = false;
+				Exception exception = new ExceptionPermissionInfoProcess(e,
+						"根据指定ID查询版块信息时发生异常.ID:" + subjectInfo.getSectionId());
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		if (check && publishAble) {
+			if (sectionInfo == null) {
+				check = false;
+				publishAble = false;
+				Exception exception = new ExceptionSectionNotExists(subjectInfo.getSectionId());
+				result.error(exception);
+			} else {
+				if ("所有人".equals(sectionInfo.getReplyPublishAble())) {
+				} else {// 判断权限
+					checkUserPermission = "SECTION_REPLY_PUBLISH_" + sectionInfo.getId();
+					hasPermission = checkUserPermission(checkUserPermission, roleAndPermission.getPermissionInfoList());
+					if (!hasPermission) {
+						publishAble = false;
+					}
+				}
+			}
+		}
+
+		if (check) {
+			wrap.setCheckResult(publishAble);
+		}
+
+		result.setData(wrap);
+		return result;
+	}
+
+	public static class Wo{
+		
+		public static List<String> Excludes = new ArrayList<String>();
+		
+		//是否拥有权限
+		private Boolean checkResult = false;
+
+		public Boolean getCheckResult() {
+			return checkResult;
+		}
+
+		public void setCheckResult(Boolean checkResult) {
+			this.checkResult = checkResult;
+		}
+		
+	}
+}

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