From ff68cdd8299f09e9fb91a96133b51e77652d6bec Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Mon, 30 Oct 2023 14:01:24 +0800 Subject: [PATCH 01/26] =?UTF-8?q?perf(mobile):=20=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/static/mobile/js/common.js | 12 +- .../resources/templates/mobile/common/js.html | 2 +- .../resources/templates/mobile/index.html | 111 +++++------------- 3 files changed, 35 insertions(+), 90 deletions(-) diff --git a/novel-front/src/main/resources/static/mobile/js/common.js b/novel-front/src/main/resources/static/mobile/js/common.js index bc6a3ea..760a8de 100644 --- a/novel-front/src/main/resources/static/mobile/js/common.js +++ b/novel-front/src/main/resources/static/mobile/js/common.js @@ -109,7 +109,7 @@ if (!token) { location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href); } - $(".user_link").html("登录注册"); + // $(".user_link").html("登录注册"); } else { $.ajax({ type: "POST", @@ -118,10 +118,10 @@ if (!token) { dataType: "json", success: function (data) { if (data.code == 200) { - $(".user_link").html("" + - "\n" + - ""); + // $(".user_link").html("" + + // "\n" + + // ""); if ("/user/login.html" == window.location.pathname) { var orginUrl = getSearchString("originUrl"); window.location.href = orginUrl == undefined || orginUrl.isBlank() ? "/" : orginUrl; @@ -137,7 +137,7 @@ if (!token) { if (needLoginPath.indexOf(window.location.pathname) != -1) { location.href = '/user/login.html'; } - $(".user_link").html("登录注册"); + // $(".user_link").html("登录注册"); } }, error: function () { diff --git a/novel-front/src/main/resources/templates/mobile/common/js.html b/novel-front/src/main/resources/templates/mobile/common/js.html index e022d12..670ff69 100644 --- a/novel-front/src/main/resources/templates/mobile/common/js.html +++ b/novel-front/src/main/resources/templates/mobile/common/js.html @@ -1,3 +1,3 @@ - + diff --git a/novel-front/src/main/resources/templates/mobile/index.html b/novel-front/src/main/resources/templates/mobile/index.html index 25e1aa8..90ba611 100644 --- a/novel-front/src/main/resources/templates/mobile/index.html +++ b/novel-front/src/main/resources/templates/mobile/index.html @@ -41,18 +41,16 @@ } .user_link { - position: relative; - display: inline-block; vertical-align: middle; - line-height: 50px; - padding: 0 5px; - color: #fff; + line-height: 40px; float: right; + color: #3eaf7c; + padding: 11px 12px 0; } .user_link a { - color: #fff; + color: #3eaf7c; } @@ -64,92 +62,39 @@ - - - - -
+
-
+
-
+
From e7005004bbb33f603e15c6bbe0ac670df9f5a166 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Mon, 30 Oct 2023 14:01:39 +0800 Subject: [PATCH 02/26] =?UTF-8?q?perf(mobile):=20=E7=99=BB=E5=BD=95/?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E9=A1=B5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/mobile/user/login.html | 40 +++++++++---------- .../templates/mobile/user/register.html | 23 ++++++----- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/novel-front/src/main/resources/templates/mobile/user/login.html b/novel-front/src/main/resources/templates/mobile/user/login.html index 5622acb..a5ac748 100644 --- a/novel-front/src/main/resources/templates/mobile/user/login.html +++ b/novel-front/src/main/resources/templates/mobile/user/login.html @@ -25,19 +25,20 @@
-
+
-
-
@@ -49,8 +50,8 @@
- - + + 注册
@@ -62,25 +63,25 @@
- \ No newline at end of file diff --git a/novel-front/src/main/resources/templates/mobile/user/register.html b/novel-front/src/main/resources/templates/mobile/user/register.html index 343606d..d9b2370 100644 --- a/novel-front/src/main/resources/templates/mobile/user/register.html +++ b/novel-front/src/main/resources/templates/mobile/user/register.html @@ -25,20 +25,21 @@
-
+
-
-
@@ -46,7 +47,7 @@
-
- - + + 登录
@@ -68,9 +69,9 @@
- \ No newline at end of file From 0d6e0ffb062eec27aeec0edecf86d13d89669921 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Mon, 30 Oct 2023 14:07:31 +0800 Subject: [PATCH 03/26] =?UTF-8?q?perf(mobile):=20=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E9=A1=B5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去掉小说内容前面的多余空格 --- .../src/main/resources/templates/mobile/book/book_content.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novel-front/src/main/resources/templates/mobile/book/book_content.html b/novel-front/src/main/resources/templates/mobile/book/book_content.html index d884013..0dee97c 100644 --- a/novel-front/src/main/resources/templates/mobile/book/book_content.html +++ b/novel-front/src/main/resources/templates/mobile/book/book_content.html @@ -241,7 +241,7 @@
-

     +

