diff --git a/src/main/java/net/alawn/bill/config/SwaggerConfig.java b/src/main/java/net/alawn/bill/config/SwaggerConfig.java index 8d0bcc8..cc49c52 100644 --- a/src/main/java/net/alawn/bill/config/SwaggerConfig.java +++ b/src/main/java/net/alawn/bill/config/SwaggerConfig.java @@ -34,7 +34,7 @@ public class SwaggerConfig { private ApiInfo apiInfo() { return new ApiInfoBuilder() - .title("Book API") + .title("BookVO API") .description("Bill接口") .termsOfServiceUrl("http://fairy8.cn") .contact(new Contact("Alawn","fairy8.cn","alawn.cn@gmail.com")) diff --git a/src/main/java/net/alawn/bill/config/WebSecurityConfig.java b/src/main/java/net/alawn/bill/config/WebSecurityConfig.java index 99e3fba..b720b38 100644 --- a/src/main/java/net/alawn/bill/config/WebSecurityConfig.java +++ b/src/main/java/net/alawn/bill/config/WebSecurityConfig.java @@ -93,7 +93,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .and() .authorizeRequests() .antMatchers("/").permitAll() - .antMatchers("/druid/**").permitAll() + .antMatchers("/test/**").permitAll() // 测试用 + .antMatchers("/druid/**").permitAll() // 阿里Druid .antMatchers("/swagger*").permitAll() .antMatchers( HttpMethod.GET, "/","/*.html", "/favicon.ico", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // .antMatchers("/resources/**").permitAll() @@ -170,5 +171,4 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { // // 使用自定义身份验证组件 // auth.authenticationProvider(new CustomAuthenticationProvider(userDetailsService)); // } - } diff --git a/src/main/java/net/alawn/bill/controller/AuthController.java b/src/main/java/net/alawn/bill/controller/AuthController.java index cef6bf7..836e892 100644 --- a/src/main/java/net/alawn/bill/controller/AuthController.java +++ b/src/main/java/net/alawn/bill/controller/AuthController.java @@ -1,6 +1,6 @@ package net.alawn.bill.controller; -import net.alawn.bill.entity.dto.AddUser; +import net.alawn.bill.entity.dto.NewUser; import net.alawn.bill.security.JwtAuthenticationRequest; import net.alawn.bill.security.JwtAuthenticationResponse; import net.alawn.bill.service.AuthService; @@ -52,7 +52,7 @@ public class AuthController { } @RequestMapping(value = "/auth/register", method = RequestMethod.POST) - public AddUser register(@RequestBody AddUser addedUser) throws AuthenticationException, HttpRequestMethodNotSupportedException { + public NewUser register(@RequestBody NewUser addedUser) throws AuthenticationException, HttpRequestMethodNotSupportedException { return authService.register(addedUser); } } diff --git a/src/main/java/net/alawn/bill/controller/BasicController.java b/src/main/java/net/alawn/bill/controller/BasicController.java index f042285..225e2c6 100644 --- a/src/main/java/net/alawn/bill/controller/BasicController.java +++ b/src/main/java/net/alawn/bill/controller/BasicController.java @@ -1,9 +1,9 @@ package net.alawn.bill.controller; import lombok.extern.slf4j.Slf4j; -import net.alawn.bill.entity.dto.AddMerchant; -import net.alawn.bill.entity.dto.AddPost; -import net.alawn.bill.entity.dto.AddTitle; +import net.alawn.bill.entity.dto.NewMerchant; +import net.alawn.bill.entity.dto.NewPost; +import net.alawn.bill.entity.dto.NewTitle; import net.alawn.bill.entity.po.*; import net.alawn.bill.repository.*; import net.alawn.bill.security.AuthUser; @@ -12,7 +12,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; -import java.net.URI; import java.net.URISyntaxException; import java.security.Principal; import java.util.List; @@ -50,12 +49,12 @@ public class BasicController { @RequestMapping(value = "/posts",method = RequestMethod.POST) @ResponseBody - public ResponseEntity addPost(@RequestBody AddPost addPost, Principal principal) throws URISyntaxException { + public ResponseEntity addPost(@RequestBody NewPost newPost, Principal principal) throws URISyntaxException { AuthUser authUser = (AuthUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); long userId = authUser.getId(); /** 登记 Post */ - Post post = addPost.build(); + Post post = newPost.build(); post.setUserId(userId); postRepo.save(post); postRepo.flush(); @@ -91,9 +90,9 @@ public class BasicController { @RequestMapping(value = "/merchants",method = RequestMethod.POST) @ResponseBody - public ResponseEntity addMerchant(@RequestBody AddMerchant addMerchant) throws URISyntaxException { + public ResponseEntity addMerchant(@RequestBody NewMerchant newMerchant) throws URISyntaxException { /** 登记 Post */ - Merchant merchant = merchantRepo.save(addMerchant.build()); + Merchant merchant = merchantRepo.save(newMerchant.build()); merchantRepo.flush(); return ResponseEntity.ok(merchant); } @@ -121,9 +120,9 @@ public class BasicController { @RequestMapping(value = "/titles",method = RequestMethod.POST) @ResponseBody - public ResponseEntity addTitle(@RequestBody AddTitle addTitle) { + public ResponseEntity<Title> addTitle(@RequestBody NewTitle newTitle) { /** 登记 Title */ - Title title = titleRepo.save(addTitle.build()); + Title title = titleRepo.save(newTitle.build()); titleRepo.flush(); return ResponseEntity.ok(title); } diff --git a/src/main/java/net/alawn/bill/controller/BillController.java b/src/main/java/net/alawn/bill/controller/BillController.java index c5313ce..cbc032d 100644 --- a/src/main/java/net/alawn/bill/controller/BillController.java +++ b/src/main/java/net/alawn/bill/controller/BillController.java @@ -1,9 +1,9 @@ package net.alawn.bill.controller; -import net.alawn.bill.entity.dto.AddBill; +import lombok.extern.slf4j.Slf4j; +import net.alawn.bill.entity.dto.NewBill; import net.alawn.bill.entity.po.Book; -import net.alawn.bill.entity.po.Item; -import net.alawn.bill.enums.State; +import net.alawn.bill.entity.po.User; import net.alawn.bill.repository.BookRepo; import net.alawn.bill.repository.ItemRepo; import net.alawn.bill.repository.UserRepo; @@ -13,10 +13,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; -import java.security.Principal; -import java.util.Date; import java.util.List; -import java.util.stream.Collectors; /** @@ -26,7 +23,8 @@ import java.util.stream.Collectors; */ -@RequestMapping(value = "/bills") +@Slf4j +@RequestMapping(value = "/bill") @RestController public class BillController { @@ -39,24 +37,34 @@ public class BillController { @Autowired UserRepo userRepo; - @RequestMapping(value = "/",method = RequestMethod.POST) - public ResponseEntity<Book> addBook(@RequestBody AddBill addBill, Principal principal){ + @RequestMapping(value = "/books",method = RequestMethod.POST) + public ResponseEntity<Book> newBook(@RequestBody NewBill newBill){ AuthUser authUser = (AuthUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); long userId = authUser.getId(); - /** 登记 book */ - Book book = bookRepo.save(new Book(userId, addBill.getPostId(), State.APPLIED,new Date(),null)); + log.info("newBill:" + newBill); - /** DTO -> PO 转换 */ - List<Item> items = addBill.getBillItems() - .stream() - .map(bill -> new Item(book.getId(),bill.getDating(),bill.getTitleId(),bill.getMerchantId(),bill.getAmount())) - .collect(Collectors.toList()); + Book book = newBill.toBook(); - /** 登记 item */ - itemRepo.saveAll(items); + book.setUser(new User(userId)); + log.info("book:" + book); + bookRepo.save(book); + log.info("book:" + book); bookRepo.flush(); - itemRepo.flush(); + + bookRepo.sumAmount(book.getId()); + return ResponseEntity.ok(book); } + + @RequestMapping(value = "/books",method = RequestMethod.GET) + public ResponseEntity<List<Book>> fetchBooks(){ + AuthUser authUser = (AuthUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + long userId = authUser.getId(); + + List<Book> books = bookRepo.findByUserId(userId); + + return ResponseEntity.ok(books); + } + } diff --git a/src/main/java/net/alawn/bill/controller/TestController.java b/src/main/java/net/alawn/bill/controller/TestController.java new file mode 100644 index 0000000..ab7d3f1 --- /dev/null +++ b/src/main/java/net/alawn/bill/controller/TestController.java @@ -0,0 +1,147 @@ +package net.alawn.bill.controller; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import net.alawn.bill.entity.po.*; +import net.alawn.bill.enums.State; +import net.alawn.bill.repository.*; +import net.alawn.bill.security.AuthUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.persistence.EntityManager; +import java.math.BigDecimal; +import java.util.*; + + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 09:59 2019-05-23 + */ + +@Slf4j +@RequestMapping(value = "/test") +@RestController +public class TestController { + + @Autowired + MainRepo mainRepo; + @Autowired + DetailRepo detailRepo; + @Autowired + UserRepo userRepo; + @Autowired + MerchantRepo merchantRepo; + @Autowired + TitleRepo titleRepo; + @Autowired + EntityManager entityManager; + + @RequestMapping(value = "/mains",method = RequestMethod.POST) + public ResponseEntity<?> main(){ + User user = userRepo.findByUsername("alawn"); + + log.info("user:" + user); + + + Merchant merc = Merchant.builder().abbr("商户简称").name("商户名称").build(); + merc.setId(22l); + + Title title = Title.builder().abbr("北京沐融").name("北京沐融信息科技有限公司").taxNo("2019230901258").build(); + title.setId(25l); + + Post post = Post.builder().address("世博馆路52号").contact("alawn").mobile("18017581610").userId(user.getId()).build(); + post.setId(32l); + + Detail detail1 = new Detail(); + detail1.setAmount(new BigDecimal(3.00)); + detail1.setMerchant(merc); + detail1.setTitle(title); + detail1.setDating(new Date()); + Detail detail2 = new Detail(); + detail2.setAmount(new BigDecimal(5.00)); + detail2.setMerchant(merc); + detail2.setTitle(title); + detail2.setDating(new Date()); + +// Set<Detail> details = new HashSet() ; +// List<Detail> details = new ArrayList<>() ; +// details.add(detail1); +// details.add(detail2); +// details.add(detail3); + + + Main main = new Main(); + + main.setApplyDate(new Date()); + main.setAcceptDate(new Date()); + main.setState(State.APPLIED); + main.setUser(user); + main.setPost(post); + main.addDetail(detail1); + main.addDetail(detail2); + log.info("main.id:" + main); + mainRepo.save(main); + mainRepo.flush(); + main.setAcceptDate(new Date()); + + Post post2 = Post.builder().address("世博馆路12号").contact("alawn").mobile("18017581610").userId(user.getId()).build(); + post2.setId(32l); +// post2.setId(33l); + + main.setPost(post2); + mainRepo.save(main); + mainRepo.flush(); + + +// Long mainId = main.getId(); + log.info("main:" + main); + +// List<Main> result = mainRepo.findAll(); +//// log.info("result:" + JSON.toJSONString(result,true)); +// +// +// Main rs = entityManager.find(Main.class,mainId); +// log.info("rs:" + rs); + + +// log.info("details:" + details); +// detailRepo.saveAll(details); +// detailRepo.flush(); + + +// Optional<Main> main1 = mainRepo.findById(mainId); +// log.info("is exists:" + mainRepo.existsById(mainId)); +//// +// if(main1.isPresent()) { +// log.info("main:" + main1.get()); +// } +// else +// { +// log.info("no data"); +// } + return ResponseEntity.ok().build(); + } + + @RequestMapping(value = "/mains",method = RequestMethod.GET) + public ResponseEntity<List<Main>> mains(){ + List<Main> result = mainRepo.findAll(); + log.info("result.size:" + result.size()); + return ResponseEntity.ok(result); + } + + @RequestMapping(value = "/details",method = RequestMethod.GET) + public ResponseEntity<List<Detail>> details(){ + List<Detail> result = detailRepo.findAll(); + log.info("result.size:" + result.size()); +// log.info("result:" + JSON.toJSONString(result,true)); + log.info("result:" + result); + return ResponseEntity.ok(result); + } + +} diff --git a/src/main/java/net/alawn/bill/entity/dto/AddBill.java b/src/main/java/net/alawn/bill/entity/dto/AddBill.java deleted file mode 100644 index 3dace38..0000000 --- a/src/main/java/net/alawn/bill/entity/dto/AddBill.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.alawn.bill.entity.dto; - -import lombok.Data; - -import java.util.List; - -/** - * @Author: Alawn - * @Description: - * @Date: Create in 10:47 2019-05-23 - */ - -@Data -public class AddBill { - private long postId; - List<BillItem> billItems; -} diff --git a/src/main/java/net/alawn/bill/entity/dto/BillItem.java b/src/main/java/net/alawn/bill/entity/dto/BillItem.java index a5b489c..d573e9e 100644 --- a/src/main/java/net/alawn/bill/entity/dto/BillItem.java +++ b/src/main/java/net/alawn/bill/entity/dto/BillItem.java @@ -13,8 +13,8 @@ import java.util.Date; @Data public class BillItem { - private Date dating; - private long titleId; - private long merchantId; - private BigDecimal amount; + private Date dating ; + private long titleId ; + private long merchantId ; + private BigDecimal amount ; } diff --git a/src/main/java/net/alawn/bill/entity/dto/NewBill.java b/src/main/java/net/alawn/bill/entity/dto/NewBill.java new file mode 100644 index 0000000..667a54b --- /dev/null +++ b/src/main/java/net/alawn/bill/entity/dto/NewBill.java @@ -0,0 +1,48 @@ +package net.alawn.bill.entity.dto; + +import lombok.Data; +import net.alawn.bill.entity.po.*; +import net.alawn.bill.enums.State; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 10:47 2019-05-23 + */ + +@Data +public class NewBill { + + private long postId ; + private List<BillItem> billItems ; + + public Book toBook() { + Book book = new Book(); + book.setApplyDate(new Date()); + book.setPost(new Post(postId)); + book.setState(State.APPLIED); + +// List<Item> items = new ArrayList<>(); +// for(BillItem rq: itemRQs){ +// Item item = new Item(); +// item.setDating(rq.getDating()); +// item.setAmount(rq.getAmount()); +// item.setMerchant(new Merchant(rq.getMerchantId())); +// item.setTitle(new Title(rq.getTitleId())); +// items.add(item); +// } + + /** 使用Java8 的stram写法 */ + List<Item> bookItems = billItems + .stream() + .map(rq -> new Item(book,new Title(rq.getTitleId()),new Merchant(rq.getMerchantId()),rq.getDating(),rq.getAmount())) + .collect(Collectors.toList()); + + book.setItems(bookItems); + return book; + } +} diff --git a/src/main/java/net/alawn/bill/entity/dto/AddMerchant.java b/src/main/java/net/alawn/bill/entity/dto/NewMerchant.java similarity index 92% rename from src/main/java/net/alawn/bill/entity/dto/AddMerchant.java rename to src/main/java/net/alawn/bill/entity/dto/NewMerchant.java index 85d8405..8c71d4f 100644 --- a/src/main/java/net/alawn/bill/entity/dto/AddMerchant.java +++ b/src/main/java/net/alawn/bill/entity/dto/NewMerchant.java @@ -9,7 +9,7 @@ import net.alawn.bill.entity.po.Merchant; * @Date: Create in 15:21 2019-05-23 */ @Data -public class AddMerchant { +public class NewMerchant { private String abbr; private String name; diff --git a/src/main/java/net/alawn/bill/entity/dto/AddPost.java b/src/main/java/net/alawn/bill/entity/dto/NewPost.java similarity index 94% rename from src/main/java/net/alawn/bill/entity/dto/AddPost.java rename to src/main/java/net/alawn/bill/entity/dto/NewPost.java index 6cacc67..7da4b58 100644 --- a/src/main/java/net/alawn/bill/entity/dto/AddPost.java +++ b/src/main/java/net/alawn/bill/entity/dto/NewPost.java @@ -10,7 +10,7 @@ import net.alawn.bill.entity.po.Post; */ @Data -public class AddPost { +public class NewPost { private String address ; private String contact ; private String mobile ; diff --git a/src/main/java/net/alawn/bill/entity/dto/AddTitle.java b/src/main/java/net/alawn/bill/entity/dto/NewTitle.java similarity index 94% rename from src/main/java/net/alawn/bill/entity/dto/AddTitle.java rename to src/main/java/net/alawn/bill/entity/dto/NewTitle.java index 351df7b..3b7e23c 100644 --- a/src/main/java/net/alawn/bill/entity/dto/AddTitle.java +++ b/src/main/java/net/alawn/bill/entity/dto/NewTitle.java @@ -12,7 +12,7 @@ import java.util.List; */ @Data -public class AddTitle { +public class NewTitle { private String name; private String abbr; private String taxNo; diff --git a/src/main/java/net/alawn/bill/entity/dto/AddUser.java b/src/main/java/net/alawn/bill/entity/dto/NewUser.java similarity index 93% rename from src/main/java/net/alawn/bill/entity/dto/AddUser.java rename to src/main/java/net/alawn/bill/entity/dto/NewUser.java index 58376fe..b0cd62a 100644 --- a/src/main/java/net/alawn/bill/entity/dto/AddUser.java +++ b/src/main/java/net/alawn/bill/entity/dto/NewUser.java @@ -6,7 +6,7 @@ import net.alawn.bill.entity.po.User; @Value @Builder -public class AddUser { +public class NewUser { private String username; private String password; diff --git a/src/main/java/net/alawn/bill/entity/po/Authority.java b/src/main/java/net/alawn/bill/entity/po/Authority.java index 781000c..fb5a483 100644 --- a/src/main/java/net/alawn/bill/entity/po/Authority.java +++ b/src/main/java/net/alawn/bill/entity/po/Authority.java @@ -1,6 +1,8 @@ package net.alawn.bill.entity.po; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; +import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.NotFound; import org.hibernate.annotations.NotFoundAction; @@ -14,7 +16,9 @@ import java.io.Serializable; @ToString(exclude = {"user"}) @NoArgsConstructor @AllArgsConstructor -public class Authority{ +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +public class Authority implements Serializable{ @EmbeddedId private AuthorityId id; diff --git a/src/main/java/net/alawn/bill/entity/po/Book.java b/src/main/java/net/alawn/bill/entity/po/Book.java index 631fe56..761ce95 100644 --- a/src/main/java/net/alawn/bill/entity/po/Book.java +++ b/src/main/java/net/alawn/bill/entity/po/Book.java @@ -1,13 +1,16 @@ package net.alawn.bill.entity.po; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; import net.alawn.bill.enums.State; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Table; -import java.util.Date; +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.*; /** * @Author: Alawn @@ -22,14 +25,40 @@ import java.util.Date; @AllArgsConstructor @NoArgsConstructor @Builder -public class Book extends Base{ +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +public class Book extends EntityId { + @JsonIgnore + @ManyToOne + @NotFound(action= NotFoundAction.IGNORE) + @JoinColumn(name = "userId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + private User user; - private long userId; - private long postId; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "postId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action= NotFoundAction.IGNORE) + private Post post; + + @OneToMany(cascade=CascadeType.ALL, mappedBy = "book", orphanRemoval = true) + @org.hibernate.annotations.ForeignKey(name = "none") + @NotFound(action= NotFoundAction.IGNORE) + private List<Item> items = new ArrayList<>(); @Enumerated(EnumType.STRING) private State state; - private Date applyDate; - private Date acceptDate; + private Date applyDate ; + private Date acceptDate ; + private BigDecimal totalAmount ; + + public void addItem(Item item) { + item.setBook(this); + this.items.add(item); + } + + public void removeItem(Item item) { + item.setBook(null); + items.remove(item); + } + } diff --git a/src/main/java/net/alawn/bill/entity/po/Detail.java b/src/main/java/net/alawn/bill/entity/po/Detail.java new file mode 100644 index 0000000..c134552 --- /dev/null +++ b/src/main/java/net/alawn/bill/entity/po/Detail.java @@ -0,0 +1,97 @@ +package net.alawn.bill.entity.po; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.*; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 10:53 2019-05-23 + */ +@Entity +@Table(name = "t_bill_detail") +@Data +@ToString(exclude = {"main"}) +//@AllArgsConstructor +//@NoArgsConstructor +//@Builder +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +public class Detail extends EntityId { + + public Detail (Main main) { + this.main = main; + } + + public Detail () { + } + +// @NotFound(action = NotFoundAction.IGNORE) +// @MapsId("id") +// @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false) // 可选属性optional=false,表示author不能为空。删除文章,不影响用户 +// @JoinColumn(name="main_id",)//设置在article表中的关联字段(外键) +// @MapsId("id") +// @NotFound(action = NotFoundAction.IGNORE) + + + /** OK */ + @JsonIgnore +// @ManyToOne(cascade = CascadeType.MERGE,fetch=FetchType.LAZY) + @ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.REFRESH) + @JoinColumn(name = "mainId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + private Main main; + + +// @ManyToOne(fetch = FetchType.LAZY) +// @NotFound(action = NotFoundAction.IGNORE) +//// @JoinColumn(name = "userId", referencedColumnName = "id") +// @JoinColumn(name = "userId", referencedColumnName = "id") +//// @MapsId("username") +// @MapsId("id") +// private User user; +// + + private Date dating; + +// @OneToOne(cascade= CascadeType.REFRESH,fetch=FetchType.LAZY) +// @NotFound(action = NotFoundAction.IGNORE) +// @MapsId("id") +// @ManyToOne(fetch=FetchType.LAZY) + @OneToOne(fetch=FetchType.LAZY) + @JoinColumn(name="titleId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT))//设置在article表中的关联字段(外键) + @NotFound(action = NotFoundAction.IGNORE) + private Title title; + +// @OneToOne(cascade= CascadeType.REFRESH,fetch=FetchType.LAZY) +// @NotFound(action = NotFoundAction.IGNORE) +// @MapsId("id") +// @ManyToOne(fetch=FetchType.LAZY) + @JsonIgnore + @OneToOne(fetch=FetchType.LAZY) + @JoinColumn(name="merchantId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT))//设置在article表中的关联字段(外键) + @NotFound(action = NotFoundAction.IGNORE) + private Merchant merchant; + + private BigDecimal amount; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Detail )) return false; + return id != null && id.equals(((Detail) o).id); + } + + @Override + public int hashCode() { + return 31; + } +} diff --git a/src/main/java/net/alawn/bill/entity/po/Base.java b/src/main/java/net/alawn/bill/entity/po/EntityId.java similarity index 67% rename from src/main/java/net/alawn/bill/entity/po/Base.java rename to src/main/java/net/alawn/bill/entity/po/EntityId.java index f7a952e..ea55996 100644 --- a/src/main/java/net/alawn/bill/entity/po/Base.java +++ b/src/main/java/net/alawn/bill/entity/po/EntityId.java @@ -1,16 +1,14 @@ package net.alawn.bill.entity.po; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; -import lombok.experimental.Accessors; -import net.alawn.bill.security.AuthUser; -import org.springframework.data.annotation.*; import org.springframework.data.annotation.Version; +import org.springframework.data.annotation.*; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import org.springframework.security.core.context.SecurityContextHolder; -import javax.persistence.*; import javax.persistence.Id; +import javax.persistence.*; import java.io.Serializable; import java.util.Date; @@ -20,15 +18,14 @@ import java.util.Date; @Data @MappedSuperclass -@Accessors(chain = true) @EntityListeners(AuditingEntityListener.class) -public class Base implements Serializable { - - private static final long serialVersionUID = 1L; +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +public class EntityId implements Serializable { + protected static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) - private long id; + protected Long id; // @Temporal(TemporalType.TIMESTAMP) // @CreationTimestamp @@ -61,5 +58,15 @@ public class Base implements Serializable { protected Long version; - +// @Override +// public boolean equals(Object o) { +// if (this == o) return true; +// if (!(o instanceof Detail )) return false; +// return id != null && id.equals(((Detail) o).id); +// } +// +// @Override +// public int hashCode() { +// return 31; +// } } diff --git a/src/main/java/net/alawn/bill/entity/po/Item.java b/src/main/java/net/alawn/bill/entity/po/Item.java index 55028a8..9acb302 100644 --- a/src/main/java/net/alawn/bill/entity/po/Item.java +++ b/src/main/java/net/alawn/bill/entity/po/Item.java @@ -1,9 +1,13 @@ package net.alawn.bill.entity.po; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; -import javax.persistence.Entity; -import javax.persistence.Table; +import javax.persistence.*; import java.math.BigDecimal; import java.util.Date; @@ -15,14 +19,46 @@ import java.util.Date; @Entity @Table(name = "t_bill_items") @Data -@ToString(callSuper = true) +@ToString(exclude = {"book"}) @AllArgsConstructor @NoArgsConstructor @Builder -public class Item extends Base{ - private long bookId; +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +public class Item extends EntityId { + + public Item(Book book) + { this.book = book; } + + /** OK */ + @JsonIgnore + @ManyToOne(fetch= FetchType.LAZY,cascade = CascadeType.MERGE,optional = false) + @JoinColumn(name = "bookId",referencedColumnName = "id",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + private Book book; + + @OneToOne(fetch=FetchType.LAZY) + @JoinColumn(name="titleId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action = NotFoundAction.IGNORE) + private Title title; + + + @OneToOne(fetch=FetchType.LAZY) + @JoinColumn(name="merchantId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action = NotFoundAction.IGNORE) + private Merchant merchant; + private Date dating; - private long titleId; - private long merchantId; private BigDecimal amount; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Item )) return false; + return id != null && id.equals(((Item) o).id); + } + + @Override + public int hashCode() { + return 31; + } } diff --git a/src/main/java/net/alawn/bill/entity/po/Main.java b/src/main/java/net/alawn/bill/entity/po/Main.java new file mode 100644 index 0000000..881a50c --- /dev/null +++ b/src/main/java/net/alawn/bill/entity/po/Main.java @@ -0,0 +1,88 @@ +package net.alawn.bill.entity.po; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.*; +import net.alawn.bill.enums.State; +import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 10:06 2019-05-23 + */ + +@Entity +@Table(name="t_bill_main") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +//@ToString(exclude = {"details"}) +public class Main extends EntityId { + +// @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) +// @OneToOne(fetch=FetchType.LAZY) +// @NotFound(action = NotFoundAction.IGNORE) +// @MapsId("id") + @JsonIgnore + @ManyToOne + @NotFound(action= NotFoundAction.IGNORE) + @JoinColumn(name = "userId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + private User user; + +// @OneToOne(mappedBy="id",cascade=CascadeType.ALL,fetch=FetchType.LAZY) +// @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) +// @NotFound(action = NotFoundAction.IGNORE) +// @MapsId("id") + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "postId",foreignKey = @ForeignKey(name = "none",value = ConstraintMode.NO_CONSTRAINT)) + @NotFound(action= NotFoundAction.IGNORE) + private Post post; + +// @OneToMany( mappedBy = "main", cascade=CascadeType.ALL,fetch=FetchType.LAZY) +// @NotFound(action = NotFoundAction.IGNORE) +// @MapsId("id") + + @OneToMany(cascade=CascadeType.ALL, mappedBy = "main", orphanRemoval = true) +// @OneToMany(cascade=CascadeType.ALL, orphanRemoval = true) +// @JoinColumn(name = "main_id") + @org.hibernate.annotations.ForeignKey(name = "none") + @NotFound(action= NotFoundAction.IGNORE) + private List<Detail> details = new ArrayList<>(); + +// @OneToMany(mappedBy = "user", fetch = FetchType.EAGER) +// private Set<Authority> authorities; + + + @Enumerated(EnumType.STRING) + private State state; + + private Date applyDate; + private Date acceptDate; + + public String toJson() { + return JSON.toJSONString(this.toString()); +// return JSON.toJSONString(this.toString(),true); + } + + public void addDetail(Detail detail) { + detail.setMain(this); + this.details.add(detail); + } + + public void removeDetail(Detail detail) { + detail.setMain(null); + details.remove(detail); + } +} diff --git a/src/main/java/net/alawn/bill/entity/po/Merchant.java b/src/main/java/net/alawn/bill/entity/po/Merchant.java index df7c6de..244bbd6 100644 --- a/src/main/java/net/alawn/bill/entity/po/Merchant.java +++ b/src/main/java/net/alawn/bill/entity/po/Merchant.java @@ -1,5 +1,6 @@ package net.alawn.bill.entity.po; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; import javax.persistence.Entity; @@ -17,7 +18,12 @@ import javax.persistence.Table; @Builder @NoArgsConstructor @AllArgsConstructor -public class Merchant extends Base{ +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +public class Merchant extends EntityId { + public Merchant(long id) { + this.id = id; + } + private String abbr; private String name; } diff --git a/src/main/java/net/alawn/bill/entity/po/Post.java b/src/main/java/net/alawn/bill/entity/po/Post.java index abf83ed..ecdf1cc 100644 --- a/src/main/java/net/alawn/bill/entity/po/Post.java +++ b/src/main/java/net/alawn/bill/entity/po/Post.java @@ -1,9 +1,11 @@ package net.alawn.bill.entity.po; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; +import lombok.experimental.Accessors; +import org.hibernate.annotations.DynamicUpdate; -import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; @@ -17,10 +19,18 @@ import javax.persistence.Table; @Table(name = "t_bill_posts") @Data @ToString(callSuper = true) +@Accessors(chain = true) @Builder @NoArgsConstructor @AllArgsConstructor -public class Post extends Base{ +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +public class Post extends EntityId { + + public Post(long id) { + this.id = id; + } + @JsonIgnore private long userId ; private String address ; diff --git a/src/main/java/net/alawn/bill/entity/po/Title.java b/src/main/java/net/alawn/bill/entity/po/Title.java index 8d88404..fa365ee 100644 --- a/src/main/java/net/alawn/bill/entity/po/Title.java +++ b/src/main/java/net/alawn/bill/entity/po/Title.java @@ -1,6 +1,8 @@ package net.alawn.bill.entity.po; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; +import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; @@ -17,10 +19,15 @@ import javax.persistence.*; @Builder @NoArgsConstructor @AllArgsConstructor -public class Title extends Base{ - +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +public class Title extends EntityId { private String name; private String abbr; @Column(length = 18) private String taxNo; + + public Title(long id) { + this.id = id; + } } diff --git a/src/main/java/net/alawn/bill/entity/po/User.java b/src/main/java/net/alawn/bill/entity/po/User.java index 7f35854..102f453 100644 --- a/src/main/java/net/alawn/bill/entity/po/User.java +++ b/src/main/java/net/alawn/bill/entity/po/User.java @@ -1,18 +1,15 @@ package net.alawn.bill.entity.po; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; +import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; -import java.io.Serializable; import java.util.Date; import java.util.Set; -import java.util.stream.Collectors; /** * @author Alawn @@ -32,7 +29,13 @@ import java.util.stream.Collectors; @AllArgsConstructor @ToString(exclude = {"authorities"}) @Slf4j -public class User extends Base { +@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" },ignoreUnknown = true) +@DynamicUpdate +public class User extends EntityId { + + public User(long id) { + this.id = id; + } /** 用户名称 */ private String username; @@ -62,6 +65,7 @@ public class User extends Base { @Builder.Default private boolean enabled = true; + // public UserDetails toUserDetails() { // log.info("toUserDetails.authorities:" + authorities); // log.info("toUserDetails.authorities:" + mapToGrantedAuthorities(authorities)); diff --git a/src/main/java/net/alawn/bill/entity/vo/BookVO.java b/src/main/java/net/alawn/bill/entity/vo/BookVO.java new file mode 100644 index 0000000..5d23979 --- /dev/null +++ b/src/main/java/net/alawn/bill/entity/vo/BookVO.java @@ -0,0 +1,9 @@ +package net.alawn.bill.entity.vo; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 10:01 2019-05-29 + */ +public class BookVO { +} diff --git a/src/main/java/net/alawn/bill/entity/vo/ItemVO.java b/src/main/java/net/alawn/bill/entity/vo/ItemVO.java new file mode 100644 index 0000000..cf70f1e --- /dev/null +++ b/src/main/java/net/alawn/bill/entity/vo/ItemVO.java @@ -0,0 +1,9 @@ +package net.alawn.bill.entity.vo; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 10:02 2019-05-29 + */ +public class ItemVO { +} diff --git a/src/main/java/net/alawn/bill/repository/BookRepo.java b/src/main/java/net/alawn/bill/repository/BookRepo.java index e4c5b37..83fb744 100644 --- a/src/main/java/net/alawn/bill/repository/BookRepo.java +++ b/src/main/java/net/alawn/bill/repository/BookRepo.java @@ -2,7 +2,12 @@ package net.alawn.bill.repository; import net.alawn.bill.entity.po.Book; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** * @Author: Alawn @@ -10,7 +15,13 @@ import org.springframework.stereotype.Repository; * @Date: Create in 11:14 2019-05-23 */ +@Transactional @Repository public interface BookRepo extends JpaRepository<Book, Long> { + List<Book> findByUserId(long userId); + + @Modifying + @Query(value = "update t_bill_books set total_amount = (select sum(amount) from t_bill_items where book_id = ?1) where id = ?1",nativeQuery = true) + void sumAmount(long bookId); } diff --git a/src/main/java/net/alawn/bill/repository/DetailRepo.java b/src/main/java/net/alawn/bill/repository/DetailRepo.java new file mode 100644 index 0000000..0b10ad1 --- /dev/null +++ b/src/main/java/net/alawn/bill/repository/DetailRepo.java @@ -0,0 +1,17 @@ +package net.alawn.bill.repository; + +import net.alawn.bill.entity.po.Detail; +import net.alawn.bill.entity.po.Main; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 11:14 2019-05-23 + */ + +@Repository +public interface DetailRepo extends JpaRepository<Detail, Long> { + +} diff --git a/src/main/java/net/alawn/bill/repository/ItemRepo.java b/src/main/java/net/alawn/bill/repository/ItemRepo.java index c9a4945..71fab5f 100644 --- a/src/main/java/net/alawn/bill/repository/ItemRepo.java +++ b/src/main/java/net/alawn/bill/repository/ItemRepo.java @@ -4,6 +4,8 @@ import net.alawn.bill.entity.po.Item; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.math.BigDecimal; + /** * @Author: Alawn * @Description: diff --git a/src/main/java/net/alawn/bill/repository/MainRepo.java b/src/main/java/net/alawn/bill/repository/MainRepo.java new file mode 100644 index 0000000..c50879d --- /dev/null +++ b/src/main/java/net/alawn/bill/repository/MainRepo.java @@ -0,0 +1,19 @@ +package net.alawn.bill.repository; + +import net.alawn.bill.entity.po.Main; +import net.alawn.bill.entity.po.Post; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 11:14 2019-05-23 + */ + +@Repository +public interface MainRepo extends JpaRepository<Main, Long> { + List<Main> findByPost(Post post); +} diff --git a/src/main/java/net/alawn/bill/security/AuthUserDetailsServiceImpl.java b/src/main/java/net/alawn/bill/security/AuthUserDetailsServiceImpl.java index c962a4a..cbb0e56 100644 --- a/src/main/java/net/alawn/bill/security/AuthUserDetailsServiceImpl.java +++ b/src/main/java/net/alawn/bill/security/AuthUserDetailsServiceImpl.java @@ -1,5 +1,6 @@ package net.alawn.bill.security; +import lombok.extern.slf4j.Slf4j; import net.alawn.bill.entity.po.User; import net.alawn.bill.repository.UserRepo; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +14,7 @@ import org.springframework.stereotype.Service; * @Description: * @Date: Create in 16:46 2019-05-20 */ +@Slf4j @Service("authUserDetailsService") public class AuthUserDetailsServiceImpl implements UserDetailsService { @@ -24,6 +26,8 @@ public class AuthUserDetailsServiceImpl implements UserDetailsService { User user = userRepo.findByUsername(name); + log.info("loadUserByUsername:" + user); + if (user == null) { throw new UsernameNotFoundException("UsernameNotFoundException"); } else { diff --git a/src/main/java/net/alawn/bill/service/AuthService.java b/src/main/java/net/alawn/bill/service/AuthService.java index 185dc69..38e8f82 100644 --- a/src/main/java/net/alawn/bill/service/AuthService.java +++ b/src/main/java/net/alawn/bill/service/AuthService.java @@ -1,6 +1,6 @@ package net.alawn.bill.service; -import net.alawn.bill.entity.dto.AddUser; +import net.alawn.bill.entity.dto.NewUser; import org.springframework.security.core.AuthenticationException; import org.springframework.web.HttpRequestMethodNotSupportedException; @@ -10,7 +10,7 @@ import org.springframework.web.HttpRequestMethodNotSupportedException; * @Date: Create in 15:58 2019-05-20 */ public interface AuthService { - AddUser register(AddUser userDTO) throws HttpRequestMethodNotSupportedException, AuthenticationException; + NewUser register(NewUser userDTO) throws HttpRequestMethodNotSupportedException, AuthenticationException; String login(String username, String password); String refresh(String oldToken); } diff --git a/src/main/java/net/alawn/bill/service/impl/AuthServiceImpl.java b/src/main/java/net/alawn/bill/service/impl/AuthServiceImpl.java index 76594a2..301c36b 100644 --- a/src/main/java/net/alawn/bill/service/impl/AuthServiceImpl.java +++ b/src/main/java/net/alawn/bill/service/impl/AuthServiceImpl.java @@ -1,6 +1,6 @@ package net.alawn.bill.service.impl; -import net.alawn.bill.entity.dto.AddUser; +import net.alawn.bill.entity.dto.NewUser; import net.alawn.bill.entity.po.Authority; import net.alawn.bill.entity.po.AuthorityId; import net.alawn.bill.entity.po.User; @@ -61,7 +61,7 @@ public class AuthServiceImpl implements AuthService { // } @Override - public AddUser register(AddUser userDTO) throws AuthenticationException { + public NewUser register(NewUser userDTO) throws AuthenticationException { final String username = userDTO.getUsername(); if(userRepo.findByUsername(username) != null) { @@ -110,7 +110,7 @@ public class AuthServiceImpl implements AuthService { return null; } - private void authenticateUser(AddUser userDTO) { + private void authenticateUser(NewUser userDTO) { UsernamePasswordAuthenticationToken upToken = new UsernamePasswordAuthenticationToken(userDTO.getUsername(), userDTO.getPassword()); // 进行安全认证 final Authentication authentication = authenticationManager.authenticate(upToken); diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..9e5521c --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<configuration> + + <jmxConfigurator /> + <property name="logBase" value="/tmp/logs"/> + <property name="appName" value="bill"/> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <layout class="ch.qos.logback.classic.PatternLayout"> + <pattern>%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %yellow([%X{TRACE_ID}]) %highlight(%-5level) %boldMagenta(%logger{36}) [%line] - %cyan(%msg%n)</pattern> + </layout> + </appender> + + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logBase}/${appName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${logBase}/${appName}-%d{yyyy-MM-dd}.log.%i</fileNamePattern> + <MaxHistory>30</MaxHistory> + <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <MaxFileSize>100MB</MaxFileSize> + </TimeBasedFileNamingAndTriggeringPolicy> + </rollingPolicy> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TRACE_ID}] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <appender name="FILE-error" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logBase}/${appName}.err</file> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>ERROR</level> + </filter> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${logBase}/${appName}-error-%d{yyyy-MM-dd}.log.%i</fileNamePattern> + <MaxHistory>30</MaxHistory> + <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <MaxFileSize>50MB</MaxFileSize> + </TimeBasedFileNamingAndTriggeringPolicy> + </rollingPolicy> + <encoder> + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TRACE_ID}] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <appender name="druid" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <File>${logBase}/${appName}-druid.log</File> + <encoder> + <pattern>%d [%level] [%thread] %logger{15}:%line %msg%n</pattern> + </encoder> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>DEBUG</level> + </filter> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${logBase}/${appName}-druid.log.%d{yyyy-MM-dd}</fileNamePattern> + <maxHistory>30</maxHistory> + </rollingPolicy> + </appender> + + <appender name="druid-queue" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>512</queueSize> + <appender-ref ref="druid"/> + </appender> + <logger name="druid.sql.DataSource" level="WARN" additivity="false"> + <appender-ref ref="druid-queue"/> + </logger> + <logger name="druid.sql.Connection" level="WARN" additivity="false"> + <appender-ref ref="druid-queue"/> + </logger> + <logger name="druid.sql.Statement" level="DEBUG" additivity="false"> + <appender-ref ref="druid-queue"/> + </logger> + + <root level="INFO"> + <appender-ref ref="STDOUT" /> + <appender-ref ref="FILE" /> + <appender-ref ref="FILE-error" /> + </root> +</configuration> + diff --git a/src/main/vue/bill/src/api/basic.js b/src/main/vue/bill/src/api/basic.js index e47d61b..91a69ec 100644 --- a/src/main/vue/bill/src/api/basic.js +++ b/src/main/vue/bill/src/api/basic.js @@ -53,7 +53,7 @@ export const getPost = (id) => { export const newBill = (bill) => { return HttpRequest.request({ - url: 'bills/', + url: 'bill/books', method: 'post', data: bill }) diff --git a/src/main/vue/bill/src/router/index.js b/src/main/vue/bill/src/router/index.js index caf6d9c..e62f448 100644 --- a/src/main/vue/bill/src/router/index.js +++ b/src/main/vue/bill/src/router/index.js @@ -25,6 +25,11 @@ export default new Router({ path: '/bill', name: 'Bill', component: () => import(/* webpackChunkName: "merchant" */ '../views/Bill.vue') + }, + { + path: '/gird', + name: 'Gird', + component: () => import(/* webpackChunkName: "merchant" */ '../views/Gird.vue') } ] }) diff --git a/src/main/vue/bill/src/views/Bill.vue b/src/main/vue/bill/src/views/Bill.vue index d828d3e..fe9ff7d 100644 --- a/src/main/vue/bill/src/views/Bill.vue +++ b/src/main/vue/bill/src/views/Bill.vue @@ -288,7 +288,7 @@ <script> import { - addPost, + newPost, fetchPosts, getPost, fetchTitles, @@ -411,13 +411,36 @@ export default { }, onSubmit(formName) { this.$refs[formName].validate(valid => { + var _this = this; if (valid) { console.info("bill:" + JSON.stringify(this.bill)); - newBill(this.bill).then(function(response) { + newBill(this.bill).then(response=> { + this.$message({ message: "提交成功", type: "success" }); + // this.disabled = true; console.info("response:" + response); + }) + .catch(function(error) { + if (error.response) { + // The request was made and the server responded with a status code + // that falls out of the range of 2xx + _this.$message({ message: 'status:' + error.response.status + ',message:' + error.response.data.message, type: 'error' }); + console.log(error.response.data); + console.log(error.response.status); + console.log(error.response.headers); + } else if (error.request) { + // The request was made but no response was received + // `error.request` is an instance of XMLHttpRequest in the browser and an instance of + // http.ClientRequest in node.js + // _this.$message.error(error.request); + console.log(error.request); + _this.$message.error('未知错误'); + } else { + // Something happened in setting up the request that triggered an Error + console.log("Error", error.message); + _this.$message.error(error.response.message); + } + console.log(error.config); }); - this.disabled = true; - this.$message({ message: "提交成功", type: "success" }); } else { console.log("error submit!!"); return false; diff --git a/src/main/vue/bill/src/views/Gird.vue b/src/main/vue/bill/src/views/Gird.vue index 115f5b6..ddbab0f 100644 --- a/src/main/vue/bill/src/views/Gird.vue +++ b/src/main/vue/bill/src/views/Gird.vue @@ -1,202 +1,49 @@ <template> <div class="main"> - <div class="group"> - <!-- <el-form ref="form" :model="form" :rules="rules" label-width="80px"> --> - <!-- <el-form ref="form" :model="form" label-width="800px"> --> - <el-form ref="billForm" :model="bill" :rules="rules" label-width="80px"> - <el-form-item label="邮寄地址" prop="postContact"> - <!--邮寄地址--> - <el-autocomplete - class="posts" - popper-class="my-autocomplete" - v-model="bill.postContact" - :fetch-suggestions="querySearchAsyncPosts" - placeholder="请输选择邮寄地址" - @select="handleSelectPosts" :disabled="disabled"> - <i class="el-icon-edit el-input__icon" slot="suffix" @click="handleIconClickPosts"></i> - <template slot-scope="{ item }"> - <div class="name">{{ item.contact }}</div> - <span class="subtitle">{{ item.address }}</span> - <span class="subtitle">;</span> - <span class="subtitle">{{ item.mobile }}</span> - <span class="subtitle">;</span> - </template> - </el-autocomplete> - </el-form-item> - - <div class="gTable"> - <!--增删改查--> - <!--明细--> - <!-- <el-form-item label="明细" prop="username"> --> - <!--分割线--> - <!-- <span><el-divider></el-divider></span> --> - <el-table :data="bill.billItems" height="400px" style="width: 100%"> - <el-table-column prop="dating" label="日期" width="100" ></el-table-column> - <el-table-column prop="titleAbbr" label="抬头" width="150"> - <template slot-scope="scope"> - <el-popover trigger="hover" placement="top"> - <p>税号: {{ scope.row.taxNo }}</p> - <p>抬头: {{ scope.row.titleName }}</p> - <div slot="reference" class="name-wrapper"> - <el-tag size="medium">{{ scope.row.titleAbbr }}</el-tag> - </div> - </el-popover> - </template> - </el-table-column> - <el-table-column prop="merchantAbbr" label="餐饮商户" width="150" ></el-table-column> - <el-table-column prop="amount" label="金额" width="80" ></el-table-column> - <el-table-column align="right" > - <template slot="header" slot-scope="scope"> - <!-- <el-button class="itemBtn" type="primary" size="medium" @click="clearFocusRow();isAddShow = true;resetForm('addForm');" :disabled="disabled">添加</el-button> --> - <el-button class="itemBtn" type="primary" size="small" @click="clearFocusRow();isAddShow = true;resetForm('addForm');" :disabled="disabled">添加</el-button> - </template> - <template slot-scope="scope"> - <el-button-group> - <!-- type="success" --> - <el-button - size="mini" - icon="el-icon-edit" - @click="handleEdit(scope.$index, scope.row)" :disabled="disabled">编辑</el-button> - <!-- type="danger" --> - <el-button - size="mini" - icon="el-icon-delete" - @click.native.prevent="handleDelete(scope.$index,bill.billItems)" :disabled="disabled">删除</el-button> - </el-button-group> - </template> - </el-table-column> - </el-table> - <!-- </el-form-item> --> - </div> - <el-form-item label-width="2px"> - <el-button class="submit" type="primary" @click="onSubmit('billForm')" :disabled="disabled">提交</el-button> - </el-form-item> - </el-form> + <div class="gTable"> + <el-table :data="book" height="400px" style="width: 100%"> + <el-table-column prop="applyDate" label="申请日期" width="150"></el-table-column> + <el-table-column prop="totalAmount" label="总金额" width="100"></el-table-column> + <el-table-column prop="post.contact" label="快递地址" width="100"> + <template slot-scope="scope"> + <el-popover trigger="hover" placement="right"> + <p>手机: {{ scope.row.post.mobile }}</p> + <p>地址: {{ scope.row.post.address }}</p> + <div slot="reference" class="name-wrapper"> + <el-tag size="medium">{{ scope.row.post.contact }}</el-tag> + </div> + </el-popover> + </template> + </el-table-column> + <!-- <el-table-column prop="titleAbbr" label="抬头" width="150"> + <template slot-scope="scope"> + <el-popover trigger="hover" placement="top"> + <p>税号: {{ scope.row.taxNo }}</p> + <p>抬头: {{ scope.row.titleName }}</p> + <div slot="reference" class="name-wrapper"> + <el-tag size="medium">{{ scope.row.titleAbbr }}</el-tag> + </div> + </el-popover> + </template> + </el-table-column>--> + <!-- <el-table-column prop="amount" label="金额" width="80"></el-table-column> --> + </el-table> + <!-- </el-form-item> --> </div> - - <!--增加--> - <div width="600px"> - <el-dialog title="增加" :visible.sync="isAddShow" width="700px" > - <el-form ref="addForm" :model="focusRow" :rules="rules" label-width="80px"> - <el-row> - <el-col :span="24"> - <!--抬头--> - <el-form-item label="抬头简称" prop="titleAbbr"> - <el-autocomplete class="titles" popper-class="my-autocomplete" v-model="focusRow.titleAbbr" :fetch-suggestions="querySearchAsyncTitles" placeholder="请输选择抬头" @select="handleSelectTitles" > - <i class="el-icon-edit el-input__icon" slot="suffix" @click="handleIconClickTitles" ></i> - <template slot-scope="{ item }"> - <div class="name">{{ item.abbr }}</div> - <span class="subtitle">{{ item.name }}</span> - <span class="subtitle">{{ item.taxNo }}</span> - </template> - </el-autocomplete> - </el-form-item> - </el-col> - </el-row> - <!--商户--> - <el-row> - <el-col :span="24"> - <el-form-item label="开票商家" prop="merchantAbbr"> - <el-autocomplete class="merchants" v-model="focusRow.merchantAbbr" :fetch-suggestions="querySearchAsyncMerchant" placeholder="请选择餐饮商户" @select="handleSelectMerchant"> - <i class="el-icon-edit el-input__icon" slot="suffix" @click="handleIconClickTitles" ></i> - <template slot-scope="{ item }"> - <div class="name">{{ item.abbr }}</div> - <span class="subtitle">{{ item.name }}</span> - </template> - </el-autocomplete> - </el-form-item> - </el-col> - </el-row> - - <!--日期 & 金额--> - <el-row> - <el-col :span="12"> - <!--开票日期--> - <el-form-item label="开票日期" prop="dating"> - <el-date-picker type="date" placeholder="选择日期" v-model="focusRow.dating" style="width: 100%;" value-format="yyyy-MM-dd"> </el-date-picker> - </el-form-item> - </el-col> - <el-col :span="1"> - <!--金额--> - <el-form-item label="开票金额" prop="amount"> - <el-input-number v-model="focusRow.amount" :precision="2" :step="100" controls-position="right" :min="0" :max="5000"></el-input-number> - </el-form-item> - </el-col> - </el-row> - </el-form> - <div slot="footer" class="dialog-footer"> - <el-button type="primary" @click="addItem('addForm')" :disabled="disabled">确 定</el-button> - <el-button @click="resetForm('addForm')">重置</el-button> - </div> - </el-dialog> - </div> - - <!--编辑--> - <div width="600px"> - <el-dialog title="编辑" :visible.sync="isEditShow" width="700px" > - <el-form ref="editForm" :model="focusRow" :rules="rules" label-width="80px"> - <el-row> - <el-col :span="24"> - <!--抬头--> - <el-form-item label="抬头简称" prop="titleAbbr"> - <el-autocomplete class="titles" popper-class="my-autocomplete" v-model="focusRow.titleAbbr" :fetch-suggestions="querySearchAsyncTitles" placeholder="请输选择抬头" @select="handleSelectTitles" > - <i class="el-icon-edit el-input__icon" slot="suffix" @click="handleIconClickTitles" ></i> - <template slot-scope="{ item }"> - <div class="name">{{ item.abbr }}</div> - <span class="subtitle">{{ item.name }}</span> - <span class="subtitle">{{ item.taxNo }}</span> - </template> - </el-autocomplete> - </el-form-item> - </el-col> - </el-row> - <!--商户--> - <el-row> - <el-col :span="24"> - <el-form-item label="开票商家" prop="merchantAbbr"> - <el-autocomplete class="merchants" v-model="focusRow.merchantAbbr" :fetch-suggestions="querySearchAsyncMerchant" placeholder="请选择餐饮商户" @select="handleSelectMerchant"> - <i class="el-icon-edit el-input__icon" slot="suffix" @click="handleIconClickTitles" ></i> - <template slot-scope="{ item }"> - <div class="name">{{ item.abbr }}</div> - <span class="subtitle">{{ item.name }}</span> - </template> - </el-autocomplete> - </el-form-item> - </el-col> - </el-row> - - <!--日期 & 金额--> - <el-row> - <el-col :span="12"> - <!--开票日期--> - <el-form-item label="开票日期" prop="dating"> - <el-date-picker type="date" placeholder="选择日期" v-model="focusRow.dating" style="width: 100%;" value-format="yyyy-MM-dd"> </el-date-picker> - </el-form-item> - </el-col> - <el-col :span="1"> - <!--金额--> - <el-form-item label="开票金额" prop="amount"> - <el-input-number v-model="focusRow.amount" :precision="2" :step="100" controls-position="right" :min="0" :max="5000"></el-input-number> - </el-form-item> - </el-col> - </el-row> - </el-form> - <div slot="footer" class="dialog-footer"> - <el-button type="primary" @click="updateItem('editForm')" :disabled="disabled">确 定</el-button> - <!-- <el-button type="primary" @click="updateItem()" >确 定</el-button> --> - <el-button @click="resetForm('editForm')">重置</el-button> - </div> - </el-dialog> - </div> - </div> </template> - <script> -import { addPost, fetchPosts, getPost, fetchTitles, fetchMerchants, newBill } from "../api/basic.js"; +import { + newPost, + fetchPosts, + getPost, + fetchTitles, + fetchMerchants, + newBill +} from "../api/basic.js"; export default { - name: "Bill", + name: "Gird", data() { return { isAddShow: false, @@ -209,38 +56,71 @@ export default { disabled: false, // focusRow: { index: null,dating: "2019-05-28", titleId: null, titleAbbr: "上海沐融",titleName:"",taxNo:"",merchantId: null, merchantAbbr: "华容月",amount: 0.0 }, focusRow: {}, - bill: { - postId: "", - // postAddress: "", - postContact : "", - // postMobile : "", - postId: "", - // postAddress: "", - billItems: [ - // { dating: "2019-05-28", titleId: null, titleAbbr: "上海沐融",titleName:"",taxNo: "" ,merchantId: null, merchantAbbr: "华容月",amount: 0.0 }, - // { dating: "2019-05-28", titleId: null, titleAbbr: "上海沐融",titleName:"",taxNo: "" ,merchantId: null, merchantAbbr: "华容月",amount: 0.0 }, - // { dating: "2019-05-28", titleId: null, titleAbbr: "上海沐融",merchantId: null, merchantAbbr: "华容月",amount: 0.0 }, - // { dating: "2019-05-28", titleId: null, titleAbbr: "上海沐融",merchantId: null, merchantAbbr: "华容月",amount: 0.0 }, - // { dating: "2019-05-28", titleId: null, titleAbbr: "上海沐融",merchantId: null, merchantAbbr: "华容月",amount: 0.0 }, - ], - }, + book: [ + { + id: 592, + post: { + id: 32, + address: "世博馆路52号鲁能国际B座11楼", + contact: "赵磊", + mobile: "18017581610" + }, + items: [ + { + id: 593, + title: { + id: 25, + name: "北京沐融信息科技股份有限公司", + abbr: "沐融北京总公司", + taxNo: "91110108071711408C" + }, + merchant: { + id: 22, + abbr: "汇京粹", + name: "汇京粹(上海)餐饮管理有限公司" + }, + dating: "2019-05-07T00:00:00.000+0000", + amount: 500.0 + }, + { + id: 594, + title: { + id: 24, + name: "北京沐融信息科技股份有限公司上海分公司", + abbr: "沐融上海分公司", + taxNo: "91310107MA1G07F91W" + }, + merchant: { + id: 23, + abbr: "花蓉月", + name: "上海花蓉月餐饮有限公司" + }, + dating: "2019-05-16T00:00:00.000+0000", + amount: 200.0 + } + ], + state: "APPLIED", + applyDate: "2019-05-30T13:02:11.000+0000", + acceptDate: null, + totalAmount: 700.0 + } + ], + rules: { postContact: [ - { required: true, message: "请选择邮寄地址",trigger: "change"}, + { required: true, message: "请选择邮寄地址", trigger: "change" } // { min: 3, max: 15, message: "长度在 3 到 15 个字符", trigger: "blur" } ], merchantAbbr: [ - { required: true, message: "请选择餐饮商户", trigger: "change"}, + { required: true, message: "请选择餐饮商户", trigger: "change" } ], titleAbbr: [ - { required: true, message: "请选择抬头", trigger: "change" }, - ], - dating: [ - { required: true, message: "选择日期", trigger: "blur" }, + { required: true, message: "请选择抬头", trigger: "change" } ], + dating: [{ required: true, message: "选择日期", trigger: "blur" }], amount: [ { required: true, message: "请输入金额", trigger: "blur" }, - { type: 'number', message: '金额必须为数字值'} + { type: "number", message: "金额必须为数字值" } ] } }; @@ -254,42 +134,50 @@ export default { /** 在表格中添加明细 */ addItem(formName) { var oriForm = formName; - this.$refs[formName].validate((valid) => { - if (valid) { - console.info('addItem'); - console.info('focusRow:' + JSON.stringify(this.focusRow)); - console.info('this.bill.billItems:' + JSON.stringify(this.bill.billItems)); - this.bill.billItems.splice(0,0,this.focusRow); - console.info('this.bill.billItems:' + JSON.stringify(this.bill.billItems)); - this.clearFocusRow(); - console.info('focusRow:' + JSON.stringify(this.focusRow)); - this.isAddShow = false; - // this.resetForm(oriForm); - } else { - console.log('error submit!!'); - return false; - } - }); + this.$refs[formName].validate(valid => { + if (valid) { + console.info("addItem"); + console.info("focusRow:" + JSON.stringify(this.focusRow)); + console.info( + "this.bill.newItems:" + JSON.stringify(this.bill.newItems) + ); + this.bill.newItems.splice(0, 0, this.focusRow); + console.info( + "this.bill.newItems:" + JSON.stringify(this.bill.newItems) + ); + this.clearFocusRow(); + console.info("focusRow:" + JSON.stringify(this.focusRow)); + this.isAddShow = false; + // this.resetForm(oriForm); + } else { + console.log("error submit!!"); + return false; + } + }); }, /** 在表格中添加明细 */ updateItem(formName) { - this.$refs[formName].validate((valid) => { - if (valid) { - console.info('index:' + index); - console.info('updateItem'); - console.info('focusRow:' + JSON.stringify(this.focusRow)); - console.info('this.bill.billItems:' + JSON.stringify(this.bill.billItems)); - var index = this.focusRow.index; - this.bill.billItems.splice(index,1,this.focusRow); - console.info('this.bill.billItems:' + JSON.stringify(this.bill.billItems)); - this.clearFocusRow(); - console.info('focusRow:' + JSON.stringify(this.focusRow)); - this.isEditShow = false; - } else { - console.log('error submit!!'); - return false; - } - }); + this.$refs[formName].validate(valid => { + if (valid) { + console.info("index:" + index); + console.info("updateItem"); + console.info("focusRow:" + JSON.stringify(this.focusRow)); + console.info( + "this.bill.newItems:" + JSON.stringify(this.bill.newItems) + ); + var index = this.focusRow.index; + this.bill.newItems.splice(index, 1, this.focusRow); + console.info( + "this.bill.newItems:" + JSON.stringify(this.bill.newItems) + ); + this.clearFocusRow(); + console.info("focusRow:" + JSON.stringify(this.focusRow)); + this.isEditShow = false; + } else { + console.log("error submit!!"); + return false; + } + }); }, /** 表格-编辑一行 */ handleEdit(index, row) { @@ -303,19 +191,19 @@ export default { row.splice(index, 1); }, onSubmit(formName) { - this.$refs[formName].validate((valid) => { - if (valid) { - console.info("bill:" + JSON.stringify(this.bill)); - newBill(this.bill).then(function(response){ - console.info("response:" + response) - }) - this.disabled = true; - this.$message({ message: "提交成功", type: "success" }); - } else { - console.log('error submit!!'); - return false; - } - }); + this.$refs[formName].validate(valid => { + if (valid) { + console.info("bill:" + JSON.stringify(this.bill)); + newBill(this.bill).then(function(response) { + console.info("response:" + response); + }); + this.disabled = true; + this.$message({ message: "提交成功", type: "success" }); + } else { + console.log("error submit!!"); + return false; + } + }); }, reset(formName) { // this.$refs[formName].resetFields(); @@ -331,14 +219,14 @@ export default { /** AutoComplete Posts 处理*/ querySearchAsyncPosts(queryString, cb) { var list = [{}]; - fetchPosts().then(function(response){ - for(let i of response.data){ - i.value = i.contact; //将想要展示的数据作为value - // i.value = i.contact; //将想要展示的数据作为value + fetchPosts().then(function(response) { + for (let i of response.data) { + i.value = i.contact; //将想要展示的数据作为value + // i.value = i.contact; //将想要展示的数据作为value } list = response.data; cb(list); - }) + }); // var posts = this.posts; // console.error("posts:" + posts); @@ -354,12 +242,12 @@ export default { }; }, loadPosts() { - console.error('loadPosts'); + console.error("loadPosts"); }, handleSelectPosts(item) { this.bill.postId = item.id; - console.log('postId:' + this.bill.postId ); - console.log('postContact:' + this.bill.postContact ); + console.log("postId:" + this.bill.postId); + console.log("postContact:" + this.bill.postContact); }, handleIconClickPosts(ev) { console.log(ev); @@ -368,14 +256,14 @@ export default { /** AutoComplete Titles 处理*/ querySearchAsyncTitles(queryString, cb) { var list = [{}]; - fetchTitles().then(function(response){ - console.info(response) - for(let i of response.data){ - i.value = i.abbr; // 将想要展示的数据作为value + fetchTitles().then(function(response) { + console.info(response); + for (let i of response.data) { + i.value = i.abbr; // 将想要展示的数据作为value } list = response.data; cb(list); - }) + }); }, createFilterTitles(queryString) { return titles => { @@ -385,15 +273,15 @@ export default { }; }, loadTitles() { - console.error('loadTitles'); + console.error("loadTitles"); }, handleSelectTitles(item) { this.focusRow.titleId = item.id; this.focusRow.titleName = item.name; this.focusRow.taxNo = item.taxNo; - console.log('titleId:' + this.focusRow.titleId ); - console.log('titleAbbr:' + this.focusRow.titleAbbr ); - console.log('titleName:' + this.focusRow.titleName ); + console.log("titleId:" + this.focusRow.titleId); + console.log("titleAbbr:" + this.focusRow.titleAbbr); + console.log("titleName:" + this.focusRow.titleName); }, handleIconClickTitles(ev) { console.log(ev); @@ -401,39 +289,40 @@ export default { /** AutoComplete Merchant 处理*/ querySearchAsyncMerchant(queryString, cb) { var list = [{}]; - fetchMerchants().then(function(response){ - for(let i of response.data){ - i.value = i.abbr; // 将想要展示的数据作为value + fetchMerchants().then(function(response) { + for (let i of response.data) { + i.value = i.abbr; // 将想要展示的数据作为value } list = response.data; cb(list); - }) + }); }, createFilterMerchant(queryString) { return merchants => { return ( - merchants.contact.toLowerCase().indexOf(queryString.toLowerCase()) === 0 + merchants.contact.toLowerCase().indexOf(queryString.toLowerCase()) === + 0 ); }; }, handleSelectMerchant(item) { this.focusRow.merchantId = item.id; this.focusRow.merchantsAbbr = item.abbr; - console.log('merchantId:' + this.focusRow.merchantId ); - console.log('merchantsAbbr:' + this.focusRow.merchantsAbbr ); - console.log('merchantsName:' + item.name ); + console.log("merchantId:" + this.focusRow.merchantId); + console.log("merchantsAbbr:" + this.focusRow.merchantsAbbr); + console.log("merchantsName:" + item.name); }, handleIconClickMerchant(ev) { console.log(ev); }, loadMerchant() { - console.error('loadTitles'); + console.error("loadTitles"); }, /** 清理当前缓存 */ clearFocusRow() { - this.focusRow = {} - console.info('clearFocusRow'); - }, + this.focusRow = {}; + console.info("clearFocusRow"); + } }, mounted() { // this.posts = this.loadPosts(); @@ -444,7 +333,7 @@ export default { <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> -.subtitle{ +.subtitle { font-size: 12px; color: #b4b4b4; } @@ -464,10 +353,10 @@ a { color: #42b983; } -.el-form-item{ +.el-form-item { /* width: 200px; */ /* margin: 10px; */ - float:inherit ; + float: inherit; padding: 20px; } .group { @@ -487,7 +376,7 @@ a { right: 0; bottom: 0; } -.gTable{ +.gTable { /* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */ /* box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04); */ text-align: left; @@ -506,7 +395,7 @@ a { } .itemBtn { width: 100px; - float:right; + float: right; } .el-form { /* box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04); */ @@ -519,7 +408,9 @@ a { text-align: left; /* width: 800px; */ } -.posts,.titles,.merchants{ +.posts, +.titles, +.merchants { width: 487px; } .el-form-item { diff --git a/src/main/vue/bill/src/views/Login.vue b/src/main/vue/bill/src/views/Login.vue index b9ede1c..42cb524 100644 --- a/src/main/vue/bill/src/views/Login.vue +++ b/src/main/vue/bill/src/views/Login.vue @@ -50,8 +50,11 @@ export default { var token = "Bearer " + res.data.token; console.log("token:" + token); window.localStorage.setItem("token", token); + this.disabled = true; this.$message({ message: "登录成功", type: "success" }); + this.$router.push({ path: 'Bill' }) + }) .catch(function(error) { // _this.$message({ message: error.response.statusText, type: 'error' }); diff --git a/src/main/vue/bill/src/views/Merchant.vue b/src/main/vue/bill/src/views/Merchant.vue index 93b5a27..0d029d0 100644 --- a/src/main/vue/bill/src/views/Merchant.vue +++ b/src/main/vue/bill/src/views/Merchant.vue @@ -20,7 +20,7 @@ </template> <script> -import { addMerchant, fetchMerchants, getMerchant } from "../api/basic.js"; +import { newMerchant, fetchMerchants, getMerchant } from "../api/basic.js"; export default { name: "Merchant", data() { @@ -36,7 +36,7 @@ export default { console.log("submit!"); console.log("merc:" + this.merc.name); // MerchantAddAction(JSON.stringify(this.merc)) - addMerchant(this.merc).then(res => { + newMerchant(this.merc).then(res => { var merchantId = res.data.id; console.log("res.data.code" + res.data.code); this.$message({ message: "恭喜你,这是一条成功消息", type: "success" });