From 55ae266381da41a325a55f5e67906c6f9c071425 Mon Sep 17 00:00:00 2001 From: Shaun Chyxion Date: Sun, 25 Mar 2018 18:24:18 +0800 Subject: [PATCH] add application remove --- .../controller/AbstractBaseController.java | 1 - .../crm/controller/ApplicationController.java | 12 ++--- .../crm/controller/CustomerController.java | 11 +---- .../crm/controller/SiteController.java | 9 +--- .../support/ApplicationServiceSupport.java | 45 +++++++++++++++---- .../support/CustomerServiceSupport.java | 2 +- .../main/resources/application_dev.properties | 2 +- .../crm/service/DiskFileStoreTest.java | 5 ++- .../ambition/file/AmbitionFileApi.java | 43 ++++++++---------- .../file/support/AbstractAmbitionFileApi.java | 28 ++++++------ .../pudonghot/ambition/file/DiskFileApi.java | 9 +++- .../ambition/file/disk/DiskFileSupport.java | 45 ++++++++++--------- .../crm/mapper/ApplicationImageMapper.xml | 3 +- .../ambition/crm/mapper/ApplicationMapper.xml | 2 +- .../ambition/crm/mapper/CustomerMapper.xml | 6 +-- .../mapper/CustomerApplicationMapperTest.java | 13 +++--- .../ambition/crm/model/ApplicationImage.java | 7 +-- .../crm/model/CustomerApplication.java | 4 +- .../ambition/crm/model/FileInfo.java | 3 ++ web/app/components/form-input-select2.js | 2 +- .../helpers/customer-application-images.js | 4 +- .../customer-application/preview-btn.hbs | 4 +- .../templates/customer-application/list.hbs | 32 +++++++------ web/app/templates/customer/list.hbs | 2 +- 24 files changed, 160 insertions(+), 134 deletions(-) diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/AbstractBaseController.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/AbstractBaseController.java index 4d47208..22efa31 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/AbstractBaseController.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/AbstractBaseController.java @@ -294,7 +294,6 @@ public abstract class AbstractBaseController { } } } - return search; } return search; } diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/ApplicationController.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/ApplicationController.java index 4eb0d9b..731a7b0 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/ApplicationController.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/ApplicationController.java @@ -9,16 +9,15 @@ import javax.validation.constraints.Max; import javax.validation.constraints.Min; import me.chyxion.tigon.model.ViewModel; import me.chyxion.tigon.model.ListResult; +import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.StringUtils; import com.pudonghot.ambition.crm.model.User; -import org.apache.commons.lang3.tuple.Pair; import org.springframework.stereotype.Controller; import com.pudonghot.ambition.crm.model.Application; import org.hibernate.validator.constraints.NotBlank; import com.pudonghot.ambition.crm.service.UserService; import org.apache.shiro.authz.annotation.RequiresRoles; import com.pudonghot.ambition.crm.model.CustomerProperty; -import org.springframework.beans.factory.annotation.Value; import com.pudonghot.ambition.crm.model.ApplicationImage; import org.springframework.web.bind.annotation.RequestParam; import com.pudonghot.ambition.crm.service.ApplicationService; @@ -40,8 +39,6 @@ import com.pudonghot.ambition.crm.form.update.ApplicationImageFormForUpdate; public class ApplicationController extends BaseQueryController { - @Value("${file.base-path}") - private String fileBasePath; @Autowired private UserService userService; private final List SEARCH_COLS = @@ -70,7 +67,6 @@ public class ApplicationController } final ListResult> result = listViewModels(search, start, limit, strSearch, null, filters, null); - result.setAttr("fileBasePath", fileBasePath); result.setAttr("users", userService.listViewModels( new Search().asc(User.EMPLOYEE_ID))); return result; @@ -138,6 +134,12 @@ public class ApplicationController ((ApplicationService) queryService).updateImage(form); } + @RequiresRoles(User.ROLE_ADMIN) + @RequestMapping(value = "/delete", method = RequestMethod.POST) + public void delete(@NotBlank @RequestParam("id") String id) { + ((ApplicationService) queryService).delete(id); + } + /** * {@inheritDoc} */ diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/CustomerController.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/CustomerController.java index 0078c81..74fa74e 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/CustomerController.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/CustomerController.java @@ -2,9 +2,8 @@ package com.pudonghot.ambition.crm.controller; import java.util.*; import javax.validation.Valid; - -import com.alibaba.fastjson.JSONArray; import lombok.extern.slf4j.Slf4j; +import com.alibaba.fastjson.JSONArray; import me.chyxion.tigon.mybatis.Search; import me.chyxion.tigon.model.ViewModel; import javax.validation.constraints.Max; @@ -19,7 +18,6 @@ import com.pudonghot.ambition.crm.model.Customer; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.web.multipart.MultipartFile; import com.pudonghot.ambition.crm.model.CustomerProperty; -import org.springframework.beans.factory.annotation.Value; import com.pudonghot.ambition.crm.service.CustomerService; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMethod; @@ -39,8 +37,6 @@ import com.pudonghot.ambition.crm.form.update.CustomerFormForUpdate; public class CustomerController extends BaseQueryController { - @Value("${file.base-path}") - private String fileBasePath; private static final List SEARCH_COLS = Arrays.asList( "customer.id", "customer.name", @@ -148,10 +144,7 @@ public class CustomerController if (StringUtils.isNotBlank(strSearch)) { search.setAttr("YTD_SALE", true); } - final ListResult> result = - listViewModels(search, start, limit, strSearch, criteria, filters, orders); - result.setAttr("fileBasePath", fileBasePath); - return result; + return listViewModels(search, start, limit, strSearch, criteria, filters, orders); } @RequiresRoles(User.ROLE_ADMIN) diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/SiteController.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/SiteController.java index bc25952..5c30fb9 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/SiteController.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/controller/SiteController.java @@ -1,9 +1,5 @@ package com.pudonghot.ambition.crm.controller; -import java.io.IOException; -import org.apache.commons.io.IOUtils; -import org.springframework.http.MediaType; -import me.chyxion.tigon.webmvc.ResourceModel; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -16,9 +12,6 @@ import org.springframework.web.bind.annotation.RequestMapping; public class SiteController { @RequestMapping("/") - public ResourceModel index() throws IOException { - return new ResourceModel( - IOUtils.toByteArray(SiteController.class.getResourceAsStream("/static/index.html")), - MediaType.TEXT_HTML_VALUE, null); + public void index() { } } diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java index f2cd5a6..a988dbb 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/ApplicationServiceSupport.java @@ -10,17 +10,19 @@ import me.chyxion.tigon.mybatis.Search; import org.springframework.util.Assert; import me.chyxion.tigon.model.ViewModel; import org.springframework.stereotype.Service; -import com.pudonghot.ambition.file.AmbitionFileApi; +import com.pudonghot.ambition.file.DiskFileApi; +import com.pudonghot.ambition.crm.model.FileInfo; import com.pudonghot.ambition.crm.model.Application; import org.springframework.web.multipart.MultipartFile; import com.pudonghot.ambition.crm.model.ApplicationImage; import com.pudonghot.ambition.crm.mapper.ApplicationMapper; -import org.springframework.beans.factory.annotation.Value; +import com.pudonghot.ambition.crm.model.CustomerApplication; import com.pudonghot.ambition.crm.service.ApplicationService; import org.springframework.beans.factory.annotation.Autowired; import me.chyxion.tigon.service.support.BaseCrudServiceSupport; import org.springframework.transaction.annotation.Transactional; import com.pudonghot.ambition.crm.mapper.ApplicationImageMapper; +import com.pudonghot.ambition.crm.mapper.CustomerApplicationMapper; import com.pudonghot.ambition.crm.form.update.ApplicationFormForUpdate; import com.pudonghot.ambition.crm.form.create.ApplicationFormForCreate; import com.pudonghot.ambition.crm.form.create.ApplicationImageFormForCreate; @@ -40,9 +42,9 @@ public class ApplicationServiceSupport @Autowired private ApplicationImageMapper imageMapper; @Autowired - private AmbitionFileApi fileApi; - @Value("${file.base-path}") - private String fileBasePath; + private DiskFileApi fileApi; + @Autowired + private CustomerApplicationMapper customerApplicationMapper; /** * {@inheritDoc} @@ -82,7 +84,6 @@ public class ApplicationServiceSupport final List images = imageMapper.list( new Search(ApplicationImage.APPLICATION_ID, id) .asc(ApplicationImage.SORT)); - images.forEach(image -> image.setUrl(fileBasePath + imageFolder(id) + "/" + image.getId())); return super.findViewModel(id) .setAttr("images", images); } @@ -149,7 +150,33 @@ public class ApplicationServiceSupport } } - private List uploadImages(final String applicationId, int sort, final MultipartFile[] images, final String[] titles, final String createdBy) { + /** + * {@inheritDoc} + */ + @Override + @Transactional(rollbackFor = Throwable.class) + public int delete(final String id) { + log.info("Delete application [{}].", id); + final Application app = find(id); + Assert.state(app != null, "No application [" + id + "] found"); + Assert.state(!app.isEnabled(), "Application [" + id + "] is enabled"); + Assert.state(customerApplicationMapper.count( + new Search(CustomerApplication.APPLICATION_ID, id)) == 0, + "Application [" + id + "] is in using"); + final Search appImageSearch = new Search(ApplicationImage.APPLICATION_ID, id); + imageMapper.list(appImageSearch).forEach( + image -> fileApi.deleteById(image.getFileId())); + imageMapper.delete(appImageSearch); + return mapper.delete(id); + } + + private List uploadImages( + final String applicationId, + int sort, + final MultipartFile[] images, + final String[] titles, + final String createdBy) { + final List imagesRtn = new ArrayList<>(); final Date now = new Date(); final String imageFolder = imageFolder(applicationId); @@ -159,9 +186,11 @@ public class ApplicationServiceSupport try (final InputStream ins = image.getInputStream()) { final String imageId = idSeq.get(); final ApplicationImage appImage = new ApplicationImage(); - appImage.setUrl(fileApi.uploadImage(ins, imageFolder, imageId)); + final FileInfo fileInfo = fileApi.uploadImage(ins, imageFolder, imageId); appImage.setId(imageId); appImage.setApplicationId(applicationId); + appImage.setFileId(fileInfo.getId()); + appImage.setUrl(fileInfo.getUrl()); appImage.setSort(sort++); appImage.setEnabled(true); appImage.setNote(titles[i]); diff --git a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java index ba04c81..6073229 100644 --- a/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java +++ b/server/crm/src/main/java/com/pudonghot/ambition/crm/service/support/CustomerServiceSupport.java @@ -152,7 +152,7 @@ public class CustomerServiceSupport final CustomerApplication customerApplication = new CustomerApplication(); customerApplication.setId(idSeq.get()); customerApplication.setCustomerId(customerId); - customerApplication.setPropertyId(applicationId); + customerApplication.setApplicationId(applicationId); customerApplication.setCreatedBy(operator); customerApplication.setDateCreated(now); customerApplicationMapper.insert(customerApplication); diff --git a/server/crm/src/main/resources/application_dev.properties b/server/crm/src/main/resources/application_dev.properties index 640b085..1223477 100644 --- a/server/crm/src/main/resources/application_dev.properties +++ b/server/crm/src/main/resources/application_dev.properties @@ -18,5 +18,5 @@ spring.http.multipart.max-file-size=1024MB spring.http.multipart.max-request-size=1024MB # File -file.base-path=http://127.0.0.1:${server.port}/f/ +file.base-path=http://127.0.0.1:1217/lm-f/ file.base-dir=/Users/chyxion/Workspaces/ambition-crm/files/ diff --git a/server/crm/src/test/java/com/pudonghot/ambition/crm/service/DiskFileStoreTest.java b/server/crm/src/test/java/com/pudonghot/ambition/crm/service/DiskFileStoreTest.java index 3b58247..fc295ef 100644 --- a/server/crm/src/test/java/com/pudonghot/ambition/crm/service/DiskFileStoreTest.java +++ b/server/crm/src/test/java/com/pudonghot/ambition/crm/service/DiskFileStoreTest.java @@ -5,6 +5,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import lombok.extern.slf4j.Slf4j; import com.pudonghot.ambition.crm.AmbitionCRM; +import com.pudonghot.ambition.crm.model.FileInfo; import com.pudonghot.ambition.file.AmbitionFileApi; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; @@ -23,11 +24,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class DiskFileStoreTest { @Autowired - private AmbitionFileApi fileApi; + private AmbitionFileApi fileApi; @Test public void testUpload() throws Exception { - final String foobar = fileApi.upload(new File("/Users/chyxion/Workspaces//Eclipse/Default/bzush-schoolmate-api/src/main/java/cn/edu/bzu/schoolmate/controllers/FileController.java"), "foobar"); + final FileInfo foobar = fileApi.upload(new File("/Users/chyxion/Workspaces//Eclipse/Default/bzush-schoolmate-api/src/main/java/cn/edu/bzu/schoolmate/controllers/FileController.java"), "foobar"); log.info("Upload result [{}].", foobar); } } diff --git a/server/file-api/src/main/java/com/pudonghot/ambition/file/AmbitionFileApi.java b/server/file-api/src/main/java/com/pudonghot/ambition/file/AmbitionFileApi.java index 400c97e..42ee7bb 100644 --- a/server/file-api/src/main/java/com/pudonghot/ambition/file/AmbitionFileApi.java +++ b/server/file-api/src/main/java/com/pudonghot/ambition/file/AmbitionFileApi.java @@ -16,9 +16,7 @@ import org.springframework.validation.annotation.Validated; * Mar 24, 2015 1:22:40 PM */ @Validated -public interface AmbitionFileApi { - String META_FORMAT = "format"; - String META_DOWNLOAD_NAME = "downloadName"; +public interface AmbitionFileApi { /** * get object url @@ -50,39 +48,36 @@ public interface AmbitionFileApi { * A UUID Will Be The Name, If Name Not Specified, * @return File Link [http://umsapp.oss-cn-hangzhou.aliyuncs.com/echat-dev/foobar.png] */ - @NotBlank String upload(@NotNull File file, String name); + UploadReturn upload(@NotNull File file, String name); /** - * Upload File To OSS + * Upload File * @param file File * @param folder Custom Folder - * @param name File Name [optional], Such As "foobar.doc", - * A UUID Will Be The Name, If Name Not Specified, + * @param name File Name * @param contentType Content Type [Optional] * @param format File Format [Optional] * @return */ - @NotBlank String upload(@NotNull File file, String folder, String name, String contentType, String format); + UploadReturn upload(@NotNull File file, String folder, String name, String contentType, String format); /** - * Upload Stream To OSS + * Upload Stream * @param ins Input Stream - * @param name File Name [optional], Such As "foobar.png", - * A UUID Will Be The Name, If Name Not Specified, + * @param name File Name * @return File Link [http://umsapp.oss-cn-hangzhou.aliyuncs.com/echat-dev/foobar.png] */ - @NotBlank String upload(@NotNull InputStream ins, @Min(1) long contentLength, String name); + UploadReturn upload(@NotNull InputStream ins, @Min(1) long contentLength, String name); /** - * Upload Stream To OSS + * Upload Stream * @param ins Input Stream * @param folder Custom Folder - * @param name File Name [optional], Such As "foobar.doc", - * A UUID Will Be The Name, If Name Not Specified, + * @param name name * @param contentType Content Type [Optional] * @param format File Format [Optional] */ - @NotBlank String upload(@NotNull InputStream ins, + UploadReturn upload(@NotNull InputStream ins, @Min(1) long contentLength, String folder, String name, @@ -101,7 +96,7 @@ public interface AmbitionFileApi { * @param downloadName File Download Name [Optional] * @return */ - @NotBlank String upload(@NotNull InputStream ins, + UploadReturn upload(@NotNull InputStream ins, @Min(1) long contentLength, String folder, String name, @@ -159,7 +154,7 @@ public interface AmbitionFileApi { * @param gender F/M/S * @return */ - @NotBlank String uploadAvatar(@NotBlank String memberId, @NotBlank String name, String gender); + UploadReturn uploadAvatar(@NotBlank String memberId, @NotBlank String name, String gender); /** * Upload Member Avatar @@ -169,7 +164,7 @@ public interface AmbitionFileApi { * @param gender * @return */ - @NotBlank String uploadAvatar(@NotBlank String folder, @NotNull String memberId, @NotBlank String name, String gender); + UploadReturn uploadAvatar(@NotBlank String folder, @NotNull String memberId, @NotBlank String name, String gender); /** * get member avatar url @@ -184,14 +179,14 @@ public interface AmbitionFileApi { * @param insAvatar * @return */ - @NotBlank String uploadAvatar(@NotBlank String memberId, @NotNull InputStream insAvatar); + UploadReturn uploadAvatar(@NotBlank String memberId, @NotNull InputStream insAvatar); /** * @param memberId * @param bytesAvatar * @return */ - @NotBlank String uploadAvatar(@NotBlank String memberId, @NotNull byte[] bytesAvatar); + UploadReturn uploadAvatar(@NotBlank String memberId, @NotNull byte[] bytesAvatar); /** * Upload Image @@ -200,7 +195,7 @@ public interface AmbitionFileApi { * @param name * @return */ - @NotBlank String uploadImage(@NotNull InputStream ins, String folder, String name); + UploadReturn uploadImage(@NotNull InputStream ins, String folder, String name); /** * @param image @@ -208,7 +203,7 @@ public interface AmbitionFileApi { * @param name * @return */ - @NotBlank String uploadImage(@NotNull byte[] image, String folder, String name); + UploadReturn uploadImage(@NotNull byte[] image, String folder, String name); /** * Upload Image @@ -216,5 +211,5 @@ public interface AmbitionFileApi { * @param ins * @return */ - @NotBlank String uploadImage(@NotNull InputStream ins, String folder); + UploadReturn uploadImage(@NotNull InputStream ins, String folder); } diff --git a/server/file-api/src/main/java/com/pudonghot/ambition/file/support/AbstractAmbitionFileApi.java b/server/file-api/src/main/java/com/pudonghot/ambition/file/support/AbstractAmbitionFileApi.java index 6329dee..fcb5e5d 100644 --- a/server/file-api/src/main/java/com/pudonghot/ambition/file/support/AbstractAmbitionFileApi.java +++ b/server/file-api/src/main/java/com/pudonghot/ambition/file/support/AbstractAmbitionFileApi.java @@ -2,13 +2,11 @@ package com.pudonghot.ambition.file.support; import java.io.File; import java.util.List; -import org.slf4j.Logger; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import javax.imageio.ImageIO; import java.io.FileInputStream; -import org.slf4j.LoggerFactory; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -32,7 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; * Sep 14, 2016 3:31:52 PM */ @Slf4j -public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { +public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { @Autowired protected ImageTool imageTool; @Autowired @@ -42,8 +40,8 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String upload(File file, String folder, String name, String contentType, String format) { - log.debug("Upload Input Stream To OSS With File [{}].", name); + public UploadReturn upload(final File file, final String folder, String name, final String contentType, String format) { + log.info("Upload input stream file [{}].", name); if (StringUtils.isBlank(name)) { name = idSeq.get(); String fileExt = FilenameUtils.getExtension(file.getName()); @@ -70,7 +68,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String upload(File file, String name) { + public UploadReturn upload(File file, String name) { return upload(file, null, name, null, null); } @@ -78,7 +76,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String upload(InputStream in, long contentLength, String name) { + public UploadReturn upload(InputStream in, long contentLength, String name) { return upload(in, contentLength, null, name, null, null); } @@ -86,7 +84,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String upload(InputStream in, + public UploadReturn upload(InputStream in, long contentLength, String folder, String name, String contentType, String fileFormat) { @@ -144,7 +142,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String uploadAvatar(String memberId, String name, String gender) { + public UploadReturn uploadAvatar(String memberId, String name, String gender) { return uploadAvatar(avatarFolder(), memberId, name, gender); } @@ -152,7 +150,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String uploadAvatar(String folder, String memberId, String name, String gender) { + public UploadReturn uploadAvatar(String folder, String memberId, String name, String gender) { byte[] bytesAvatar = imageTool.genAvatar(name, gender); return upload(new ByteArrayInputStream(bytesAvatar), bytesAvatar.length, @@ -165,7 +163,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String uploadAvatar(String memberId, InputStream ins) { + public UploadReturn uploadAvatar(String memberId, InputStream ins) { return uploadImage(ins, avatarFolder(), memberId); } @@ -181,7 +179,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String uploadImage(InputStream ins, String folder, String name) { + public UploadReturn uploadImage(InputStream ins, String folder, String name) { byte[] bytesFile = null; try { bytesFile = IOUtils.toByteArray(ins); @@ -200,7 +198,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String uploadImage(byte[] bytesFile, String folder, String name) { + public UploadReturn uploadImage(byte[] bytesFile, String folder, String name) { String format = imageTool.imageType(new ByteArrayInputStream(bytesFile)); if (StringUtils.isNotBlank(format)) { if (!ArrayUtils.contains(new String[] {"png", "jpg", "jpeg"}, format)) { @@ -226,7 +224,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * @return */ @Override - public String uploadImage(InputStream ins, String folder) { + public UploadReturn uploadImage(InputStream ins, String folder) { return uploadImage(ins, folder, null); } @@ -234,7 +232,7 @@ public abstract class AbstractAmbitionFileApi implements AmbitionFileApi { * {@inheritDoc} */ @Override - public String uploadAvatar(String memberId, byte[] bytesAvatar) { + public UploadReturn uploadAvatar(String memberId, byte[] bytesAvatar) { return uploadImage(bytesAvatar, avatarFolder(), memberId); } diff --git a/server/file-disk/src/main/java/com/pudonghot/ambition/file/DiskFileApi.java b/server/file-disk/src/main/java/com/pudonghot/ambition/file/DiskFileApi.java index 3023b9e..6c6675a 100644 --- a/server/file-disk/src/main/java/com/pudonghot/ambition/file/DiskFileApi.java +++ b/server/file-disk/src/main/java/com/pudonghot/ambition/file/DiskFileApi.java @@ -1,6 +1,7 @@ package com.pudonghot.ambition.file; import com.pudonghot.ambition.crm.model.FileInfo; +import org.hibernate.validator.constraints.NotBlank; import java.io.File; @@ -9,7 +10,7 @@ import java.io.File; * chyxion@163.com
* Mar 11, 2018 18:13:51 */ -public interface DiskFileApi extends AmbitionFileApi { +public interface DiskFileApi extends AmbitionFileApi { /** * find file info @@ -24,4 +25,10 @@ public interface DiskFileApi extends AmbitionFileApi { * @return file */ File getFile(FileInfo fileInfo); + + /** + * delete file by id + * @param id id + */ + void deleteById(@NotBlank String id); } diff --git a/server/file-disk/src/main/java/com/pudonghot/ambition/file/disk/DiskFileSupport.java b/server/file-disk/src/main/java/com/pudonghot/ambition/file/disk/DiskFileSupport.java index 89edb3f..fdecbc8 100644 --- a/server/file-disk/src/main/java/com/pudonghot/ambition/file/disk/DiskFileSupport.java +++ b/server/file-disk/src/main/java/com/pudonghot/ambition/file/disk/DiskFileSupport.java @@ -26,7 +26,7 @@ import com.pudonghot.ambition.file.support.AbstractAmbitionFileApi; */ @Slf4j public class DiskFileSupport - extends AbstractAmbitionFileApi + extends AbstractAmbitionFileApi implements DiskFileApi { @Autowired @@ -85,7 +85,7 @@ public class DiskFileSupport */ @Override @Transactional - public String upload(final InputStream in, + public FileInfo upload(final InputStream in, final long contentLength, String folder, final String name, @@ -97,13 +97,17 @@ public class DiskFileSupport boolean update = false; Date now = new Date(); FileInfo fileInfo = findFileInfo(fullName); - File prevFile = null; if (fileInfo != null) { fileInfo.setDateUpdated(now); update = true; // delete previous file - prevFile = new File(getFileDir(), fileInfo.getFilePath()); + final File prevFile = getFile(fileInfo); log.info("Will delete previous file [{}].", prevFile); + // delete previous files + if (prevFile != null) { + log.info("Delete previous file [{}] before upload.", prevFile); + FileUtils.deleteQuietly(prevFile); + } } else { fileInfo = new FileInfo(); @@ -132,18 +136,6 @@ public class DiskFileSupport log.info("Upload input stream with name [{}].", fullName); OutputStream fout = null; try { - // delete previous files - if (prevFile != null) { - FileUtils.deleteQuietly(prevFile); - log.info("Delete file [{}] before upload.", prevFile); - FileUtils.deleteQuietly(prevFile); - } - -// for (File file : getFileDir().listFiles( -// (FilenameFilter) new WildcardFileFilter(filePath + ".*"))) { -// log.info("Delete File [{}] Before Upload.", file.getAbsolutePath()); -// FileUtils.deleteQuietly(file); -// } final File storeFile = new File(getFileDir(), filePath); final File fileParent = storeFile.getParentFile(); @@ -153,8 +145,9 @@ public class DiskFileSupport fout = new FileOutputStream(storeFile); IOUtils.copy(in, fout); - // return getUrl(filePath); - return basePath + fullName; + // return basePath + fullName; + fileInfo.setUrl(basePath + filePath); + return fileInfo; } catch (IOException e) { throw new IllegalStateException( @@ -230,6 +223,19 @@ public class DiskFileSupport return new File(getFileDir(), fileInfo.getFilePath()); } + /** + * {@inheritDoc} + */ + @Override + public void deleteById(String id) { + final FileInfo fileInfo = fileInfoMapper.find(id); + if (fileInfo != null) { + log.info("Delete file [{}].", fileInfo); + fileInfoMapper.delete(id); + FileUtils.deleteQuietly(getFile(fileInfo)); + } + } + // -- // private methods @@ -275,7 +281,7 @@ public class DiskFileSupport String getFilePath(final String fileId, final String folder, final String name, String fileFormat) { String distFolder = DateFormatUtils.format(new Date(), "yyyyMMdd") + "/"; if (StringUtils.isNotBlank(folder)) { - if (distFolder.endsWith("/")) { + if (folder.endsWith("/")) { distFolder = folder + distFolder; } else { @@ -301,5 +307,4 @@ public class DiskFileSupport return StringUtils.isNotBlank(fileFormat) ? filePath + "." + fileFormat : filePath; } - } diff --git a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/ApplicationImageMapper.xml b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/ApplicationImageMapper.xml index f4b0bfa..811cf04 100644 --- a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/ApplicationImageMapper.xml +++ b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/ApplicationImageMapper.xml @@ -30,7 +30,8 @@ select , - (select group_concat(id order by sort separator 0x1d) from + (select group_concat(url order by sort separator 0x1d) from crm_application_image where application_id = a.id group by application_id) images, diff --git a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml index f655664..6a48372 100644 --- a/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml +++ b/server/mapper/src/main/java/com/pudonghot/ambition/crm/mapper/CustomerMapper.xml @@ -183,7 +183,7 @@ (select group_concat(p.id order by p.name separator ',') from crm_customer_application a join crm_customer_property p - on a.property_id = p.id + on a.application_id = p.id where a.customer_id = customer.id group by a.customer_id) applications, @@ -191,7 +191,7 @@ (select group_concat(p.name order by p.name separator ',') from crm_customer_application a join crm_customer_property p - on a.property_id = p.id + on a.application_id = p.id where a.customer_id = customer.id group by a.customer_id) application_names @@ -202,7 +202,7 @@ join (select distinct customer_id from crm_customer_application - where property_id in + where application_id in #{appId} diff --git a/server/mapper/src/test/java/com/pudonghot/ambition/crm/mapper/CustomerApplicationMapperTest.java b/server/mapper/src/test/java/com/pudonghot/ambition/crm/mapper/CustomerApplicationMapperTest.java index c7c3b17..26a5da2 100644 --- a/server/mapper/src/test/java/com/pudonghot/ambition/crm/mapper/CustomerApplicationMapperTest.java +++ b/server/mapper/src/test/java/com/pudonghot/ambition/crm/mapper/CustomerApplicationMapperTest.java @@ -1,15 +1,14 @@ package com.pudonghot.ambition.crm.mapper; -import org.junit.Assert; import org.junit.Test; import java.util.Date; +import org.junit.Assert; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.pudonghot.ambition.crm.mapper.CustomerApplicationMapper; import com.pudonghot.ambition.crm.model.CustomerApplication; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; /** * @version 0.0.1 @@ -32,7 +31,7 @@ public class CustomerApplicationMapperTest extends AbstractTransactionalJUnit4Sp m.setId(id); m.setDateCreated(new Date()); m.setCustomerId("s"); - m.setPropertyId("s"); + m.setApplicationId("s"); mapper.insert(m); Assert.assertTrue(mapper.list(null).size() > 0); /* diff --git a/server/model/src/main/java/com/pudonghot/ambition/crm/model/ApplicationImage.java b/server/model/src/main/java/com/pudonghot/ambition/crm/model/ApplicationImage.java index 009bc05..b8bad03 100644 --- a/server/model/src/main/java/com/pudonghot/ambition/crm/model/ApplicationImage.java +++ b/server/model/src/main/java/com/pudonghot/ambition/crm/model/ApplicationImage.java @@ -4,7 +4,6 @@ import lombok.Getter; import lombok.Setter; import me.chyxion.tigon.model.M3; import me.chyxion.tigon.mybatis.Table; -import me.chyxion.tigon.mybatis.Transient; /** * @author Shaun Chyxion
@@ -18,12 +17,14 @@ public class ApplicationImage extends M3 { private static final long serialVersionUID = 1L; // Column Names + public static final String FILE_ID = "file_id"; + public static final String URL = "url"; public static final String APPLICATION_ID = "application_id"; public static final String SORT = "sort"; // Properties + private String fileId; + private String url; private String applicationId; private float sort; - @Transient - private String url; } diff --git a/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerApplication.java b/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerApplication.java index 0c3c1c5..485c1f1 100644 --- a/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerApplication.java +++ b/server/model/src/main/java/com/pudonghot/ambition/crm/model/CustomerApplication.java @@ -19,10 +19,10 @@ public class CustomerApplication extends M3 { // Column Names public static final String CUSTOMER_ID = "customer_id"; - public static final String PROPERTY_ID = "property_id"; + public static final String APPLICATION_ID = "application_id"; // Properties private String customerId; - private String propertyId; + private String applicationId; } diff --git a/server/model/src/main/java/com/pudonghot/ambition/crm/model/FileInfo.java b/server/model/src/main/java/com/pudonghot/ambition/crm/model/FileInfo.java index 6c88532..e1f779b 100644 --- a/server/model/src/main/java/com/pudonghot/ambition/crm/model/FileInfo.java +++ b/server/model/src/main/java/com/pudonghot/ambition/crm/model/FileInfo.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.Setter; import me.chyxion.tigon.model.M3; import me.chyxion.tigon.mybatis.Table; +import me.chyxion.tigon.mybatis.Transient; /** * @version 0.0.1 @@ -33,4 +34,6 @@ public class FileInfo extends M3 { private String downloadName; private long contentLength; private String contentType; + @Transient + private String url; } diff --git a/web/app/components/form-input-select2.js b/web/app/components/form-input-select2.js index b8f7469..4dc6c6b 100644 --- a/web/app/components/form-input-select2.js +++ b/web/app/components/form-input-select2.js @@ -65,7 +65,7 @@ export default BaseFormInput.extend({ if (me.get('multiple')) { const vals = me.getVal(); if (isArray(vals)) { - vals.each(v => me.select(me.findOption(v))); + vals.forEach(v => me.select(me.findOption(v))); } else { me.setVal(me.getSelected()); diff --git a/web/app/helpers/customer-application-images.js b/web/app/helpers/customer-application-images.js index 340c700..ac2ff5f 100644 --- a/web/app/helpers/customer-application-images.js +++ b/web/app/helpers/customer-application-images.js @@ -1,11 +1,11 @@ import { helper } from '@ember/component/helper'; -export function customerApplicationImages([fileBasePath, appId, images, titles]) { +export function customerApplicationImages([images, titles]) { if (images) { titles = titles ? titles.split(String.fromCharCode(0x1d)) : []; return images.split(String.fromCharCode(0x1d)).map((image, i) => { return { - image: fileBasePath + 'app/' + appId + '/' + image, + image: image, title: titles[i] } }); diff --git a/web/app/templates/components/customer-application/preview-btn.hbs b/web/app/templates/components/customer-application/preview-btn.hbs index 343ae8a..4146be9 100644 --- a/web/app/templates/components/customer-application/preview-btn.hbs +++ b/web/app/templates/components/customer-application/preview-btn.hbs @@ -14,7 +14,9 @@

{{content}}


- {{#with (customer-application-images file-base-path model.id model.images model.imageTitles) as |images|}} +

{{model.note}}

+
+ {{#with (customer-application-images model.images model.imageTitles) as |images|}} {{#each images as |image index|}} {{image-previews cover-title=true image-height=192 image-style='border-radius: 2%; border: 1px solid #DCDCDC; max-width: 480px;' previews=images index=index}} {{/each}} diff --git a/web/app/templates/customer-application/list.hbs b/web/app/templates/customer-application/list.hbs index 98cb774..92a92b4 100644 --- a/web/app/templates/customer-application/list.hbs +++ b/web/app/templates/customer-application/list.hbs @@ -23,7 +23,8 @@ Name - Content + + Images @@ -56,11 +57,10 @@ {{#each model.data as |it|}} - {{!it.name}} - {{customer-application/preview-btn model=it file-base-path=model.fileBasePath}} + {{customer-application/preview-btn model=it}} - {{image-previews previews=(customer-application-images model.fileBasePath it.id it.images it.imageTitles)}} + {{image-previews previews=(customer-application-images it.images it.imageTitles)}} {{editable-cell model=it field='note'}} @@ -79,6 +79,11 @@ {{#link-to 'customer-application.edit' it.id class='btn btn-xs btn-info' data-rel='tooltip' title='Edit'}} {{/link-to}} + {{#if ajax.user.admin}} + {{#unless it.enabled}} + {{delete-btn model=it}} + {{/unless}} + {{/if}} diff --git a/web/app/templates/customer/list.hbs b/web/app/templates/customer/list.hbs index acb1ac3..05e99a0 100644 --- a/web/app/templates/customer/list.hbs +++ b/web/app/templates/customer/list.hbs @@ -226,7 +226,7 @@ {{#each (str-split it.applications) as |aId|}} {{#each model.applicationList as |app|}} {{#if (eq aId app.id)}} - {{customer-application/preview-btn model=app file-base-path=model.fileBasePath}} + {{customer-application/preview-btn model=app}} {{/if}} {{/each}} {{!option-text model.applicationList a 'id' 'name'}}