From c82f0705e61d67d268d3d65b4ebe328a4a826bc1 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Fri, 3 Nov 2023 11:58:42 +0800 Subject: [PATCH 01/17] add merchant Repository, paging logic, fix html, update mapper, --- springWarehouse/data/merchant_sample.csv | 12 ++ springWarehouse/pom.xml | 5 + springWarehouse/sql/ddl/order.sql | 8 +- ...ication.java => WarehouseApplication.java} | 6 +- .../yen/springWarehouse/bean/Merchant.java | 9 +- .../controller/MerchantController.java | 85 +++++++--- .../controller/ProductController.java | 3 - .../mapper/MerchantMapper.java | 2 + .../springWarehouse/mapper/merchantMapper.xml | 11 +- .../repository/MerchantRepository.java | 9 + .../service/MerchantService.java | 3 + .../service/impl/MerchantServiceImpl.java | 5 + .../src/main/resources/templates/main.html | 2 +- .../templates/merchant/list_merchant.html | 159 ++++++------------ ...ts.java => WarehouseApplicationTests.java} | 2 +- 15 files changed, 171 insertions(+), 150 deletions(-) rename springWarehouse/src/main/java/com/yen/springWarehouse/{SpringWarehouseApplication.java => WarehouseApplication.java} (69%) create mode 100644 springWarehouse/src/main/java/com/yen/springWarehouse/repository/MerchantRepository.java rename springWarehouse/src/test/java/com/yen/springWarehouse/{SpringWarehouseApplicationTests.java => WarehouseApplicationTests.java} (96%) diff --git a/springWarehouse/data/merchant_sample.csv b/springWarehouse/data/merchant_sample.csv index 9c35ac684..a3102ee19 100644 --- a/springWarehouse/data/merchant_sample.csv +++ b/springWarehouse/data/merchant_sample.csv @@ -1,4 +1,16 @@ name,city,type,status merchant-1,taipei,normal,0 merchant-2,sapporo,normal,0 +merchant-3,kushiro,normal,0 +merchant-1,taipei,normal,0 +merchant-2,sapporo,normal,0 +merchant-3,kushiro,normal,0 +merchant-1,taipei,normal,0 +merchant-2,sapporo,normal,0 +merchant-3,kushiro,normal,0 +merchant-1,taipei,normal,0 +merchant-2,sapporo,normal,0 +merchant-3,kushiro,normal,0 +merchant-1,taipei,normal,0 +merchant-2,sapporo,normal,0 merchant-3,kushiro,normal,0 \ No newline at end of file diff --git a/springWarehouse/pom.xml b/springWarehouse/pom.xml index 3ba22b720..23f8f4be3 100644 --- a/springWarehouse/pom.xml +++ b/springWarehouse/pom.xml @@ -164,6 +164,11 @@ 1.7.0 + + org.springframework.boot + spring-boot-starter-data-jpa + + diff --git a/springWarehouse/sql/ddl/order.sql b/springWarehouse/sql/ddl/order.sql index a4003ce95..543f33058 100644 --- a/springWarehouse/sql/ddl/order.sql +++ b/springWarehouse/sql/ddl/order.sql @@ -16,6 +16,10 @@ CREATE TABLE IF NOT EXISTS orders ( INSERT INTO orders(id, merchant_id, product_id, amount, status, create_time, update_time) VALUES -("213ac245-7a2a-453b-a4a7-149426b13f84", 1, 1, 1, "completed", now(), now()), -("d42b3224-b715-46af-9294-3b2ecc6ccc7a", 2, 2, 1, "cancelled", now(), now()), +("213ac24efgefdf84", 1, 1, 1, "completed", now(), now()), +("d42b3224-b715-4gfgf-3b2eccc7a", 2, 2, 1, "cancelled", now(), now()), +("d42b322;;4-b715-4gfgf-3b2eccc7a", 2, 2, 1, "cancelled", now(), now()), +("-b715-4gfg;;f-3b2eccc7a", 2, 2, 1, "cancelled", now(), now()), +("-b715-4gfgf-", 2, 2, 1, "cancelled", now(), now()), +("d42b3224--4gfgf-3b2eccc7a", 2, 2, 1, "cancelled", now(), now()), (uuid(), 1, 3, 1, "pending", now(), now()); \ No newline at end of file diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/SpringWarehouseApplication.java b/springWarehouse/src/main/java/com/yen/springWarehouse/WarehouseApplication.java similarity index 69% rename from springWarehouse/src/main/java/com/yen/springWarehouse/SpringWarehouseApplication.java rename to springWarehouse/src/main/java/com/yen/springWarehouse/WarehouseApplication.java index 648672beb..50b5fb5b7 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/SpringWarehouseApplication.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/WarehouseApplication.java @@ -3,17 +3,19 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; @ComponentScan(basePackages = "com.yen.springWarehouse") @org.mybatis.spring.annotation.MapperScan("com.yen.springWarehouse.mapper") +@EnableJpaRepositories(basePackages = "com.yen.springWarehouse.repository") @EnableTransactionManagement // TODO : recheck this @SpringBootApplication -public class SpringWarehouseApplication { +public class WarehouseApplication { public static void main(String[] args) { - SpringApplication.run(SpringWarehouseApplication.class, args); + SpringApplication.run(WarehouseApplication.class, args); } } diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/bean/Merchant.java b/springWarehouse/src/main/java/com/yen/springWarehouse/bean/Merchant.java index 1c1bb78de..b41debd71 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/bean/Merchant.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/bean/Merchant.java @@ -8,17 +8,22 @@ import lombok.Data; import lombok.NoArgsConstructor; +import javax.persistence.*; import java.io.Serializable; @Data +@Entity @AllArgsConstructor @NoArgsConstructor -@TableName("merchant") +//@TableName("merchant") +@Table(name="merchant") public class Merchant implements Serializable { private static final long serialVersionUID = 234345356533250815L; - @TableId(type = IdType.AUTO) + @Id + @GeneratedValue(strategy= GenerationType.IDENTITY) + //@TableId(type = IdType.AUTO) private int id; @TableField("name") diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java index c24e00731..57c7c1197 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java @@ -1,21 +1,27 @@ package com.yen.springWarehouse.controller; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.pagehelper.PageInfo; import com.yen.springWarehouse.bean.Merchant; import com.yen.springWarehouse.bean.ProductType; +import com.yen.springWarehouse.repository.MerchantRepository; import com.yen.springWarehouse.service.MerchantService; import com.yen.springWarehouse.util.csvUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedReader; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -25,9 +31,14 @@ @RequestMapping("/merchant") public class MerchantController { + private final int PAGINATIONSIZE = 3; + @Autowired MerchantService merchantService; + @Autowired + MerchantRepository merchantRepository; + @GetMapping("/toInput") public String input(Map map) { @@ -78,30 +89,52 @@ public String createBatch(@RequestParam("file") MultipartFile file, Map map, @RequestParam(value="pageNo", required=false, defaultValue="1") String pageNoStr) { + public String list(Map map, + @RequestParam(value = "pageNo", required = false, defaultValue = "0") int pageNum, + @RequestParam(value="pageSize", defaultValue = "0" + PAGINATIONSIZE) int pageSize) { + + log.info("pageNum = {}", pageNum); + +// Page page = new Page<>(pageNum, PAGINATIONSIZE); +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// IPage iPage = merchantService.page(page, +// new LambdaQueryWrapper() +// .orderByAsc(Merchant::getId) +// ); +// log.info("iPage.total = {}, iPage.getPages = {} iPage = {}", iPage.getTotal(), iPage.getPages(), iPage); +// map.put("page", iPage); + + + Pageable pageRequest = PageRequest.of(pageNum, pageSize, Sort.by(Sort.Direction.DESC, "id")); + Page postsPage = merchantRepository.findAll(pageRequest); //merchantService //postRepository.findAll(pageRequest); + List merchants = postsPage.toList(); + log.info(">>> merchants length = {}", merchants.toArray().length); + PageInfo pageInfo = null; + //為了程式的嚴謹性,判斷非空: + if(pageNum <= 0){ + pageNum = 0; + } + log.info("當前頁是:"+pageNum+"顯示條數是:"+pageSize); + //1.引入分頁外掛,pageNum是第幾頁,pageSize是每頁顯示多少條,預設查詢總數count + PageHelper.startPage(pageNum, pageSize); + //2.緊跟的查詢就是一個分頁查詢-必須緊跟.後面的其他查詢不會被分頁,除非再次呼叫PageHelper.startPage + try { + //Page postList = postRepository.findAll(pageRequest);//service查詢所有的資料的介面 + List merchantList = merchantService.getAllMerchant();//service查詢所有的資料的介面 + log.info(">>> 分頁資料:" + merchantList.get(0).toString()); + //3.使用PageInfo包裝查詢後的結果,5是連續顯示的條數,結果list型別是Page + pageInfo = new PageInfo(merchantList, pageSize); + //4.使用model/map/modelandview等帶回前端 + System.out.println(">>> (merchant) pageInfo = " + pageInfo.getPages()); - int pageNo; - // check pageNo - pageNo = Integer.parseInt(pageNoStr); - if(pageNo < 1){ - pageNo = 1; - } - /* - * 1st param:which page - * 2nd param : record count per page - */ - log.info("pageNo = {}", pageNo); - Page page = new Page<>(pageNo,3); - QueryWrapper queryWrapper = new QueryWrapper<>(); - IPage iPage = merchantService.page(page, - new LambdaQueryWrapper() - .orderByAsc(Merchant::getId) - ); - log.info("iPage.total = {}, iPage.getPages = {} iPage = {}", iPage.getTotal(), iPage.getPages(), iPage); - map.put("page", iPage); + map.put("pageInfo",pageInfo); + map.put("merchantList",merchantList); + }finally { + PageHelper.clearPage(); //清理 ThreadLocal 儲存的分頁引數,保證執行緒安全 + } return "merchant/list_merchant"; } @@ -112,7 +145,7 @@ public String remove(@PathVariable("typeId") Integer typeId) { return "redirect:/merchant/list"; } - @GetMapping(value="/preUpdate/{typeId}") + @GetMapping(value = "/preUpdate/{typeId}") public String preUpdate(@PathVariable("typeId") Integer typeId, Map map) { Merchant merchant = merchantService.getById(typeId); @@ -121,7 +154,7 @@ public String preUpdate(@PathVariable("typeId") Integer typeId, Map { List getMerchantList(Page merchantPage, @Param("ew") QueryWrapper wrapper); + + List getAllMerchant(); } diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/merchantMapper.xml b/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/merchantMapper.xml index 8f2b7c988..b0c900929 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/merchantMapper.xml +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/mapper/merchantMapper.xml @@ -5,8 +5,7 @@ - - + + + + \ No newline at end of file diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/repository/MerchantRepository.java b/springWarehouse/src/main/java/com/yen/springWarehouse/repository/MerchantRepository.java new file mode 100644 index 000000000..61364e1eb --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/repository/MerchantRepository.java @@ -0,0 +1,9 @@ +package com.yen.springWarehouse.repository; + +import com.yen.springWarehouse.bean.Merchant; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Component; + +@Component +public interface MerchantRepository extends PagingAndSortingRepository { +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/service/MerchantService.java b/springWarehouse/src/main/java/com/yen/springWarehouse/service/MerchantService.java index 16fd9091c..f890e8f4b 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/service/MerchantService.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/service/MerchantService.java @@ -7,8 +7,11 @@ import com.yen.springWarehouse.util.MerchantQueryHelper; import com.yen.springWarehouse.util.ProductQueryHelper; +import java.util.List; + public interface MerchantService extends IService { Page getMerchantPage(MerchantQueryHelper helper, Integer pageNo, Integer pageSize); + List getAllMerchant(); } diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/MerchantServiceImpl.java b/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/MerchantServiceImpl.java index 857899b61..c0fe3a7dd 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/MerchantServiceImpl.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/service/impl/MerchantServiceImpl.java @@ -51,4 +51,9 @@ public Page getMerchantPage(MerchantQueryHelper helper, Integer pageNo return new Page<>(); } + @Override + public List getAllMerchant() { + return merchantMapper.getAllMerchant(); + } + } diff --git a/springWarehouse/src/main/resources/templates/main.html b/springWarehouse/src/main/resources/templates/main.html index 4d7657541..a848109ff 100644 --- a/springWarehouse/src/main/resources/templates/main.html +++ b/springWarehouse/src/main/resources/templates/main.html @@ -46,7 +46,7 @@ - \ No newline at end of file diff --git a/springWarehouse/src/test/java/com/yen/springWarehouse/SpringWarehouseApplicationTests.java b/springWarehouse/src/test/java/com/yen/springWarehouse/WarehouseApplicationTests.java similarity index 96% rename from springWarehouse/src/test/java/com/yen/springWarehouse/SpringWarehouseApplicationTests.java rename to springWarehouse/src/test/java/com/yen/springWarehouse/WarehouseApplicationTests.java index e914ba9da..57ae4c015 100644 --- a/springWarehouse/src/test/java/com/yen/springWarehouse/SpringWarehouseApplicationTests.java +++ b/springWarehouse/src/test/java/com/yen/springWarehouse/WarehouseApplicationTests.java @@ -10,7 +10,7 @@ import java.util.List; @SpringBootTest -class SpringWarehouseApplicationTests { +class WarehouseApplicationTests { // @Test // void contextLoads() { From ce3d820437b63d52fec67ec2848ccd78a058fee6 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Fri, 3 Nov 2023 17:12:12 +0800 Subject: [PATCH 02/17] set scrolling=yes in html --- springWarehouse/src/main/resources/templates/main.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springWarehouse/src/main/resources/templates/main.html b/springWarehouse/src/main/resources/templates/main.html index a848109ff..f944a50e8 100644 --- a/springWarehouse/src/main/resources/templates/main.html +++ b/springWarehouse/src/main/resources/templates/main.html @@ -41,7 +41,7 @@
-
From 6eb399550efe5aace1945d679afb12c81455548e Mon Sep 17 00:00:00 2001 From: yennanliu Date: Fri, 3 Nov 2023 17:39:21 +0800 Subject: [PATCH 03/17] update content height --- springWarehouse/src/main/resources/static/css/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springWarehouse/src/main/resources/static/css/style.css b/springWarehouse/src/main/resources/static/css/style.css index 2ed803c61..f5c3257cd 100644 --- a/springWarehouse/src/main/resources/static/css/style.css +++ b/springWarehouse/src/main/resources/static/css/style.css @@ -40,7 +40,7 @@ body,tr,td,th,div,span,ul,li,input,select,option,textarea{ #content{ overflow:hidden; - height:500px; + height:600px; } form div { From 19e521dae2262d5f967ab2a8280cee6d2fe78865 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Thu, 2 Nov 2023 17:02:53 +0800 Subject: [PATCH 04/17] add comment bean, ddl, mapper, service --- springBootBlog/sql/comment.sql | 7 ++++ .../mdblog/controller/CommentController.java | 23 +++++++++++++ .../yen/mdblog/controller/PostController.java | 12 +++++++ .../java/com/yen/mdblog/entity/Po/Author.java | 1 - .../com/yen/mdblog/entity/Po/Comment.java | 33 +++++++++++++++++++ .../com/yen/mdblog/mapper/CommentMapper.java | 17 ++++++++++ .../com/yen/mdblog/mapper/CommentMapper.xml | 19 +++++++++++ .../com/yen/mdblog/service/AuthorService.java | 1 - .../yen/mdblog/service/CommentService.java | 12 +++++++ .../service/impl/CommentServiceImpl.java | 27 +++++++++++++++ 10 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 springBootBlog/sql/comment.sql create mode 100644 springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java create mode 100644 springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java create mode 100644 springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java create mode 100644 springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml create mode 100644 springBootBlog/src/main/java/com/yen/mdblog/service/CommentService.java create mode 100644 springBootBlog/src/main/java/com/yen/mdblog/service/impl/CommentServiceImpl.java diff --git a/springBootBlog/sql/comment.sql b/springBootBlog/sql/comment.sql new file mode 100644 index 000000000..19e36c669 --- /dev/null +++ b/springBootBlog/sql/comment.sql @@ -0,0 +1,7 @@ +-- DDL for comment table + +INSERT INTO comment(`author_id`,`post_id`,`comment_content`, `create_time`, `update_time`) +values +(1, 1, "some comment", now(), now()), +(2, 2, "some comment", now(), now()), +(3, 3, "some comment", now(), now()); diff --git a/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java new file mode 100644 index 000000000..8fdeff8ba --- /dev/null +++ b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java @@ -0,0 +1,23 @@ +//package com.yen.mdblog.controller; +// +//import com.yen.mdblog.service.CommentService; +//import lombok.extern.log4j.Log4j2; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Controller; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.RequestMapping; +// +//@Controller +//@RequestMapping("/comment") +//@Log4j2 +//public class CommentController { +// +// @Autowired +// CommentService commentService; +// +// @GetMapping("/{postId}") +// public String getComments(){ +// +// } +// +//} diff --git a/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java b/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java index 61efcfb03..4fe00075e 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java @@ -4,11 +4,13 @@ import com.github.pagehelper.PageInfo; import com.yen.mdblog.entity.Dto.SearchRequest; import com.yen.mdblog.entity.Po.Author; +import com.yen.mdblog.entity.Po.Comment; import com.yen.mdblog.entity.Po.Post; import com.yen.mdblog.entity.Vo.CreatePost; import com.yen.mdblog.mapper.PostMapper; import com.yen.mdblog.repository.PostRepository; import com.yen.mdblog.service.AuthorService; +import com.yen.mdblog.service.CommentService; import com.yen.mdblog.service.PostService; import com.yen.mdblog.util.PostUtil; import lombok.extern.log4j.Log4j2; @@ -51,6 +53,9 @@ public class PostController { @Autowired PostMapper postMapper; + @Autowired + CommentService commentService; + @GetMapping("/all") public String getPaginatedPosts( @RequestParam(value = "pageNum", defaultValue = "0") int pageNum, @@ -102,7 +107,14 @@ public String getPostById(@PathVariable long id, Model model, Principal principa Optional postOptional = postRepository.findById(id); if (postOptional.isPresent()) { + model.addAttribute("post", postOptional.get()); + + // load comment + // TODO : double check whether should do below here or in CommentController + List comment = commentService.getCommentsByPostId(id); + //System.out.println(">>> comment len = " + comment.size()); + } else { model.addAttribute("error", "no-post"); } diff --git a/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Author.java b/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Author.java index 53ab4765f..93ca2fe73 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Author.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Author.java @@ -3,7 +3,6 @@ import lombok.Data; import lombok.ToString; import javax.persistence.*; -import java.time.LocalDateTime; import java.util.*; @Data diff --git a/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java b/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java new file mode 100644 index 000000000..c9cc19920 --- /dev/null +++ b/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java @@ -0,0 +1,33 @@ +package com.yen.mdblog.entity.Po; + +import lombok.Data; +import lombok.ToString; +import javax.persistence.*; +import java.util.*; + +@Data +@Entity +@ToString +@Table(name = "comment") +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private Integer id; + + @Column + private Integer authorId; + + @Column + private Long postId; + + @Column(columnDefinition = "TEXT") + private String commentContent; + + @Column + private Date createTime; + + @Column + private Date updateTime; +} diff --git a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java new file mode 100644 index 000000000..72b066ca2 --- /dev/null +++ b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java @@ -0,0 +1,17 @@ +package com.yen.mdblog.mapper; + +import com.yen.mdblog.entity.Po.Author; +import com.yen.mdblog.entity.Po.Comment; +import com.yen.mdblog.entity.Po.Post; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface CommentMapper { + + public List getCommentByPostId(Long postId); + + public void insertComment(@Param("Comment") Comment comment); +} diff --git a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml new file mode 100644 index 000000000..0c83ce45b --- /dev/null +++ b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + INSERT INTO comment(`author_id`,`post_id`,`comment_content`, `create_time`, `update_time`) + values(#{authorId}, #{postId}, #{commentContent}, #{createTime}, #{updateTime}) + + + \ No newline at end of file diff --git a/springBootBlog/src/main/java/com/yen/mdblog/service/AuthorService.java b/springBootBlog/src/main/java/com/yen/mdblog/service/AuthorService.java index b1367739c..bee502dcd 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/service/AuthorService.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/service/AuthorService.java @@ -1,7 +1,6 @@ package com.yen.mdblog.service; import com.yen.mdblog.entity.Po.Author; -import com.yen.mdblog.entity.Po.Post; import java.util.List; diff --git a/springBootBlog/src/main/java/com/yen/mdblog/service/CommentService.java b/springBootBlog/src/main/java/com/yen/mdblog/service/CommentService.java new file mode 100644 index 000000000..9345b9d9f --- /dev/null +++ b/springBootBlog/src/main/java/com/yen/mdblog/service/CommentService.java @@ -0,0 +1,12 @@ +package com.yen.mdblog.service; + +import com.yen.mdblog.entity.Po.Comment; + +import java.util.List; + +public interface CommentService { + + List getCommentsByPostId(Long postId); + + void insertComment(Comment comment); +} diff --git a/springBootBlog/src/main/java/com/yen/mdblog/service/impl/CommentServiceImpl.java b/springBootBlog/src/main/java/com/yen/mdblog/service/impl/CommentServiceImpl.java new file mode 100644 index 000000000..6b3870916 --- /dev/null +++ b/springBootBlog/src/main/java/com/yen/mdblog/service/impl/CommentServiceImpl.java @@ -0,0 +1,27 @@ +package com.yen.mdblog.service.impl; + +import com.yen.mdblog.entity.Po.Comment; +import com.yen.mdblog.mapper.CommentMapper; +import com.yen.mdblog.service.CommentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CommentServiceImpl implements CommentService { + + @Autowired + CommentMapper commentMapper; + + @Override + public List getCommentsByPostId(Long postId) { + return commentMapper.getCommentByPostId(postId); + } + + @Override + public void insertComment(Comment comment) { + commentMapper.insertComment(comment); + } + +} From 6c092acfbd35cffa0049114680128e75e17d3c0a Mon Sep 17 00:00:00 2001 From: yennanliu Date: Thu, 2 Nov 2023 17:33:49 +0800 Subject: [PATCH 05/17] show comment in post html, fix ddl, PostController --- springBootBlog/sql/comment.sql | 3 ++- .../com/yen/mdblog/controller/PostController.java | 8 ++++++-- springBootBlog/src/main/resources/templates/post.html | 11 +++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/springBootBlog/sql/comment.sql b/springBootBlog/sql/comment.sql index 19e36c669..d112a1d67 100644 --- a/springBootBlog/sql/comment.sql +++ b/springBootBlog/sql/comment.sql @@ -4,4 +4,5 @@ INSERT INTO comment(`author_id`,`post_id`,`comment_content`, `create_time`, `upd values (1, 1, "some comment", now(), now()), (2, 2, "some comment", now(), now()), -(3, 3, "some comment", now(), now()); +(3, 3, "some comment", now(), now()), +(2, 1, "ahahahahahahaah", now(), now()); diff --git a/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java b/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java index 4fe00075e..32dc93009 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java @@ -112,8 +112,12 @@ public String getPostById(@PathVariable long id, Model model, Principal principa // load comment // TODO : double check whether should do below here or in CommentController - List comment = commentService.getCommentsByPostId(id); - //System.out.println(">>> comment len = " + comment.size()); + List commentList = commentService.getCommentsByPostId(id); + System.out.println(">>> comment len = " + commentList.size()); + // only add to model when comment size > 0 + if (commentList.size() > 0){ + model.addAttribute("comments", commentList); + } } else { model.addAttribute("error", "no-post"); diff --git a/springBootBlog/src/main/resources/templates/post.html b/springBootBlog/src/main/resources/templates/post.html index 9f9008e47..ac49d043d 100644 --- a/springBootBlog/src/main/resources/templates/post.html +++ b/springBootBlog/src/main/resources/templates/post.html @@ -19,5 +19,16 @@

Title

Content

+ + +
+
+ +

Id

+

commenter Id

+

content

+
+
+ \ No newline at end of file From f17b3fede1f54e408b34d26cd1c99dd87f0c714d Mon Sep 17 00:00:00 2001 From: yennanliu Date: Fri, 3 Nov 2023 18:33:36 +0800 Subject: [PATCH 06/17] add createComment in html, enable commentController, fix comment mapper, add CreateComment Vo --- .../mdblog/controller/CommentController.java | 68 +++++++++++++------ .../yen/mdblog/controller/PostController.java | 2 + .../com/yen/mdblog/entity/Po/Comment.java | 4 ++ .../yen/mdblog/entity/Vo/CreateComment.java | 19 ++++++ .../com/yen/mdblog/mapper/AuthorMapper.java | 2 - .../com/yen/mdblog/mapper/CommentMapper.java | 2 +- .../com/yen/mdblog/mapper/CommentMapper.xml | 8 ++- .../src/main/resources/templates/post.html | 13 +++- 8 files changed, 93 insertions(+), 25 deletions(-) create mode 100644 springBootBlog/src/main/java/com/yen/mdblog/entity/Vo/CreateComment.java diff --git a/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java index 8fdeff8ba..88170dc53 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java @@ -1,23 +1,53 @@ -//package com.yen.mdblog.controller; -// -//import com.yen.mdblog.service.CommentService; -//import lombok.extern.log4j.Log4j2; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Controller; -//import org.springframework.web.bind.annotation.GetMapping; -//import org.springframework.web.bind.annotation.RequestMapping; -// -//@Controller -//@RequestMapping("/comment") -//@Log4j2 -//public class CommentController { -// -// @Autowired -// CommentService commentService; -// +package com.yen.mdblog.controller; + +import com.yen.mdblog.entity.Po.Author; +import com.yen.mdblog.entity.Po.Comment; +import com.yen.mdblog.entity.Po.Post; +import com.yen.mdblog.entity.Vo.CreateComment; +import com.yen.mdblog.entity.Vo.CreatePost; +import com.yen.mdblog.service.CommentService; +import com.yen.mdblog.util.PostUtil; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.security.Principal; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Controller +@RequestMapping("/comment") +@Log4j2 +public class CommentController { + + @Autowired + CommentService commentService; + // @GetMapping("/{postId}") // public String getComments(){ // // } -// -//} + + @RequestMapping(value="/create", method= RequestMethod.POST) + public String createComment(CreateComment request, Model model, Principal principal){ + + log.info(">>> create comment start ..."); + Comment comment = new Comment(); +// comment.setAuthorId(request.getAuthorId()); +// comment.setPostId(request.getPostId()); + comment.setCommentContent(request.getCommentContent()); + comment.setCreateTime(new Date()); //? + log.info(">>>> create post end ..."); + commentService.insertComment(comment); + model.addAttribute("user", principal.getName()); + return "success"; + } + +} diff --git a/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java b/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java index 32dc93009..8badc5c34 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/controller/PostController.java @@ -6,6 +6,7 @@ import com.yen.mdblog.entity.Po.Author; import com.yen.mdblog.entity.Po.Comment; import com.yen.mdblog.entity.Po.Post; +import com.yen.mdblog.entity.Vo.CreateComment; import com.yen.mdblog.entity.Vo.CreatePost; import com.yen.mdblog.mapper.PostMapper; import com.yen.mdblog.repository.PostRepository; @@ -109,6 +110,7 @@ public String getPostById(@PathVariable long id, Model model, Principal principa if (postOptional.isPresent()) { model.addAttribute("post", postOptional.get()); + model.addAttribute("comment", new CreateComment()); // load comment // TODO : double check whether should do below here or in CommentController diff --git a/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java b/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java index c9cc19920..869a6062b 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/entity/Po/Comment.java @@ -1,6 +1,8 @@ package com.yen.mdblog.entity.Po; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.ToString; import javax.persistence.*; import java.util.*; @@ -8,6 +10,8 @@ @Data @Entity @ToString +@AllArgsConstructor +@NoArgsConstructor @Table(name = "comment") public class Comment { diff --git a/springBootBlog/src/main/java/com/yen/mdblog/entity/Vo/CreateComment.java b/springBootBlog/src/main/java/com/yen/mdblog/entity/Vo/CreateComment.java new file mode 100644 index 000000000..fa5240fbb --- /dev/null +++ b/springBootBlog/src/main/java/com/yen/mdblog/entity/Vo/CreateComment.java @@ -0,0 +1,19 @@ +package com.yen.mdblog.entity.Vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CreateComment { + + private long id; + private Integer authorId; + private Long postId; + private String commentContent; + private LocalDateTime createTime; + private LocalDateTime updateTime; +} diff --git a/springBootBlog/src/main/java/com/yen/mdblog/mapper/AuthorMapper.java b/springBootBlog/src/main/java/com/yen/mdblog/mapper/AuthorMapper.java index b2bf2d291..23620f117 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/mapper/AuthorMapper.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/mapper/AuthorMapper.java @@ -16,8 +16,6 @@ public interface AuthorMapper { public int getAuthorCount(); -// @Insert("INSERT INTO authors(`id`,`email`,`name`,`url`) values(#{id}, #{email}, #{name}, #{url})") -// @Options(useGeneratedKeys = true, keyProperty = "id") public void insertAuthor(Author author); public void updateAuthor(Author author); diff --git a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java index 72b066ca2..6a0adb6d1 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.java @@ -13,5 +13,5 @@ public interface CommentMapper { public List getCommentByPostId(Long postId); - public void insertComment(@Param("Comment") Comment comment); + public void insertComment(Comment comment); } diff --git a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml index 0c83ce45b..0a0d8385b 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml +++ b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml @@ -11,9 +11,13 @@ + + + + - INSERT INTO comment(`author_id`,`post_id`,`comment_content`, `create_time`, `update_time`) - values(#{authorId}, #{postId}, #{commentContent}, #{createTime}, #{updateTime}) + INSERT INTO comment(`comment_content`) + values(#{commentContent}) \ No newline at end of file diff --git a/springBootBlog/src/main/resources/templates/post.html b/springBootBlog/src/main/resources/templates/post.html index ac49d043d..4e4a91bf3 100644 --- a/springBootBlog/src/main/resources/templates/post.html +++ b/springBootBlog/src/main/resources/templates/post.html @@ -20,13 +20,24 @@

Title

- + + + +
+

Content:

+

+
+ + + +

Comment

Id

commenter Id

content

+

comment time

From 9caeb70f083c132ca0103c547c6a9829cb15ef26 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Fri, 3 Nov 2023 18:53:59 +0800 Subject: [PATCH 07/17] add postId to comment form, update mapper --- .../java/com/yen/mdblog/controller/CommentController.java | 4 +++- .../src/main/java/com/yen/mdblog/mapper/CommentMapper.xml | 4 ++-- springBootBlog/src/main/resources/templates/post.html | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java index 88170dc53..553004df9 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java @@ -41,9 +41,11 @@ public String createComment(CreateComment request, Model model, Principal princi log.info(">>> create comment start ..."); Comment comment = new Comment(); // comment.setAuthorId(request.getAuthorId()); -// comment.setPostId(request.getPostId()); + comment.setPostId(request.getPostId()); comment.setCommentContent(request.getCommentContent()); comment.setCreateTime(new Date()); //? + + System.out.println(">>> (CommentController) create new comment = " + comment.toString()); log.info(">>>> create post end ..."); commentService.insertComment(comment); model.addAttribute("user", principal.getName()); diff --git a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml index 0a0d8385b..14f1ba8f8 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml +++ b/springBootBlog/src/main/java/com/yen/mdblog/mapper/CommentMapper.xml @@ -16,8 +16,8 @@ - INSERT INTO comment(`comment_content`) - values(#{commentContent}) + INSERT INTO comment(`post_id`, `comment_content`) + values(#{postId}, #{commentContent}) \ No newline at end of file diff --git a/springBootBlog/src/main/resources/templates/post.html b/springBootBlog/src/main/resources/templates/post.html index 4e4a91bf3..cee541d7f 100644 --- a/springBootBlog/src/main/resources/templates/post.html +++ b/springBootBlog/src/main/resources/templates/post.html @@ -25,6 +25,9 @@

Title

Content:

+ + +

From 03d7f62e4f88477d05c0b6fdb4e7bb7f0a704b78 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Fri, 3 Nov 2023 19:04:14 +0800 Subject: [PATCH 08/17] redirect to comment_success html after comment --- .../yen/mdblog/controller/CommentController.java | 2 +- .../resources/templates/comment_success.html | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 springBootBlog/src/main/resources/templates/comment_success.html diff --git a/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java index 553004df9..a349359ae 100644 --- a/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java +++ b/springBootBlog/src/main/java/com/yen/mdblog/controller/CommentController.java @@ -49,7 +49,7 @@ public String createComment(CreateComment request, Model model, Principal princi log.info(">>>> create post end ..."); commentService.insertComment(comment); model.addAttribute("user", principal.getName()); - return "success"; + return "comment_success"; } } diff --git a/springBootBlog/src/main/resources/templates/comment_success.html b/springBootBlog/src/main/resources/templates/comment_success.html new file mode 100644 index 000000000..4ba069ee5 --- /dev/null +++ b/springBootBlog/src/main/resources/templates/comment_success.html @@ -0,0 +1,16 @@ + + + + + + + Add new comment complete + + +
+ +

Comment OK

+ + + + \ No newline at end of file From 2af7dd804986f974304bcdbf3e7cfe505d23ad6e Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 08:16:45 +0800 Subject: [PATCH 09/17] add, rename github action yml, update readme --- .../{maven2.yml => maven_blogService.yml} | 3 -- .github/workflows/maven_warehouseService.yaml | 31 +++++++++++++++++++ springWarehouse/README.md | 2 +- 3 files changed, 32 insertions(+), 4 deletions(-) rename .github/workflows/{maven2.yml => maven_blogService.yml} (76%) create mode 100644 .github/workflows/maven_warehouseService.yaml diff --git a/.github/workflows/maven2.yml b/.github/workflows/maven_blogService.yml similarity index 76% rename from .github/workflows/maven2.yml rename to .github/workflows/maven_blogService.yml index 3f458d787..d1c6f7233 100644 --- a/.github/workflows/maven2.yml +++ b/.github/workflows/maven_blogService.yml @@ -29,6 +29,3 @@ jobs: cache: maven - name: Build with Maven run: rm -rf ~/.m2 && cd springBootBlog && mvn -DskipTests=true package - # # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - # - name: Update dependency graph - # uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 diff --git a/.github/workflows/maven_warehouseService.yaml b/.github/workflows/maven_warehouseService.yaml new file mode 100644 index 000000000..9ac33172c --- /dev/null +++ b/.github/workflows/maven_warehouseService.yaml @@ -0,0 +1,31 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: rm -rf ~/.m2 && cd springWarehouse && mvn -DskipTests=true package \ No newline at end of file diff --git a/springWarehouse/README.md b/springWarehouse/README.md index 51b4e7327..9cd670223 100644 --- a/springWarehouse/README.md +++ b/springWarehouse/README.md @@ -17,7 +17,7 @@ Warehouse data are maintained, managed via this app ## Tech -- Java +- Java 8 - Spring boot - mybatispluss - thymeleaf From 49f73c9f3bb93bfb0c251090a6ace616a5868a01 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 08:19:09 +0800 Subject: [PATCH 10/17] reanme ci job --- .github/workflows/maven.yml | 2 +- .github/workflows/maven_blogService.yml | 2 +- .github/workflows/maven_warehouseService.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6cbff2fe1..406ccd54c 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -1,7 +1,7 @@ # This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven -name: Java CI with Maven +name: (EcommerceGuli, CourseSystem) Java CI with Maven on: push: diff --git a/.github/workflows/maven_blogService.yml b/.github/workflows/maven_blogService.yml index d1c6f7233..621e54996 100644 --- a/.github/workflows/maven_blogService.yml +++ b/.github/workflows/maven_blogService.yml @@ -6,7 +6,7 @@ # separate terms of service, privacy policy, and support # documentation. -name: Java CI with Maven +name: (Blog service) Java CI with Maven on: push: diff --git a/.github/workflows/maven_warehouseService.yaml b/.github/workflows/maven_warehouseService.yaml index 9ac33172c..32e0f919f 100644 --- a/.github/workflows/maven_warehouseService.yaml +++ b/.github/workflows/maven_warehouseService.yaml @@ -6,7 +6,7 @@ # separate terms of service, privacy policy, and support # documentation. -name: Java CI with Maven +name: (Warehouse service) Java CI with Maven on: push: From b66a0ae714b7e50390abde777a50485594315543 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 16:25:13 +0800 Subject: [PATCH 11/17] add chatRoom src code, update readme --- springChatRoom/.gitignore | 33 ++++++++++ springChatRoom/README.md | 20 +----- springChatRoom/doc/ref.md | 20 ++++++ springChatRoom/pom.xml | 65 +++++++++++++++++++ .../SpringChatRoomApplication.java | 14 ++++ .../src/main/resources/application.properties | 1 + .../SpringChatRoomApplicationTests.java | 13 ++++ 7 files changed, 147 insertions(+), 19 deletions(-) create mode 100644 springChatRoom/.gitignore create mode 100644 springChatRoom/doc/ref.md create mode 100644 springChatRoom/pom.xml create mode 100644 springChatRoom/src/main/java/com/yen/springChatRoom/SpringChatRoomApplication.java create mode 100644 springChatRoom/src/main/resources/application.properties create mode 100644 springChatRoom/src/test/java/com/yen/springChatRoom/SpringChatRoomApplicationTests.java diff --git a/springChatRoom/.gitignore b/springChatRoom/.gitignore new file mode 100644 index 000000000..549e00a2a --- /dev/null +++ b/springChatRoom/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/springChatRoom/README.md b/springChatRoom/README.md index 0ef01bd16..f6d491b35 100644 --- a/springChatRoom/README.md +++ b/springChatRoom/README.md @@ -22,22 +22,4 @@ - geo location app - stock market app - co-editing system (e.g. google doc ?) - - app needs near real-time update/sync, data transmit is not small - -## Ref -- Article - - https://ithelp.ithome.com.tw/articles/10197142 - - https://ithelp.ithome.com.tw/articles/10197191 - - https://www.baeldung.com/websockets-spring - - https://blog.csdn.net/wwd0501/article/details/54582912 - - https://www.slideshare.net/wenhsiaoyi/java-api-for-websocket - - https://www.syscom.com.tw/ePaper_New_Content.aspx?id=368&EPID=194&TableName=sgEPArticle - - https://tw511.com/a/01/16646.html -- Code - - https://spring.io/guides/gs/messaging-stomp-websocket/ - - https://morosedog.gitlab.io/springboot-20190416-springboot28/ - -- Video - - https://youtu.be/r4fdPmZuzmY?si=qrmRTm09Bo53Ina1 - - https://youtu.be/RbCFeeePJoM?si=DF6mES5XApvSkhXw - - https://youtu.be/es_fTKyfI4w?si=vVhEz6Us-zrcerTR \ No newline at end of file + - app needs near real-time update/sync, data transmit is not small \ No newline at end of file diff --git a/springChatRoom/doc/ref.md b/springChatRoom/doc/ref.md new file mode 100644 index 000000000..b39ca6c7e --- /dev/null +++ b/springChatRoom/doc/ref.md @@ -0,0 +1,20 @@ +## Ref +- Article + - https://blog.csdn.net/qqxx6661/article/details/98883166 + - https://github.com/yennanliu/springboot-websocket-demo + + - https://ithelp.ithome.com.tw/articles/10197142 + - https://ithelp.ithome.com.tw/articles/10197191 + - https://www.baeldung.com/websockets-spring + - https://blog.csdn.net/wwd0501/article/details/54582912 + - https://www.slideshare.net/wenhsiaoyi/java-api-for-websocket + - https://www.syscom.com.tw/ePaper_New_Content.aspx?id=368&EPID=194&TableName=sgEPArticle + - https://tw511.com/a/01/16646.html +- Code + - https://spring.io/guides/gs/messaging-stomp-websocket/ + - https://morosedog.gitlab.io/springboot-20190416-springboot28/ + +- Video + - https://youtu.be/r4fdPmZuzmY?si=qrmRTm09Bo53Ina1 + - https://youtu.be/RbCFeeePJoM?si=DF6mES5XApvSkhXw + - https://youtu.be/es_fTKyfI4w?si=vVhEz6Us-zrcerTR \ No newline at end of file diff --git a/springChatRoom/pom.xml b/springChatRoom/pom.xml new file mode 100644 index 000000000..142df91f5 --- /dev/null +++ b/springChatRoom/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.0.12 + + + + com.yen + springChatRoom + 0.0.1-SNAPSHOT + springChatRoom + Demo project for Spring Boot + + + 11 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-websocket + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + + + + com.alibaba + fastjson + 1.2.79 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/springChatRoom/src/main/java/com/yen/springChatRoom/SpringChatRoomApplication.java b/springChatRoom/src/main/java/com/yen/springChatRoom/SpringChatRoomApplication.java new file mode 100644 index 000000000..1646df1e4 --- /dev/null +++ b/springChatRoom/src/main/java/com/yen/springChatRoom/SpringChatRoomApplication.java @@ -0,0 +1,14 @@ +package com.yen.springChatRoom; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringChatRoomApplication { + + public static void main(String[] args) { + + SpringApplication.run(SpringChatRoomApplication.class, args); + } + +} diff --git a/springChatRoom/src/main/resources/application.properties b/springChatRoom/src/main/resources/application.properties new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/springChatRoom/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/springChatRoom/src/test/java/com/yen/springChatRoom/SpringChatRoomApplicationTests.java b/springChatRoom/src/test/java/com/yen/springChatRoom/SpringChatRoomApplicationTests.java new file mode 100644 index 000000000..79b8b9778 --- /dev/null +++ b/springChatRoom/src/test/java/com/yen/springChatRoom/SpringChatRoomApplicationTests.java @@ -0,0 +1,13 @@ +package com.yen.springChatRoom; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringChatRoomApplicationTests { + + @Test + void contextLoads() { + } + +} From e2d5354b24219f5528138e73e68852bd9a9f7975 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 16:54:43 +0800 Subject: [PATCH 12/17] add config, model, controller --- .../config/WebSocketConfig.java | 34 ++++++++++++++ .../controller/ChatController.java | 42 +++++++++++++++++ .../yen/springChatRoom/model/ChatMessage.java | 47 +++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 springChatRoom/src/main/java/com/yen/springChatRoom/config/WebSocketConfig.java create mode 100644 springChatRoom/src/main/java/com/yen/springChatRoom/controller/ChatController.java create mode 100644 springChatRoom/src/main/java/com/yen/springChatRoom/model/ChatMessage.java diff --git a/springChatRoom/src/main/java/com/yen/springChatRoom/config/WebSocketConfig.java b/springChatRoom/src/main/java/com/yen/springChatRoom/config/WebSocketConfig.java new file mode 100644 index 000000000..5b156b685 --- /dev/null +++ b/springChatRoom/src/main/java/com/yen/springChatRoom/config/WebSocketConfig.java @@ -0,0 +1,34 @@ +package com.yen.springChatRoom.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + /** + * Stomp : spring implement WebSocket via Stomp + * + * - https://blog.csdn.net/qq_21294185/article/details/130657375 + * - https://blog.csdn.net/u013749113/article/details/131455579 + */ + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + + //WebSocketMessageBrokerConfigurer.super.registerStompEndpoints(registry); + registry.addEndpoint("ws").withSockJS(); // if browser not support websocket, use SockJS instead + } + + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + + //WebSocketMessageBrokerConfigurer.super.configureMessageBroker(registry); + registry.setApplicationDestinationPrefixes("/app"); + registry.enableSimpleBroker("/topic"); + } +} diff --git a/springChatRoom/src/main/java/com/yen/springChatRoom/controller/ChatController.java b/springChatRoom/src/main/java/com/yen/springChatRoom/controller/ChatController.java new file mode 100644 index 000000000..d5d3a105f --- /dev/null +++ b/springChatRoom/src/main/java/com/yen/springChatRoom/controller/ChatController.java @@ -0,0 +1,42 @@ +package com.yen.springChatRoom.controller; + +import com.yen.springChatRoom.model.ChatMessage; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.stereotype.Controller; +import org.springframework.messaging.simp.SimpMessageHeaderAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Controller +public class ChatController { + + private static final Logger LOGGER = LoggerFactory.getLogger(ChatController.class); + + @MessageMapping("/chat.sendMessage") + @SendTo("/topic/public") + public ChatMessage sendMessage(@Payload ChatMessage chatMessage){ + return chatMessage; + } + + @MessageMapping("/chat.addUser") + @SendTo("/topic/public") + public ChatMessage addUser(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) { + + LOGGER.info("User added in Chatroom:" + chatMessage.getSender()); + // add username in web socket session + headerAccessor.getSessionAttributes().put("username", chatMessage.getSender()); + return chatMessage; + + // TODO : update with below +// try { +// headerAccessor.getSessionAttributes().put("username", chatMessage.getSender()); +//// redisTemplate.opsForSet().add(onlineUsers, chatMessage.getSender()); +//// redisTemplate.convertAndSend(userStatus, JsonUtil.parseObjToJson(chatMessage)); +// } catch (Exception e) { +// LOGGER.error(e.getMessage(), e); +// } + } + +} diff --git a/springChatRoom/src/main/java/com/yen/springChatRoom/model/ChatMessage.java b/springChatRoom/src/main/java/com/yen/springChatRoom/model/ChatMessage.java new file mode 100644 index 000000000..e792fd2cb --- /dev/null +++ b/springChatRoom/src/main/java/com/yen/springChatRoom/model/ChatMessage.java @@ -0,0 +1,47 @@ +package com.yen.springChatRoom.model; + +public class ChatMessage { + private MessageType type; + private String content; + private String sender; + + public enum MessageType { + CHAT, + JOIN, + LEAVE + } + + public MessageType getType() { + return type; + } + + public void setType(MessageType type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getSender() { + return sender; + } + + public void setSender(String sender) { + this.sender = sender; + } + + @Override + public String toString() { + return "ChatMessage{" + + "type=" + type + + ", content='" + content + '\'' + + ", sender='" + sender + '\'' + + '}'; + } + +} From c25df576c2fa38e4aedc6dac1a23f4fbd8531aa9 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 16:55:28 +0800 Subject: [PATCH 13/17] update main app name --- ...pringChatRoomApplication.java => ChatRoomApplication.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename springChatRoom/src/main/java/com/yen/springChatRoom/{SpringChatRoomApplication.java => ChatRoomApplication.java} (68%) diff --git a/springChatRoom/src/main/java/com/yen/springChatRoom/SpringChatRoomApplication.java b/springChatRoom/src/main/java/com/yen/springChatRoom/ChatRoomApplication.java similarity index 68% rename from springChatRoom/src/main/java/com/yen/springChatRoom/SpringChatRoomApplication.java rename to springChatRoom/src/main/java/com/yen/springChatRoom/ChatRoomApplication.java index 1646df1e4..584fefbf4 100644 --- a/springChatRoom/src/main/java/com/yen/springChatRoom/SpringChatRoomApplication.java +++ b/springChatRoom/src/main/java/com/yen/springChatRoom/ChatRoomApplication.java @@ -4,11 +4,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class SpringChatRoomApplication { +public class ChatRoomApplication { public static void main(String[] args) { - SpringApplication.run(SpringChatRoomApplication.class, args); + SpringApplication.run(ChatRoomApplication.class, args); } } From 415ae3785d2ef4a8e23254861e543b0e3628fff0 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 17:12:13 +0800 Subject: [PATCH 14/17] add listener --- .../listener/WebSocketEventListener.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 springChatRoom/src/main/java/com/yen/springChatRoom/listener/WebSocketEventListener.java diff --git a/springChatRoom/src/main/java/com/yen/springChatRoom/listener/WebSocketEventListener.java b/springChatRoom/src/main/java/com/yen/springChatRoom/listener/WebSocketEventListener.java new file mode 100644 index 000000000..daecb38d8 --- /dev/null +++ b/springChatRoom/src/main/java/com/yen/springChatRoom/listener/WebSocketEventListener.java @@ -0,0 +1,48 @@ +package com.yen.springChatRoom.listener; + +import com.yen.springChatRoom.controller.ChatController; +import com.yen.springChatRoom.model.ChatMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.messaging.simp.SimpMessageSendingOperations; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.messaging.SessionConnectedEvent; +import org.springframework.web.socket.messaging.SessionDisconnectEvent; + +@Component +public class WebSocketEventListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(ChatController.class); + + @Autowired + private SimpMessageSendingOperations messagingTemplate; + + // connect + @EventListener + public void handleWebSocketConnectListener(SessionConnectedEvent event){ + + LOGGER.info("Receive a new web socket connection!"); + } + + // disconnect + @EventListener + public void handleWebSocketDisConnectListener(SessionDisconnectEvent event){ + + StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage()); + String username = (String) headerAccessor.getSessionAttributes().get("username"); + + if (username != null){ + + LOGGER.info("User disconnected : " + username); + ChatMessage chatMessage = new ChatMessage(); + chatMessage.setType(ChatMessage.MessageType.LEAVE); + chatMessage.setSender(username); + + messagingTemplate.convertAndSend("/topic/public", chatMessage); + } + } + +} From 0dc35fce2e6e92e9db745c37dff829746835deda Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 17:22:55 +0800 Subject: [PATCH 15/17] add css, js, index.html --- .../src/main/resources/static/css/main.css | 298 ++++++++++++++++++ .../src/main/resources/static/index.html | 59 ++++ .../src/main/resources/static/js/main.js | 122 +++++++ 3 files changed, 479 insertions(+) create mode 100644 springChatRoom/src/main/resources/static/css/main.css create mode 100644 springChatRoom/src/main/resources/static/index.html create mode 100644 springChatRoom/src/main/resources/static/js/main.js diff --git a/springChatRoom/src/main/resources/static/css/main.css b/springChatRoom/src/main/resources/static/css/main.css new file mode 100644 index 000000000..384b3cd8b --- /dev/null +++ b/springChatRoom/src/main/resources/static/css/main.css @@ -0,0 +1,298 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html,body { + height: 100%; + overflow: hidden; +} + +body { + margin: 0; + padding: 0; + font-weight: 400; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 1rem; + line-height: 1.58; + color: #333; + background-color: #f4f4f4; + height: 100%; +} + +body:before { + height: 50%; + width: 100%; + position: absolute; + top: 0; + left: 0; + background: #128ff2; + content: ""; + z-index: 0; +} + +.clearfix:after { + display: block; + content: ""; + clear: both; +} + +.hidden { + display: none; +} + +.form-control { + width: 100%; + min-height: 38px; + font-size: 15px; + border: 1px solid #c8c8c8; +} + +.form-group { + margin-bottom: 15px; +} + +input { + padding-left: 10px; + outline: none; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 20px; + margin-bottom: 20px; +} + +h1 { + font-size: 1.7em; +} + +a { + color: #128ff2; +} + +button { + box-shadow: none; + border: 1px solid transparent; + font-size: 14px; + outline: none; + line-height: 100%; + white-space: nowrap; + vertical-align: middle; + padding: 0.6rem 1rem; + border-radius: 2px; + transition: all 0.2s ease-in-out; + cursor: pointer; + min-height: 38px; +} + +button.default { + background-color: #e8e8e8; + color: #333; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12); +} + +button.primary { + background-color: #128ff2; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12); + color: #fff; +} + +button.accent { + background-color: #ff4743; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12); + color: #fff; +} + +#username-page { + text-align: center; +} + +.username-page-container { + background: #fff; + box-shadow: 0 1px 11px rgba(0, 0, 0, 0.27); + border-radius: 2px; + width: 100%; + max-width: 500px; + display: inline-block; + margin-top: 42px; + vertical-align: middle; + position: relative; + padding: 35px 55px 35px; + min-height: 250px; + position: absolute; + top: 50%; + left: 0; + right: 0; + margin: 0 auto; + margin-top: -160px; +} + +.username-page-container .username-submit { + margin-top: 10px; +} + + +#chat-page { + position: relative; + height: 100%; +} + +.chat-container { + max-width: 700px; + margin-left: auto; + margin-right: auto; + background-color: #fff; + box-shadow: 0 1px 11px rgba(0, 0, 0, 0.27); + margin-top: 30px; + height: calc(100% - 60px); + max-height: 600px; + position: relative; +} + +#chat-page ul { + list-style-type: none; + background-color: #FFF; + margin: 0; + overflow: auto; + overflow-y: scroll; + padding: 0 20px 0px 20px; + height: calc(100% - 150px); +} + +#chat-page #messageForm { + padding: 20px; +} + +#chat-page ul li { + line-height: 1.5rem; + padding: 10px 20px; + margin: 0; + border-bottom: 1px solid #f4f4f4; +} + +#chat-page ul li p { + margin: 0; +} + +#chat-page .event-message { + width: 100%; + text-align: center; + clear: both; +} + +#chat-page .event-message p { + color: #777; + font-size: 14px; + word-wrap: break-word; +} + +#chat-page .chat-message { + padding-left: 68px; + position: relative; +} + +#chat-page .chat-message i { + position: absolute; + width: 42px; + height: 42px; + overflow: hidden; + left: 10px; + display: inline-block; + vertical-align: middle; + font-size: 18px; + line-height: 42px; + color: #fff; + text-align: center; + border-radius: 50%; + font-style: normal; + text-transform: uppercase; +} + +#chat-page .chat-message span { + color: #333; + font-weight: 600; +} + +#chat-page .chat-message p { + color: #43464b; +} + +#messageForm .input-group input { + float: left; + width: calc(100% - 85px); +} + +#messageForm .input-group button { + float: left; + width: 80px; + height: 38px; + margin-left: 5px; +} + +.chat-header { + text-align: center; + padding: 15px; + border-bottom: 1px solid #ececec; +} + +.chat-header h2 { + margin: 0; + font-weight: 500; +} + +.connecting { + padding-top: 5px; + text-align: center; + color: #777; + position: absolute; + top: 65px; + width: 100%; +} + + +@media screen and (max-width: 730px) { + + .chat-container { + margin-left: 10px; + margin-right: 10px; + margin-top: 10px; + } +} + +@media screen and (max-width: 480px) { + .chat-container { + height: calc(100% - 30px); + } + + .username-page-container { + width: auto; + margin-left: 15px; + margin-right: 15px; + padding: 25px; + } + + #chat-page ul { + height: calc(100% - 120px); + } + + #messageForm .input-group button { + width: 65px; + } + + #messageForm .input-group input { + width: calc(100% - 70px); + } + + .chat-header { + padding: 10px; + } + + .connecting { + top: 60px; + } + + .chat-header h2 { + font-size: 1.1em; + } +} \ No newline at end of file diff --git a/springChatRoom/src/main/resources/static/index.html b/springChatRoom/src/main/resources/static/index.html new file mode 100644 index 000000000..e2974a07e --- /dev/null +++ b/springChatRoom/src/main/resources/static/index.html @@ -0,0 +1,59 @@ + + + + + + + Spring Boot WebSocket Chat Application + + + + + +
+
+

Type your username

+
+
+ +
+
+ +
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/springChatRoom/src/main/resources/static/js/main.js b/springChatRoom/src/main/resources/static/js/main.js new file mode 100644 index 000000000..14f12e5c1 --- /dev/null +++ b/springChatRoom/src/main/resources/static/js/main.js @@ -0,0 +1,122 @@ +'use strict'; + +// Ref +// - https://www.callicoder.com/spring-boot-websocket-chat-example/ +// - https://blog.csdn.net/qqxx6661/article/details/98883166 + +var usernamePage = document.querySelector('#username-page'); +var chatPage = document.querySelector('#chat-page'); +var usernameForm = document.querySelector('#usernameForm'); +var messageForm = document.querySelector('#messageForm'); +var messageInput = document.querySelector('#message'); +var messageArea = document.querySelector('#messageArea'); +var connectingElement = document.querySelector('.connecting'); + +var stompClient = null; +var username = null; + +var colors = [ + '#2196F3', '#32c787', '#00BCD4', '#ff5652', + '#ffc107', '#ff85af', '#FF9800', '#39bbb0' +]; + +function connect(event) { + username = document.querySelector('#name').value.trim(); + + if(username) { + usernamePage.classList.add('hidden'); + chatPage.classList.remove('hidden'); + + var socket = new SockJS('/ws'); + stompClient = Stomp.over(socket); + + stompClient.connect({}, onConnected, onError); + } + event.preventDefault(); +} + + +function onConnected() { + // Subscribe to the Public Topic + stompClient.subscribe('/topic/public', onMessageReceived); + + // Tell your username to the server + stompClient.send("/app/chat.addUser", + {}, + JSON.stringify({sender: username, type: 'JOIN'}) + ) + + connectingElement.classList.add('hidden'); +} + + +function onError(error) { + connectingElement.textContent = 'Could not connect to WebSocket server. Please refresh this page to try again!'; + connectingElement.style.color = 'red'; +} + + +function sendMessage(event) { + var messageContent = messageInput.value.trim(); + if(messageContent && stompClient) { + var chatMessage = { + sender: username, + content: messageInput.value, + type: 'CHAT' + }; + stompClient.send("/app/chat.sendMessage", {}, JSON.stringify(chatMessage)); + messageInput.value = ''; + } + event.preventDefault(); +} + + +function onMessageReceived(payload) { + var message = JSON.parse(payload.body); + + var messageElement = document.createElement('li'); + + if(message.type === 'JOIN') { + messageElement.classList.add('event-message'); + message.content = message.sender + ' joined!'; + } else if (message.type === 'LEAVE') { + messageElement.classList.add('event-message'); + message.content = message.sender + ' left!'; + } else { + messageElement.classList.add('chat-message'); + + var avatarElement = document.createElement('i'); + var avatarText = document.createTextNode(message.sender[0]); + avatarElement.appendChild(avatarText); + avatarElement.style['background-color'] = getAvatarColor(message.sender); + + messageElement.appendChild(avatarElement); + + var usernameElement = document.createElement('span'); + var usernameText = document.createTextNode(message.sender); + usernameElement.appendChild(usernameText); + messageElement.appendChild(usernameElement); + } + + var textElement = document.createElement('p'); + var messageText = document.createTextNode(message.content); + textElement.appendChild(messageText); + + messageElement.appendChild(textElement); + + messageArea.appendChild(messageElement); + messageArea.scrollTop = messageArea.scrollHeight; +} + + +function getAvatarColor(messageSender) { + var hash = 0; + for (var i = 0; i < messageSender.length; i++) { + hash = 31 * hash + messageSender.charCodeAt(i); + } + var index = Math.abs(hash % colors.length); + return colors[index]; +} + +usernameForm.addEventListener('submit', connect, true) +messageForm.addEventListener('submit', sendMessage, true) \ No newline at end of file From 28751b1ed36ec595286d1477a47f226107eee72e Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 17:33:46 +0800 Subject: [PATCH 16/17] update todo --- springChatRoom/README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/springChatRoom/README.md b/springChatRoom/README.md index f6d491b35..d1499918b 100644 --- a/springChatRoom/README.md +++ b/springChatRoom/README.md @@ -1,12 +1,28 @@ # Spring Chat Room +- UI : http://localhost:8080 + ## Run ```bash ``` ## Tech -- spring boot -- Spring socket +- Java 11 +- spring boot 3.0.12 +- webSocket +- STOMP +- Extension + - Redis + +## Todo +- Feature + - private msg (1 to 1) + - group chat + - @ "notification" + - msg push (?) + - "read" 已讀 feature + - show user list + - save history msg ## Knowledge - WebSocket From cf2b4152d6cb048e436467268c2d323c062f4d09 Mon Sep 17 00:00:00 2001 From: yennanliu Date: Sat, 4 Nov 2023 18:30:38 +0800 Subject: [PATCH 17/17] fix merchant page param, fix html url, add cors config, update merchantController --- .../src/main/resources/templates/posts.html | 2 +- .../springWarehouse/config/CorsConfig.java | 33 +++++++++++++++++++ .../controller/MerchantController.java | 18 +++++----- .../templates/merchant/list_merchant.html | 13 ++++---- 4 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 springWarehouse/src/main/java/com/yen/springWarehouse/config/CorsConfig.java diff --git a/springBootBlog/src/main/resources/templates/posts.html b/springBootBlog/src/main/resources/templates/posts.html index 131606cc7..ee5e43a7b 100644 --- a/springBootBlog/src/main/resources/templates/posts.html +++ b/springBootBlog/src/main/resources/templates/posts.html @@ -31,7 +31,7 @@
Author
- diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/config/CorsConfig.java b/springWarehouse/src/main/java/com/yen/springWarehouse/config/CorsConfig.java new file mode 100644 index 000000000..db41036c9 --- /dev/null +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/config/CorsConfig.java @@ -0,0 +1,33 @@ +package com.yen.springWarehouse.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig { + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + + //映射路徑 + registry.addMapping("/**") + //允許跨網域請求的來源 + .allowedOrigins("/*") + //允許跨域攜帶cookie資訊,預設跨網域請求是不攜帶cookie資訊的。 + .allowCredentials(true) + //允許使用那些請求方式 + .allowedMethods("GET", "POST", "PUT", "DELETE") + //允許哪些Header + .allowedHeaders("/*") + //可獲取哪些Header(因為跨網域預設不能取得全部Header資訊) + .exposedHeaders("Header1", "Header2"); + } + }; + } + +} diff --git a/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java index 57c7c1197..5268ab2cf 100644 --- a/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java +++ b/springWarehouse/src/main/java/com/yen/springWarehouse/controller/MerchantController.java @@ -89,11 +89,12 @@ public String createBatch(@RequestParam("file") MultipartFile file, Map map, - @RequestParam(value = "pageNo", required = false, defaultValue = "0") int pageNum, - @RequestParam(value="pageSize", defaultValue = "0" + PAGINATIONSIZE) int pageSize) { + public String list(@RequestParam(value = "pageNum", required = false, defaultValue = "0") int pageNum, + @RequestParam(value="pageSize", defaultValue = "0" + PAGINATIONSIZE) int pageSize, + Map map) { - log.info("pageNum = {}", pageNum); + //pageNum = 2; + log.info(">>> pageNum = {}", pageNum); // Page page = new Page<>(pageNum, PAGINATIONSIZE); // QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -106,8 +107,8 @@ public String list(Map map, Pageable pageRequest = PageRequest.of(pageNum, pageSize, Sort.by(Sort.Direction.DESC, "id")); - Page postsPage = merchantRepository.findAll(pageRequest); //merchantService //postRepository.findAll(pageRequest); - List merchants = postsPage.toList(); + Page merchantsPage = merchantRepository.findAll(pageRequest); //merchantService //postRepository.findAll(pageRequest); + List merchants = merchantsPage.toList(); log.info(">>> merchants length = {}", merchants.toArray().length); PageInfo pageInfo = null; //為了程式的嚴謹性,判斷非空: @@ -127,11 +128,8 @@ public String list(Map map, //4.使用model/map/modelandview等帶回前端 System.out.println(">>> (merchant) pageInfo = " + pageInfo.getPages()); - - - map.put("pageInfo",pageInfo); - map.put("merchantList",merchantList); + map.put("merchants", merchants); }finally { PageHelper.clearPage(); //清理 ThreadLocal 儲存的分頁引數,保證執行緒安全 } diff --git a/springWarehouse/src/main/resources/templates/merchant/list_merchant.html b/springWarehouse/src/main/resources/templates/merchant/list_merchant.html index 1e35da7d4..ceab8584f 100644 --- a/springWarehouse/src/main/resources/templates/merchant/list_merchant.html +++ b/springWarehouse/src/main/resources/templates/merchant/list_merchant.html @@ -10,7 +10,7 @@

Merchant Management

-
+
@@ -18,7 +18,8 @@

Merchant Management

-
City
+
City
+
Id
@@ -36,22 +37,22 @@
City
First
  • - +
  • - Last + Last