Przeglądaj źródła

update:注册协议

yonge 5 lat temu
rodzic
commit
da508159eb
31 zmienionych plików z 1514 dodań i 144 usunięć
  1. 7 5
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java
  2. 4 6
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/fallback/SysUserFeignServiceFallback.java
  3. 0 11
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  4. 1 1
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java
  5. 31 26
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java
  6. 2 6
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  7. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserTsignDao.java
  8. 67 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserTsign.java
  9. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java
  10. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserTsignService.java
  11. 1 2
      mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java
  12. 145 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  13. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  14. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  15. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  16. 23 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserTsignServiceImpl.java
  17. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  18. 147 0
      mec-biz/src/main/resources/config/contracts/Instrument.html
  19. 165 0
      mec-biz/src/main/resources/config/contracts/courses.ftl
  20. 222 0
      mec-biz/src/main/resources/config/contracts/register.ftl
  21. BIN
      mec-biz/src/main/resources/config/fonts/simsun.ttc
  22. 68 0
      mec-biz/src/main/resources/config/mybatis/SysUserTsignMapper.xml
  23. 1 1
      mec-education/src/main/java/com/ym/mec/education/service/impl/TeacherAttendanceServiceImpl.java
  24. 58 0
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupRegisterController.java
  25. 24 45
      mec-student/src/main/java/com/ym/mec/student/controller/RegisterController.java
  26. 1 1
      mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java
  27. 0 6
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/ESealPlugin.java
  28. 12 30
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java
  29. 18 0
      mec-util/pom.xml
  30. 97 0
      mec-util/src/main/java/com/ym/mec/util/freemarker/FreemarkerTemplateEngine.java
  31. 370 0
      mec-util/src/main/java/com/ym/mec/util/pdf/PDFUtil.java

+ 7 - 5
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java

