Index: forgon-knowledge/src/main/java/com/forgon/knowledge/dwr/KnowledgeTableManager.java =================================================================== diff -u -r15543 -r40537 --- forgon-knowledge/src/main/java/com/forgon/knowledge/dwr/KnowledgeTableManager.java (.../KnowledgeTableManager.java) (revision 15543) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/dwr/KnowledgeTableManager.java (.../KnowledgeTableManager.java) (revision 40537) @@ -11,6 +11,7 @@ import org.apache.log4j.Logger; import com.forgon.knowledge.jmesa.assembler.KnowledgeTable; +import com.forgon.knowledge.model.KnowledgeFolder; import com.forgon.knowledge.service.KnowledgeFileManager; import com.forgon.knowledge.service.KnowledgeViewManager; import com.forgon.knowledge.xml.service.KnowledgeModuleManager; @@ -103,7 +104,12 @@ ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); for(Long id: folderIdList){ THTreeNode folderNode = thTreeNodeManager.getTHTreeNodeById(moduleXmlBean.getFolderClassName(), Long.valueOf(id)); - thTreeNodeManager.deleteTHTreeNode(folderNode); + if(folderNode instanceof KnowledgeFolder){ + //删除文件夹 + knowledgeFileManager.deleteKnowledgeFolderFile((KnowledgeFolder) folderNode); + }else{ + thTreeNodeManager.deleteTHTreeNode(folderNode); + } } } Index: forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManager.java =================================================================== diff -u -r38668 -r40537 --- forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManager.java (.../AttachFileManager.java) (revision 38668) +++ forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManager.java (.../AttachFileManager.java) (revision 40537) @@ -81,7 +81,7 @@ * @param attachType 附件类型 * @param objectId 关联的记录ID */ - public void deleteAttachFile(String attachType, Long objectId); + public void deleteAttachFileByAttachTypeAndObjectId(String attachType, Long objectId); } Index: forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManager.java =================================================================== diff -u -r28827 -r40537 --- forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManager.java (.../KnowledgeFileManager.java) (revision 28827) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManager.java (.../KnowledgeFileManager.java) (revision 40537) @@ -3,9 +3,11 @@ import com.forgon.exception.exceptionDTO.AbstractExceptionDTO; import com.forgon.exception.exceptionDTO.UploadExceptionDTO; import com.forgon.knowledge.model.KnowledgeFile; +import com.forgon.knowledge.model.KnowledgeFolder; import com.forgon.knowledge.model.Vo.ReadRecordVo; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.util.List; @@ -55,6 +57,19 @@ * @return */ List getReadRecordByknowledgeFileId(String knowledgeFileId); + + /** + * 删除文件夹及文件夹内的文件 + * @param folderNode 文件夹 + */ + public void deleteKnowledgeFolderFile(KnowledgeFolder folderNode); + /** + * 附件下载 + * @param id 附件id + * @param response response + */ + public void downloadAttachFile(Long id, HttpServletResponse response); + } Index: forgon-tools/src/main/java/com/forgon/tools/crypto/coder/CoderEncryption.java =================================================================== diff -u -r39766 -r40537 --- forgon-tools/src/main/java/com/forgon/tools/crypto/coder/CoderEncryption.java (.../CoderEncryption.java) (revision 39766) +++ forgon-tools/src/main/java/com/forgon/tools/crypto/coder/CoderEncryption.java (.../CoderEncryption.java) (revision 40537) @@ -46,6 +46,11 @@ * 设备接口用户名和密码加密深度,默认为3.详见:GDSRMYY-544 */ public static final int DEVICEINTERFACE_ENCRPT_DEPTH = 3; + + /** + * 下载密码的加密深度ZSRY-126 + */ + public static final int DOWNLOADPASSWORD_ENCRPT_DEPTH = 3; /** * BASE64解密,返回byte数组 Index: forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManagerImpl.java =================================================================== diff -u -r28827 -r40537 --- forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManagerImpl.java (.../KnowledgeFileManagerImpl.java) (revision 28827) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManagerImpl.java (.../KnowledgeFileManagerImpl.java) (revision 40537) @@ -1,6 +1,8 @@ package com.forgon.knowledge.service; import java.io.File; +import java.io.IOException; +import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.net.URLEncoder; @@ -10,8 +12,10 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections.map.HashedMap; @@ -25,6 +29,7 @@ import com.beust.jcommander.ParameterException; import com.forgon.attachfile.enums.AttachFileSaveType; +import com.forgon.attachfile.model.AttachFile; import com.forgon.attachfile.service.AttachFileManager; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.vo.LoginUserData; @@ -35,20 +40,23 @@ import com.forgon.exception.exceptionDTO.AbstractExceptionDTO; import com.forgon.exception.exceptionDTO.UploadExceptionDTO; import com.forgon.exception.exceptionHandler.UploadExceptionHandler; +import com.forgon.filedownload.service.FileDownLoadManager; import com.forgon.knowledge.model.KnowledgeFile; import com.forgon.knowledge.model.KnowledgeFolder; import com.forgon.knowledge.model.ReadRecord; import com.forgon.knowledge.model.Vo.ReadRecordVo; import com.forgon.knowledge.xml.service.KnowledgeModuleManager; import com.forgon.knowledge.xmlbean.ModuleXmlBean; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; import com.forgon.security.model.User; -import com.forgon.security.service.AclManager; import com.forgon.security.service.AclTools; import com.forgon.tools.Constants; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.util.ObjectUtil; import com.forgon.tools.util.SqlUtils; +import com.forgon.treenode.model.THTreeNode; import com.forgon.treenode.service.THTreeNodeManager; import edu.emory.mathcs.backport.java.util.Arrays; @@ -62,24 +70,30 @@ private ObjectDao objectDao; private THTreeNodeManager thTreeNodeManager; private KnowledgeModuleManager knowledgeModuleManager; - private AclManager aclManager; private AttachFileManager attachFileManager; private SupplyRoomConfigManager supplyRoomConfigManager; - public void setSupplyRoomConfigManager( + private FileDownLoadManager fileDownLoadManager; + + private LogManager appLogManager; + + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + + public void setFileDownLoadManager(FileDownLoadManager fileDownLoadManager) { + this.fileDownLoadManager = fileDownLoadManager; + } + public void setSupplyRoomConfigManager( SupplyRoomConfigManager supplyRoomConfigManager) { this.supplyRoomConfigManager = supplyRoomConfigManager; } public void setAttachFileManager(AttachFileManager attachFileManager) { this.attachFileManager = attachFileManager; } - public void setAclManager(AclManager aclManager) { - this.aclManager = aclManager; - } - public void setObjectDao(ObjectDao objectDao) { this.objectDao = objectDao; } @@ -95,22 +109,23 @@ @Override public void delete(KnowledgeFile po) { + // 删除文件对应的阅读记录 + objectDao.excuteSQL(String.format("delete from %s where knowledgeFileId = %s ", ReadRecord.class.getSimpleName(), po.getId())); + //删除文件附件 + attachFileManager.deleteAllAttachFile(po.getAttachFiles()); + //删除文件 objectDao.delete(po); } - @SuppressWarnings("unchecked") @Override public void deleteFileNodeByIds(String moduleId, List ids) { for (Long id : ids) { KnowledgeFile fileNode = getById(moduleId, id.toString()); + attachFileManager.deleteAllAttachFile(fileNode.getAttachFiles()); objectDao.delete(fileNode); } // 删除文件对应的阅读记录 - String hql = String.format(" from %s po where %s ", ReadRecord.class.getSimpleName(), SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.knowledgeFileId", ids)); - List readRecords = objectDao.findByHql(hql); - if(CollectionUtils.isNotEmpty(readRecords)){ - objectDao.deleteAll(readRecords); - } + objectDao.excuteSQL(String.format("delete from %s where %s ", ReadRecord.class.getSimpleName(), SqlUtils.getNonStringFieldInLargeCollectionsPredicate("knowledgeFileId", ids))); } @SuppressWarnings("unchecked") @@ -410,4 +425,55 @@ return readRecordVos; } + @Override + public void deleteKnowledgeFolderFile(KnowledgeFolder knowledgeFolder) { + + if(knowledgeFolder == null){ + return; + } + Set files = knowledgeFolder.getFiles(); + if(CollectionUtils.isNotEmpty(files)){ + knowledgeFolder.setFiles(null); + for (KnowledgeFile knowledgeFile : files) { + this.delete(knowledgeFile); + } + } + Set childrens = knowledgeFolder.getChildren(); + if(CollectionUtils.isNotEmpty(childrens)){ + knowledgeFolder.setChildren(null); + for (THTreeNode thTreeNode : childrens) { + this.deleteKnowledgeFolderFile((KnowledgeFolder)thTreeNode); + } + } + objectDao.delete(knowledgeFolder); + } + + @Override + public void downloadAttachFile(Long id, HttpServletResponse response) { + if(!DatabaseUtil.isPoIdValid(id) || response == null){ + throw new RuntimeException("参数异常"); + } + AttachFile attachFile = attachFileManager.getById(id+""); + if(attachFile == null){ + throw new RuntimeException("参数异常"); + } + OutputStream out = null; + try { + String fileName = attachFile.getFileName(); + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes("GBK"), "ISO8859_1")); + out = response.getOutputStream(); + fileDownLoadManager.downLoadAttachFile(id+"", out); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, "下载", "下载文件:" + attachFile.getAttachFilePath() + attachFile.getFileName()); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if(out != null){ + try { + out.close(); + } catch (Exception e2) {} + } + } + } + } Index: ssts-web/src/main/java/com/forgon/disinfectsystem/devicemaintenancecus/devicemaintenancecusins/service/DeviceMaintenanceCusInsManagerImpl.java =================================================================== diff -u -r39008 -r40537 --- ssts-web/src/main/java/com/forgon/disinfectsystem/devicemaintenancecus/devicemaintenancecusins/service/DeviceMaintenanceCusInsManagerImpl.java (.../DeviceMaintenanceCusInsManagerImpl.java) (revision 39008) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/devicemaintenancecus/devicemaintenancecusins/service/DeviceMaintenanceCusInsManagerImpl.java (.../DeviceMaintenanceCusInsManagerImpl.java) (revision 40537) @@ -204,7 +204,7 @@ private void deleteAttachFile(DeviceMaintenanceCusI dmi) { DeviceMaintenanceCusD dmd = (DeviceMaintenanceCusD) dmi.getFormDefinition(); if(StringUtils.equals(dmd.getUploadAttachFile(), Constants.STR_YES)){ - attachFileManager.deleteAttachFile(AttachFile.ATTACH_TYPE_DEVICE_MAINTENANCE, dmi.getId()); + attachFileManager.deleteAttachFileByAttachTypeAndObjectId(AttachFile.ATTACH_TYPE_DEVICE_MAINTENANCE, dmi.getId()); } } Index: forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManagerImpl.java =================================================================== diff -u -r38668 -r40537 --- forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManagerImpl.java (.../AttachFileManagerImpl.java) (revision 38668) +++ forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManagerImpl.java (.../AttachFileManagerImpl.java) (revision 40537) @@ -6,7 +6,10 @@ import com.forgon.attachfile.model.AttachFile; import com.forgon.attachfile.model.AttachFileInterface; import com.forgon.attachfile.vo.AttachFileVO; +import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.exception.UploadException; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; import com.forgon.tools.AppKeys; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.guid.GUIDGenerator; @@ -39,9 +42,15 @@ protected Logger logger = Logger.getLogger(this.getClass()); - private ObjectDao objectDao; + private ObjectDao objectDao; + + private LogManager appLogManager; + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + public void setObjectDao(ObjectDao objectDao) { this.objectDao = objectDao; } @@ -54,6 +63,12 @@ AttachFile attachFile = (AttachFile) objectDao.getByProperty( "AttachFile", "id", Long.valueOf(id)); objectDao.delete(attachFile); + //如果存在文件路径,则表示是保存在本地,删除附件在数据库数据后再删除本地文件 + deleteLocalAttachFile(attachFile); + //记录删除文件的日志 + StringBuffer logBuffer = new StringBuffer(); + logBuffer.append("删除文件:" + attachFile.getAttachFilePath() + attachFile.getFileName() + ";"); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, Log.TYPE_DELETE, logBuffer.toString()); } } } @@ -75,10 +90,11 @@ AttachFile attachFile = (AttachFile) objectDao.getByProperty("AttachFile", "id", Long.valueOf(attachFileId)); objectDao.delete(attachFile); //如果存在文件路径,则表示是保存在本地,删除附件在数据库数据后再删除本地文件 - String attachFilePath = attachFile.getAttachFilePath(); - if (StringUtils.isNotBlank(attachFilePath)) { - org.apache.commons.io.FileUtils.deleteQuietly(new File(attachFilePath + attachFile.getUUIDFileName())); - } + deleteLocalAttachFile(attachFile); + //保存删除文件的日志 + StringBuffer logBuffer = new StringBuffer(); + logBuffer.append("删除文件:" + attachFile.getAttachFilePath() + attachFile.getFileName() + ";"); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, Log.TYPE_DELETE, logBuffer.toString()); } catch (Exception e) { logger.error(e, e); @@ -87,25 +103,54 @@ } - public List getAttachFilesIdAndFileName( + /** + * 如果存在文件路径,则表示是保存在本地,删除附件在数据库数据后再删除本地文件 + * @param attachFile 附件 + */ + private void deleteLocalAttachFile(AttachFile attachFile){ + if(attachFile == null){ + return; + } + //如果存在文件路径,则表示是保存在本地,删除附件在数据库数据后再删除本地文件 + String attachFilePath = attachFile.getAttachFilePath(); + if (StringUtils.isNotBlank(attachFilePath)) { + org.apache.commons.io.FileUtils.deleteQuietly(new File(attachFilePath + attachFile.getUUIDFileName())); + } + } + + @SuppressWarnings("unchecked") + public List getAttachFilesIdAndFileName( String formObjectName, String formId) { List list = new ArrayList(); if (StringUtils.isBlank(formObjectName) || StringUtils.isBlank(formId)) { return list; } - AttachFileInterface attachFileInterface = (AttachFileInterface) objectDao - .getByProperty(formObjectName, "id", Long.valueOf(formId)); - if (attachFileInterface == null) { - return list; + Collection formIdColl = StringTools.parseToLongs(formId, ";"); + if(CollectionUtils.isEmpty(formIdColl)){ + return list; } - String attachFileKeyIds = attachFileInterface.getAttachFiles(); + List fileIdList = new ArrayList(formIdColl); + List attachFileInterfaceList = objectDao.findByIds(formObjectName, fileIdList); + if(CollectionUtils.isEmpty(attachFileInterfaceList)){ + return list; + } - list = getAttachFilesIdAndFileNameByAttachIds(attachFileKeyIds); + List attachFileKeyIdList = new ArrayList(); + for (AttachFileInterface attachFileInterface : attachFileInterfaceList) { + String attachFileKeyIds = attachFileInterface.getAttachFiles(); + if(StringUtils.isNotBlank(attachFileKeyIds)){ + attachFileKeyIdList.add(attachFileKeyIds); + } + } - return list; + if(CollectionUtils.isEmpty(attachFileKeyIdList)){ + return list; + } + + return getAttachFilesIdAndFileNameByAttachIds(StringTools.join(attachFileKeyIdList, ",")); } @SuppressWarnings("unchecked") @@ -114,13 +159,12 @@ if (StringUtils.isBlank(attachFileIds)) { return list; } - String sql = "select new com.forgon.attachfile.vo.AttachFileVO(id,contentType,attachType,fileName) from AttachFile po where po.id in (" + String sql = "select new com.forgon.attachfile.vo.AttachFileVO(id,contentType,attachType,fileName,UUIDFileName) from AttachFile po where po.id in (" + attachFileIds + ")"; list = objectDao.findByHql(sql); return list; } - @SuppressWarnings("unchecked") public void saveAttachFiles(HttpServletRequest request, Object object) { if (object == null) { @@ -321,6 +365,8 @@ MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; //本地文件保存路径的list,用于上传出错时保存成功上传了的文件的路径,在异常处理时删掉这些文件 List fileSavePathLists = new ArrayList<>(); + //上传文件:培训管理/培训视频/XXXXX/文件名.格式 + StringBuffer logBuffer = new StringBuffer(); //遍历需要处理的上传附件 for (Iterator it = multipartRequest.getFileNames(); it.hasNext(); ) { String key = it.next(); @@ -337,6 +383,7 @@ Session session = objectDao.getHibernateSession(); Blob attachFileBlob = Hibernate.getLobCreator(session).createBlob(file.getBytes()); attachFile.setAttachFileBinary(attachFileBlob); + logBuffer.append(attachFile.getFileName() + "(保存到数据库);"); } //如果是保存到本地 else if (AttachFileSaveType.LOCAL.equals(saveType)) { @@ -349,6 +396,7 @@ FileUtils.saveLocalFile(fileStream, attachFile.getAttachFilePath(), attachFile.getUUIDFileName()); //保存成功后将对应的地址放到list中 fileSavePathLists.add(attachFile.getAttachFilePath() + attachFile.getUUIDFileName()); + logBuffer.append(attachFile.getAttachFilePath() + attachFile.getFileName() + ";"); } } } @@ -359,6 +407,11 @@ map.put("fileSavePaths", fileSavePathLists); // 将上传的附件ID关联到上传表单中去 attachFileInterface.setAttachFiles(attachFiles); + // 保存上传附件的日志 + if(logBuffer.length() > 0){ + logBuffer.insert(0, "上传文件:"); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, Log.TYPE_ADD, logBuffer.toString()); + } } catch (UploadException ex){ throw ex; @@ -537,7 +590,7 @@ @SuppressWarnings("unchecked") @Override - public void deleteAttachFile(String attachType, Long objectId) { + public void deleteAttachFileByAttachTypeAndObjectId(String attachType, Long objectId) { if(StringUtils.isBlank(attachType)){ throw new RuntimeException("附件类型不能为空!"); } @@ -552,10 +605,7 @@ for (AttachFile attachFile : attachFileList) { objectDao.delete(attachFile); //如果存在文件路径,则表示是保存在本地,删除附件在数据库数据后再删除本地文件 - String attachFilePath = attachFile.getAttachFilePath(); - if (StringUtils.isNotBlank(attachFilePath)) { - org.apache.commons.io.FileUtils.deleteQuietly(new File(attachFilePath + attachFile.getUUIDFileName())); - } + deleteLocalAttachFile(attachFile); } } Index: forgon-core/src/main/java/com/forgon/security/service/DownloadPasswordManager.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/security/service/DownloadPasswordManager.java (revision 0) +++ forgon-core/src/main/java/com/forgon/security/service/DownloadPasswordManager.java (revision 40537) @@ -0,0 +1,42 @@ +package com.forgon.security.service; + +import com.forgon.security.model.DownloadPassword; +import com.forgon.tools.hibernate.BasePoManager; + +/** + * 下载密码的manager + * ZSRY-126 + */ +public interface DownloadPasswordManager extends BasePoManager { + + /** + * 设置下载密码 + * 密码格式要求最低为6位数 + * @param downloadPassword 下载密码的密文 + */ + public void setDownloadPassword(String downloadPassword); + + /** + * 下载密码校验 + * @param downloadPassword 下载密码的密文 + */ + public void downloadPasswordVerification(String downloadPassword); + + /** + * 清除下载密码 + */ + public void clearDownloadPassword(); + + /** + * 记录查看下载密码的日志 + */ + public void recordDownloadPasswordAccessLog(); + + /** + * 查询下载密码 + * 正常DownloadPassword表只有一条记录,而且密码不为空 + * @return + */ + public DownloadPassword loadDownloadPassword(); + +} Index: forgon-core/src/main/java/com/forgon/attachfile/vo/AttachFileVO.java =================================================================== diff -u -r15795 -r40537 --- forgon-core/src/main/java/com/forgon/attachfile/vo/AttachFileVO.java (.../AttachFileVO.java) (revision 15795) +++ forgon-core/src/main/java/com/forgon/attachfile/vo/AttachFileVO.java (.../AttachFileVO.java) (revision 40537) @@ -11,6 +11,8 @@ private String contentType; private String attachType; private String attachFileName; + /**唯一文件名*/ + private String UUIDFileName; @@ -46,14 +48,23 @@ this.attachFileName = attachFileName; } - public AttachFileVO() { + public String getUUIDFileName() { + return UUIDFileName; + } + + public void setUUIDFileName(String uUIDFileName) { + UUIDFileName = uUIDFileName; + } + + public AttachFileVO() { } - public AttachFileVO(Long id, String contentType, String attachType, String attachFileName) { + public AttachFileVO(Long id, String contentType, String attachType, String attachFileName, String UUIDFileName) { this.id = id; this.contentType = contentType; this.attachType = attachType; this.attachFileName = attachFileName; + this.UUIDFileName = UUIDFileName; } @Override Index: forgon-knowledge/src/main/java/com/forgon/knowledge/controller/KnowledgeFileController.java =================================================================== diff -u -r28827 -r40537 --- forgon-knowledge/src/main/java/com/forgon/knowledge/controller/KnowledgeFileController.java (.../KnowledgeFileController.java) (revision 28827) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/controller/KnowledgeFileController.java (.../KnowledgeFileController.java) (revision 40537) @@ -6,6 +6,8 @@ import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.SysUserManager; +import com.forgon.disinfectsystem.entity.onlineexams.examdefinition.ExamDefinition; +import com.forgon.exception.SystemException; import com.forgon.exception.UploadException; import com.forgon.exception.exceptionDTO.UploadExceptionDTO; import com.forgon.knowledge.model.KnowledgeFile; @@ -15,8 +17,10 @@ import com.forgon.knowledge.xml.service.KnowledgeModuleManager; import com.forgon.knowledge.xmlbean.ModuleXmlBean; import com.forgon.tools.AppKeys; +import com.forgon.tools.json.JSONUtil; import com.forgon.tools.util.FileUtils; import com.forgon.treenode.service.THTreeNodeManager; +import net.sf.json.JSONObject; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.FastDateFormat; @@ -28,6 +32,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -257,5 +262,21 @@ // } // return false; // } + + /** + * 培训管理附件下载 + */ + @RequestMapping(name = "/networkdisk/downloadAttachFile", produces = "application/json;charset=UTF-8") + @ResponseBody + public String downloadAttachFile(Long id, HttpServletResponse response){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + knowledgeFileManager.downloadAttachFile(id, response); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return result.toString(); + } } Index: forgon-core/src/main/java/com/forgon/security/controller/DownloadPasswordController.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/security/controller/DownloadPasswordController.java (revision 0) +++ forgon-core/src/main/java/com/forgon/security/controller/DownloadPasswordController.java (revision 40537) @@ -0,0 +1,115 @@ +package com.forgon.security.controller; + +import net.sf.json.JSONObject; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.security.model.DownloadPassword; +import com.forgon.security.service.DownloadPasswordManager; +import com.forgon.tools.json.JSONUtil; + +/** + * 下载密码的controller + * ZSRY-126 + */ +@RestController +@RequestMapping(value = "/disinfectSystem/downloadPasswordController", produces = "application/json;charset=UTF-8") +public class DownloadPasswordController { + + @Autowired + private DownloadPasswordManager downloadPasswordManager; + + @Autowired + private LogManager appLogManager; + + /** + * 设置下载密码 + * @return + */ + @RequestMapping("/setDownloadPassword") + public String setDownloadPassword(String downloadPassword){ + JSONObject result = JSONUtil.buildJsonObject(true, "保存成功!"); + try { + downloadPasswordManager.setDownloadPassword(downloadPassword); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return result.toString(); + } + + /** + * 加载下载密码 + * @return + */ + @RequestMapping("/loadDownloadPassword") + public String loadDownloadPassword(){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + JSONObject data = new JSONObject(); + DownloadPassword downloadPassword = downloadPasswordManager.loadDownloadPassword(); + if(downloadPassword != null){ + data = JSONObject.fromObject(downloadPassword); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, "查阅", "查看了下载密码"); + } + result = JSONUtil.buildJsonObject(true, data); + } catch (Exception e) { + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return result.toString(); + } + + /** + * 下载密码校验 + * @return + */ + @RequestMapping("/downloadPasswordVerification") + public String downloadPasswordVerification(String downloadPassword){ + JSONObject result = JSONUtil.buildJsonObject(true, "密码校验成功!"); + try { + downloadPasswordManager.downloadPasswordVerification(downloadPassword); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return result.toString(); + } + + /** + * 清除下载密码 + * @return + */ + @RequestMapping("/clearDownloadPassword") + public String clearDownloadPassword(){ + JSONObject result = JSONUtil.buildJsonObject(true, "密码已清除!"); + try { + downloadPasswordManager.clearDownloadPassword(); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return result.toString(); + } + + /** + * 记录查看下载密码的日志 + * @return + */ + @RequestMapping("/recordDownloadPasswordAccessLog") + public String recordDownloadPasswordAccessLog(){ + JSONObject result = JSONUtil.buildJsonObject(true, "日志记录完成!"); + try { + downloadPasswordManager.recordDownloadPasswordAccessLog(); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return result.toString(); + } + +} Index: forgon-core/src/main/java/com/forgon/security/service/DownloadPasswordManagerImpl.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/security/service/DownloadPasswordManagerImpl.java (revision 0) +++ forgon-core/src/main/java/com/forgon/security/service/DownloadPasswordManagerImpl.java (revision 40537) @@ -0,0 +1,106 @@ +package com.forgon.security.service; + +import java.util.List; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.exception.SystemException; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.security.model.DownloadPassword; +import com.forgon.tools.crypto.coder.CoderEncryption; +import com.forgon.tools.hibernate.BasePoManagerImpl; + +@Service("downloadPasswordManager") +@Transactional +public class DownloadPasswordManagerImpl extends BasePoManagerImpl implements DownloadPasswordManager { + + @Autowired + private LogManager appLogManager; + + @Autowired + private OperationManager operationManager; + + @Override + public synchronized void setDownloadPassword(String downloadPassword) { + if(StringUtils.isBlank(downloadPassword)){ + throw new SystemException("密码不能为空!"); + } + String decryptDownloadPassword = null; + try { + decryptDownloadPassword = CoderEncryption.decryptBASE64(downloadPassword,CoderEncryption.DOWNLOADPASSWORD_ENCRPT_DEPTH); + } catch (Exception e) { + e.printStackTrace(); + throw new SystemException("密码格式异常!"); + } + if(StringUtils.isBlank(decryptDownloadPassword)){ + throw new SystemException("密码不能为空!"); + } + //密码格式要求最低为6位数 + if(decryptDownloadPassword.length() < 6){ + throw new SystemException("密码最低为6位数!"); + } + String beforeChangePassowrd = "未设置"; + DownloadPassword downloadPasswordObj = this.loadDownloadPassword(); + if(downloadPasswordObj == null){ + downloadPasswordObj = new DownloadPassword(); + }else{ + beforeChangePassowrd = downloadPasswordObj.getDownloadPassword(); + } + downloadPasswordObj.setDownloadPassword(downloadPassword); + this.save(downloadPasswordObj); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, Log.TYPE_UPDATE, String.format("修改下载密码,原值:%s,新值:%s", beforeChangePassowrd, downloadPassword)); + } + + @Override + public void downloadPasswordVerification(String downloadPassword) { + if(StringUtils.isBlank(downloadPassword)){ + throw new SystemException("密码不能为空!"); + } + DownloadPassword downloadPasswordObj = this.loadDownloadPassword(); + if(downloadPasswordObj == null){ + //没设置密码,不需要校验密码 + return; + } + if(!StringUtils.equals(downloadPassword, downloadPasswordObj.getDownloadPassword())){ + throw new SystemException("密码错误!"); + } + } + + @Override + public synchronized void clearDownloadPassword() { + if(!operationManager.isCurrentUserHaveAnyOperation("SSTS_DownloadPassword_Manager")){ + throw new SystemException("清除密码失败,请联系管理员!"); + } + List downloadPasswordList = this.getAll(); + if(CollectionUtils.isEmpty(downloadPasswordList)){ + return; + } + for (DownloadPassword downloadPassword : downloadPasswordList) { + this.delete(downloadPassword); + } + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, Log.TYPE_DELETE, "删除了下载密码"); + } + + @Override + public void recordDownloadPasswordAccessLog() { + if(!operationManager.isCurrentUserHaveAnyOperation("SSTS_DownloadPassword_Manager")){ + throw new SystemException("当前用户无法查看下载密码,请联系管理员!"); + } + if(loadDownloadPassword() == null){ + throw new SystemException("密码已经被清除,请联系管理员!"); + } + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_TRAINING, "查阅", "查看了下载密码"); + } + + @Override + public DownloadPassword loadDownloadPassword() { + return this.getFirst(" downloadPassword is not null "); + } + +} Index: forgon-core/src/main/java/com/forgon/security/model/DownloadPassword.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/security/model/DownloadPassword.java (revision 0) +++ forgon-core/src/main/java/com/forgon/security/model/DownloadPassword.java (revision 40537) @@ -0,0 +1,52 @@ +package com.forgon.security.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 下载密码 + * 新增下载密码管理功能:如有下载密码,下载时需要输入下载密码才能够进行下载 + * ZSRY-126 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class DownloadPassword { + + /** + * id + */ + private Long id; + + /** + * 下载密码的密文 + */ + private String downloadPassword; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDownloadPassword() { + return downloadPassword; + } + + public void setDownloadPassword(String downloadPassword) { + this.downloadPassword = downloadPassword; + } + +} Index: forgon-core/src/main/java/com/forgon/log/model/Log.java =================================================================== diff -u -r40302 -r40537 --- forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 40302) +++ forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 40537) @@ -81,6 +81,7 @@ public static final String MODEL_SYSTEMWARNING = "系统告警"; public static final String MODEL_ORGUNIT = "组织机构"; public static final String MODEL_TOUSSEINSTANCE = "器械包信息"; + public static final String MODEL_TRAINING = "培训管理"; public static final String TYPE_REMARK_UPDATE = "备注更改";//添加 public static final String TYPE_ADD = "A";//添加 public static final String TYPE_UPDATE = "U";//修改