From 07bed12fa50342386292554bc7f9deaa168569a7 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Mon, 30 Oct 2023 14:17:03 +0800 Subject: [PATCH 04/26] =?UTF-8?q?fix(mobile):=20=E5=85=85=E5=80=BC?= =?UTF-8?q?=E9=A1=B5=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- novel-front/src/main/resources/templates/mobile/pay/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novel-front/src/main/resources/templates/mobile/pay/index.html b/novel-front/src/main/resources/templates/mobile/pay/index.html index 35e75bf..362856b 100644 --- a/novel-front/src/main/resources/templates/mobile/pay/index.html +++ b/novel-front/src/main/resources/templates/mobile/pay/index.html @@ -5,7 +5,7 @@ - + From 8a63cff0b5f223476734d1b38138c44e745eb4ac Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Tue, 31 Oct 2023 08:24:54 +0800 Subject: [PATCH 05/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f040b53..96d1be6 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ novel-plus -- 父工程 ## 演示视频 -https://www.bilibili.com/video/BV1Zo4y187Mi +https://www.bilibili.com/video/BV18e41197xs ## 增值服务 From c62da9bb3a9b3603014d0edb436146512631100d Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Fri, 29 Dec 2023 00:11:01 +0800 Subject: [PATCH 06/26] =?UTF-8?q?fix:=20nickName=E3=80=81userPhoto=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/java2nb/novel/entity/User.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/novel-common/src/main/java/com/java2nb/novel/entity/User.java b/novel-common/src/main/java/com/java2nb/novel/entity/User.java index fd3805e..04b93af 100644 --- a/novel-common/src/main/java/com/java2nb/novel/entity/User.java +++ b/novel-common/src/main/java/com/java2nb/novel/entity/User.java @@ -14,43 +14,48 @@ public class User { private Long id; - @NotBlank(groups = {AddGroup.class},message="手机号不能为空!") - @Pattern(groups = {AddGroup.class},regexp="^1[3|4|5|6|7|8|9][0-9]{9}$",message="手机号格式不正确!") + @NotBlank(groups = {AddGroup.class}, message = "手机号不能为空!") + @Pattern(groups = {AddGroup.class}, regexp = "^1[3|4|5|6|7|8|9][0-9]{9}$", message = "手机号格式不正确!") + @Null(groups = {UpdateGroup.class}) @Generated("org.mybatis.generator.api.MyBatisGenerator") private String username; - @NotBlank(groups = {AddGroup.class},message="密码不能为空!") + @NotBlank(groups = {AddGroup.class}, message = "密码不能为空!") @Null(groups = {UpdateGroup.class}) @Generated("org.mybatis.generator.api.MyBatisGenerator") private String password; @Null(groups = {AddGroup.class}) + @Pattern(groups = { + UpdateGroup.class}, regexp = "[\u4E00-\u9FA5A-Za-z0-9_]{1,20}", message = "昵称格式不正确!") @Generated("org.mybatis.generator.api.MyBatisGenerator") private String nickName; @Null(groups = {AddGroup.class}) + @Pattern(groups = { + UpdateGroup.class}, regexp = "^/localPic/\\d{4}/\\d{2}/\\d{2}/[A-Za-z0-9]+\\.(jpg|jpeg|swf|gif|png|JPG|JPEG|SWF|GIF|PNG)$", message = "只能上传图片格式的文件!") @Generated("org.mybatis.generator.api.MyBatisGenerator") private String userPhoto; @Null(groups = {AddGroup.class}) - @Min(value = 0,groups = {UpdateGroup.class}) - @Max(value = 1,groups = {UpdateGroup.class}) + @Min(value = 0, groups = {UpdateGroup.class}) + @Max(value = 1, groups = {UpdateGroup.class}) @Generated("org.mybatis.generator.api.MyBatisGenerator") private Byte userSex; - @Null(groups = {AddGroup.class,UpdateGroup.class}) + @Null(groups = {AddGroup.class, UpdateGroup.class}) @Generated("org.mybatis.generator.api.MyBatisGenerator") private Long accountBalance; - @Null(groups = {AddGroup.class,UpdateGroup.class}) + @Null(groups = {AddGroup.class, UpdateGroup.class}) @Generated("org.mybatis.generator.api.MyBatisGenerator") private Byte status; - @Null(groups = {AddGroup.class,UpdateGroup.class}) + @Null(groups = {AddGroup.class, UpdateGroup.class}) @Generated("org.mybatis.generator.api.MyBatisGenerator") private Date createTime; - @Null(groups = {AddGroup.class,UpdateGroup.class}) + @Null(groups = {AddGroup.class, UpdateGroup.class}) @Generated("org.mybatis.generator.api.MyBatisGenerator") private Date updateTime; From f77792aa3c5f88d9d47b38024325e67c0a2dfc26 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Fri, 29 Dec 2023 00:34:04 +0800 Subject: [PATCH 07/26] =?UTF-8?q?perf:=20=E9=99=90=E5=88=B6=E6=98=B5?= =?UTF-8?q?=E7=A7=B0=E9=95=BF=E5=BA=A6=E5=B9=B6=E4=BC=98=E5=8C=96=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/java2nb/novel/entity/User.java | 2 +- .../src/main/resources/static/css/base.css | 2 +- .../src/main/resources/static/css/base.css | 2 +- .../resources/templates/user/set_name.html | 2 +- templates/green/static/css/base.css | 2 +- templates/orange/static/css/base.css | 1086 ++++++++++++++--- 6 files changed, 914 insertions(+), 182 deletions(-) diff --git a/novel-common/src/main/java/com/java2nb/novel/entity/User.java b/novel-common/src/main/java/com/java2nb/novel/entity/User.java index 04b93af..a3a1d5a 100644 --- a/novel-common/src/main/java/com/java2nb/novel/entity/User.java +++ b/novel-common/src/main/java/com/java2nb/novel/entity/User.java @@ -27,7 +27,7 @@ public class User { @Null(groups = {AddGroup.class}) @Pattern(groups = { - UpdateGroup.class}, regexp = "[\u4E00-\u9FA5A-Za-z0-9_]{1,20}", message = "昵称格式不正确!") + UpdateGroup.class}, regexp = "[\u4E00-\u9FA5A-Za-z0-9_]{1,11}", message = "昵称格式不正确!") @Generated("org.mybatis.generator.api.MyBatisGenerator") private String nickName; diff --git a/novel-crawl/src/main/resources/static/css/base.css b/novel-crawl/src/main/resources/static/css/base.css index 2a405a3..1246d57 100644 --- a/novel-crawl/src/main/resources/static/css/base.css +++ b/novel-crawl/src/main/resources/static/css/base.css @@ -331,7 +331,7 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { } .logo { - width: 198px; + width: 160px; float: left; padding: 23px 130px 0 0; display: block diff --git a/novel-front/src/main/resources/static/css/base.css b/novel-front/src/main/resources/static/css/base.css index 2a405a3..1246d57 100644 --- a/novel-front/src/main/resources/static/css/base.css +++ b/novel-front/src/main/resources/static/css/base.css @@ -331,7 +331,7 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { } .logo { - width: 198px; + width: 160px; float: left; padding: 23px 130px 0 0; display: block diff --git a/novel-front/src/main/resources/templates/user/set_name.html b/novel-front/src/main/resources/templates/user/set_name.html index 40e8037..e9cd0d8 100644 --- a/novel-front/src/main/resources/templates/user/set_name.html +++ b/novel-front/src/main/resources/templates/user/set_name.html @@ -27,7 +27,7 @@
  • 我的昵称
  •  用户名只能包括汉字、英文字母、数字和下划线
  •   Date: Fri, 29 Dec 2023 18:54:53 +0800 Subject: [PATCH 08/26] =?UTF-8?q?fix(novel-admin):=20=E5=8F=8B=E6=83=85?= =?UTF-8?q?=E9=93=BE=E6=8E=A5URL=E6=A0=BC=E5=BC=8F=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FriendLinkController.java | 5 +- .../java2nb/novel/domain/FriendLinkDO.java | 304 +++++++++--------- .../templates/novel/friendLink/add.html | 2 +- .../templates/novel/friendLink/edit.html | 2 +- 4 files changed, 163 insertions(+), 150 deletions(-) diff --git a/novel-admin/src/main/java/com/java2nb/novel/controller/FriendLinkController.java b/novel-admin/src/main/java/com/java2nb/novel/controller/FriendLinkController.java index a26a40a..dd86893 100644 --- a/novel-admin/src/main/java/com/java2nb/novel/controller/FriendLinkController.java +++ b/novel-admin/src/main/java/com/java2nb/novel/controller/FriendLinkController.java @@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -83,7 +84,7 @@ public class FriendLinkController { @ResponseBody @PostMapping("/save") @RequiresPermissions("novel:friendLink:add") - public R save(FriendLinkDO friendLink) { + public R save(@Validated FriendLinkDO friendLink) { if (friendLinkService.save(friendLink) > 0) { redisTemplate.delete(CacheKey.INDEX_LINK_KEY); return R.ok(); @@ -98,7 +99,7 @@ public class FriendLinkController { @ResponseBody @RequestMapping("/update") @RequiresPermissions("novel:friendLink:edit") - public R update(FriendLinkDO friendLink) { + public R update(@Validated FriendLinkDO friendLink) { friendLinkService.update(friendLink); redisTemplate.delete(CacheKey.INDEX_LINK_KEY); return R.ok(); diff --git a/novel-admin/src/main/java/com/java2nb/novel/domain/FriendLinkDO.java b/novel-admin/src/main/java/com/java2nb/novel/domain/FriendLinkDO.java index b0b9d73..d026566 100644 --- a/novel-admin/src/main/java/com/java2nb/novel/domain/FriendLinkDO.java +++ b/novel-admin/src/main/java/com/java2nb/novel/domain/FriendLinkDO.java @@ -1,163 +1,175 @@ package com.java2nb.novel.domain; -import java.io.Serializable; - - -import java.math.BigDecimal; - import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.java2nb.common.jsonserializer.LongToStringSerializer; - - +import org.hibernate.validator.constraints.URL; import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; import java.util.Date; - /** - * - * * @author xiongxy * @email 1179705413@qq.com * @date 2023-04-14 15:12:25 */ public class FriendLinkDO implements Serializable { - private static final long serialVersionUID = 1L; - - //主键 - private Integer id; - //链接名 - private String linkName; - //链接url - private String linkUrl; - //排序号 - private Integer sort; - //是否开启,0:不开启,1:开启 - private Integer isOpen; - //创建人id - //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值) - //所以通过序列化成字符串来解决 - @JsonSerialize(using = LongToStringSerializer.class) - private Long createUserId; - //创建时间 - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private Date createTime; - //更新者用户id - //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值) - //所以通过序列化成字符串来解决 - @JsonSerialize(using = LongToStringSerializer.class) - private Long updateUserId; - //更新时间 - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private Date updateTime; + private static final long serialVersionUID = 1L; - /** - * 设置:主键 - */ - public void setId(Integer id) { - this.id = id; - } - /** - * 获取:主键 - */ - public Integer getId() { - return id; - } - /** - * 设置:链接名 - */ - public void setLinkName(String linkName) { - this.linkName = linkName; - } - /** - * 获取:链接名 - */ - public String getLinkName() { - return linkName; - } - /** - * 设置:链接url - */ - public void setLinkUrl(String linkUrl) { - this.linkUrl = linkUrl; - } - /** - * 获取:链接url - */ - public String getLinkUrl() { - return linkUrl; - } - /** - * 设置:排序号 - */ - public void setSort(Integer sort) { - this.sort = sort; - } - /** - * 获取:排序号 - */ - public Integer getSort() { - return sort; - } - /** - * 设置:是否开启,0:不开启,1:开启 - */ - public void setIsOpen(Integer isOpen) { - this.isOpen = isOpen; - } - /** - * 获取:是否开启,0:不开启,1:开启 - */ - public Integer getIsOpen() { - return isOpen; - } - /** - * 设置:创建人id - */ - public void setCreateUserId(Long createUserId) { - this.createUserId = createUserId; - } - /** - * 获取:创建人id - */ - public Long getCreateUserId() { - return createUserId; - } - /** - * 设置:创建时间 - */ - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - /** - * 获取:创建时间 - */ - public Date getCreateTime() { - return createTime; - } - /** - * 设置:更新者用户id - */ - public void setUpdateUserId(Long updateUserId) { - this.updateUserId = updateUserId; - } - /** - * 获取:更新者用户id - */ - public Long getUpdateUserId() { - return updateUserId; - } - /** - * 设置:更新时间 - */ - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } - /** - * 获取:更新时间 - */ - public Date getUpdateTime() { - return updateTime; - } + + //主键 + private Integer id; + //链接名 + private String linkName; + //链接url + @URL + private String linkUrl; + //排序号 + private Integer sort; + //是否开启,0:不开启,1:开启 + private Integer isOpen; + //创建人id + //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值) + //所以通过序列化成字符串来解决 + @JsonSerialize(using = LongToStringSerializer.class) + private Long createUserId; + //创建时间 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + //更新者用户id + //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值) + //所以通过序列化成字符串来解决 + @JsonSerialize(using = LongToStringSerializer.class) + private Long updateUserId; + //更新时间 + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 设置:主键 + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取:主键 + */ + public Integer getId() { + return id; + } + + /** + * 设置:链接名 + */ + public void setLinkName(String linkName) { + this.linkName = linkName; + } + + /** + * 获取:链接名 + */ + public String getLinkName() { + return linkName; + } + + /** + * 设置:链接url + */ + public void setLinkUrl(String linkUrl) { + this.linkUrl = linkUrl; + } + + /** + * 获取:链接url + */ + public String getLinkUrl() { + return linkUrl; + } + + /** + * 设置:排序号 + */ + public void setSort(Integer sort) { + this.sort = sort; + } + + /** + * 获取:排序号 + */ + public Integer getSort() { + return sort; + } + + /** + * 设置:是否开启,0:不开启,1:开启 + */ + public void setIsOpen(Integer isOpen) { + this.isOpen = isOpen; + } + + /** + * 获取:是否开启,0:不开启,1:开启 + */ + public Integer getIsOpen() { + return isOpen; + } + + /** + * 设置:创建人id + */ + public void setCreateUserId(Long createUserId) { + this.createUserId = createUserId; + } + + /** + * 获取:创建人id + */ + public Long getCreateUserId() { + return createUserId; + } + + /** + * 设置:创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * 获取:创建时间 + */ + public Date getCreateTime() { + return createTime; + } + + /** + * 设置:更新者用户id + */ + public void setUpdateUserId(Long updateUserId) { + this.updateUserId = updateUserId; + } + + /** + * 获取:更新者用户id + */ + public Long getUpdateUserId() { + return updateUserId; + } + + /** + * 设置:更新时间 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + /** + * 获取:更新时间 + */ + public Date getUpdateTime() { + return updateTime; + } } diff --git a/novel-admin/src/main/resources/templates/novel/friendLink/add.html b/novel-admin/src/main/resources/templates/novel/friendLink/add.html index 66e3d11..10096e1 100644 --- a/novel-admin/src/main/resources/templates/novel/friendLink/add.html +++ b/novel-admin/src/main/resources/templates/novel/friendLink/add.html @@ -23,7 +23,7 @@
    + type="url" required>
diff --git a/novel-admin/src/main/resources/templates/novel/friendLink/edit.html b/novel-admin/src/main/resources/templates/novel/friendLink/edit.html index cef908d..f04ff49 100644 --- a/novel-admin/src/main/resources/templates/novel/friendLink/edit.html +++ b/novel-admin/src/main/resources/templates/novel/friendLink/edit.html @@ -26,7 +26,7 @@ + type="url" required>
From 7bbabb349243f0c5e1372647ac748a91f46ef633 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Sat, 3 Feb 2024 14:03:23 +0800 Subject: [PATCH 09/26] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=85=85?= =?UTF-8?q?=E5=80=BC=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=9C=AA=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/java2nb/novel/controller/PayController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java b/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java index d489f9c..ff5d98b 100644 --- a/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java +++ b/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java @@ -51,7 +51,7 @@ public class PayController extends BaseController { UserDetails userDetails = getUserDetails(request); if (userDetails == null) { //未登录,跳转到登陆页面 - httpResponse.sendRedirect("/user/login.html?originUrl=/pay/aliPay?payAmount=" + payAmount); + httpResponse.sendRedirect("/user/login.html?originUrl=/pay/index.html"); } else { //创建充值订单 Long outTradeNo = orderService.createPayOrder((byte) 1, payAmount, userDetails.getId()); From 4665b5c4b93e4365f82f189dea51050cb88d94d2 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Sat, 3 Feb 2024 16:14:36 +0800 Subject: [PATCH 10/26] fix: bug --- .../novel/service/impl/OrderServiceImpl.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java index 1ff25ee..2456ce8 100644 --- a/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java +++ b/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java @@ -35,7 +35,8 @@ public class OrderServiceImpl implements OrderService { @Override public Long createPayOrder(Byte payChannel, Integer payAmount, Long userId) { Date currentDate = new Date(); - Long outTradeNo = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(currentDate)+new Random().nextInt(10)); + Long outTradeNo = Long.parseLong( + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(currentDate) + new Random().nextInt(10)); OrderPay orderPay = new OrderPay(); orderPay.setOutTradeNo(outTradeNo); orderPay.setPayChannel(payChannel); @@ -50,15 +51,17 @@ public class OrderServiceImpl implements OrderService { @Transactional(rollbackFor = Exception.class) @Override public void updatePayOrder(Long outTradeNo, String tradeNo, String tradeStatus) { - SelectStatementProvider selectStatement = select(OrderPayDynamicSqlSupport.id,OrderPayDynamicSqlSupport.payStatus,OrderPayDynamicSqlSupport.totalAmount,OrderPayDynamicSqlSupport.userId) - .from(OrderPayDynamicSqlSupport.orderPay) - .where(OrderPayDynamicSqlSupport.outTradeNo, isEqualTo(outTradeNo)) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(OrderPayDynamicSqlSupport.id, + OrderPayDynamicSqlSupport.payStatus, OrderPayDynamicSqlSupport.totalAmount, + OrderPayDynamicSqlSupport.userId) + .from(OrderPayDynamicSqlSupport.orderPay) + .where(OrderPayDynamicSqlSupport.outTradeNo, isEqualTo(outTradeNo)) + .build() + .render(RenderingStrategies.MYBATIS3); OrderPay orderPay = orderPayMapper.selectMany(selectStatement).get(0); - if(orderPay.getPayStatus()!=1) { + if (orderPay.getPayStatus().intValue() != 1) { //此订单还未处理过 if (tradeStatus.equals("TRADE_SUCCESS") || tradeStatus.equals("TRADE_FINISHED")) { @@ -69,17 +72,12 @@ public class OrderServiceImpl implements OrderService { orderPayMapper.updateByPrimaryKeySelective(orderPay); //2.增加用户余额 - userService.addAmount(orderPay.getUserId(),orderPay.getTotalAmount()*100); - - - - + userService.addAmount(orderPay.getUserId(), orderPay.getTotalAmount() * 100); } } - } } From 4c82c2d72043eb00f5ce01d6be218a5043aac9cb Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Sun, 4 Feb 2024 12:25:26 +0800 Subject: [PATCH 11/26] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../novel/controller/PayController.java | 23 +- .../java2nb/novel/mapper/FrontUserMapper.java | 15 ++ .../java2nb/novel/service/OrderService.java | 16 +- .../novel/service/impl/OrderServiceImpl.java | 35 +-- .../novel/service/impl/UserServiceImpl.java | 204 +++++++++--------- .../resources/mybatis/mapping/UserMapper.xml | 13 ++ 6 files changed, 161 insertions(+), 145 deletions(-) create mode 100644 novel-front/src/main/java/com/java2nb/novel/mapper/FrontUserMapper.java create mode 100644 novel-front/src/main/resources/mybatis/mapping/UserMapper.xml diff --git a/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java b/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java index ff5d98b..f5bb878 100644 --- a/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java +++ b/novel-front/src/main/java/com/java2nb/novel/controller/PayController.java @@ -121,7 +121,7 @@ public class PayController extends BaseController { PrintWriter out = httpResponse.getWriter(); - //获取支付宝POST过来反馈信息 + //获取支付宝POST过来的信息 Map params = new HashMap<>(); Map requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { @@ -134,18 +134,10 @@ public class PayController extends BaseController { params.put(name, valueStr); } - //调用SDK验证签名 + //验证签名 boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getPublicKey(), alipayConfig.getCharset(), alipayConfig.getSignType()); - //——请在这里编写您的程序(以下代码仅作参考)—— - - /* 实际验证过程建议商户务必添加以下校验: - 1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, - 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), - 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) - 4、验证app_id是否为该商户本身。 - */ if (signVerified) { //验证成功 //商户订单号 @@ -160,21 +152,18 @@ public class PayController extends BaseController { String tradeStatus = new String(request.getParameter("trade_status").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); - //更新订单状态 - orderService.updatePayOrder(Long.parseLong(outTradeNo), tradeNo, tradeStatus); + if ("TRADE_SUCCESS".equals(tradeStatus)) { + //支付成功 + orderService.updatePayOrder(Long.parseLong(outTradeNo), tradeNo, 1); + } out.println("success"); } else {//验证失败 out.println("fail"); - //调试用,写文本函数记录程序运行情况是否正常 - //String sWord = AlipaySignature.getSignCheckContentV1(params); - //AlipayConfig.logResult(sWord); } - } - } \ No newline at end of file diff --git a/novel-front/src/main/java/com/java2nb/novel/mapper/FrontUserMapper.java b/novel-front/src/main/java/com/java2nb/novel/mapper/FrontUserMapper.java new file mode 100644 index 0000000..1242c77 --- /dev/null +++ b/novel-front/src/main/java/com/java2nb/novel/mapper/FrontUserMapper.java @@ -0,0 +1,15 @@ +package com.java2nb.novel.mapper; + +import org.apache.ibatis.annotations.Param; + +/** + * @author Administrator + */ +public interface FrontUserMapper extends UserMapper { + + + + void addUserBalance(@Param("userId") Long userId, @Param("amount") Integer amount); + + +} diff --git a/novel-front/src/main/java/com/java2nb/novel/service/OrderService.java b/novel-front/src/main/java/com/java2nb/novel/service/OrderService.java index 83d5109..7974497 100644 --- a/novel-front/src/main/java/com/java2nb/novel/service/OrderService.java +++ b/novel-front/src/main/java/com/java2nb/novel/service/OrderService.java @@ -1,7 +1,6 @@ package com.java2nb.novel.service; - /** * @author 11797 */ @@ -12,18 +11,19 @@ public interface OrderService { * 创建充值订单 * * @param payChannel 支付渠道 - * @param payAmount 支付金额 - * @param userId 用户ID + * @param payAmount 支付金额 + * @param userId 用户ID * @return 商户订单号 - * */ + */ Long createPayOrder(Byte payChannel, Integer payAmount, Long userId); /** * 更新订单状态 + * * @param outTradeNo 商户订单号 - * @param tradeNo 支付宝/微信 订单号 - * @param tradeStatus 支付状态 - * */ - void updatePayOrder(Long outTradeNo, String tradeNo, String tradeStatus); + * @param tradeNo 支付宝/微信 订单号 + * @param payStatus 支付状态 + */ + void updatePayOrder(Long outTradeNo, String tradeNo, int payStatus); } diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java index 2456ce8..c7d10ac 100644 --- a/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java +++ b/novel-front/src/main/java/com/java2nb/novel/service/impl/OrderServiceImpl.java @@ -9,6 +9,7 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.mybatis.dynamic.sql.render.RenderingStrategies; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; +import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,6 +18,7 @@ import java.util.Date; import java.util.Random; import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo; +import static org.mybatis.dynamic.sql.SqlBuilder.update; import static org.mybatis.dynamic.sql.select.SelectDSL.select; /** @@ -50,7 +52,7 @@ public class OrderServiceImpl implements OrderService { @Transactional(rollbackFor = Exception.class) @Override - public void updatePayOrder(Long outTradeNo, String tradeNo, String tradeStatus) { + public void updatePayOrder(Long outTradeNo, String tradeNo, int payStatus) { SelectStatementProvider selectStatement = select(OrderPayDynamicSqlSupport.id, OrderPayDynamicSqlSupport.payStatus, OrderPayDynamicSqlSupport.totalAmount, OrderPayDynamicSqlSupport.userId) @@ -59,25 +61,30 @@ public class OrderServiceImpl implements OrderService { .build() .render(RenderingStrategies.MYBATIS3); - OrderPay orderPay = orderPayMapper.selectMany(selectStatement).get(0); + OrderPay orderPay = orderPayMapper.selectOne(selectStatement).orElse(null); - if (orderPay.getPayStatus().intValue() != 1) { - //此订单还未处理过 - - if (tradeStatus.equals("TRADE_SUCCESS") || tradeStatus.equals("TRADE_FINISHED")) { + if (orderPay.getPayStatus().intValue() == 2) { + //待支付订单处理 + if (payStatus == 1) { //支付成功 //1.更新订单状态为成功 - orderPay.setPayStatus((byte) 1); - orderPay.setUpdateTime(new Date()); - orderPayMapper.updateByPrimaryKeySelective(orderPay); - - //2.增加用户余额 - userService.addAmount(orderPay.getUserId(), orderPay.getTotalAmount() * 100); - + UpdateStatementProvider updateStatement = update(OrderPayDynamicSqlSupport.orderPay) + .set(OrderPayDynamicSqlSupport.tradeNo).equalTo(tradeNo) + .set(OrderPayDynamicSqlSupport.payStatus).equalTo((byte) 1) + .set(OrderPayDynamicSqlSupport.updateTime).equalTo(new Date()) + .where(OrderPayDynamicSqlSupport.id, isEqualTo(orderPay.getId())) + .and(OrderPayDynamicSqlSupport.payStatus, isEqualTo((byte) 2)) + .build() + .render(RenderingStrategies.MYBATIS3); + int updateRow = orderPayMapper.update(updateStatement); + if (updateRow > 0) { + //更新成功 + //2.增加用户余额 + userService.addAmount(orderPay.getUserId(), orderPay.getTotalAmount() * 100); + } } } - } } diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/UserServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/UserServiceImpl.java index bd85505..98418fb 100644 --- a/novel-front/src/main/java/com/java2nb/novel/service/impl/UserServiceImpl.java +++ b/novel-front/src/main/java/com/java2nb/novel/service/impl/UserServiceImpl.java @@ -1,20 +1,20 @@ package com.java2nb.novel.service.impl; import com.github.pagehelper.PageHelper; -import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.UserDetails; -import com.java2nb.novel.entity.*; -import com.java2nb.novel.entity.User; -import com.java2nb.novel.service.UserService; import com.java2nb.novel.core.enums.ResponseStatus; +import com.java2nb.novel.entity.User; +import com.java2nb.novel.entity.*; +import com.java2nb.novel.mapper.*; +import com.java2nb.novel.service.UserService; +import com.java2nb.novel.vo.BookReadHistoryVO; +import com.java2nb.novel.vo.BookShelfVO; +import com.java2nb.novel.vo.UserFeedbackVO; +import io.github.xxyopen.model.page.PageBean; import io.github.xxyopen.model.page.builder.pagehelper.PageBuilder; import io.github.xxyopen.util.IdWorker; import io.github.xxyopen.util.MD5Util; import io.github.xxyopen.web.exception.BusinessException; -import com.java2nb.novel.mapper.*; -import com.java2nb.novel.vo.BookReadHistoryVO; -import com.java2nb.novel.vo.BookShelfVO; -import com.java2nb.novel.vo.UserFeedbackVO; import io.github.xxyopen.web.util.BeanUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -46,7 +46,7 @@ import static org.mybatis.dynamic.sql.select.SelectDSL.select; @RequiredArgsConstructor public class UserServiceImpl implements UserService { - private final UserMapper userMapper; + private final FrontUserMapper userMapper; private final FrontUserBookshelfMapper userBookshelfMapper; @@ -63,17 +63,17 @@ public class UserServiceImpl implements UserService { public UserDetails register(User user) { //查询用户名是否已注册 SelectStatementProvider selectStatement = select(count(id)) - .from(UserDynamicSqlSupport.user) - .where(username, isEqualTo(user.getUsername())) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(UserDynamicSqlSupport.user) + .where(username, isEqualTo(user.getUsername())) + .build() + .render(RenderingStrategies.MYBATIS3); long count = userMapper.count(selectStatement); if (count > 0) { //用户名已注册 throw new BusinessException(ResponseStatus.USERNAME_EXIST); } User entity = new User(); - BeanUtils.copyProperties(user,entity); + BeanUtils.copyProperties(user, entity); //数据库生成注册记录 Long id = idWorker.nextId(); entity.setId(id); @@ -94,12 +94,12 @@ public class UserServiceImpl implements UserService { @Override public UserDetails login(User user) { //根据用户名密码查询记录 - SelectStatementProvider selectStatement = select(id, username,nickName) - .from(UserDynamicSqlSupport.user) - .where(username, isEqualTo(user.getUsername())) - .and(password, isEqualTo(MD5Util.MD5Encode(user.getPassword(), Charsets.UTF_8.name()))) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(id, username, nickName) + .from(UserDynamicSqlSupport.user) + .where(username, isEqualTo(user.getUsername())) + .and(password, isEqualTo(MD5Util.MD5Encode(user.getPassword(), Charsets.UTF_8.name()))) + .build() + .render(RenderingStrategies.MYBATIS3); List users = userMapper.selectMany(selectStatement); if (users.size() == 0) { throw new BusinessException(ResponseStatus.USERNAME_PASS_ERROR); @@ -116,11 +116,11 @@ public class UserServiceImpl implements UserService { @Override public Boolean queryIsInShelf(Long userId, Long bookId) { SelectStatementProvider selectStatement = select(count(UserBookshelfDynamicSqlSupport.id)) - .from(userBookshelf) - .where(UserBookshelfDynamicSqlSupport.userId, isEqualTo(userId)) - .and(UserBookshelfDynamicSqlSupport.bookId, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(userBookshelf) + .where(UserBookshelfDynamicSqlSupport.userId, isEqualTo(userId)) + .and(UserBookshelfDynamicSqlSupport.bookId, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3); return userBookshelfMapper.count(selectStatement) > 0; } @@ -141,10 +141,10 @@ public class UserServiceImpl implements UserService { @Override public void removeFromBookShelf(Long userId, Long bookId) { DeleteStatementProvider deleteStatement = deleteFrom(userBookshelf) - .where(UserBookshelfDynamicSqlSupport.userId, isEqualTo(userId)) - .and(UserBookshelfDynamicSqlSupport.bookId, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .where(UserBookshelfDynamicSqlSupport.userId, isEqualTo(userId)) + .and(UserBookshelfDynamicSqlSupport.bookId, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3); userBookshelfMapper.delete(deleteStatement); } @@ -162,10 +162,10 @@ public class UserServiceImpl implements UserService { Date currentDate = new Date(); //删除该书以前的历史记录 DeleteStatementProvider deleteStatement = deleteFrom(userReadHistory) - .where(UserReadHistoryDynamicSqlSupport.bookId, isEqualTo(bookId)) - .and(UserReadHistoryDynamicSqlSupport.userId, isEqualTo(userId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .where(UserReadHistoryDynamicSqlSupport.bookId, isEqualTo(bookId)) + .and(UserReadHistoryDynamicSqlSupport.userId, isEqualTo(userId)) + .build() + .render(RenderingStrategies.MYBATIS3); userReadHistoryMapper.delete(deleteStatement); //插入该书新的历史记录 @@ -177,17 +177,16 @@ public class UserServiceImpl implements UserService { userReadHistory.setUpdateTime(currentDate); userReadHistoryMapper.insertSelective(userReadHistory); - //更新书架的阅读历史 UpdateStatementProvider updateStatement = update(userBookshelf) - .set(UserBookshelfDynamicSqlSupport.preContentId) - .equalTo(preContentId) - .set(UserBookshelfDynamicSqlSupport.updateTime) - .equalTo(currentDate) - .where(UserBookshelfDynamicSqlSupport.userId, isEqualTo(userId)) - .and(UserBookshelfDynamicSqlSupport.bookId, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .set(UserBookshelfDynamicSqlSupport.preContentId) + .equalTo(preContentId) + .set(UserBookshelfDynamicSqlSupport.updateTime) + .equalTo(currentDate) + .where(UserBookshelfDynamicSqlSupport.userId, isEqualTo(userId)) + .and(UserBookshelfDynamicSqlSupport.bookId, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3); userBookshelfMapper.update(updateStatement); @@ -206,25 +205,26 @@ public class UserServiceImpl implements UserService { @Override public PageBean listUserFeedBackByPage(Long userId, int page, int pageSize) { PageHelper.startPage(page, pageSize); - SelectStatementProvider selectStatement = select(UserFeedbackDynamicSqlSupport.content, UserFeedbackDynamicSqlSupport.createTime) - .from(userFeedback) - .where(UserFeedbackDynamicSqlSupport.userId, isEqualTo(userId)) - .orderBy(UserFeedbackDynamicSqlSupport.id.descending()) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(UserFeedbackDynamicSqlSupport.content, + UserFeedbackDynamicSqlSupport.createTime) + .from(userFeedback) + .where(UserFeedbackDynamicSqlSupport.userId, isEqualTo(userId)) + .orderBy(UserFeedbackDynamicSqlSupport.id.descending()) + .build() + .render(RenderingStrategies.MYBATIS3); List userFeedbacks = userFeedbackMapper.selectMany(selectStatement); PageBean pageBean = PageBuilder.build(userFeedbacks); - pageBean.setList(BeanUtil.copyList(userFeedbacks,UserFeedbackVO.class)); + pageBean.setList(BeanUtil.copyList(userFeedbacks, UserFeedbackVO.class)); return pageBean; } @Override public User userInfo(Long userId) { - SelectStatementProvider selectStatement = select(username, nickName, userPhoto,userSex,accountBalance) - .from(user) - .where(id, isEqualTo(userId)) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(username, nickName, userPhoto, userSex, accountBalance) + .from(user) + .where(id, isEqualTo(userId)) + .build() + .render(RenderingStrategies.MYBATIS3); return userMapper.selectMany(selectStatement).get(0); } @@ -245,39 +245,35 @@ public class UserServiceImpl implements UserService { @Override public void updatePassword(Long userId, String oldPassword, String newPassword) { SelectStatementProvider selectStatement = select(password) - .from(user) - .where(id,isEqualTo(userId)) - .build() - .render(RenderingStrategies.MYBATIS3); - if(!userMapper.selectMany(selectStatement).get(0).getPassword().equals(MD5Util.MD5Encode(oldPassword, Charsets.UTF_8.name()))){ + .from(user) + .where(id, isEqualTo(userId)) + .build() + .render(RenderingStrategies.MYBATIS3); + if (!userMapper.selectMany(selectStatement).get(0).getPassword() + .equals(MD5Util.MD5Encode(oldPassword, Charsets.UTF_8.name()))) { throw new BusinessException(ResponseStatus.OLD_PASSWORD_ERROR); } UpdateStatementProvider updateStatement = update(user) - .set(password) - .equalTo(MD5Util.MD5Encode(newPassword, Charsets.UTF_8.name())) - .where(id,isEqualTo(userId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .set(password) + .equalTo(MD5Util.MD5Encode(newPassword, Charsets.UTF_8.name())) + .where(id, isEqualTo(userId)) + .build() + .render(RenderingStrategies.MYBATIS3); userMapper.update(updateStatement); } - @Transactional(rollbackFor = Exception.class) @Override public void addAmount(Long userId, int amount) { - User user = this.userInfo(userId); - user.setId(userId); - user.setAccountBalance(user.getAccountBalance()+amount); - userMapper.updateByPrimaryKeySelective(user); - + userMapper.addUserBalance(userId, amount); } @Override public boolean queryIsBuyBookIndex(Long userId, Long bookIndexId) { return userBuyRecordMapper.count(c -> - c.where(UserBuyRecordDynamicSqlSupport.userId, isEqualTo(userId)) - .and(UserBuyRecordDynamicSqlSupport.bookIndexId,isEqualTo(bookIndexId))) > 0; + c.where(UserBuyRecordDynamicSqlSupport.userId, isEqualTo(userId)) + .and(UserBuyRecordDynamicSqlSupport.bookIndexId, isEqualTo(bookIndexId))) > 0; } @Transactional(rollbackFor = Exception.class) @@ -285,7 +281,7 @@ public class UserServiceImpl implements UserService { public void buyBookIndex(Long userId, UserBuyRecord buyRecord) { //查询用户余额 long balance = userInfo(userId).getAccountBalance(); - if(balance bookIds, Date startTime, Date endTime) { return userMapper.selectStatistic(select(countDistinct(UserBuyRecordDynamicSqlSupport.userId)) - .from(UserBuyRecordDynamicSqlSupport.userBuyRecord) - .where(UserBuyRecordDynamicSqlSupport.bookId,isIn(bookIds)) - .and(UserBuyRecordDynamicSqlSupport.createTime,isGreaterThanOrEqualTo(startTime)) - .and(UserBuyRecordDynamicSqlSupport.createTime,isLessThanOrEqualTo(endTime)) - .build() - .render(RenderingStrategies.MYBATIS3)); + .from(UserBuyRecordDynamicSqlSupport.userBuyRecord) + .where(UserBuyRecordDynamicSqlSupport.bookId, isIn(bookIds)) + .and(UserBuyRecordDynamicSqlSupport.createTime, isGreaterThanOrEqualTo(startTime)) + .and(UserBuyRecordDynamicSqlSupport.createTime, isLessThanOrEqualTo(endTime)) + .build() + .render(RenderingStrategies.MYBATIS3)); } - - - - } diff --git a/novel-front/src/main/resources/mybatis/mapping/UserMapper.xml b/novel-front/src/main/resources/mybatis/mapping/UserMapper.xml new file mode 100644 index 0000000..48dbc26 --- /dev/null +++ b/novel-front/src/main/resources/mybatis/mapping/UserMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + update user set account_balance = account_balance + ${amount} + where id = #{userId} + + + + \ No newline at end of file From 82758271e37161f15f81b5c374a260dd682838d1 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Mon, 5 Feb 2024 12:05:26 +0800 Subject: [PATCH 12/26] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E6=92=AD=E6=94=BE=E5=B0=8F=E8=AF=B4=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/mobile/book/book_content.html | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/novel-front/src/main/resources/templates/mobile/book/book_content.html b/novel-front/src/main/resources/templates/mobile/book/book_content.html index 0dee97c..59c91da 100644 --- a/novel-front/src/main/resources/templates/mobile/book/book_content.html +++ b/novel-front/src/main/resources/templates/mobile/book/book_content.html @@ -210,6 +210,26 @@ 字体: + + + + + + + + + + + +

@@ -389,6 +409,79 @@ } + console.log(speechSynthesis.getVoices()); + + $(window).on('beforeunload', function () { + if (speechSynthesis.speaking) { + speechSynthesis.cancel() + } + }); + + function speakChapter() { + console.log('speechSynthesis.paused', speechSynthesis.paused) + console.log('speechSynthesis.pending', speechSynthesis.pending) + console.log('speechSynthesis.speaking', speechSynthesis.speaking) + if (speechSynthesis.speaking && !speechSynthesis.paused) { + speechSynthesis.pause(); + return; + } + if (speechSynthesis.speaking && speechSynthesis.paused) { + speechSynthesis.resume(); + } + speak({ + 'text': $('#chaptercontent').text(), + 'speechRate': 0.5, + 'pitch': 1, + 'lang': 'zh-CN' + }, function () { + console.log('语音播放结束'); + }, function () { + console.log('语音开始播放'); + }); + + + } + + /** + * @description 文字转语音方法 + * @public + * @param { text, rate, lang, volume, pitch } object + * @param text 要合成的文字内容,字符串 + * @param speechRate 读取文字的语速 0.1~10 正常1 + * @param lang 读取文字时的语言 + * @param volume 读取时声音的音量 0~1 正常1 + * @param voice 读取文字的语音服务 + * @param pitch 读取时声音的音高 0~2 正常1 + * @returns SpeechSynthesisUtterance + */ + function speak({text, speechRate, lang, volume, pitch, voice}, endEvent, startEvent) { + if (!window.SpeechSynthesisUtterance) { + console.warn('当前浏览器不支持文字转语音服务') + return; + } + + if (!text) { + return; + } + + const speechUtterance = new SpeechSynthesisUtterance(); + speechUtterance.text = text; + speechUtterance.rate = speechRate || 1; + speechUtterance.lang = lang || 'zh-CN'; + speechUtterance.volume = volume || 1; + speechUtterance.pitch = pitch || 1; + speechUtterance.voice = voice || null; + speechUtterance.onend = function () { + endEvent && endEvent(); + }; + speechUtterance.onstart = function () { + startEvent && startEvent(); + }; + speechSynthesis.speak(speechUtterance); + + return speechUtterance; + } + From 2fc533f8ae690137484102c3fea23e0ac3d5b399 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Mon, 5 Feb 2024 21:12:41 +0800 Subject: [PATCH 13/26] =?UTF-8?q?fix(novel-crawl):=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=A1=B5=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- novel-crawl/src/main/resources/templates/login.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/novel-crawl/src/main/resources/templates/login.html b/novel-crawl/src/main/resources/templates/login.html index 5454e16..decc2b0 100644 --- a/novel-crawl/src/main/resources/templates/login.html +++ b/novel-crawl/src/main/resources/templates/login.html @@ -6,9 +6,8 @@ 爬虫管理系统登录 - - + + @@ -64,92 +62,39 @@ - -
+
- - - -
+
-
+
-
+
diff --git a/templates/green/html/mobile/pay/index.html b/templates/green/html/mobile/pay/index.html index 35e75bf..362856b 100644 --- a/templates/green/html/mobile/pay/index.html +++ b/templates/green/html/mobile/pay/index.html @@ -5,7 +5,7 @@ - + diff --git a/templates/green/html/mobile/user/login.html b/templates/green/html/mobile/user/login.html index 5622acb..a5ac748 100644 --- a/templates/green/html/mobile/user/login.html +++ b/templates/green/html/mobile/user/login.html @@ -25,19 +25,20 @@
-
+
-
-
@@ -49,8 +50,8 @@
- - + + 注册
@@ -62,25 +63,25 @@
- \ No newline at end of file diff --git a/templates/green/html/mobile/user/register.html b/templates/green/html/mobile/user/register.html index 343606d..d9b2370 100644 --- a/templates/green/html/mobile/user/register.html +++ b/templates/green/html/mobile/user/register.html @@ -25,20 +25,21 @@
-
+
-
-
@@ -46,7 +47,7 @@
-
- - + + 登录
@@ -68,9 +69,9 @@
- \ No newline at end of file diff --git a/templates/green/html/user/set_name.html b/templates/green/html/user/set_name.html index 40e8037..e9cd0d8 100644 --- a/templates/green/html/user/set_name.html +++ b/templates/green/html/user/set_name.html @@ -27,7 +27,7 @@
  • 我的昵称
  •  用户名只能包括汉字、英文字母、数字和下划线
  •  登录|注册"); + // $(".user_link").html("登录注册"); } else { $.ajax({ type: "POST", @@ -118,10 +118,10 @@ if (!token) { dataType: "json", success: function (data) { if (data.code == 200) { - $(".user_link").html("" + - "\n" + - ""); + // $(".user_link").html("" + + // "\n" + + // ""); if ("/user/login.html" == window.location.pathname) { var orginUrl = getSearchString("originUrl"); window.location.href = orginUrl == undefined || orginUrl.isBlank() ? "/" : orginUrl; @@ -137,7 +137,7 @@ if (!token) { if (needLoginPath.indexOf(window.location.pathname) != -1) { location.href = '/user/login.html'; } - $(".user_link").html("登录注册"); + // $(".user_link").html("登录注册"); } }, error: function () { From 331f56d112fa12efd3496916e8117b04c101cde3 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Wed, 7 Feb 2024 14:58:36 +0800 Subject: [PATCH 15/26] =?UTF-8?q?fix:=20=E7=A7=BB=E5=8A=A8=E7=AB=AF?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=9C=A8=E6=95=B0=E6=8D=AE=E9=87=8F=E5=B0=8F?= =?UTF-8?q?=E4=BA=8E10=E6=97=B6=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- novel-front/src/main/resources/templates/mobile/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novel-front/src/main/resources/templates/mobile/index.html b/novel-front/src/main/resources/templates/mobile/index.html index 90ba611..0cc9db3 100644 --- a/novel-front/src/main/resources/templates/mobile/index.html +++ b/novel-front/src/main/resources/templates/mobile/index.html @@ -208,7 +208,7 @@ if (data.code == 200) { var updateRankBooks = data.data; var updateRankBookHtml = ""; - for (var i = 0; i < 10; i++) { + for (var i = 0; i < updateRankBooks.length; i++) { var updateRankBook = updateRankBooks[i]; if (updateRankBook.bookDesc) { From 674e4df84c8e91f05c64252beb85c69ba6a577ad Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Wed, 7 Feb 2024 14:59:31 +0800 Subject: [PATCH 16/26] =?UTF-8?q?chore:=20=E6=A8=A1=E7=89=88=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/green/html/mobile/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/green/html/mobile/index.html b/templates/green/html/mobile/index.html index 90ba611..0cc9db3 100644 --- a/templates/green/html/mobile/index.html +++ b/templates/green/html/mobile/index.html @@ -208,7 +208,7 @@ if (data.code == 200) { var updateRankBooks = data.data; var updateRankBookHtml = ""; - for (var i = 0; i < 10; i++) { + for (var i = 0; i < updateRankBooks.length; i++) { var updateRankBook = updateRankBooks[i]; if (updateRankBook.bookDesc) { From 2d218076c4db2bcfadc06d88865b2e8b9df06056 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Sun, 18 Feb 2024 10:28:29 +0800 Subject: [PATCH 17/26] =?UTF-8?q?chore:=20=E4=BF=AE=E6=94=B9=E6=89=93?= =?UTF-8?q?=E5=8C=85=E9=BB=98=E8=AE=A4=E6=A8=A1=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- novel-front/src/main/build/config/application-common-prod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novel-front/src/main/build/config/application-common-prod.yml b/novel-front/src/main/build/config/application-common-prod.yml index 714997f..f21795f 100644 --- a/novel-front/src/main/build/config/application-common-prod.yml +++ b/novel-front/src/main/build/config/application-common-prod.yml @@ -34,7 +34,7 @@ pic: #模版配置 templates: - name: orange + name: green #小说内容保存配置 content: From 34d211afbf7429807eef56b06b916fa5204deff3 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Wed, 21 Feb 2024 19:27:48 +0800 Subject: [PATCH 18/26] =?UTF-8?q?fix:=20=E5=8F=AA=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E6=9C=89=E5=86=85=E5=AE=B9=E7=9A=84=E5=B0=8F=E8=AF=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/mybatis/mapping/BookMapper.xml | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/novel-front/src/main/resources/mybatis/mapping/BookMapper.xml b/novel-front/src/main/resources/mybatis/mapping/BookMapper.xml index dae223a..b020f40 100644 --- a/novel-front/src/main/resources/mybatis/mapping/BookMapper.xml +++ b/novel-front/src/main/resources/mybatis/mapping/BookMapper.xml @@ -34,35 +34,41 @@ - - update book set visit_count = visit_count + ${visitCount} + + update book + set visit_count = visit_count + ${visitCount} where id = #{bookId} - update book set comment_count = comment_count+1 - where id = #{bookId} + update book + set comment_count = comment_count + 1 + where id = #{bookId} + select id, book_name, author_name, pic_url, book_desc, score + from book + ORDER BY score, RAND() LIMIT #{limit}; + \ No newline at end of file From 9d4dc409c6e504d3e5484fbe57009c69e77485a7 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Sun, 3 Mar 2024 11:10:46 +0800 Subject: [PATCH 19/26] =?UTF-8?q?fix:=20URI=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/static/javascript/bookdetail.js | 11 ++- .../resources/static/javascript/common.js | 73 +++++++++---------- .../main/resources/static/mobile/js/common.js | 2 +- .../templates/author/author_income.html | 43 ++++++----- .../author/author_income_detail.html | 45 ++++++------ .../resources/templates/author/index.html | 4 +- .../templates/author/index_list.html | 6 +- .../templates/book/book_content.html | 2 +- .../templates/mobile/book/book_content.html | 2 +- .../templates/mobile/book/book_detail.html | 2 +- .../resources/templates/mobile/pay/index.html | 2 +- .../templates/mobile/user/userinfo.html | 2 +- .../main/resources/templates/pay/index.html | 59 ++++++++------- .../resources/templates/user/comment.html | 19 ++--- .../resources/templates/user/favorites.html | 37 +++++----- .../resources/templates/user/feedback.html | 2 +- .../templates/user/feedback_list.html | 17 ++--- .../templates/user/read_history.html | 29 ++++---- .../resources/templates/user/set_name.html | 4 +- .../templates/user/set_password.html | 28 ++++--- .../resources/templates/user/set_sex.html | 33 +++++---- .../main/resources/templates/user/setup.html | 39 +++++----- .../resources/templates/user/userinfo.html | 27 +++---- 23 files changed, 253 insertions(+), 235 deletions(-) diff --git a/novel-front/src/main/resources/static/javascript/bookdetail.js b/novel-front/src/main/resources/static/javascript/bookdetail.js index 8d5f66b..7e78c68 100644 --- a/novel-front/src/main/resources/static/javascript/bookdetail.js +++ b/novel-front/src/main/resources/static/javascript/bookdetail.js @@ -27,15 +27,14 @@ if (layerStatus == 1) { $("#cFavs").html("已收藏"); jQuery.cookie("u-faorites", "1"); - } - else { + } else { $("#cFavs").html("已在书架"); } } else if (data.code == 1001) { //未登录 - location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href); + location.href = '/user/login.html?originUrl=' + encodeURIComponent(location.href); } else { layer.alert(data.msg); @@ -91,7 +90,7 @@ } }, SaveComment: function (cmtBId, cmtCId, cmtDetail) { - if(!isLogin){ + if (!isLogin) { layer.alert('请先登陆'); return; } @@ -121,7 +120,7 @@ } else if (data.code == 1001) { //未登录 - location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href); + location.href = '/user/login.html?originUrl=' + encodeURIComponent(location.href); } else { layer.alert(data.msg); @@ -187,7 +186,7 @@ localStorage.setItem("fonts", fonts); $(".readBox").css("font-size", fonts + "px"); $("#cFonts").html(fonts); - $("#ChapterBody").attr("class","article-content font"+fonts); + $("#ChapterBody").attr("class", "article-content font" + fonts); BookDetail.reShowCover(); }, SetBackUpColor: function (colorNum) { diff --git a/novel-front/src/main/resources/static/javascript/common.js b/novel-front/src/main/resources/static/javascript/common.js index e3fa1c8..f7f2c0a 100644 --- a/novel-front/src/main/resources/static/javascript/common.js +++ b/novel-front/src/main/resources/static/javascript/common.js @@ -1,10 +1,11 @@ -var needLoginPath = ['/user/favorites.html','/user/comment.html','/user/feedback.html', - '/user/feedback_list.html','/user/read_history.html','/user/set_name.html', - '/user/set_password.html','/user/set_sex.html','/user/setup.html','/user/userinfo.html', +var needLoginPath = ['/user/favorites.html', '/user/comment.html', '/user/feedback.html', + '/user/feedback_list.html', '/user/read_history.html', '/user/set_name.html', + '/user/set_password.html', '/user/set_sex.html', '/user/setup.html', '/user/userinfo.html', "/pay/index.html," + - "/author/register.html","/author/index.html"]; + "/author/register.html", "/author/index.html"]; var isLogin = false; var url = window.location.search; + //key(需要检索的键) function getSearchString(key) { var str = url; @@ -14,26 +15,28 @@ function getSearchString(key) { for (var i = 0; i < arr.length; i++) { var tmp_arr = arr[i].split("="); - if(tmp_arr[0] == key){ + if (tmp_arr[0] == key) { return decodeURIComponent(tmp_arr[1]); } } return undefined; } + var keyword = getSearchString("k"); -if(keyword != undefined) { +if (keyword != undefined) { $("#searchKey").val(keyword); $("#workDirection").remove(); $("#idGirl").remove(); } -function searchByK(k){ - if(!k){ - window.location.href='/book/bookclass.html?k='+encodeURIComponent(document.getElementById("searchKey").value) - }else{ - window.location.href='/book/bookclass.html?k='+encodeURIComponent(k) +function searchByK(k) { + if (!k) { + window.location.href = '/book/bookclass.html?k=' + encodeURIComponent(document.getElementById("searchKey").value) + } else { + window.location.href = '/book/bookclass.html?k=' + encodeURIComponent(k) } } + $("#searchKey").keypress(function (even) { if (even.which == 13) { even.stopPropagation(); @@ -50,37 +53,37 @@ Array.prototype.indexOf = function (val) { var token = $.cookie('Authorization'); -if(!token){ - if(needLoginPath.indexOf(window.location.pathname) != -1){ - location.href = '/user/login.html?originUrl='+decodeURIComponent(location.href); +if (!token) { + if (needLoginPath.indexOf(window.location.pathname) != -1) { + location.href = '/user/login.html?originUrl=' + encodeURIComponent(location.href); } $(".user_link").html("|登录注册"); -}else{ +} else { $.ajax({ type: "POST", url: "/user/refreshToken", data: {}, dataType: "json", - success: function(data){ - if(data.code == 200){ + success: function (data) { + if (data.code == 200) { $(".user_link").html("|" + - ""+data.data.nickName+"" + + "" + data.data.nickName + "" + "退出"); ; - if("/user/login.html" == window.location.pathname){ + if ("/user/login.html" == window.location.pathname) { var orginUrl = getSearchString("originUrl"); window.location.href = orginUrl == undefined || orginUrl.isBlank() ? "/" : orginUrl; return; } isLogin = true; - if(localStorage.getItem("autoLogin") == 1){ - $.cookie('Authorization', data.data.token, { expires: 7 ,path: '/' }); - }else { - $.cookie('Authorization', data.data.token,{ path: '/' }); + if (localStorage.getItem("autoLogin") == 1) { + $.cookie('Authorization', data.data.token, {expires: 7, path: '/'}); + } else { + $.cookie('Authorization', data.data.token, {path: '/'}); } - }else{ - if(needLoginPath.indexOf(window.location.pathname) != -1){ + } else { + if (needLoginPath.indexOf(window.location.pathname) != -1) { location.href = '/user/login.html'; } $(".user_link").html("|登录注册"); @@ -94,7 +97,6 @@ if(!token){ } - String.prototype.isPhone = function () { var strTemp = /^1[3|4|5|6|7|8|9][0-9]{9}$/; if (strTemp.test(this)) { @@ -104,7 +106,7 @@ String.prototype.isPhone = function () { }; String.prototype.isBlank = function () { - if(this == null || $.trim(this) == ""){ + if (this == null || $.trim(this) == "") { return true; } return false; @@ -118,11 +120,8 @@ String.prototype.isNickName = function () { }; - - - function logout() { - $.cookie('Authorization', null,{ path: '/' }); + $.cookie('Authorization', null, {path: '/'}); location.reload(); } @@ -133,9 +132,9 @@ function isImg(str) { //校验图片上传 -function checkPicUpload(file){ +function checkPicUpload(file) { - if(!isImg(file.value.substr(file.value.lastIndexOf(".")))){ + if (!isImg(file.value.substr(file.value.lastIndexOf(".")))) { layer.alert('只能上传图片格式的文件!'); return false; } @@ -144,13 +143,13 @@ function checkPicUpload(file){ if (isIE && !file.files) { var filePath = file.value; var fileSystem = new ActiveXObject("Scripting.FileSystemfileect"); - var file = fileSystem.GetFile (filePath); + var file = fileSystem.GetFile(filePath); fileSize = file.Size; - }else { + } else { fileSize = file.files[0].size; } - fileSize=Math.round(fileSize/1024*100)/100; //单位为KB - if(fileSize>=1024){ + fileSize = Math.round(fileSize / 1024 * 100) / 100; //单位为KB + if (fileSize >= 1024) { layer.alert('上传的图片大小不能超过1M!'); return false; } diff --git a/novel-front/src/main/resources/static/mobile/js/common.js b/novel-front/src/main/resources/static/mobile/js/common.js index 760a8de..fc19f68 100644 --- a/novel-front/src/main/resources/static/mobile/js/common.js +++ b/novel-front/src/main/resources/static/mobile/js/common.js @@ -106,7 +106,7 @@ Array.prototype.remove = function (val) { var token = $.cookie('Authorization'); if (!token) { if (needLoginPath.indexOf(window.location.pathname) != -1) { - location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href); + location.href = '/user/login.html?originUrl=' + encodeURIComponent(location.href); } // $(".user_link").html("登录注册"); diff --git a/novel-front/src/main/resources/templates/author/author_income.html b/novel-front/src/main/resources/templates/author/author_income.html index 3e9cc3a..8f4f25f 100644 --- a/novel-front/src/main/resources/templates/author/author_income.html +++ b/novel-front/src/main/resources/templates/author/author_income.html @@ -1,5 +1,5 @@ - - + @@ -7,14 +7,15 @@ 作家管理系统-小说精品屋 - +