@@ -2,21 +2,23 @@ package com.ym.mec.auth.api.client;
 
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import com.ym.mec.auth.api.client.fallback.SysUserFeignServiceFallback;
-import com.ym.mec.auth.api.dto.SysUserInfo;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.common.config.FeignConfiguration;
 
 @FeignClient(name = "auth-server", configuration = { FeignConfiguration.class }, fallback = SysUserFeignServiceFallback.class)
 public interface SysUserFeignService {
 
-	@GetMapping(value = "query/{username}")
-	public SysUserInfo getUser(@PathVariable("username") String username);
+	@GetMapping(value = "user/queryUserById/{userId}")
+	public SysUser queryUserById(@PathVariable("userId") Integer userId);
 
 	@GetMapping(value = "user/queryUserByPhone")
-	public SysUser getUserByMobile(@RequestParam("mobile") String mobile);
+	public SysUser queryUserByMobile(@RequestParam("mobile") String mobile);
 
 	@PostMapping(value = "user/add", consumes = MediaType.APPLICATION_JSON_VALUE)
 	public Object addUser(SysUser user);

+ 4 - 6
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/fallback/SysUserFeignServiceFallback.java

@@ -3,15 +3,14 @@ package com.ym.mec.auth.api.client.fallback;
 import org.springframework.stereotype.Component;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.dto.SysUserInfo;
 import com.ym.mec.auth.api.entity.SysUser;
 
 @Component
 public class SysUserFeignServiceFallback implements SysUserFeignService {
 
 	@Override
-	public SysUserInfo getUser(String username) {
-		return new SysUserInfo();
+	public SysUser queryUserById(Integer userId) {
+		return null;
 	}
 
 	@Override
@@ -22,13 +21,12 @@ public class SysUserFeignServiceFallback implements SysUserFeignService {
 
 	@Override
 	public SysUser queryUserInfo() {
-		System.out.println("********************************");
 		return null;
 	}
 
 	@Override
-	public SysUser getUserByMobile(String mobile) {
-		return new SysUser();
+	public SysUser queryUserByMobile(String mobile) {
+		return null;
 	}
 
 	public Object addUser(SysUser user){

+ 0 - 11
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java

@@ -95,9 +95,6 @@ public class SysUser implements Serializable{
 	@ApiModelProperty(value = "真实姓名",required = false)
 	private String realName;
 
-	@ApiModelProperty(value = "e签宝唯一编号",required = false)
-	private String esignId;
-
 	@ApiModelProperty(value = "微信号",required = false)
 	private String wechatId;
 
@@ -269,14 +266,6 @@ public class SysUser implements Serializable{
 		this.idCardNo = idCardNo;
 	}
 
-	public String getEsignId() {
-		return esignId;
-	}
-
-	public void setEsignId(String esignId) {
-		this.esignId = esignId;
-	}
-
 	public String getWechatId() {
 		return wechatId;
 	}

+ 1 - 1
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java

@@ -106,7 +106,7 @@ public class TokenController extends BaseController {
 	}
 
 	@PostMapping(value = "exit",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
-	@ApiOperation(value = "出登录")
+	@ApiOperation(value = "退出登录")
 	public HttpResponseResult logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION) String authHeader) {
 		if (StringUtils.isBlank(authHeader)) {
 			return failed("退出失败,token 为空");

+ 31 - 26
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/UserController.java

@@ -46,7 +46,7 @@ public class UserController extends BaseController {
 	@GetMapping("/query")
 	public Object query() {
 		AuthUser user = SecurityUtils.getUser();
-		if(user != null){
+		if (user != null) {
 			return succeed(sysUserService.get(user.getUserId()));
 		}
 		return failed();
@@ -55,7 +55,7 @@ public class UserController extends BaseController {
 	@ApiOperation(value = "根据用户编号获取用户基本信息")
 	@GetMapping("/getBasic")
 	public Object getBasic(Integer userId) {
-		if(userId == null){
+		if (userId == null) {
 			return failed("参数校验异常");
 		}
 		return succeed(sysUserService.getBasic(userId));
@@ -66,6 +66,11 @@ public class UserController extends BaseController {
 		return sysUserService.queryByPhone(mobile);
 	}
 
+	@GetMapping(value = "/queryUserById/{userId}")
+	public SysUser queryUserById(@PathVariable("userId") Integer userId) {
+		return sysUserService.get(userId);
+	}
+
 	@ApiOperation(value = "新增用户")
 	@PostMapping(value = "/add", consumes = MediaType.APPLICATION_JSON_VALUE)
 	public Object add(@RequestBody SysUser sysUser) {
@@ -73,48 +78,48 @@ public class UserController extends BaseController {
 	}
 
 	@ApiOperation(value = "设置密码")
-	@PostMapping(value = "/setPassword",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+	@PostMapping(value = "/setPassword", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
 	@ApiImplicitParams({ @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
 			@ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String") })
-	public Object setPassword(String mobile,String password) {
-		if(StringUtils.isEmpty(mobile) || StringUtils.isEmpty(password)){
+	public Object setPassword(String mobile, String password) {
+		if (StringUtils.isEmpty(mobile) || StringUtils.isEmpty(password)) {
 			return failed();
 		}
 		SysUser sysUser = sysUserService.queryByPhone(mobile);
-		if(sysUser == null){
+		if (sysUser == null) {
 			return failed("用户不存在");
 		}
 		password = new BCryptPasswordEncoder().encode(password);
-		sysUserService.updatePassword(mobile,password);
+		sysUserService.updatePassword(mobile, password);
 		return succeed();
 	}
 
 	@ApiOperation(value = "修改密码")
-	@PostMapping(value = "/updatePassword",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+	@PostMapping(value = "/updatePassword", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
 	@ApiImplicitParams({ @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
 			@ApiImplicitParam(name = "authCode", value = "验证码", required = true, dataType = "String"),
-			@ApiImplicitParam(name = "newPassword", value = "新密码", required = true, dataType = "String")})
-	public Object updatePassword(String mobile,String authCode,String newPassword) {
-		if(StringUtils.isEmpty(mobile) || StringUtils.isEmpty(authCode) || StringUtils.isEmpty(newPassword)){
+			@ApiImplicitParam(name = "newPassword", value = "新密码", required = true, dataType = "String") })
+	public Object updatePassword(String mobile, String authCode, String newPassword) {
+		if (StringUtils.isEmpty(mobile) || StringUtils.isEmpty(authCode) || StringUtils.isEmpty(newPassword)) {
 			return failed("参数校验异常");
 		}
 		SysUser sysUser = sysUserService.queryByPhone(mobile);
-		if(sysUser == null){
+		if (sysUser == null) {
 			return failed("用户不存在");
 		}
-		if(smsCodeService.verifyValidCode(mobile, authCode)){
-			sysUserService.updatePassword(mobile,new BCryptPasswordEncoder().encode(newPassword));
+		if (smsCodeService.verifyValidCode(mobile, authCode)) {
+			sysUserService.updatePassword(mobile, new BCryptPasswordEncoder().encode(newPassword));
 			return succeed();
-		}else {
+		} else {
 			return failed("验证码错误");
 		}
 	}
 
 	@ApiOperation(value = "修改用户")
-	@PostMapping(value = "/update",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+	@PostMapping(value = "/update", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
 	public Object update(SysUser sysUser) {
 		AuthUser user = SecurityUtils.getUser();
-		if(user != null){
+		if (user != null) {
 			Date date = new Date();
 			sysUser.setId(user.getUserId());
 			sysUser.setUpdateTime(date);
@@ -128,7 +133,7 @@ public class UserController extends BaseController {
 	@GetMapping("/getRole")
 	public Object getRole() {
 		AuthUser user = SecurityUtils.getUser();
-		if(user != null) {
+		if (user != null) {
 			return succeed(sysRoleService.findRoleByUserId(user.getUserId()));
 		}
 		return failed();
@@ -137,24 +142,24 @@ public class UserController extends BaseController {
 	@ApiOperation(value = "用户角色新增")
 	@ApiImplicitParams({ @ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataType = "Integer"),
 			@ApiImplicitParam(name = "roleIds", value = "角色id,逗号分隔", required = true, dataType = "String") })
-	@PostMapping(value = "/addRole",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
-	public Object getRole(String userId,String roleIds) {
-		if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(roleIds)){
+	@PostMapping(value = "/addRole", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+	public Object getRole(String userId, String roleIds) {
+		if (StringUtils.isEmpty(userId) || StringUtils.isEmpty(roleIds)) {
 			return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
 		}
-		sysUserRoleService.batchInsert(Integer.parseInt(userId),roleIds);
+		sysUserRoleService.batchInsert(Integer.parseInt(userId), roleIds);
 		return succeed();
 	}
 
 	@ApiOperation(value = "用户角色删除")
 	@ApiImplicitParams({ @ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataType = "Integer"),
 			@ApiImplicitParam(name = "roleIds", value = "角色id,逗号分隔", required = true, dataType = "String") })
-	@PostMapping(value = "/delRole",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
-	public Object delRole(String userId,String roleIds) {
-		if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(roleIds)){
+	@PostMapping(value = "/delRole", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+	public Object delRole(String userId, String roleIds) {
+		if (StringUtils.isEmpty(userId) || StringUtils.isEmpty(roleIds)) {
 			return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
 		}
-		sysUserRoleService.batchDel(Integer.parseInt(userId),roleIds);
+		sysUserRoleService.batchDel(Integer.parseInt(userId), roleIds);
 		return succeed();
 	}
 }

+ 2 - 6
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -27,7 +27,6 @@
         <result column="email_" property="email"/>
         <result column="im_token_" property="imToken"/>
         <result column="id_card_no_" property="idCardNo"/>
-        <result column="esign_id_" property="esignId"/>
         <result column="wechat_id_" property="wechatId"/>
     </resultMap>
 
@@ -66,9 +65,9 @@
         </selectKey>
         -->
         INSERT INTO sys_user
-        (im_token_,id_,username_,salt_,phone_,avatar_,organ_id_,create_time_,update_time_,wx_openid_,qq_openid_,user_type_,gender_,nation_,birthdate_,email_,id_card_no_,esign_id_,wechat_id_,real_name_)
+        (im_token_,id_,username_,salt_,phone_,avatar_,organ_id_,create_time_,update_time_,wx_openid_,qq_openid_,user_type_,gender_,nation_,birthdate_,email_,id_card_no_,wechat_id_,real_name_)
         VALUES(#{imToken},#{id},#{username},#{salt},#{phone},#{avatar},#{organId},now(),now(),#{wxOpenid},#{qqOpenid},#{userType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
-        #{gender},#{nation},#{birthdate},#{email},#{idCardNo},#{esignId},#{wechatId},#{realName})
+        #{gender},#{nation},#{birthdate},#{email},#{idCardNo},#{wechatId},#{realName})
     </insert>
 
     <!-- 根据主键查询一条记录 -->
@@ -126,9 +125,6 @@
             <if test="idCardNo != null">
                 id_card_no_ = #{idCardNo},
             </if>
-            <if test="esignId != null">
-                esign_id_ = #{esignId},
-            </if>
             <if test="wechatId != null">
                 wechat_id_ = #{wechatId},
             </if>

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysUserTsignDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysUserTsignDao extends BaseDAO<Integer, SysUserTsign> {
+
+	
+}

+ 67 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysUserTsign.java

@@ -0,0 +1,67 @@
+package com.ym.mec.biz.dal.entity;
+
+import java.util.Date;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_user_tsign):
+ */
+public class SysUserTsign {
+
+	/**  */
+	private Integer userId;
+
+	/** e签宝账户ID */
+	private String accountId;
+
+	/** 电子印章数据 */
+	private String sealData;
+
+	/**  */
+	private java.util.Date createTime = new Date();
+
+	public SysUserTsign(Integer userId, String accountId, String sealData) {
+		this.userId = userId;
+		this.accountId = accountId;
+		this.sealData = sealData;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getUserId() {
+		return this.userId;
+	}
+
+	public void setAccountId(String accountId) {
+		this.accountId = accountId;
+	}
+
+	public String getAccountId() {
+		return this.accountId;
+	}
+
+	public void setSealData(String sealData) {
+		this.sealData = sealData;
+	}
+
+	public String getSealData() {
+		return this.sealData;
+	}
+
+	public void setCreateTime(java.util.Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getCreateTime() {
+		return this.createTime;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ContractService.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.service;
+
+import java.util.Map;
+
+public interface ContractService {
+
+	/**
+	 * 用户注册
+	 * @param userId
+	 * @return
+	 */
+	boolean register(Integer userId);
+
+	/**
+	 * 传递注册协议至第三方公证平台
+	 * @param userId
+	 * @param params
+	 * @return
+	 */
+	boolean transferRegisterContract(Integer userId, Map<String, Object> params);
+
+	/**
+	 * 查询注册协议内容
+	 * @param userId
+	 * @param params
+	 * @return
+	 */
+	String queryRegisterContract(Integer userId, Map<String, Object> params);
+}

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserTsignService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysUserTsignService extends BaseService<Integer, SysUserTsign> {
+
+}

+ 1 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/UploadFileService.java

@@ -4,7 +4,6 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.Files;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
@@ -32,7 +31,7 @@ public class UploadFileService {
 	private int maxSize;
 
 	/** 支持的扩展名 */
-	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi}")
+	@Value("${common.upload.supportExtensions:jpg,jpeg,gif,png,mp3,mid,midi,aac}")
 	private String supportExtensions;
 
 	/** 文件根目录 */

+ 145 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java

@@ -0,0 +1,145 @@
+package com.ym.mec.biz.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.biz.service.SysUserTsignService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.thirdparty.eseal.ESealPlugin;
+import com.ym.mec.thirdparty.storage.StoragePlugin;
+import com.ym.mec.util.freemarker.FreemarkerTemplateEngine;
+import com.ym.mec.util.pdf.PDFUtil;
+
+@Service
+public class ContractServiceImpl implements ContractService {
+
+	@Autowired
+	private SysUserTsignService sysUserTsignService;
+
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private ESealPlugin eSealPlugin;
+
+	@Autowired
+	private StoragePlugin storagePlugin;
+
+	@Value("${contract.baseDir:/var/pdf}")
+	private String contractBaseDir;
+
+	private DateFormat dateFormatOss = new SimpleDateFormat("yyyy/MM/dd");
+
+	@Override
+	public boolean register(Integer userId) {
+
+		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
+
+		if (sysUserTsign == null) {
+
+			SysUser user = sysUserFeignService.queryUserById(userId);
+			if (user == null) {
+				return false;
+			}
+			String accountId = eSealPlugin.createUserAccount(user.getRealName(), user.getIdCardNo(), user.getPhone());
+
+			if (StringUtils.isBlank(accountId)) {
+				throw new BizException("创建电子存证账户失败");
+			}
+
+			String sealData = eSealPlugin.createSeal(accountId);
+
+			if (StringUtils.isBlank(sealData)) {
+				throw new BizException("创建电子存证印章失败");
+			}
+
+			sysUserTsign = new SysUserTsign(userId, accountId, sealData);
+
+			sysUserTsignService.insert(sysUserTsign);
+		}
+
+		return true;
+	}
+
+	@Override
+	public boolean transferRegisterContract(Integer userId, Map<String, Object> params) {
+
+		SysUserTsign sysUserTsign = sysUserTsignService.get(userId);
+
+		if (sysUserTsign == null) {
+			return false;
+		}
+
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/" + userId + ".pdf";
+		File debtFile = new File(contractBaseDir);
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		templateEngine.render(params, "register.ftl", new File(srcPdfPath));
+
+		// 生成借款协议PDF
+		try {
+			PDFUtil.renderToPDFByData(ContractServiceImpl.class.getResource("/").getFile(), FileUtils.readFileToString(new File(srcPdfPath)), srcPdfPath,
+					"config/fonts/simsun.ttc");
+		} catch (IOException e) {
+			throw new BizException("生产pdf协议失败", e);
+		}
+
+		eSealPlugin.userSign(sysUserTsign.getAccountId(), sysUserTsign.getSealData(), srcPdfPath, srcPdfPath);
+
+		Date date = new Date();
+		// 上传到oss
+		String dateStrOss = dateFormatOss.format(date);
+		String pdfFilePath = storagePlugin.uploadFile(dateStrOss, new File(srcPdfPath));
+
+		FileUtils.deleteQuietly(new File(srcPdfPath));
+
+		return true;
+	}
+
+	@Override
+	public String queryRegisterContract(Integer userId, Map<String, Object> params) {
+
+		// 合成freemarker
+		String srcPdfPath = contractBaseDir + "/" + userId + ".pdf";
+		File debtFile = new File(contractBaseDir);
+		if (!debtFile.exists()) {
+			debtFile.mkdirs();
+		}
+
+		FreemarkerTemplateEngine templateEngine = FreemarkerTemplateEngine.getInstance();
+		templateEngine.setClassForTemplateLoading(ContractServiceImpl.class, "/config/contracts/");
+
+		templateEngine.render(params, "register.ftl", new File(srcPdfPath));
+
+		String result = "";
+		try {
+			result = FileUtils.readFileToString(new File(srcPdfPath));
+		} catch (IOException e) {
+			throw new BizException("读取注册协议出错", e);
+		}
+		FileUtils.deleteQuietly(new File(srcPdfPath));
+
+		return result;
+	}
+
+}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -51,7 +51,7 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee>  imp
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void add(Employee employee){
-		SysUser user = sysUserFeignService.getUserByMobile(employee.getPhone());
+		SysUser user = sysUserFeignService.queryUserByMobile(employee.getPhone());
 		if(user != null){
             user.setUserType(SysUserType.SYSTEM);
 			teacherDao.updateUser(user);

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -102,7 +102,7 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional(rollbackFor = Exception.class)
     public StudentRegistration addStudent(StudentRegistration studentRegistration) {
         Date date = new Date();
-        SysUser sysUser = sysUserFeignService.getUserByMobile(studentRegistration.getParentsPhone());
+        SysUser sysUser = sysUserFeignService.queryUserByMobile(studentRegistration.getParentsPhone());
         if (sysUser == null) {
             sysUser = new SysUser();
             sysUser.setPhone(studentRegistration.getParentsPhone());

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -79,7 +79,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 			for (String tel : tels) {
 				message = new SysMessage();
 				if (userId == null) {
-					SysUser user = sysUserFeignService.getUserByMobile(tel);
+					SysUser user = sysUserFeignService.queryUserByMobile(tel);
 					if (user != null) {
 						userId = user.getId();
 					}

+ 23 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserTsignServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.biz.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.biz.dal.dao.SysUserTsignDao;
+import com.ym.mec.biz.dal.entity.SysUserTsign;
+import com.ym.mec.biz.service.SysUserTsignService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysUserTsignServiceImpl extends BaseServiceImpl<Integer, SysUserTsign>  implements SysUserTsignService {
+	
+	@Autowired
+	private SysUserTsignDao sysUserTsignDao;
+
+	@Override
+	public BaseDAO<Integer, SysUserTsign> getDAO() {
+		return sysUserTsignDao;
+	}
+	
+}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java

@@ -53,7 +53,7 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void add(Teacher teacher){
-		SysUser user = sysUserFeignService.getUserByMobile(teacher.getPhone());
+		SysUser user = sysUserFeignService.queryUserByMobile(teacher.getPhone());
 		if(user != null && user.getId() != null){
 			teacherDao.updateUser(user);
 			Teacher teacher1 = teacherDao.get(user.getId());

+ 147 - 0
mec-biz/src/main/resources/config/contracts/Instrument.html

@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html lang="en" style="font-size: 100px;">
+<head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Cache-Control" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />
+    <title>乐器借用协议</title>
+    <style>
+        body { margin: 0; }
+        header {
+            height: .40rem;
+            line-height: .40rem;
+            color: #000;
+            font-size: .17rem;
+            background: #fff;
+            box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
+            text-align: center;
+        }
+        header .back {
+            width: .2rem;
+            height: .2rem;
+            position: absolute;
+            left: .12rem;
+            top: .1rem;
+        }
+        .container {
+            padding: .22rem .2rem .3rem;
+            font-size: .14rem;
+        }
+        h1 {
+            font-size: .16rem;
+            text-align: center;
+        }
+        h2 {
+            font-size: .16rem;
+            font-weight: bold;
+            padding-top: .15rem;
+        }
+        h3 {
+            font-size: .14rem;
+            font-weight: bold;
+        }
+        .signature {
+            display: flex;
+            padding-top: .5rem;
+        }
+        .signature .sign {
+            flex: 1;
+            position: relative;
+        }
+        .signature span {
+            display: block;
+        }
+        .signature .cachet {
+            position: absolute;
+            top: -.6rem;
+            left: 0;
+            width: 1.5rem;
+            height: 1.5rem;
+        }
+        .iInfo {
+            display: flex;
+        }
+        .iInfo span {
+            flex: 1;
+        }
+        .iInfoContent, .iInfoContent span {
+            display: block;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <h1>《乐器借用协议》</h1>
+        甲方:{{proto}} <br/>
+        <div style="display: flex;">乙方:
+            <div style="flex: 1 auto;">
+                <div class="iInfo">
+                    <span>家长姓名 {{proto}}</span>
+                    <span>电话:{{proto}}</span>
+                </div>
+                <div class="iInfo">
+                    <span>身份证号:{{proto}}</span>
+                </div>
+                <div class="iInfo">
+                    <span>学生姓名:{{proto}}</span>
+                    <span>所在班级:{{proto}}</span>
+                </div>
+                <div class="iInfo">
+                    <span>所在声部:{{proto}}</span>
+                </div>
+            </div>
+        </div>                     
+        
+        为了促进学校乐团健康、持续发展,让更多的学生在校园拥有良好的器乐学习机会,甲方基于公益普惠的原则,决定提供价值{{proto}}元的KEY品牌全新乐器供乙方在学校乐团期间免费使用。现根据《中华人民共和国合同法》等法律法规规定,为明确甲乙双方权利义务,经协商一致,就乙方借用乐器事宜达成如下协议:
+        <h2>一、甲方权利与义务:</h2>
+        1、乙方所借用的乐器为甲方资产,乐器所有权归属甲方所有,甲方有权在必要时向乙方收回借用乐器并退还押金。<br/>
+        2、甲方所提供乐器为全新的KEY品牌乐器。在乙方签订本协议、交纳乐器使用押金后,甲方即将乐器交付给乙方供其在学校乐团期间免费使用。<br/>
+        3、乙方归还乐器时,双方当面当场验收,经甲方维修技师检验确认乐器无人为损坏、可正常使用后,甲方在七个工作日内全额不计息退还乙方已交纳的押金。<br/>
+        4、如乙方已购买甲方乐器保养服务,甲方需在乙方借用期间协助乙方处理乐器维修和保养问题。
+        <h2>二、乙方权利与义务:</h2>
+        1、乙方在签订本协议、交纳乐器使用押金¥{{proto}}元(大写人民币{{proto}}元整)后,享有所借用乐器在学校乐团期间的免费使用权。乙方应当爱惜乐器并妥善保管,不得将该乐器转租、借用、出售、典当、质押或抵押,也不得将乐器交于非专业人士使用。乐器借用政策,每位团员仅可享受一次,退团后再次加入乐团的,将无法享受乐器借用政策。<br/>
+        2、乐器日常维护由乙方自行完成,每次练习完毕后需按老师要求对乐器进行擦拭并装箱保管。如因人为原因(包括但不限于磕、碰、摔等)造成乐器损坏的,乙方需自行承担维修费用;如因非甲方原因导致乐器无法正常使用(正常使用磨损除外)或乐器毁损、灭失、遗失的,乙方须按本协议中明示的乐器团购价格进行赔付。<br/>
+        3、当乙方决定不再继续乐团学习时,应在退团之日起1日内将其借用的乐器归还甲方,双方当面当场验收,经甲方维修技师检验确认乐器无人为损坏、可正常使用后,乙方可按照本协议约定获得已交纳的押金;经甲方维修技师检验,乐器存在损坏的,乙方应承担相应的维修费用,如乐器已经无法正常使用的,乙方须按本协议中明示的乐器团购价格进行赔付,甲方有权从应退还乙方的押金中先行扣除维修费用、赔付费用,如甲方扣除押金后仍然不足以弥补维修费用、赔付费用的,甲方有权继续要求乙方支付剩余费用。<br/>
+        4、乙方终止乐团学习2个月内,仍未将乐器归还给甲方的,则视为乙方违约,乙方所交押金甲方有权不予退还,同时乙方须按乐器团购价格进行赔付。
+        <h2>三、乐器标准:</h2> 
+        <div class="iInfo">
+            <span>名称:{{proto}}</span>
+            <span>品牌:{{proto}}</span>  
+        </div>
+        <div class="iInfo">
+            <span>型号:{{proto.}}</span>
+            <span>团购价格:{{proto}}</span>
+        </div>
+
+        <h2>四、违约责任</h2>  
+        1、当事人一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失。<br/>
+        2、乙方应始终维护甲方的知识产权以及品牌形象,本协议期间以及本协议因任何原因失效、被撤销、解除或终止后,均不得直接或间接通过任何公众媒体(包括但不限于传统大众媒体,以及微信、微博、博客、直播平台等社交平台)发表损害甲方(包括但不限于其产品、服务或甲方授课老师)声誉的言论或实施任何类似行为,否则乙方应赔偿甲方因此遭受的全部损失。
+        <h2>五、保密条款</h2>
+        1、双方对本协议的条款、本协议的签订及履行情况以及通过签订和履行本协议而获知的对方及对方关联公司的任何信息均负有保密义务。任何一方不得以任何形式透露给第三方(有关法律法规要求和甲乙双方的法律、会计顾问、授权雇员除外),也不得擅自使用。
+        2、本保密义务期限不受本协议期限的限制。本协议失效、被撤销、解除或终止等任何情况下,双方均应遵守本保密义务。
+        <h2>六、不可抗力</h2>
+        1、一方遇到不可抗力事件(指甲乙双方无法控制、无法预见或即使预见也无法避免的事件,该事件妨碍、影响或延误任何一方履行本协议的全部或部分义务,该事件包括但不限于自然灾害(如水灾、地震等)、火灾、政府行为、法律或政策变化(含学校合作变化)、战争或其他任何类似事件)时,受影响方应当立即书面通知对方,并告知该不可抗力事件对本协议可能产生的影响,并在该不可抗力事件发生后5日内向对方提供该事件的详细信息及由有关机构出具的解释受影响方因此无法履行本协议项下全部或部分义务的相关证明。<br/>
+        2、由于上述不可抗力事件致使受影响方无法履行或无法按时履行本协议项下全部或部分义务的,双方于彼此间均不承担违约责任,但双方应在相互信任的基础上协商解决,尽力减少不可抗力事件对本协议的影响,并采取合理方式进行调整(包括但不限于另行签订补充协议等),尽量避免损失的扩大。<br/>
+        3、不可抗力事件消失或结束后,除双方另行协商一致外,受到不可抗力影响的一方应当立即采取措施继续履行本协议,如不可抗力事件持续30日以上的,则任何一方有权以书面通知对方的方式单方解除本协议。
+        <h2>七、适用法律及争议解决方式</h2>
+        1、本协议的订立、效力、履行、解释及争议解决均适用中华人民共和国法律。<br/>
+        2、因履行本协议发生的一切争议,甲乙双方应友好协商解决;如双方在发生争议后30日内无法通过协商解决时,任何一方有权向甲方所在地有管辖权的人民法院提起诉讼解决。
+        <h2>八、其他</h2>
+        1、本协议自双方按照本协议约定方式签署之日起生效,有效期至双方履行完本协议约定的全部义务时止。<br/>
+        2、双方确认并同意,本协议的电子版本与纸质版本具有同等法律效力。双方发生争议时,电子合同打印件可作为证据提交。双方通过网络以在线方式签订本协议的 ,则以乙方点击“确认”或“同意”等相关按钮或以电子签名的方式作为对合同内容的同意、确认以及本协议的签署;如双方签订纸质版本协议的,则本协议壹式贰份,甲方盖公章或合同专用章并且乙方签字作为有效签署方式,并且双方各执壹份,每份具有同等法律效力。<br/>
+        3、本协议未尽事宜或对本协议的任何修改、补充,由双方另行协商后以签订补充协议的方式解决,补充协议与本协议具有同等法律效力;双方没有约定也没有协商一致的,遵照相关法律法规规定执行。<br/>
+        4、双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、APP推送消息送达,乙方如果变更电话号码的,应当自变更后1日内通知甲方且获得甲方确认,甲方通过电话、APP方式无法联系乙方或者甲方认为必要时,甲方也可以通过特快专递至乙方住址的方式向乙方发出上述任何通知、文件、资料等,并在甲方寄出特快专递后第5日视为送达成功。
+        <div class="signature">
+            <div class="sign">甲方签章:
+                <span>日期:{{proto}}</span>
+            </div>
+            <div class="sign">乙方签字:{{proto}}
+                <span>日期:{{proto}} </span>
+            </div>
+        </div>
+    </div>
+</body>
+</html>

+ 165 - 0
mec-biz/src/main/resources/config/contracts/courses.ftl

@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<html lang="en" style="font-size: 100px;">
+<head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Cache-Control" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />
+    <title>课程服务协议</title>
+    <style type="text/css">
+        body { margin: 0; }
+        header {
+            height: .40rem;
+            line-height: .40rem;
+            color: #000;
+            font-size: .17rem;
+            background: #fff;
+            box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
+            text-align: center;
+        }
+        header .back {
+            width: .2rem;
+            height: .2rem;
+            position: absolute;
+            left: .12rem;
+            top: .1rem;
+        }
+        .container {
+            padding: .22rem .2rem .3rem;
+            font-size: .14rem;
+        }
+        h1 {
+            font-size: .16rem;
+            text-align: center;
+        }
+        h2 {
+            font-size: .16rem;
+            font-weight: bold;
+            padding-top: .15rem;
+        }
+        h3 {
+            font-size: .14rem;
+            font-weight: bold;
+        }
+        .signature {
+            display: flex;
+            padding-top: .5rem;
+        }
+        .signature .sign {
+            flex: 1;
+            position: relative;
+        }
+        .signature span {
+            display: block;
+        }
+        .signature .cachet {
+            position: absolute;
+            top: -.6rem;
+            left: 0;
+            width: 1.5rem;
+            height: 1.5rem;
+        }
+        .iInfo {
+            display: flex;
+        }
+        .iInfo span {
+            flex: 1;
+        }
+        .iInfoContent, .iInfoContent span {
+            display: block;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+    <div class="container">
+        <h1>《课程服务协议》</h1>
+        <!-- 甲方:深圳大雅乐盟网络教育股份有限公司 <br/> -->
+        甲方:{{proto}} <br/>
+        <div style="display: flex;">乙方:
+            <div style="flex: 1 auto;">
+                <div class="iInfo">
+                    <span>家长姓名 {{proto}}</span>
+                    <span>电话:{{proto}}</span>
+                </div>
+                <div class="iInfo">
+                    <span>身份证号:{{proto}}</span>
+                </div>
+                <div class="iInfo">
+                    <span>学生姓名:{{proto}}</span>
+                    <span>所在班级:{{proto}}</span>
+                </div>
+                <div class="iInfo">
+                    <span>所在声部:{{proto}}</span>
+                </div>
+            </div>
+        </div>  
+        为进一步提升器乐教学质量和服务品质,保证学员学习进度,明确培训各方的权责,经甲、乙双方协商一致,特订立本协议,以便共同遵守。
+
+        <h2>一、课程信息</h2>
+        
+        <div class="iInfoContent">
+            <span>授课内容:{{proto}}</span>
+            <span>授课形式:{{proto}}</span>
+            <span>课次数量:{{proto}}</span>
+            <span>缴费金额:{{proto}}</span>
+        </div>
+
+        <h2>二、行为规范</h2>
+        乙方在选择甲方各类提高课程并签署本协议时视为乙方已经仔细阅读并同意遵守如下事项:
+        <h3>1.报名</h3>
+        1.1无论是否源自指导老师或教务老师的建议,乙方选择参加甲方的课程,包括对授课形式、授课内容的选择,均为乙方自主意愿的表达及独立自主的选择。<br/>
+        1.2乙方应在所选课程开始前完成相应课程缴费,并完成报名手续。
+        <h3>2.上课</h3>
+        2.1乙方应按时到达甲方指定上课地点,作好课前准备;如发生迟到、或因自身原因早退等情况的,为避免影响老师后续课程的正常进行,授课老师除完成原定时间安排的授课外,将不再提供额外延长课时。<br/>
+        2.2乙方(含学员,下同)不得携带任何食品进入教室,所有进食应在课前完成;进入教室后,不得大声喧哗、追逐嬉戏,应当听从授课老师的安排;乙方应爱护公共财产和教学设施,严禁在桌椅上刻、划、涂、写等不文明行为;乙方未经授课老师同意,不得擅自使用教室内的乐器、音响、电视、空调等器材、设施,如造成此类器材、设施损坏的,乙方应照价赔偿。<br/>
+        2.3未经授课老师同意,乙方家长不得进入课堂,以免影响老师和学员上课;为保证训练质量及进度,学员应保证按照指导老师或教务老师所提出的要求在家练习,遇到专业问题应及时向指导老师请教,非专业问题可随时向教务老师反映。<br/>
+        2.4乙方家长应教育及监督学员务必注意个人安全,妥善保管个人财物,对于非甲方原因造成的人身安全事故或财物损失,由责任人自行承担。
+        <h3>3.请假、休会及扣费</h3>
+        3.1基于教学进度和质量保证,本课程对于课程的延续性有严格要求,因此乙方应尽量避免请假。<br/>
+        3.2一对一课程有特殊情况需要请假的,应提前24小时以上以书面形式告知对应的授课老师,以便及时调整时间安排;一对多课程,不接受任何个人单独请假,如果集体请假,应提前24小时以上以书面形式告知对应的授课老师,未按本协议约定请假则当次课程视同已经教授,系统将自动结算课时并扣除相应费用。乙方请假后,应尽快预约补课时间完成补课。<br/>
+        3.3一对一课程以及一对二课程,乙方如遇特殊情况时,可向甲方或授课老师】申请办理临时休课。乙方可在6个月内申请复学,超过6个月未申请复课的,甲方有权按自动退会处理。一对二课程申请临时休课的,还需征得同组学员同意后方可申请休课。<br/>
+        3.4每期课程相对应的有效期,乙方应在有效期内完成课程,10次课一期的,自交费之日起4个月内有效;20次课一期的,自交费之日起8个月内有效;40次课一期的,自交费之日起16个月内有效。如果由于指导老师请假等原因造成课程不能如期完成的,课程有效期将顺延;如课程超出有效期限,乙方所缴纳的课程费用将自动扣除逾期未完成的课时后自动清零。
+
+        <h2>三、退费</h2>
+        1、一对一课程开课后,乙方要求退费的,乙方应在课程有效期内提出申请,甲方扣除报名费及未授课部分对应学费的20%后,将余款(不计息,下同)退还给乙方;如果乙方报名时享受打折优惠的,甲方先按照原价计算当期已上课时学费,再扣除报名费及未授课部分学费的20%后,将余款退还给乙方。<br/>
+        2、一对二课程开课后,乙方要求退费的,乙方应在课程有效期内提出申请,甲方扣除报名费及未授课部分的学费30%后,将余款退还给乙方;如果乙方报名时享受了打折优惠的,甲方先按照原价计算当期已上课时学费,再扣除报名费及未授课部分学费的30%后,将余款退还给乙方。<br/>
+        3、除一对一课程以及一对二课程之外的其他课程,课程开课后,甲方不接受任何原因的退款申请。<br/>
+        4、甲方所有收费,均向乙方开具加盖公司印章的收款凭据,乙方务必妥善保管,乙方按照本协议约定退费时,应向甲方出具该收费凭据原件方可办理。
+
+        <h2>四、违约责任</h2>
+        1、当事人一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失。<br/>
+        2、乙方应始终维护甲方的知识产权以及品牌形象,本协议期间以及本协议因任何原因失效、被撤销、解除或终止后,均不得直接或间接通过任何公众媒体(包括但不限于传统大众媒体,以及微信、微博、博客、直播平台等社交平台)发表损害甲方(包括但不限于其产品、服务及甲方授课老师)声誉的言论或实施任何类似行为,否则乙方应赔偿甲方因此遭受的全部损失。
+        <h2>五、保密条款</h2>
+        1、双方对本协议的条款、本协议的签订及履行情况以及通过签订和履行本协议而获知的对方及对方关联公司的任何信息均负有保密义务。任何一方不得以任何形式透露给第三方(有关法律法规要求和甲乙双方的法律、会计顾问、授权雇员除外),也不得擅自使用。<br/>
+        2、本保密义务期限不受本协议期限的限制。本协议失效、被撤销、解除或终止等任何情况下,双方均应遵守本保密义务。<br/>
+
+        <h2>六、不可抗力</h2>
+        1、一方遇到不可抗力事件(指甲乙双方无法控制、无法预见或即使预见也无法避免的事件,该事件妨碍、影响或延误任何一方履行本协议的全部或部分义务,该事件包括但不限于自然灾害(如水灾、地震等)、火灾、政府行为、法律或政策变化(含学校合作变化)、战争或其他任何类似事件)时,受影响方应当立即书面通知对方,并告知该不可抗力事件对本协议可能产生的影响,并在该不可抗力事件发生后5日内向对方提供该事件的详细信息及由有关机构出具的解释受影响方因此无法履行本协议项下全部或部分义务的相关证明。<br/>
+        2、由于上述不可抗力事件致使受影响方无法履行或无法按时履行本协议项下全部或部分义务的,双方于彼此间均不承担违约责任,但双方应在相互信任的基础上协商解决,尽力减少不可抗力事件对本协议的影响,并采取合理方式进行调整(包括但不限于另行签订补充协议等),尽量避免损失的扩大。<br/>
+        3、不可抗力事件消失或结束后,除双方另行协商一致外,受到不可抗力影响的一方应当立即采取措施继续履行本协议,如不可抗力事件持续30日以上的,则任何一方有权以书面通知对方的方式单方解除本协议。<br/>
+
+        <h2>七、适用法律及争议解决方式</h2>
+        1、本协议的订立、效力、履行、解释及争议解决均适用中华人民共和国法律。<br/>
+        2、因履行本协议发生的一切争议,甲乙双方应友好协商解决;如双方在发生争议后30日内无法通过协商解决时,任何一方有权向甲方所在地有管辖权的人民法院提起诉讼解决。<br/>
+
+        <h2>八、其他</h2>
+        1、乙方同意,甲方有权在乙方学习和活动期间对其拍摄照片、视频,甲方对所拍摄的照片、视频有永久免费使用权。<br/>
+        2、未经甲方事先书面同意,乙方不得将本课程转让给乙方以外的任何第三方。<br/>
+        3、双方确认并同意,本协议的电子版本与纸质版本具有同等法律效力。双方发生争议时,电子合同打印件可作为证据提交。双方通过网络以在线方式签订本协议的 ,则以乙方点击“确认”或“同意”等相关按钮或以电子签名的方式作为对合同内容的同意、确认以及本协议的签署;如双方签订纸质版本协议的,则本协议壹式贰份,甲方盖公章或合同专用章并且乙方签字作为有效签署方式,并且双方各执壹份,每份具有同等法律效力。<br/>
+        4、本协议自双方按照本协议约定方式签署之日起生效,有效期至双方履行完本协议约定的全部义务时止。<br/>
+        5、本协议未尽事宜或对本协议的任何修改、补充,有双方另行协商后以签订补充协议的方式解决,补充协议与本协议具有同等法律效力;双方没有约定也没有协商一致的,遵照相关法律法规规定执行。<br/>
+        6、双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、APP推送消息送达,乙方如果变更电话号码的,应当自变更后1日内通知甲方且获得甲方确认,甲方通过电话、APP方式无法联系乙方或者甲方认为必要时,甲方也可以通过特快专递至乙方住址的方式向乙方发出上述任何通知、文件、资料等,并在甲方寄出特快专递后第5日视为送达成功。<br/>
+
+        <div class="signature">
+            <div class="sign">甲方签章:
+                <span>日期:{{proto}}</span>
+            </div>
+            <div class="sign">乙方签字:{{proto}}
+                <span>日期:{{proto}} </span>
+            </div>
+        </div>
+    </div>
+</body>
+</html>

+ 222 - 0
mec-biz/src/main/resources/config/contracts/register.ftl

@@ -0,0 +1,222 @@
+<!DOCTYPE html>
+<html lang="en" style="font-size: 100px;">
+<head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Cache-Control" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />
+    <title>APP用户注册及乐团注册服务协议</title>
+    <style type="text/css">
+        body { margin: 0; }
+        header {
+            height: .40rem;
+            line-height: .40rem;
+            color: #000;
+            font-size: .17rem;
+            background: #fff;
+            box-shadow: 0px 1px 8px 0px rgba(0, 0, 0, 0.07);
+            text-align: center;
+        }
+        header .back {
+            width: .2rem;
+            height: .2rem;
+            position: absolute;
+            left: .12rem;
+            top: .1rem;
+        }
+        .container {
+            padding: .22rem .2rem .3rem;
+            font-size: .14rem;
+        }
+        h1 {
+            font-size: .16rem;
+            text-align: center;
+        }
+        h2 {
+            font-size: .16rem;
+            font-weight: bold;
+            padding-top: .15rem;
+        }
+        h3 {
+            font-size: .14rem;
+            font-weight: bold;
+        }
+        .signature {
+            display: flex;
+            padding-top: .5rem;
+        }
+        .signature .sign {
+            flex: 1;
+            position: relative;
+        }
+        .signature span {
+            display: block;
+        }
+        .signature .cachet {
+            position: absolute;
+            top: -.6rem;
+            left: 0;
+            width: 1.5rem;
+            height: 1.5rem;
+        }
+        .iInfo {
+            display: flex;
+        }
+        .iInfo span {
+            flex: 1;
+        }
+        .iInfoContent, .iInfoContent span {
+            display: block;
+        }
+    </style>
+</head>
+<body style="font-family:'SimSun'">
+    <div class="container">
+        <h1>《APP用户注册及乐团注册服务协议》</h1>
+
+        欢迎用户使用{{proto}}(下称“本软件”),请用户在使用本软件前仔细阅读本协议。如用户不同意本协议任何条款,请勿在本软件注册账号或使用大雅乐盟基于本软件提供的服务(下称“本服务”)。用户点击“注册”、“登录”或“同意”等按钮或使用本服务后,本协议即构成大雅乐盟与用户之间具有约束力的法律文件。
+        <h2>一、提示</h2>
+        1. 用户在使用本软件或本服务前,应当认真阅读本协议。请用户务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、法律适用和争议解决条款。免除或者限制责任的条款将以粗体下划线标识,用户应重点阅读,并自行选择接受或不接受。如用户对本协议有任何疑问,可联系大雅乐盟。<br/>
+        2. 当用户按照注册页面提示填写信息、阅读并同意本协议且完成全部注册程序,或登录本软件,或使用本服务后,即表示用户已充分阅读、理解并接受本协议的全部内容,并与大雅乐盟达成一致,成为大雅乐盟的用户。阅读本协议的过程中,如果用户不同意或不接受本协议任何条款,用户应立即停止注册、登录本软件或使用本服务。<br/>
+        3. 大雅乐盟可以随时更新本协议的各项条款,包括但不限于增加新的服务类型或功能,更新后的协议条款一经大雅乐盟在本软件公布或更新即生效并代替原来的协议条款,大雅乐盟不会另行通知用户,用户可以及时关注并阅读大雅乐盟更新的本协议最新版本;用户继续使用本软件或本服务的,视为用户接受本协议的最新更新版本;用户不接受本协议最新版本的,应立即停止使用本软件或本服务。<br/>
+        4. 特别提醒:未满18周岁的用户应在法定监护人的陪同下阅读后,并且应在法定监护人的同意和指导下注册和/或使用本软件及本服务。
+        <h2>二、关于本软件及本服务的重要提示</h2>
+        1. 用户使用本服务需要下载本软件的客户端版本,本软件的客户端版本提供包括但不限于 iOS、Android等多个应用版本,用户必须选择与所安装终端设备相匹配的软件版本。 用户可以直接从大雅乐盟的网站上获取本软件,也可以从得到大雅乐盟授权的第三方获取。如果用户从未经大雅乐盟授权的第三方获取本软件或与本软件名称相同的安装程序,大雅乐盟无法保证该软件能够正常使用,并对因此给用户造成的损失不予负责。下载安装程序后,用户需要按照该程序提示的步骤正确安装。<br/>
+        2. 为了改善用户体验、完善服务内容,大雅乐盟将不断努力开发新的服务,并为用户不时提供软件更新(这些更新可能会采取软件替换、修改、功能强化、版本升级等形式)。大雅乐盟有权不经向用户特别通知而对本软件进行更新,或者对本软件的部分功能效果进行改变或限制。新版本发布后,旧版本的软件可能无法使用。大雅乐盟无法保证旧版本软件继续可用及相应的客户服务,请用户随时核对并下载最新版本。<br/>
+        3. 用户理解并同意:为了向用户提供有效的服务,本软件会利用用户终端设备的处理器和带宽等资源,用户使用本软件时,需要接入互联网、移动互联网,此时可能产生数据流量的费用,用户需自行向运营商了解相关资费信息,并自行承担接入互联网、移动互联网所需的费用(包括但不限于上网费、通讯费)以及使用本软件及本服务必需的设备(包括但不限于电脑、手机等移动终端设备)。<br/>
+        4. 大雅乐盟给予用户一项个人的、不可转让及非排他性的许可,以使用本软件。用户可以为非商业目的在单一台终端设备上安装、使用、显示、运行本软件。用户不得为商业运营目的安装、使用、运行本软件,不可以对该软件或者该软件运行过程中释放到任何计算机终端内存中的数据及该软件运行过程中客户端与服务器端的交互数据进行复制、更改、修改、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统。<br/>
+        5. 本协议其他条款未明示授权的其他一切权利仍由大雅乐盟保留,用户在行使这些权利时须另外取得大雅乐盟的书面许可。大雅乐盟如果未行使前述任何权利,并不构成对该权利的放弃。
+        
+        <h2>三、服务内容</h2> 
+        1. 大雅乐盟:即{{proto}}。<br/>
+        2. 本服务是基于互联网及移动互联网,通过本软件向用户提供【直播教学、录播教学、智能打分、学员管理等】功能服务。大雅乐盟以乐团为单位对用户进行管理,用户注册本软件即视为用户同意参加乐团,遵守乐团的各项制度和管理。用户在使用本软件或本服务过程中发生任何问题的,可以与大雅乐盟乐团老师联系和处理。具体内容及具体规则以用户与大雅乐盟签署的协议及/或本软件公示的内容为准。<br/>
+        3. 服务功能介绍:<br/>
+        直播教学:{{proto}}<br/>
+        录播教学:{{proto}}<br/>
+        智能打分:{{proto}}<br/>
+        学员管理:{{proto}}<br/>
+        4. 本软件规则包括但不限于大雅乐盟通过官网、本软件等途径发布的全部规则、细则、解读、说明公告等。<br/>
+        5. 服务费用<br/>
+        5.1 用户使用本软件或本服务的费用以用户与大雅乐盟签署的协议及/或本软件公示的内容为准。<br/>
+        6. 乐团管理<br/>
+        6.1大雅乐盟有权对用户进行管理,制定乐团各项制度,对用户在乐团的日常行为进行管理。<br/>
+        
+        <h2>四、用户账户注册、使用与管理</h2>  
+        1. 用户资格<br/>
+        用户开始使用本软件或本服务前,应当具备中华人民共和国法律规定的与用户行为相对应的民事行为能力,否则用户的法定监护人应依照法律规定承担因此而导致的一切后果。<br/>
+        2. 账户说明<br/>
+        用户使用本软件时,应当注册账户,注册时可以使用{{proto}},用户应当提供并填写真实、合法、准确、完整的资料和信息,并在相关信息变更时在1个工作日内在本软件更新。因用户提供或填写的资料、信息不符合上述要求而导致的任何问题及后果,应由用户自行承担,大雅乐盟不对此承担任何责任。当用户按照注册页面提示填写信息、阅读并同意本协议且完成全部注册程序后,用户可获得本软件账户并成为本软件用户。<br/>
+        3. 账户安全规范<br/>
+        3.1 用户的账户由用户自行设置、保管。建议用户务必保管好用户的账户及密码,当用户每次使用完本软件时,应以正确步骤离开本软件。用户了解并同意,确保用户账户及密码的机密安全是用户的责任。用户将对利用该账户及密码所进行的一切行动及言论负完全的责任,并同意以下事项:<br/>
+        3.1.1 用户主动泄露账户、密码或遭受他人攻击、诈骗等行为导致的损失及后果,均由用户自行承担;<br/>
+        3.1.2 用户的账户只限用户本人使用,未经大雅乐盟事先书面同意,不得将账户提供、转让、许可、出售给任何第三方;<br/>
+        3.1.3 擅自使用他人账户及密码的,大雅乐盟及其合法授权主体有权追究实际使用人的法律责任;<br/>
+        3.1.4 用户应当设置符合本软件要求的密码,并妥善保管和保护密码,不得随意告诉他人,并定期更新密码。大雅乐盟同时还建议用户通过使用复杂密码等方式,不要使用过于简单的词语或数字,以保证用户的账号、密码安全;<br/>
+        3.1.5 如发现任何未经授权使用用户账户访问和/或使用本软件或其他可能导致用户账户遭窃、遗失的情况,建议用户立即通知大雅乐盟。<br/>
+        3.2 大雅乐盟有权基于单方独立判断,在其认为可能发生危害交易安全等情形时,不经通知而先行暂停、中断或终止向用户提供本协议项下的全部或部分用户服务,并将注册资料移除或删除,且无需对用户或任何第三方承担任何责任。前述情形包括但不限于:<br/>
+        3.2.1 大雅乐盟发现异常交易或有理由认为存在违法违规情形时;<br/>
+        3.2.2 大雅乐盟认为用户账户被冒用或其他大雅乐盟认为有风险的其他情形。<br/>
+        4. 用户忘记或丢失账户、密码时,可以按照本软件的申诉途径凭初始注册资料找回账户,但大雅乐盟并不承诺用户忘记或丢失账户后一定能通过申诉途径找回该账户。本软件的账户或密码找回/重设机制仅负责识别用户在申诉申请上所填资料与系统记录资料的一致性,而无法识别申诉人是否系真正账户使用权人。用户因忘记或丢失账户或密码而遭致任何法律责任或损失的,用户应自行承担全部法律责任及损失,大雅乐盟不对此承担任何责任。<br/>
+        5. 用户理解并同意,本软件同大多数互联网软件一样,可能会受多种因素影响,包括但不限于用户原因、网络服务质量、社会环境等;也可能会受各种安全问题的侵扰,包括但不限于他人非法利用用户资料,进行现实中的骚扰;用户下载安装的其他软件或访问的其他网站中可能含有病毒、木马程序或其他恶意程序,威胁用户的终端设备信息和数据安全,继而影响本软件的正常使用等。因此,用户应加强信息安全及个人信息的保护意识,注意密码保护,以免遭受损失。<br/>
+        
+        <h2>五、服务使用规则</h2>
+        1. 用户使用本软件或本服务时,不得实施下列行为:<br/>
+        1.1使用本软件或本服务的过程中出现下列情形:<br/>
+        1.1.1破坏宪法所确定的基本原则的;<br/>
+        1.1.2危害国家安全、泄露国家秘密、颠覆国家政权、破坏国家统一的;<br/>
+        1.1.3损害国家荣誉和利益的;<br/>
+        1.1.4煽动民族仇恨、民族歧视,破坏民族团结的;<br/>
+        1.1.5破坏国家宗教政策,宣扬邪教和封建迷信的;<br/>
+        1.1.6散布谣言,扰乱社会秩序,破坏社会稳定的;<br/>
+        1.1.7散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;<br/>
+        1.1.8侮辱或者诽谤他人,侵害他人合法权益的;<br/>
+        1.1.9含有法律法规、行政规章所禁止的其他内容的;<br/>
+        1.2 发布、传送、传播、储存侵害他人合法权利(包括但不限于名誉权、肖像权、知识产权、商业秘密等)的内容;<br/>
+        1.3 发布、传送、传播、储存与他人隐私、个人信息或资料有关的内容;<br/>
+        1.4 发布、传送、传播虚假、骚扰、营销、广告、诱导分享等相关的内容;<br/>
+        1.5 违反法律法规或干扰、破坏大雅乐盟、本软件的正常运营的其他内容。<br/>
+        2. 未经大雅乐盟事先书面同意,用户使用本软件时不得有下列行为:<br/>
+        2.1 以创建相同、类似或竞争服务为目的访问本软件或使用本服务;<br/>
+        2.2 删除、遮掩、修改本软件及其副本上关于著作权的声明;<br/>
+        2.3 对本软件或本服务(包括但不限于服务或其内容中的广告或赞助内容)进行任何形式的许可、出售、租赁、转让、发行或做其他商业用途;<br/>
+        2.4 通过修改或伪造软件运行中的指令、数据,或者增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论是否基于商业目的;<br/>
+        2.5 通过非大雅乐盟开发、授权的第三方软件、插件、外挂、系统,登录或使用本软件或本服务;<br/>
+        2.6 自行或者授权他人、第三方软件对本软件及其组件、模块、数据进行干扰,或在本软件或利用本服务上传或发布病毒、蠕虫、恶意代码、故意破坏或改变系统或数据的软件;<br/>
+        2.7 其他未经大雅乐盟明示授权的行为。<br/>
+        3. 用户内容是指用户上传、提供信息和资料或以其他方式使用本软件与本服务时产生的所有内容(包括但不限于用户信息、资料、图片或其他内容),用户是用户内容的唯一的责任人,应当承担因用户内容披露而导致的用户或任何第三方被识别的风险。<br/>
+        4. 用户充分了解并同意,用户必须为自己注册账号下的一切行为负责,包括用户所发表的任何内容以及由此产生的任何后果。用户应对本服务中的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。大雅乐盟无法且不会对因前述风险而导致的任何损失或损害承担责任。<br/>
+        5. 用户应服从大雅乐盟乐团的管理,用户在乐团出现下列情形的,大雅乐盟有权对用户作出警告,用户收到警告后仍然不遵守大雅乐盟的管理制度的,大雅乐盟有权对用户作出退团等处分:<br/>
+        5.1上课、排练时不遵守纪律,影响乐团其他团员的正常上课、排练;<br/>
+        5.2不服从乐团老师的管理和指导;<br/>
+        5.3一个学期内发生两次及以上缺席乐团上课、排练行为;<br/>
+        5.4一个学期内发生两次及以上未按老师要求回传视频作业的情形;<br/>
+        5.5连续{{proto}}天不练习,影响乐团团员和乐团的整体水平的。<br/>
+        6. 用户在每次参加乐团排练、训练时,应按专业老师要求带齐训练所需乐器、教材乐谱、乐谱本、铅笔及乐器护理等学习用品,并提前10分钟到达排练场地,做好准备工作;始终保持排练、训练场地的清洁卫生;如遇到特殊情况无法参加乐团排练、训练时,应提前一天向乐团老师请假。<br/>
+        7. 因用户个人原因未能按时上课的,视为该用户放弃该次上课,学校乐团声部训练不因用户请假而停止整个声部课教学,如用户因此给乐团造成任何不良影响的,用户应尽力弥补并消除该不良影响。<br/>
+        8. 用户应保证每日练习时间不少于20分钟,并按专业老师要求通过本软件回传周视频作业。<br/>
+        9. 退团:用户如因自身原因拟退出乐团的,应向学校申请退团,并获得学校的同意退团批准,再经用户家长确认后,方可退团。<br/>
+
+        
+        <h2>六、第三方链接及服务</h2>
+        1. 本软件或本服务可能保留有第三方网站或网址的链接,访问这些链接将由用户自己做出决定,大雅乐盟并不就这些链接上所提供的任何信息、数据、观点、图片、陈述或建议的准确性、完整性、充分性和可靠性提供承诺或保证。大雅乐盟没有审查过任何第三方网站,对这些网站及其内容不进行控制,也不负任何责任。如果用户决定访问任何与本站链接的第三方网站,其可能带来的结果和风险全部由用户自己承担。<br/>
+        2. 用户在使用本软件中第三方提供的产品或服务时,除遵守本协议约定外,还应遵守第三方的用户协议。大雅乐盟和第三方对可能出现的纠纷在法律规定和约定的范围内各自承担责任。因用户使用本软件或要求大雅乐盟提供特定服务时,本软件可能会调用第三方系统或者通过第三方支持用户的使用或访问,使用或访问的结果由该第三方提供(包括但不限于第三方通过公众账号提供的服务,或通过开放平台接入的内容等),大雅乐盟不保证通过第三方提供服务及内容的安全性、准确性、有效性及其他不确定的风险,由此若引发的任何争议及损害,与大雅乐盟无关,大雅乐盟不承担任何责任。<br/>
+        3. 用户已知晓并同意大雅乐盟提供本服务(无论是免费服务还是有偿服务)还可能基于第三方如合作单位(包括但不限于电信运营商)提供的技术支持等服务获得。如果因第三方提供的服务给用户增加任何成本或造成任何损失的,大雅乐盟会协助用户与第三方进行沟通和处理,如因此发生维修、更换等费用的,应由用户自行承担,大雅乐盟不对此承担任何法律责任和赔偿责任。<br/>
+        
+        <h2>七、知识产权的保护以及保密</h2>
+        1. 大雅乐盟的商标、商号、Logo、图形及其组合,以及大雅乐盟的其他标识、产品和服务名称均为大雅乐盟或大雅乐盟关联公司所有,未经大雅乐盟书面授权,任何人不得以任何方式展示、使用或作其他处理,也不得向任何第三方表明或让其误认为其有权展示、使用或作其他处理。<br/>
+        2. 大雅乐盟提供的培训、课程相关的全部内容(包括但不限于培训课程设置、培训课件、教材等)的知识产权均归大雅乐盟单独和完整所有。用户应当保护大雅乐盟的知识产权,只能用于自身学习之目的,未经大雅乐盟事先书面同意,不得擅自将培训课程相关的任何内容进行复制、复印、影音、拍摄或进行摘要等措施后以转让、出售、赠与或其他任何形式提供给任何第三方,否则大雅乐盟有权追究其法律责任。<br/>
+        3. 大雅乐盟为提供服务而使用的任何软件(包括但不限于软件中所含的任何图象、照片、动画、录像、录音、音乐、文字和附加程序、随附的帮助材料)的一切权利均属于该软件的著作权人,未经该软件的著作权人许可,用户不得对该软件进行反向工程(reverse engineer)、反向编译(decompile)或反汇编(disassemble)。<br/>
+        4. 用户已经了解并同意:在大雅乐盟提供的所有服务器上的数据(包括但不限于虚拟物品等)全部归大雅乐盟所有。在不影响用户正常接收服务的情况下,大雅乐盟有权决定保留或不保留服务器上的全部或部分数据。<br/>
+        5. 用户已经了解并同意:大雅乐盟有权将本协议项下大雅乐盟所有的知识产权授权第三方使用,在变更产品运营商时,大雅乐盟可以将其运营的产品或服务以及与该在产品或服务相关的归大雅乐盟所有的知识产权转让给新的产品运营商。<br/>
+        6. 用户使用大雅乐盟提供的本软件或本服务期间获取的文件、资料、表格等信息,包括但不限于有关合作资料、营销资料等,无论是口头、书面的或是电子文件形式的,均属大雅乐盟的商业秘密,用户必须对这些商业秘密严格遵守保密义务,不得向外透露,也不得使用这些商业秘密为自己或他人谋取利益。<br/>
+        
+        <h2>八、违约条款</h2>
+        1. 用户违反本协议约定时即构成违约情形,大雅乐盟有权要求用户采取及时的补救措施,消除违约后果,并有权终止本协议。如用户的违约行为使大雅乐盟及/或关联公司遭受损失(包括自身的直接经济损失、商誉损失及对外支付的赔偿金、和解款、律师费、诉讼费等间接经济损失)的,用户应赔偿大雅乐盟及/或关联公司的上述全部损失。<br/>
+        2. 用户理解并同意,如用户的行为导致第三方向大雅乐盟及/或关联公司主张权利或任何索赔、要求或损失的,大雅乐盟及/或关联公司在对第三人承担赔偿义务后可向用户追偿与此相关的全部损失。<br/>
+        
+        <h2>九、协议终止</h2>
+        1. 用户有权通过以下任一方式终止本协议:<br/>
+        1.1用户自行注销用户的账户的;<br/>
+        1.2用户按照本协议约定方式退出乐团的;<br/>
+        1.3 变更事项生效或服务协议更新时,用户停止使用并明示不愿接受变更事项或明示不愿接受更新后的服务协议的;<br/>
+        1.4 用户明示不愿继续使用本软件或本服务,且符合本协议终止条件的。<br/>
+        2. 出现以下情况时,大雅乐盟可以终止本协议:<br/>
+        2.1 用户违反本协议约定的,大雅乐盟依据违约条款终止本协议,或对用户处以退团处分的;<br/>
+        2.2 用户的账户被大雅乐盟依据本协议进行注销等清理的;<br/>
+        2.3 用户在使用本软件或本服务时存在侵犯他人合法权益或其他严重违法违规行为的;<br/>
+        2.4 不可抗力导致本协议不能履行的(“不可抗力”是指双方不可预见、或可以预见但不能避免并或克服的客观情况,该事件妨碍、影响或延误任何一方根据合同履行其全部或部分义务。该事件包括但不限于政府行为、法律或规定的发布或修订,自然灾害、战争、网络堵塞或中断、黑客袭击或任何其他类似事件),且该不可抗力持续30天以上的;<br/>
+        2.5 根据相关法律法规规定大雅乐盟应当终止服务或大雅乐盟认为需终止服务的其他情形。<br/>
+        3. 协议终止后的处理<br/>
+        本协议终止后,除法律有明确规定外,大雅乐盟无义务向用户或用户指定的第三方披露用户账户中的任何信息。<br/>
+
+        <h2>十、责任限制</h2>
+        1. 用户使用本软件或本服务的风险应由用户自行承担,大雅乐盟对本软件不作任何类型的担保,不论是明示的、默示的保证和条件,包括但不限于本软件的适销性、适用性、无病毒、无疏忽或无技术瑕疵问题、所有权和无侵权的明示或默示担保和条件,对在任何情况下因使用或不能使用本软件所产生的直接、间接、偶然、特殊及后续的损害及风险,大雅乐盟不承担任何责任。<br/>
+        2. 用户明确理解和同意,大雅乐盟不对因下述任一情况而导致的损害赔偿承担责任,包括但不限于利润、商誉、使用、数据等方面的损失或其它无形损失的损害赔偿:<br/>
+        1.1 大雅乐盟向用户免费提供的任何产品或者服务;<br/>
+        1.2 大雅乐盟向用户赠送的任何产品或者服务;<br/>
+        1.3 对于用户使用本软件上可能涉及由第三方所有、控制或者运营的网站或平台提供的服务及其导致的风险;<br/>
+        1.4 因用户的过错导致的任何损失,该过错包括但不限于:决策失误、操作不当、遗忘或泄露密码、密码被他人破解、用户使用的计算机系统被第三方侵入、用户向大雅乐盟发送的指令信息不明确或存在歧义、用户下载非法或不明程序、用户委托他人代理交易时他人恶意或不当操作而造成的损失;<br/>
+        1.5 信息网络设备连接故障,电脑、通讯或其他系统出现故障,不能进行数据传输、保存的;<br/>
+        1.6 本软件或其服务器停机维护期间;<br/>
+        1.7 不可抗力因素导致的任何损失;<br/>
+        1.8 大雅乐盟依据本协议约定终止协议时。<br/>
+        3. 用户理解并同意,因大雅乐盟过错导致用户不能享受相应服务,大雅乐盟承担相应责任的最高限额不超过用户实际支付的当次服务费用总额。<br/>
+        4. 大雅乐盟努力保障用户的知情权,如主动中断或终止部分或全部网络服务,应提前90日在大雅乐盟服务平台以公告通知、app推送等方式通知。<br/>
+         
+        <h2>十一、隐私权保护政策</h2>
+        用户及用户的监护人同意,大雅乐盟向用户提供本服务时,会收集、使用必要的用户个人信息,包括但不限于用户姓名、性别、年龄、学校、班级、联系方式、用户监护人的姓名及联系方式等,并将收集到的信息用于提供本服务必需的目的和场景。大雅乐盟不会收集与提供本服务无关的用户个人信息,具体隐私权保护政策详见大雅乐盟或本软件公示的《隐私政策》。<br/>
+         
+        <h2>十二、争议解决及适用法律</h2>
+        1. 本协议及其修订的有效性、履行、解释及争议解决,均适用中华人民共和国大陆地区法律。<br/>
+        2. 用户与大雅乐盟之间就本协议发生的任何纠纷或争议,首先应友好协商解决,协商不成的,应将纠纷或争议提交至大雅乐盟所在地有管辖权的法院管辖。<br/>
+
+        <h2>十三、其他</h2>
+        1. 如本协议中的任何条款无论因何种原因导致全部或部分无效或不具有执行力的,则该条款应视为自始不存在且不影响本协议其他条款的效力,此时该条款可被新的条款所取代,以保证最大限度地接近双方意图、确保本协议要求的经济目的,以及实现原有条款的意图。<br/>
+        2. 本协议中的标题仅为方便而设,本身并无实际涵义,不能作为本协议涵义解释的依据。<br/>
+        3. 如用户对本软件、本服务或本协议内容有任何疑问、意见或建议,用户可联系大雅乐盟,联系电话:{{proto}},大雅乐盟将及时回复用户的请求。<br/>
+
+    </div>
+</body>
+</html>

BIN
mec-biz/src/main/resources/config/fonts/simsun.ttc


+ 68 - 0
mec-biz/src/main/resources/config/mybatis/SysUserTsignMapper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.SysUserTsignDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.SysUserTsign" id="SysUserTsign">
+		<result column="user_id_" property="userId" />
+		<result column="account_id_" property="accountId" />
+		<result column="seal_data_" property="sealData" />
+		<result column="create_time_" property="createTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysUserTsign" >
+		SELECT * FROM sys_user_tsign WHERE user_id_ = #{userId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysUserTsign">
+		SELECT * FROM sys_user_tsign ORDER BY user_id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysUserTsign" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_user_tsign (user_id_,account_id_,seal_data_,create_time_) VALUES(#{userId},#{accountId},#{sealData},#{createTime})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysUserTsign">
+		UPDATE sys_user_tsign <set>
+<if test="userId != null">
+user_id_ = #{userId},
+</if>
+<if test="accountId != null">
+account_id_ = #{accountId},
+</if>
+<if test="sealData != null">
+seal_data_ = #{sealData},
+</if>
+<if test="createTime != null">
+create_time_ = #{createTime},
+</if>
+</set> WHERE user_id_ = #{userId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_user_tsign WHERE user_id_ = #{userId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysUserTsign" parameterType="map">
+		SELECT * FROM sys_user_tsign ORDER BY user_id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_user_tsign
+	</select>
+</mapper>

+ 1 - 1
mec-education/src/main/java/com/ym/mec/education/service/impl/TeacherAttendanceServiceImpl.java

@@ -49,7 +49,7 @@ public class TeacherAttendanceServiceImpl extends ServiceImpl<TeacherAttendanceM
         if (Objects.isNull(teacherLeaveRecordReq.getTeacherId())) {
             return PageResponse.errorParam();
         }
-        Page<TeacherAttendance> teacherAttendancePage = new Page<>(teacherLeaveRecordReq.getPageNo(), teacherLeaveRecordReq.getPageSize());
+        Page<TeacherAttendance> teacherAttendancePage = new Page<TeacherAttendance>(teacherLeaveRecordReq.getPageNo(), teacherLeaveRecordReq.getPageSize());
         Page<TeacherAttendanceResp> pageResult = new Page();
         List<TeacherAttendanceResp> list = Lists.newArrayList();
         Page<TeacherAttendance> page = baseMapper.selectClassRecordPage(teacherAttendancePage, teacherLeaveRecordReq);

+ 58 - 0
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupRegisterController.java

@@ -0,0 +1,58 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.MusicGroupSubjectGoodsAndInfoDto;
+import com.ym.mec.biz.dal.dto.RegisterPayDto;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@RequestMapping("register")
+@Api(tags = "乐团注册")
+@RestController
+public class MusicGroupRegisterController extends BaseController {
+
+    @Autowired
+    private StudentRegistrationService studentRegistrationService;
+    @Autowired
+    private SubjectService subjectService;
+    @Autowired
+    private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private MusicGroupService musicGroupService;
+
+
+    @ApiOperation(value = "新增学生报名信息")
+    @PostMapping("/add")
+    public Object add(StudentRegistration studentRegistration) {
+        MusicGroup musicGroup = musicGroupService.get(studentRegistration.getMusicGroupId().toString());
+        studentRegistration.setOrganId(musicGroup.getOrganId());
+        return succeed(studentRegistrationService.addStudent(studentRegistration));
+    }
+
+    @ApiOperation(value = "获取乐团报名所需信息")
+    @GetMapping("/getMusicGroupRegInfo")
+    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "Integer")})
+    public HttpResponseResult getMusicGroupRegInfo(Integer musicGroupId) {
+        return succeed(musicGroupSubjectPlanService.getMusicGroupRegInfo(musicGroupId));
+    }
+
+}

+ 24 - 45
mec-student/src/main/java/com/ym/mec/student/controller/RegisterController.java

@@ -1,58 +1,37 @@
 package com.ym.mec.student.controller;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.MusicGroupSubjectGoodsAndInfoDto;
-import com.ym.mec.biz.dal.dto.RegisterPayDto;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.service.MusicGroupService;
-import com.ym.mec.biz.service.MusicGroupSubjectPlanService;
-import com.ym.mec.biz.service.StudentRegistrationService;
-import com.ym.mec.biz.service.SubjectService;
-import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-import javax.annotation.Resource;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.ContractService;
+import com.ym.mec.common.controller.BaseController;
 
 @RequestMapping("register")
-@Api(tags = "乐团注册")
+@Api(tags = "注册服务")
 @RestController
 public class RegisterController extends BaseController {
 
-    @Autowired
-    private StudentRegistrationService studentRegistrationService;
-    @Autowired
-    private SubjectService subjectService;
-    @Autowired
-    private MusicGroupSubjectPlanService musicGroupSubjectPlanService;
-    @Resource
-    private SysUserFeignService sysUserFeignService;
-    @Autowired
-    private MusicGroupService musicGroupService;
-
-
-    @ApiOperation(value = "新增学生报名信息")
-    @PostMapping("/add")
-    public Object add(StudentRegistration studentRegistration) {
-        MusicGroup musicGroup = musicGroupService.get(studentRegistration.getMusicGroupId().toString());
-        studentRegistration.setOrganId(musicGroup.getOrganId());
-        return succeed(studentRegistrationService.addStudent(studentRegistration));
-    }
-
-    @ApiOperation(value = "获取乐团报名所需信息")
-    @GetMapping("/getMusicGroupRegInfo")
-    @ApiImplicitParams({@ApiImplicitParam(name = "musicGroupId", value = "乐团编号", required = true, dataType = "Integer")})
-    public HttpResponseResult getMusicGroupRegInfo(Integer musicGroupId) {
-        return succeed(musicGroupSubjectPlanService.getMusicGroupRegInfo(musicGroupId));
-    }
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private ContractService contractService;
+
+	@ApiOperation("查询注册协议")
+	@GetMapping(value = "queryContract")
+	public Object queryCoursePage() {
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("获取用户信息失败");
+		}
+		return succeed(contractService.queryRegisterContract(sysUser.getId(), null));
+	}
 
 }

+ 1 - 1
mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java

@@ -89,7 +89,7 @@ public class SysMessageController extends BaseController {
 		if (StringUtils.isBlank(mobileNo)) {
 			sysUser = sysUserFeignService.queryUserInfo();
 		} else {
-			sysUser = sysUserFeignService.getUserByMobile(mobileNo);
+			sysUser = sysUserFeignService.queryUserByMobile(mobileNo);
 		}
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");

+ 0 - 6
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/ESealPlugin.java

@@ -3,12 +3,6 @@ package com.ym.mec.thirdparty.eseal;
 public interface ESealPlugin {
 
 	/**
-	 * 注册客户端
-	 * @return
-	 */
-	public boolean registClient();
-
-	/**
 	 * 创建用户账户(个人)
 	 * @param realName 姓名
 	 * @param idcard 身份证号码

+ 12 - 30
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/eseal/provider/TsignPlugin.java

@@ -50,45 +50,27 @@ public class TsignPlugin implements ESealPlugin, InitializingBean, DisposableBea
 
 	@Override
 	public void afterPropertiesSet() throws Exception {
-		registClient();
-
-		serviceClient = serviceClient();
-		if (serviceClient == null) {
-			throw new ThirdpartyException("获取e签宝客户端失败");
-		}
-	}
-
-	@Override
-	public void destroy() throws Exception {
-		ServiceClientManager.shutdown(projectId);
-	}
-
-	/**
-	 * 客户端注册
-	 * @return
-	 */
-	public boolean registClient() {
 		ProjectConfig projectconfig = new ProjectConfig();
 		projectconfig.setProjectId(projectId);
 		projectconfig.setProjectSecret(projectSecret);
 		projectconfig.setItsmApiUrl(apisUrl);
 		Result result = ServiceClientManager.registClient(projectconfig, null, null);
-		if (result.getErrCode() == 0) {
-			return true;
+		if (result.getErrCode() != 0) {
+			throw new ThirdpartyException("e签宝客户端注册失败");
 		}
-		return false;
-	}
 
-	/**
-	 * 获取客户端
-	 * @return
-	 */
-	public ServiceClient serviceClient() {
-		ServiceClient serviceclient = ServiceClientManager.get(projectId);
-		if (serviceclient == null) {
+		serviceClient = ServiceClientManager.get(projectId);
+		if (serviceClient == null) {
 			throw new ThirdpartyException(MessageFormat.format("ServiceClient为null,获取客户端接口调用失败 ", projectId));
 		}
-		return serviceclient;
+		if (serviceClient == null) {
+			throw new ThirdpartyException("获取e签宝客户端失败");
+		}
+	}
+
+	@Override
+	public void destroy() throws Exception {
+		ServiceClientManager.shutdown(projectId);
 	}
 
 	/**

+ 18 - 0
mec-util/pom.xml

@@ -44,5 +44,23 @@
 			<groupId>org.apache.httpcomponents</groupId>
 			<artifactId>httpmime</artifactId>
 		</dependency>
+
+		<dependency>
+			<groupId>com.lowagie</groupId>
+			<artifactId>itext</artifactId>
+			<version>2.1.7</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.xhtmlrenderer</groupId>
+			<artifactId>flying-saucer-pdf</artifactId>
+			<version>9.0.7</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.freemarker</groupId>
+			<artifactId>freemarker</artifactId>
+			<version>2.3.20</version>
+		</dependency>
 	</dependencies>
 </project>

+ 97 - 0
mec-util/src/main/java/com/ym/mec/util/freemarker/FreemarkerTemplateEngine.java

@@ -0,0 +1,97 @@
+package com.ym.mec.util.freemarker;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import freemarker.template.Configuration;
+import freemarker.template.DefaultObjectWrapper;
+import freemarker.template.Template;
+
+public class FreemarkerTemplateEngine {
+	private static final Logger LOGGER = LoggerFactory.getLogger(FreemarkerTemplateEngine.class);
+
+	private final static FreemarkerTemplateEngine templateEngine = new FreemarkerTemplateEngine();
+
+	private static Configuration cfg;
+
+	private FreemarkerTemplateEngine() {
+		cfg = new Configuration();
+		cfg.setOutputEncoding("UTF-8");
+		cfg.setClassForTemplateLoading(FreemarkerTemplateEngine.class, "/template/");
+		cfg.setObjectWrapper(new DefaultObjectWrapper());
+	}
+
+	public static FreemarkerTemplateEngine getInstance() {
+		return templateEngine;
+	}
+
+	public void setClassForTemplateLoading(Class<?> clazz, String pathPrefix) {
+		cfg.setClassForTemplateLoading(clazz, pathPrefix);
+	}
+
+	public void render(Map<String, Object> data, String templateFile, File outputFile) {
+		FileWriter fw = null;
+		BufferedWriter bw = null;
+		try {
+			Template temp = cfg.getTemplate(templateFile);
+			fw = new FileWriter(outputFile);
+			bw = new BufferedWriter(fw);
+			temp.process(data, bw);
+			bw.flush();
+		} catch (Exception e) {
+			LOGGER.warn("模板文件{}渲染失败", templateFile, e);
+		} finally {
+			if (bw != null) {
+				try {
+					bw.close();
+				} catch (IOException e) {
+					LOGGER.warn("BufferedWriter关闭异常");
+				}
+			}
+			if (fw != null) {
+				try {
+					fw.close();
+				} catch (IOException e) {
+					LOGGER.warn("FileWriter关闭异常");
+				}
+			}
+		}
+	}
+
+	public void render(Map<String, Object> data, String templateFile, String outputFile) {
+		FileWriter fw = null;
+		BufferedWriter bw = null;
+		try {
+			Template temp = cfg.getTemplate(templateFile);
+			File file = new File(outputFile);
+			fw = new FileWriter(file);
+			bw = new BufferedWriter(fw);
+			temp.process(data, bw);
+			bw.flush();
+		} catch (Exception e) {
+			LOGGER.warn("模板文件{}渲染失败", templateFile, e);
+		} finally {
+			if (bw != null) {
+				try {
+					bw.close();
+				} catch (IOException e) {
+					LOGGER.warn("BufferedWriter关闭异常");
+				}
+			}
+			if (fw != null) {
+				try {
+					fw.close();
+				} catch (IOException e) {
+					LOGGER.warn("FileWriter关闭异常");
+				}
+			}
+		}
+	}
+
+}

+ 370 - 0
mec-util/src/main/java/com/ym/mec/util/pdf/PDFUtil.java

@@ -0,0 +1,370 @@
+package com.ym.mec.util.pdf;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+
+import org.xhtmlrenderer.pdf.ITextRenderer;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.pdf.BaseFont;
+import com.ym.mec.util.exception.UtilException;
+
+/**
+ * 若想将html文件转换成pdf文件 1、html必须符合xhtml语法规范 2、必须在文件中指定文件的编码方式
+ * 3、如果需要显示中文,则必须指定字体文件,且在html文件中指定使用该字体 4、若用官方jar,则会有关中文换行的问题 OMS系统:
+ * solar2.utils 创建者: gaoyong 创建时间: 2013-6-21
+ */
+public class PDFUtil {
+
+	/**
+	 * 通过文本文件导出pdf文件
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param file
+	 *            输入的文件
+	 * @param pdf
+	 *            输出路径
+	 * @param fontFamily
+	 *            字体
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 */
+	public static void renderToPDFByFile(String baseUrl, File file, String pdf, String fontFamily) throws IOException, UtilException {
+		try {
+			ITextRenderer renderer = getRendererByFile(baseUrl, file, fontFamily);
+			doRenderToPDF(renderer, pdf);
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将文件转换成pdf字节数组
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param file
+	 *            源文件
+	 * @param fontFamily
+	 *            字体
+	 * @return 返回字节数组
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 */
+	public static byte[] renderToByteByFile(String baseUrl, File file, String fontFamily) throws IOException, UtilException {
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByFile(baseUrl, file, fontFamily);
+			return doRenderToByte(renderer);
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将文件转换成pdf字节流
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param file
+	 *            源文件
+	 * @param fontFamily
+	 *            字体
+	 * @return 返回字节数组流
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 */
+	public static ByteArrayInputStream renderToInputStreamByFile(String baseUrl, File file, String fontFamily) throws UtilException, IOException {
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByFile(baseUrl, file, fontFamily);
+			return new ByteArrayInputStream(doRenderToByte(renderer));
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将uri对应的资源导出为pdf
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param uri
+	 *            源文件的位置
+	 * @param pdf
+	 *            最终导出的pdf文件路径
+	 * @param fontFamily
+	 *            字体
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 */
+	public static void renderToPDFByURI(String baseUrl, String uri, String pdf, String fontFamily) throws IOException, UtilException {
+
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByURI(baseUrl, uri, fontFamily);
+			doRenderToPDF(renderer, pdf);
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将uri对应的资源转换成pdf字节数组
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param uri
+	 *            源文件的位置
+	 * @param fontFamily
+	 *            字体
+	 * @return 字节数组
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 */
+	public static byte[] renderToByteByURI(String baseUrl, String uri, String fontFamily) throws IOException, UtilException {
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByURI(baseUrl, uri, fontFamily);
+			return doRenderToByte(renderer);
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将uri对应的资源转换成pdf字节流
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param uri
+	 *            源文件的位置
+	 * @param fontFamily
+	 *            字体
+	 * @return 字节数组流
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 */
+	public static ByteArrayInputStream renderToInputStreamByURI(String baseUrl, String uri, String fontFamily) throws UtilException, IOException {
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByURI(baseUrl, uri, fontFamily);
+			return new ByteArrayInputStream(doRenderToByte(renderer));
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将字符串写入到pdf文件并输出
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param data
+	 *            字符串
+	 * @param pdf
+	 *            最终导出的pdf文件路径
+	 * @param fontFamily
+	 *            字体
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 */
+	public static void renderToPDFByData(String baseUrl, String data, String pdf, String fontFamily) throws IOException, UtilException {
+
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByData(baseUrl, data, fontFamily);
+			doRenderToPDF(renderer, pdf);
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将uri对应的资源转换成pdf字节数组
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param data
+	 *            字符串
+	 * @param fontFamily
+	 *            字体
+	 * @return 字节数组
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 */
+	public static byte[] renderToByteByData(String baseUrl, String data, String fontFamily) throws IOException, UtilException {
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByData(baseUrl, data, fontFamily);
+			return doRenderToByte(renderer);
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 将uri对应的资源转换成pdf字节流
+	 * 
+	 * @param baseUrl
+	 *            资源存放路径
+	 * @param data
+	 *            字符串
+	 * @param fontFamily
+	 *            字体
+	 * @return 字节数组流
+	 * @throws UtilException
+	 *             创建pdf文件失败
+	 * @throws IOException
+	 *             如果发生 I/O 错误
+	 */
+	public static ByteArrayInputStream renderToInputStreamByData(String baseUrl, String data, String fontFamily) throws UtilException, IOException {
+		ITextRenderer renderer;
+		try {
+			renderer = getRendererByData(baseUrl, data, fontFamily);
+			return new ByteArrayInputStream(doRenderToByte(renderer));
+		} catch (DocumentException e) {
+			throw new UtilException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * 根据file生成ITextRenderer对象
+	 * 
+	 * @param file
+	 *            源文件
+	 * @param fontFamily
+	 *            字体文件路径
+	 * @return
+	 * @throws DocumentException
+	 * @throws IOException
+	 */
+	private static ITextRenderer getRendererByFile(String baseUrl, File file, String fontFamily) throws DocumentException, IOException {
+		if (file.exists()) {
+			ITextRenderer renderer = new ITextRenderer();
+			URL url = new URL(baseUrl);
+			File fontFamilyFile = new File(url.getPath(), fontFamily);
+			if (fontFamilyFile.exists()) {
+				renderer.getFontResolver().addFont(fontFamilyFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
+			}
+			renderer.setDocument(file);
+			renderer.getSharedContext().setBaseURL(baseUrl);
+			renderer.layout();
+			return renderer;
+		} else {
+			throw new FileNotFoundException(file.getPath());
+		}
+	}
+
+	/**
+	 * 根据uri获取ITextRenderer对象
+	 * 
+	 * @param uri
+	 * @param fontFamily
+	 * @return
+	 * @throws DocumentException
+	 * @throws IOException
+	 */
+	private static ITextRenderer getRendererByURI(String baseUrl, String uri, String fontFamily) throws DocumentException, IOException {
+		ITextRenderer renderer = new ITextRenderer();
+
+		URL url = new URL(baseUrl);
+		File fontFamilyFile = new File(url.getPath(), fontFamily);
+		if (fontFamilyFile.exists()) {
+			renderer.getFontResolver().addFont(fontFamilyFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
+		}
+		renderer.setDocument(uri);
+		renderer.getSharedContext().setBaseURL(baseUrl);
+		renderer.layout();
+		return renderer;
+	}
+
+	/**
+	 * 根据字符串内容获取ITextRenderer对象
+	 * 
+	 * @param data
+	 * @param fontFamily
+	 * @return
+	 * @throws DocumentException
+	 * @throws IOException
+	 */
+	private static ITextRenderer getRendererByData(String baseUrl, String data, String fontFamily) throws DocumentException, IOException {
+		ITextRenderer renderer = new ITextRenderer();
+
+		File fontFamilyFile = new File(baseUrl, fontFamily);
+		if (fontFamilyFile.exists()) {
+			renderer.getFontResolver().addFont(fontFamilyFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
+		}
+		renderer.setDocumentFromString(data);
+		renderer.getSharedContext().setBaseURL(baseUrl);
+		renderer.layout();
+		return renderer;
+	}
+
+	/**
+	 * 将renderer对象写入pdf文件
+	 * 
+	 * @param renderer
+	 * @param pdf
+	 * @throws IOException
+	 * @throws DocumentException
+	 */
+	private static void doRenderToPDF(ITextRenderer renderer, String pdf) throws IOException, DocumentException {
+		OutputStream os = null;
+		try {
+			os = new FileOutputStream(pdf);
+			renderer.createPDF(os);
+		} finally {
+			if (os != null) {
+				os.close();
+			}
+		}
+	}
+
+	/**
+	 * 将ITextRenderer对象转换成字节
+	 * 
+	 * @param renderer
+	 * @return
+	 * @throws DocumentException
+	 * @throws IOException
+	 */
+	private static byte[] doRenderToByte(ITextRenderer renderer) throws DocumentException, IOException {
+		ByteArrayOutputStream baos = null;
+		byte[] array = null;
+		try {
+			baos = new ByteArrayOutputStream();
+			renderer.createPDF(baos);
+			baos.flush();
+			array = baos.toByteArray();
+		} finally {
+			if (baos != null) {
+				baos.close();
+			}
+		}
+		return array;
+	}
+}