Compare commits

...

133 Commits

Author SHA1 Message Date
2ce51d5fc0 图片更新 2020-12-04 17:06:53 +08:00
2f4b671d84 修改版本号 2020-12-04 16:50:44 +08:00
6ffd8d90d7 样式优化 2020-12-04 16:43:12 +08:00
1e2b6f4103 样式优化 2020-12-04 16:21:33 +08:00
24c7175872 新增微信公众号 2020-12-03 08:38:06 +08:00
a6b009cc84 v3.0.1发布 2020-12-03 03:02:44 +08:00
04afa759a7 v3.0.1发布 2020-12-03 02:56:54 +08:00
1be39a0f13 手机端UI更新 2020-12-03 02:01:48 +08:00
2fd0349a80 v2.11.0发布 2020-12-02 11:42:59 +08:00
79fd85ab9b v2.11.0发布 2020-12-02 11:41:06 +08:00
0b22bbb111 文档更新 2020-12-01 12:15:56 +08:00
7f4d315f25 后台新闻模块开发完成 2020-12-01 12:14:25 +08:00
f7375c5779 release_v2.10.0发布 2020-12-01 06:02:41 +08:00
194461f729 修改版本号 2020-12-01 06:01:24 +08:00
6bf6b44493 文档更新 2020-12-01 05:55:15 +08:00
cffa00a54a 显示优化 2020-12-01 05:48:56 +08:00
b279763383 后台首页更 新,新增会员总数/作家总数/作品总数/交易总数统计,新增7日内会员新增/作家新增/作品新增/交易新增统计报表 2020-12-01 05:42:12 +08:00
cfe19854a5 v2.9.1发布 2020-12-01 03:05:09 +08:00
28cebad48d 后台管理系统修改密码长度5位以上,修复admin账号登录后无法修改密码的bug 2020-12-01 03:02:48 +08:00
68a1ece57c update 2020-11-27 21:14:45 +08:00
77645da2bd update readme 2020-11-23 08:48:11 +08:00
36376aa623 update readme 2020-11-23 08:44:27 +08:00
9e98665cca v2.9.0发布 2020-11-23 08:29:50 +08:00
9a19a33406 章节字数计算规则优化 2020-11-23 08:21:58 +08:00
a4f7042b87 更新sql 2020-11-22 18:06:01 +08:00
31aa3192fd 小说章节定价规则自定义 2020-11-22 17:15:20 +08:00
cd11854eff v2.8.0发布 2020-11-17 10:52:44 +08:00
85f5048fd9 v2.8.0发布 2020-11-17 10:49:59 +08:00
f625ee38e1 作家后台完善 2020-11-17 10:25:31 +08:00
2c3e346ea7 修复小说阅读的时候按键盘→会报错的bug 2020-11-12 12:03:45 +08:00
66093cb065 v2.7.1发布 2020-11-10 11:56:11 +08:00
beba6e5154 作家后台小说列表新增昨日订阅量统计 2020-11-09 18:18:27 +08:00
04d3aef82b 展示图更新 2020-11-09 15:10:30 +08:00
018daf8d37 修改上传提示图片 2020-11-09 14:53:18 +08:00
8e0f1f12a4 作者后台菜单栏图标修改 2020-11-09 14:11:02 +08:00
165c96cd48 v2.7.0发布 2020-11-06 08:01:07 +08:00
e343134ce2 手机端购买页面更新&版本号更改 2020-11-05 07:47:17 +08:00
a1adb2c7df 删除垃圾文件夹 2020-11-03 15:21:19 +08:00
81a82d8e72 展示图更新 2020-11-03 15:18:50 +08:00
1d33094bd7 展示图更新 2020-11-03 15:15:46 +08:00
4cccea5d75 作家专区新增稿费收入查询(订阅明细+稿费汇总) 2020-11-03 14:58:59 +08:00
fbfb68583f update 2020-11-03 09:01:33 +08:00
655957904b update 2020-11-03 08:55:32 +08:00
99e973091d 自动更新排除掉原创小说 2020-11-03 08:41:48 +08:00
5fdf618223 自动更新排除掉原创小说 2020-11-03 08:30:45 +08:00
03c4e6c54b v2.6.5发布 2020-11-03 07:41:38 +08:00
29527301cf front模块添加message配置文件,覆盖common模块的配置,方便打包后直接修改网站信息 2020-11-03 07:36:13 +08:00
29d03a7a22 通用header.html加入script参数 2020-11-03 07:24:13 +08:00
ad4199dc4e 添加示例网站 2020-11-03 06:57:46 +08:00
4f7f9af6a9 update readme 2020-11-03 06:54:52 +08:00
ee2a0f514f 排行榜页面显示问题修复 2020-10-25 20:27:24 +08:00
70f04bd37c 小说封面图片上传 2020-08-10 07:12:14 +08:00
9d621edaec update readme 2020-07-03 09:31:57 +08:00
56c0a81c1b update readme 2020-07-03 08:57:38 +08:00
6b3b88c147 Merge branch 'release_v2.6.1' into release_v2.6.2 2020-07-02 23:17:14 +08:00
894ee67f56 优化mac端浏览器的识别问题 2020-07-02 23:15:21 +08:00
a88891b72f v2.6.2发布 2020-06-29 16:45:51 +08:00
5c7724c813 修改首页缓存时间 2020-06-29 16:43:10 +08:00
79c9f3e0f1 Merge branch 'release_v2.6.0' into release_v2.6.1 2020-06-25 10:49:15 +08:00
575142f9f3 修复部分maven版本admin模块build失败的问题 2020-06-25 10:46:27 +08:00
83c2460c83 v2.6.1发布 2020-06-22 11:06:52 +08:00
c7642ac2ef 修复搜索引擎模式下按更新时间筛选的bug 2020-06-22 11:01:23 +08:00
5af570a514 v2.6.0发布 2020-06-15 18:08:09 +08:00
0d96ff81b6 v2.6.0发布 2020-06-15 17:47:12 +08:00
7733cf1e3f 更新版本号 2020-06-15 15:13:37 +08:00
c9c714e71e 增加单本采集任务 2020-06-15 15:08:15 +08:00
3cbb6bf3fb 遇到错误章节直接中断改为遇到错误章节跳过,解决某些网站由于大量章节错误而导致的大量书籍未爬取完的情况 2020-06-15 10:06:35 +08:00
750e234f60 更新 2020-06-09 04:26:32 +08:00
c1d485c42b 更新 2020-06-09 04:19:10 +08:00
0e2e6229cd 增加新源,过滤简介中的特殊字符,提高爬虫兼容性 2020-06-08 16:54:58 +08:00
f8a669eb01 关闭分表的升级通道 2020-06-01 17:33:46 +08:00
6d56399d0f 文档更新 2020-06-01 16:12:46 +08:00
1a0c1f864b v2.5.0发布 2020-06-01 15:40:37 +08:00
b193aca288 默认开启分表功能(适用于新用户),通过添加配置spring.autoconfigure.exclude=io.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration来关闭分表功能(适用于老用户升级) 2020-06-01 11:31:05 +08:00
7a6d7a4442 暂时关闭分表功能,有需要自己开启 2020-06-01 09:24:37 +08:00
5505840b6e 暂时关闭分表功能,有需要的自己开启 2020-06-01 09:22:00 +08:00
xxy
8eb3048b91 文档更新 2020-05-29 10:10:25 +08:00
xxy
1b138c2aad 文档更新 2020-05-29 10:06:45 +08:00
f5e2dbaa6b 更改配置文件中redis配置位置 2020-05-26 18:52:38 +08:00
xxy
b6cb9aaedc 文档更新 2020-05-26 18:17:34 +08:00
f9f1e474ec 引入shardingjdbc,将小说内容表分为10个小表 2020-05-26 18:09:19 +08:00
xxy
06bf848e99 更新文档 2020-05-26 13:17:23 +08:00
6e171d20ed 集成fastDfs 2020-05-26 13:07:53 +08:00
c62acc288e 集成OSS对象存储 2020-05-26 11:31:30 +08:00
xxy
9975faed01 点击量计算优化 2020-05-26 02:27:39 +08:00
xxy
8fde3a3725 点击量计算优化 2020-05-26 02:13:28 +08:00
xxy
430504ee28 点击量计算优化 2020-05-26 02:10:37 +08:00
xxy
16447c60ec 引入redisson 2020-05-26 00:28:12 +08:00
xxy
be7cbe2d6f 欲引入Redisson框架实现分布式锁 2020-05-26 00:04:00 +08:00
xxy
8f1ed88b07 es采集优化 2020-05-25 23:38:46 +08:00
xxy
9b9851e7ab 文档更新 2020-05-25 23:16:08 +08:00
a55edf0408 es优化 2020-05-25 21:37:00 +08:00
856c4c0667 es优化 2020-05-25 21:26:47 +08:00
e4dd5bcb71 引入rabbitmq流量削峰,累积点击量后统一更新 2020-05-25 21:06:51 +08:00
5dbddbdd96 es导入优化 2020-05-25 17:51:05 +08:00
73be43e1c5 优化es采集 2020-05-25 17:11:03 +08:00
ce2a3b4647 集成redis 2020-05-25 16:54:39 +08:00
68abdeca93 文档更新 2020-05-25 10:59:24 +08:00
0b505a3922 v2.1.2发布 2020-05-25 10:51:22 +08:00
353cb8c536 修复网路图片保存时文件损坏的情况 2020-05-25 10:40:50 +08:00
xxy
e1e1310b9e 解决book_index的主键生成冲突 2020-05-24 17:59:03 +08:00
4c42ac0d29 文档更新 2020-05-24 09:17:49 +08:00
d025d3d514 优化列表页显示 2020-05-24 02:04:02 +08:00
a0fb8e481a 1.解决爬虫线程停止失败的bug,2新增新笔趣阁源,兼容更多源站 2020-05-24 00:54:27 +08:00
80b933db8d v2.1.1发布 2020-05-22 11:58:42 +08:00
87a060280a 1.解决小说/章节发布表单重复提交问题,2.解决小说章节发布字数计算问题,3.解决个人发布小说字体更改问题 2020-05-22 11:49:18 +08:00
9c78f400dc v2.1.0发布 2020-05-21 09:15:47 +08:00
c2cdf73893 1优化网络图片转换策略 2020-05-21 08:46:46 +08:00
a13ea78c3f 1优化es导入策略,2增加默认图片,在读取网络图片失败时设置,防止一直失败重试 2020-05-21 08:16:37 +08:00
0144b77983 v2.1.0发布 2020-05-20 22:13:53 +08:00
07b9ffde96 修改版本号 2020-05-20 21:30:19 +08:00
002a0723f7 索引+搜索优化 2020-05-20 21:23:59 +08:00
8a628f081f 集成elasticsearch搜索引擎 2020-05-20 18:08:29 +08:00
4aa6b82143 更新书趣阁规则 2020-05-18 20:13:46 +08:00
c80b02caf0 v2.0.2发布 2020-05-18 17:31:00 +08:00
5e16119880 增加笔趣阁书源 2020-05-18 17:08:43 +08:00
231b94f1da v2.0.2发布 2020-05-18 14:51:02 +08:00
92ce982899 1.优化爬虫编写规则,兼容更多网站 2.新增书趣阁书源 2020-05-18 14:01:49 +08:00
8c2e43c04f Merge branch 'master' into release_v2.0.1 2020-05-17 22:21:50 +08:00
f553d23fb9 v2.0.1发布 2020-05-17 22:14:53 +08:00
xxy
9773b73475 修改版本号 2020-05-16 13:29:32 +08:00
xxy
5543b905cd 小说发布防xss攻击 2020-05-16 13:20:08 +08:00
xxy
e273906441 小说发布防xss攻击 2020-05-16 13:05:44 +08:00
xxy
83dc04c50b Merge branch 'develop' of https://gitee.com/xiongxyang/novel-plus into develop 2020-05-16 12:05:33 +08:00
xxy
b4f5b18e93 1.修复昵称修改不会显示在顶部栏的问题
2.修复底部作者专区超链接问题
2020-05-16 12:01:02 +08:00
fe80c21812 Merge branch 'develop' of https://gitee.com/xiongxyang/novel-plus into develop 2020-05-16 11:46:11 +08:00
4c2a7f12c1 gitignore add file 2020-05-16 11:44:33 +08:00
xxy
e24e87b546 修复性别修改问题 2020-05-16 03:05:49 +08:00
xxy
b8b074d40a v2.0.0版本发布 2020-05-14 07:18:17 +08:00
xxy
a662f42bcf 修改版本号 2020-05-13 22:35:25 +08:00
xxy
0fa929f9de 用户购买功能实现 2020-05-13 21:43:07 +08:00
xxy
401d23871d 作家专区开发实现 2020-05-13 19:45:57 +08:00
xxy
4878f17de8 更新版本号 2020-05-11 22:36:06 +08:00
468 changed files with 59938 additions and 1101 deletions

3
.gitignore vendored
View File

@ -13,3 +13,6 @@
/novel-admin/target /novel-admin/target
/*.iml /*.iml
/novel-admin/*.iml /novel-admin/*.iml
.DS_Store
/novel-admin/cachedata
/novel-admin/logs

View File

@ -0,0 +1,135 @@
package com.java2nb.system.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.system.domain.UserDO;
import com.java2nb.system.service.UserService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:46:33
*/
@Controller
@RequestMapping("/system/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping()
@RequiresPermissions("system:user:user")
String User() {
return "system/user/user";
}
@ApiOperation(value = "获取列表", notes = "获取列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("system:user:user")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<UserDO> userList = userService.list(query);
int total = userService.count(query);
PageBean pageBean = new PageBean(userList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增页面", notes = "新增页面")
@GetMapping("/add")
@RequiresPermissions("system:user:add")
String add() {
return "system/user/add";
}
@ApiOperation(value = "修改页面", notes = "修改页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("system:user:edit")
String edit(@PathVariable("id") Long id, Model model) {
UserDO user = userService.get(id);
model.addAttribute("user", user);
return "system/user/edit";
}
@ApiOperation(value = "查看页面", notes = "查看页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("system:user:detail")
String detail(@PathVariable("id") Long id, Model model) {
UserDO user = userService.get(id);
model.addAttribute("user", user);
return "system/user/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增", notes = "新增")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("system:user:add")
public R save( UserDO user) {
if (userService.save(user) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改", notes = "修改")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("system:user:edit")
public R update( UserDO user) {
userService.update(user);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除", notes = "删除")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("system:user:remove")
public R remove( Long id) {
if (userService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除", notes = "批量删除")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("system:user:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
userService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,32 @@
package com.java2nb.system.dao;
import com.java2nb.system.domain.UserDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:46:33
*/
@Mapper
public interface UserDao {
UserDO get(Long id);
List<UserDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(UserDO user);
int update(UserDO user);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,177 @@
package com.java2nb.system.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.java2nb.common.jsonserializer.LongToStringSerializer;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:46:33
*/
public class UserDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//登录名
private String username;
//登录密码
private String password;
//昵称
private String nickName;
//用户头像
private String userPhoto;
//用户性别01
private Integer userSex;
//账户余额
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long accountBalance;
//用户状态0正常
private Integer status;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置:登录名
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取:登录名
*/
public String getUsername() {
return username;
}
/**
* 设置:登录密码
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取:登录密码
*/
public String getPassword() {
return password;
}
/**
* 设置:昵称
*/
public void setNickName(String nickName) {
this.nickName = nickName;
}
/**
* 获取:昵称
*/
public String getNickName() {
return nickName;
}
/**
* 设置:用户头像
*/
public void setUserPhoto(String userPhoto) {
this.userPhoto = userPhoto;
}
/**
* 获取:用户头像
*/
public String getUserPhoto() {
return userPhoto;
}
/**
* 设置用户性别01
*/
public void setUserSex(Integer userSex) {
this.userSex = userSex;
}
/**
* 获取用户性别01
*/
public Integer getUserSex() {
return userSex;
}
/**
* 设置:账户余额
*/
public void setAccountBalance(Long accountBalance) {
this.accountBalance = accountBalance;
}
/**
* 获取:账户余额
*/
public Long getAccountBalance() {
return accountBalance;
}
/**
* 设置用户状态0正常
*/
public void setStatus(Integer status) {
this.status = status;
}
/**
* 获取用户状态0正常
*/
public Integer getStatus() {
return status;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
}

View File

@ -0,0 +1,30 @@
package com.java2nb.system.service;
import com.java2nb.system.domain.UserDO;
import java.util.List;
import java.util.Map;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:46:33
*/
public interface UserService {
UserDO get(Long id);
List<UserDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(UserDO user);
int update(UserDO user);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,55 @@
package com.java2nb.system.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import com.java2nb.system.dao.UserDao;
import com.java2nb.system.domain.UserDO;
import com.java2nb.system.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public UserDO get(Long id){
return userDao.get(id);
}
@Override
public List<UserDO> list(Map<String, Object> map){
return userDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return userDao.count(map);
}
@Override
public int save(UserDO user){
return userDao.save(user);
}
@Override
public int update(UserDO user){
return userDao.update(user);
}
@Override
public int remove(Long id){
return userDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return userDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.system.dao.UserDao">
<select id="get" resultType="com.java2nb.system.domain.UserDO">
select `id`,`username`,`password`,`nick_name`,`user_photo`,`user_sex`,`account_balance`,`status`,`create_time`,`update_time` from user where id = #{value}
</select>
<select id="list" resultType="com.java2nb.system.domain.UserDO">
select `id`,`username`,`password`,`nick_name`,`user_photo`,`user_sex`,`account_balance`,`status`,`create_time`,`update_time` from user
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="username != null and username != ''"> and username = #{username} </if>
<if test="password != null and password != ''"> and password = #{password} </if>
<if test="nickName != null and nickName != ''"> and nick_name = #{nickName} </if>
<if test="userPhoto != null and userPhoto != ''"> and user_photo = #{userPhoto} </if>
<if test="userSex != null and userSex != ''"> and user_sex = #{userSex} </if>
<if test="accountBalance != null and accountBalance != ''"> and account_balance = #{accountBalance} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from user
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="username != null and username != ''"> and username = #{username} </if>
<if test="password != null and password != ''"> and password = #{password} </if>
<if test="nickName != null and nickName != ''"> and nick_name = #{nickName} </if>
<if test="userPhoto != null and userPhoto != ''"> and user_photo = #{userPhoto} </if>
<if test="userSex != null and userSex != ''"> and user_sex = #{userSex} </if>
<if test="accountBalance != null and accountBalance != ''"> and account_balance = #{accountBalance} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.system.domain.UserDO">
insert into user
(
`id`,
`username`,
`password`,
`nick_name`,
`user_photo`,
`user_sex`,
`account_balance`,
`status`,
`create_time`,
`update_time`
)
values
(
#{id},
#{username},
#{password},
#{nickName},
#{userPhoto},
#{userSex},
#{accountBalance},
#{status},
#{createTime},
#{updateTime}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.system.domain.UserDO">
insert into user
(
<if test="id != null"> `id`, </if>
<if test="username != null"> `username`, </if>
<if test="password != null"> `password`, </if>
<if test="nickName != null"> `nick_name`, </if>
<if test="userPhoto != null"> `user_photo`, </if>
<if test="userSex != null"> `user_sex`, </if>
<if test="accountBalance != null"> `account_balance`, </if>
<if test="status != null"> `status`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="updateTime != null"> `update_time` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="username != null"> #{username}, </if>
<if test="password != null"> #{password}, </if>
<if test="nickName != null"> #{nickName}, </if>
<if test="userPhoto != null"> #{userPhoto}, </if>
<if test="userSex != null"> #{userSex}, </if>
<if test="accountBalance != null"> #{accountBalance}, </if>
<if test="status != null"> #{status}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="updateTime != null"> #{updateTime} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.system.domain.UserDO">
update user
<set>
<if test="username != null">`username` = #{username}, </if>
<if test="password != null">`password` = #{password}, </if>
<if test="nickName != null">`nick_name` = #{nickName}, </if>
<if test="userPhoto != null">`user_photo` = #{userPhoto}, </if>
<if test="userSex != null">`user_sex` = #{userSex}, </if>
<if test="accountBalance != null">`account_balance` = #{accountBalance}, </if>
<if test="status != null">`status` = #{status}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from user where id = #{value}
</delete>
<delete id="batchRemove">
delete from user where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/system/user/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/system/user/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,231 @@
var prefix = "/system/user"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'username',
title: '登录名'
},
{
field: 'password',
title: '登录密码'
},
{
field: 'nickName',
title: '昵称'
},
{
field: 'userPhoto',
title: '用户头像'
},
{
field: 'userSex',
title: '用户性别01'
},
{
field: 'accountBalance',
title: '账户余额'
},
{
field: 'status',
title: '用户状态0正常'
},
{
field: 'createTime',
title: '创建时间'
},
{
field: 'updateTime',
title: '更新时间'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,18 @@
-- 菜单SQL
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES ('1', '', 'system/user', 'system:user:user', '1', 'fa', '6');
-- 按钮父菜单ID
set @parentId = @@identity;
-- 菜单对应按钮SQL
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '查看', null, 'system:user:detail', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '新增', null, 'system:user:add', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '修改', null, 'system:user:edit', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '删除', null, 'system:user:remove', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '批量删除', null, 'system:user:batchRemove', '2', null, '6';

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-content">
<form class="form-horizontal m-t" id="signupForm">
<div class="form-group">
<label class="col-sm-3 control-label">登录名:</label>
<div class="col-sm-8">
<input id="username" name="username"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">登录密码:</label>
<div class="col-sm-8">
<input id="password" name="password"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">昵称:</label>
<div class="col-sm-8">
<input id="nickName" name="nickName"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户头像:</label>
<div class="col-sm-8">
<input id="userPhoto" name="userPhoto"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户性别01</label>
<div class="col-sm-8">
<input id="userSex" name="userSex"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">账户余额:</label>
<div class="col-sm-8">
<input id="accountBalance" name="accountBalance"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户状态0正常</label>
<div class="col-sm-8">
<input id="status" name="status"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">创建时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="createTime"
name="createTime"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">更新时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="updateTime"
name="updateTime"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-8 col-sm-offset-3">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div th:include="include::footer"></div>
<script type="text/javascript" src="/wangEditor/release/wangEditor.js"></script>
<script type="text/javascript" src="/js/appjs/system/user/add.js">
</script>
</body>
</html>

View File

@ -0,0 +1,110 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-content">
<form class="form-horizontal m-t" id="signupForm">
<input id="id" name="id" th:value="${user.id}"
type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">登录名:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.username}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">登录密码:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.password}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">昵称:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.nickName}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户头像:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.userPhoto}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户性别01</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.userSex}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">账户余额:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.accountBalance}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户状态0正常</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.status}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">创建时间:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.createTime}==null?null:${#dates.format(user.createTime,'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">更新时间:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${user.updateTime}==null?null:${#dates.format(user.updateTime,'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div th:include="include::footer"></div>
</body>
</html>

View File

@ -0,0 +1,115 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-content">
<form class="form-horizontal m-t" id="signupForm">
<input id="id" name="id" th:value="${user.id}"
type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">登录名:</label>
<div class="col-sm-8">
<input id="username" name="username"
th:value="${user.username}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">登录密码:</label>
<div class="col-sm-8">
<input id="password" name="password"
th:value="${user.password}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">昵称:</label>
<div class="col-sm-8">
<input id="nickName" name="nickName"
th:value="${user.nickName}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户头像:</label>
<div class="col-sm-8">
<input id="userPhoto" name="userPhoto"
th:value="${user.userPhoto}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户性别01</label>
<div class="col-sm-8">
<input id="userSex" name="userSex"
th:value="${user.userSex}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">账户余额:</label>
<div class="col-sm-8">
<input id="accountBalance" name="accountBalance"
th:value="${user.accountBalance}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户状态0正常</label>
<div class="col-sm-8">
<input id="status" name="status"
th:value="${user.status}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">创建时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="createTime"
name="createTime"
th:value="${user.createTime}==null?null:${#dates.format(user.createTime,'yyyy-MM-dd HH:mm:ss')}"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">更新时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="updateTime"
name="updateTime"
th:value="${user.updateTime}==null?null:${#dates.format(user.updateTime,'yyyy-MM-dd HH:mm:ss')}"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-8 col-sm-offset-3">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div th:include="include::footer"></div>
<script type="text/javascript" src="/wangEditor/release/wangEditor.js"></script>
<script type="text/javascript" src="/js/appjs/system/user/edit.js">
</script>
</body>
</html>

View File

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="col-sm-12">
<div class="ibox">
<div class="ibox-body">
<div class="fixed-table-toolbar">
<div class="columns pull-left">
<button shiro:hasPermission="system:user:add" type="button"
class="btn btn-primary" onclick="add()">
<i class="fa fa-plus" aria-hidden="true"></i>添加
</button>
<button shiro:hasPermission="system:user:batchRemove" type="button"
class="btn btn-danger"
onclick="batchRemove()">
<i class="fa fa-trash" aria-hidden="true"></i>删除
</button>
</div>
<div class="columns pull-right">
<button class="btn btn-success" onclick="reLoad()">查询</button>
</div>
<form id="searchForm">
<div class="columns pull-right col-md-2">
<input id="id" name="id" type="text" class="form-control"
placeholder="主键">
</div>
</form>
</div>
<table id="exampleTable" data-mobile-responsive="true">
</table>
</div>
</div>
</div>
</div>
<!--shiro控制bootstraptable行内按钮看见性 -->
<div>
<script type="text/javascript">
var s_detail_h = 'hidden';
var s_edit_h = 'hidden';
var s_remove_h = 'hidden';
</script>
</div>
<div shiro:hasPermission="test:order:detail">
<script type="text/javascript">
s_detail_h = '';
</script>
</div>
<div shiro:hasPermission="system:user:edit">
<script type="text/javascript">
s_edit_h = '';
</script>
</div>
<div shiro:hasPermission="system:user:remove">
<script type="text/javascript">
var s_remove_h = '';
</script>
</div>
<div th:include="include :: footer"></div>
<script type="text/javascript" src="/js/appjs/system/user/user.js"></script>
</body>
</html>

145
README.md
View File

@ -1,10 +1,19 @@
[![index](./assets/热门云产品1040.100.jpg)](https://cloud.tencent.com/act/cps/redirect?redirect=1052&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console) [![index]( https://s1.ax1x.com/2020/07/03/NOSA5q.jpg )]( https://cloud.tencent.com/act/cps/redirect?redirect=1052&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console )
# 小说精品屋-plus # 小说精品屋-plus
#### 新项目小说精品屋-微服务版
基于小说精品屋-plus构建的Spring Cloud 微服务小说门户平台
Gitee仓库地址 https://gitee.com/xiongxyang/novel-cloud
GitHub仓库地址 https://github.com/201206030/novel-cloud
#### 演示地址 #### 演示地址
[点击前往](http://www.java2nb.com)(前台门户) [点击前往](http://47.106.243.172:8888/)
#### 前言 #### 前言
@ -12,9 +21,9 @@
#### 项目介绍 #### 项目介绍
[小说精品屋](https://github.com/201206030/fiction_house)是一个多平台web、安卓app、微信小程序、功能完善的小说弹幕网站包含精品小说专区、轻小说专区和漫画专区。包括小说/漫画分类、小说/漫画搜索、小说/漫画排行、完本小说/漫画、小说/漫画评分、小说/漫画在线阅读、小说/漫画书架、小说/漫画阅读记录、小说下载、小说弹幕、小说/漫画自动爬取、小说内容自动分享到微博、邮件自动推广、链接自动推送到百度搜索引擎等功能。包含电脑端、移动端、微信小程序等多个平台现已开源web端、安卓端、小程序端源码。 小说精品屋-plus是在[小说精品屋](https://github.com/201206030/fiction_house)的基础上去除了漫画和弹幕模块专注于小说是一个多端PC、移动阅读、功能完善的小说原创/爬虫网站项目既包含了作家专区供原创作者上传小说又提供了爬虫工具通过规则多线程全自动采集任意小说网站数据已兼容99%的小说网站),新书自动入库,老书自动更新。
小说精品屋-plus是在小说精品屋的基础上重新进行了数据库设计代码重构和功能增强提升了程序整体的可读性和性能增加了很多商用特性主要升级如下 小说精品屋-plus重新进行了数据库设计代码重构和功能增强提升了程序整体的可读性和性能增加了很多商用特性主要升级如下
- [x] 数据库重新设计结构调整 - [x] 数据库重新设计结构调整
- [x] 服务端代码重构MyBatis3升级为MyBatis3DynamicSql - [x] 服务端代码重构MyBatis3升级为MyBatis3DynamicSql
@ -24,9 +33,10 @@
- [x] 排行榜 - [x] 排行榜
- [x] 小说评论模块 - [x] 小说评论模块
- [x] 阅读主题模块 - [x] 阅读主题模块
- [ ] 作家专区 - [x] 作家专区
- [x] 充值 - [x] 充值
- [ ] 后台管理系统 - [x] 订阅
- [x] 后台管理系统
- [x] 爬虫管理系统 - [x] 爬虫管理系统
#### 项目结构 #### 项目结构
@ -40,53 +50,119 @@ novel-plus -- 父工程
``` ```
#### 技术选型 #### 技术选型
Springboot+Mybatis+Mysql+Ehcache+Thymeleaf+Layui
| 技术 | 说明
| -------------------- | ---------------------------
| SpringBoot | Spring应用快速开发脚手架
| MyBatis | 持久层ORM框架
| MyBatis Dynamic SQL | Mybatis动态sql
| PageHelper | MyBatis分页插件
| MyBatisGenerator | 持久层代码生成插件
| Sharding-Jdbc | 代码层分库分表中间件
| JJWT | JWT登录支持
| SpringSecurity | 安全框架
| Shiro | 安全框架
| Ehcache | Java进程内缓存框架(默认缓存)
| Redis | 分布式缓存(缓存替换方案默认关闭一行配置开启)
| ElasticSearch | 搜索引擎(搜索增强方案默认关闭一行配置开启)
| RabbitMq | 消息队列(流量削峰默认关闭一行配置开启)
| OSS | 阿里云对象存储服务(图片存储方式之一一行配置即可切换)
| FastDfs |开源轻量级分布式文件系统(图片存储方式之一一行配置即可切换)
| Redisson | 实现分布式锁
| Lombok | 简化对象封装工具
| Docker | 应用容器引擎
| Mysql | 数据库服务
| Thymeleaf | 模板引擎
| Layui | 前端UI
#### PC站截图 #### PC站截图
1. 首页
![img](https://oscimg.oschina.net/oscnet/up-bbb1c7f72e183327bff754a9fa8bb75223e.png)
![index](./assets/1588548668698.gif) 2. 分类索引页
![img](https://oscimg.oschina.net/oscnet/up-d0b2e03129bfae47b8bb96a491b73d383c5.png)
3. 搜索页
![index](./assets/1588548784395.gif) ![img](https://gitee.com/xiongxyang/novel-plus/raw/release_v2.1.0/assets/QQ20200520-215756.png)
![img](https://oscimg.oschina.net/oscnet/up-ed5f689557718924acac76bc3ebca36afcb.png)
4. 排行榜
![index](./assets/1588548916980.gif) ![img](https://oscimg.oschina.net/oscnet/up-78d5a68586cd92a86c669311f414508f922.png)
5. 详情页
![img](https://oscimg.oschina.net/oscnet/up-8be2495a2869f93626b0c9c1df6f329747a.png)
6. 阅读页
![img](https://oscimg.oschina.net/oscnet/up-517c84148d2db8e11717a8bbecc57fa1be7.png)
7. 用户中心
![img](https://oscimg.oschina.net/oscnet/up-805a30e7a663a3fd5cb39a7ea26bc132a01.png)
8. 充值
![img](https://oscimg.oschina.net/oscnet/up-5a601b0b3af3224d0bebcfe12fc15075d34.png)
![img](https://oscimg.oschina.net/oscnet/up-face25d02c07b05b2ce954cc4bf4ee6a0cc.png)
9. 作家专区
![img](https://oscimg.oschina.net/oscnet/up-30766372cc7f56480ff1d7d55198204f6ea.png)
![img](https://s3.ax1x.com/2020/11/17/DVFiQI.png)
![img](https://s1.ax1x.com/2020/11/09/B7X5oF.png)
![img](https://s1.ax1x.com/2020/11/09/B7XLsx.png)
10. 购买
![img](https://oscimg.oschina.net/oscnet/up-ce0f585efd82a9670335f118cf5897c85e9.png)
![img](https://oscimg.oschina.net/oscnet/up-f849960f4c1303fea77d26e64fc505a7180.png)
#### 手机站截图 #### 手机站截图
1. 首页 1. 首页
![index](./assets/QQ%E5%9B%BE%E7%89%8720191018162208.jpg) <img src="https://s3.ax1x.com/2020/12/04/DbsSoj.jpg" alt="index" style="zoom:33%;" />
2. 小说列表页
2. 小说详情页 <img src="https://s3.ax1x.com/2020/12/04/DbrfsO.jpg" alt="微信图片_20190904181558" style="zoom: 33%;" />
![微信图片_20190904181558](./assets/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20190904181558.png) 3. 小说详情页
<img src="https://s3.ax1x.com/2020/12/04/DbsklV.jpg" alt="QQ图片20191018161901" style="zoom:33%;" />
3. 目录页
![QQ图片20191018161901](./assets/QQ%E5%9B%BE%E7%89%8720191108022250.png)
4. 小说阅读页 4. 小说阅读页
![QQ图片20191018161901](./assets/QQ%E5%9B%BE%E7%89%8720191018161901.png) <img src="https://s3.ax1x.com/2020/12/04/Dbsew4.jpg" alt="QQ图片20191018161901" style="zoom:33%;" />
#### 爬虫管理系统截图 #### 爬虫管理系统截图
![QQ图片20191018161901](./assets/crawl_index.png) ![img](https://s1.ax1x.com/2020/11/03/BsOgbD.png)
![img](https://s1.ax1x.com/2020/11/03/BsOHr8.png)
#### 后台管理系统截图
![img](https://oscimg.oschina.net/oscnet/up-0552343538674a22a64819834100558f39b.png)
![img](https://s3.ax1x.com/2020/12/01/DWgLNT.png)
![img](https://s3.ax1x.com/2020/12/01/DfmRCd.png)
![img](https://oscimg.oschina.net/oscnet/up-faf5dda7320674c29a1772bc0c81d74762e.png)
#### 安装步骤 #### 安装步骤
@ -127,16 +203,29 @@ docker安装教程[点击前往](https://my.oschina.net/java2nb/blog/4271989)
#### QQ交流群 #### QQ交流群
![mini-code](./assets/qq_group.png) ![mini-code](https://s1.ax1x.com/2020/10/31/BUQVeI.png)
#### 捐赠支持 #### 微信公众号发布最新更新资讯
开源项目不易若此项目能得到你的青睐可以捐赠支持作者持续开发与维护 ![mini-code](https://s3.ax1x.com/2020/12/03/DoImOx.png)
![mini-code](./assets/jk.png) #### 赞赏支持
开源项目不易若此项目能得到你的青睐那么你可以赞赏支持作者持续开发与维护
- 服务器的费用也是一笔开销
- 为用户提供更好的开发环境
- 一杯咖啡
![mini-code](https://s1.ax1x.com/2020/10/31/BUQJwq.png)
### 免责声明
本项目提供的爬虫工具仅用于采集项目初期的测试数据请勿用于商业盈利
用户使用本系统从事任何违法违规的事情一切后果由用户自行承担作者不承担任何责任
#### 备注 #### 备注
精品小说屋所有相关项目均已在开源中国公开感兴趣的可进入[开源中国](https://www.oschina.net/p/fiction_house)按关键字`精品小说屋`搜索。 精品小说屋所有相关项目均已在开源中国公开感兴趣的可进入[开源中国](https://www.oschina.net/p/fiction_house)按关键字`精品小说屋`搜索。
[![index](./assets/120060.jpg)](https://www.aliyun.com/minisite/goods?userCode=uf4nasee ) [![index](https://s1.ax1x.com/2020/07/03/NOSuMF.jpg)](https://www.aliyun.com/minisite/goods?userCode=uf4nasee )

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 185 KiB

82
es/index_create.txt Normal file
View File

@ -0,0 +1,82 @@
PUT /novel
{
"mappings" : {
"book" : {
"properties" : {
"id" : {
"type" : "long"
},
"authorId" : {
"type" : "long"
},
"authorName" : {
"type" : "text",
"analyzer": "ik_smart",
"boost": 1.9
},
"bookName" : {
"type" : "text",
"analyzer": "ik_smart",
"boost": 2
},
"bookDesc" : {
"type" : "text",
"analyzer": "ik_smart",
"boost": 0.1
},
"bookStatus" : {
"type" : "short"
},
"catId" : {
"type" : "integer"
},
"catName" : {
"type" : "text",
"analyzer": "ik_smart",
"boost": 1.0
},
"lastIndexId" : {
"type" : "long"
},
"lastIndexName" : {
"type" : "text",
"analyzer": "ik_smart",
"boost": 0.1
},
"lastIndexUpdateTime" : {
"type": "keyword"
},
"picUrl" : {
"type" : "keyword"
},
"score" : {
"type" : "float"
},
"wordCount" : {
"type" : "integer"
},
"workDirection" : {
"type" : "short"
},
"visitCount" : {
"type": "long"
}
}
}
}
}

6
novel-admin/Dockerfile Normal file
View File

@ -0,0 +1,6 @@
FROM java:8
ADD novel-admin-1.0.0.jar /root
ENV dburl=""
ENV username=""
ENV password=""
ENTRYPOINT ["sh","-c","java -Dspring.datasource.url=${dburl} -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -jar /root/novel-admin-1.0.0.jar"]

View File

@ -5,7 +5,7 @@
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<artifactId>novel-admin</artifactId> <artifactId>novel-admin</artifactId>
<version>1.0.0</version> <version>2.11.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>novel-admin</name> <name>novel-admin</name>
@ -50,10 +50,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId> <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> </dependency>
<!-- NekoHTML 是一个简单地HTML扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息 <!-- NekoHTML 是一个简单地HTML扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息
这个解析器能投扫描HTML文件并修正许多作者人或机器在编写HTML文档过程中常犯的错误 这个解析器能投扫描HTML文件并修正许多作者人或机器在编写HTML文档过程中常犯的错误
NekoHTML 能增补缺失的父元素自动用结束标签关闭相应的元素以及不匹配的内嵌元素标签 NekoHTML 能增补缺失的父元素自动用结束标签关闭相应的元素以及不匹配的内嵌元素标签
NekoHTML 的开发使用了Xerces Native Interface (XNI)后者是Xerces2的实现基础--> NekoHTML 的开发使用了Xerces Native Interface (XNI)后者是Xerces2的实现基础-->
<dependency> <dependency>
<groupId>net.sourceforge.nekohtml</groupId> <groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId> <artifactId>nekohtml</artifactId>
@ -137,23 +137,19 @@
<artifactId>velocity</artifactId> <artifactId>velocity</artifactId>
<version>1.7</version> <version>1.7</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--<dependency>--> <!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>--> <!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-data-redis</artifactId>--> <!--<artifactId>spring-boot-starter-data-redis</artifactId>-->
<!--</dependency>--> <!--</dependency>-->
<!-- quartz --> <!-- quartz -->
<!--<dependency>--> <!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>--> <!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-cache</artifactId>--> <!--<artifactId>spring-boot-starter-cache</artifactId>-->
<!--</dependency>--> <!--</dependency>-->
<!--<dependency>--> <!--<dependency>-->
<!--<groupId>net.sf.ehcache</groupId>--> <!--<groupId>net.sf.ehcache</groupId>-->
<!--<artifactId>ehcache</artifactId>--> <!--<artifactId>ehcache</artifactId>-->
<!--</dependency>--> <!--</dependency>-->
@ -188,7 +184,6 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
@ -239,18 +234,22 @@
</configuration> </configuration>
</plugin>--> </plugin>-->
<!--SpringBoot项目默认使用spring-boot-maven-plugin要打成被其他项目引用的jar包需要更换此插件--> <!--SpringBoot项目默认使用spring-boot-maven-plugin要打成被其他项目引用的jar包需要更换此插件-->
<!-- <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>-->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<distributionManagement> <!--<distributionManagement>
<repository> <repository>
<id>nexus_release</id> <id>nexus_release</id>
<name>release</name> <name>release</name>
@ -261,5 +260,5 @@
<name>snapshots</name> <name>snapshots</name>
<url>http://47.106.243.172:8081/nexus/content/repositories/snapshots/</url> <url>http://47.106.243.172:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository> </snapshotRepository>
</distributionManagement> </distributionManagement>-->
</project> </project>

View File

@ -1,10 +1,14 @@
package com.java2nb.common.utils; package com.java2nb.common.utils;
import lombok.SneakyThrows;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 日期处理 * 日期处理
@ -91,4 +95,37 @@ public class DateUtils {
r += ""; r += "";
return r; return r;
} }
/**
* 获取过去第几天的日期
*
* @param past
* @return
*/
@SneakyThrows
public static String getPastDate(int past,Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - past);
Date today = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(today);
}
/**
* 获取过去几天的日期集合
*
* @param past
* @return
*/
public static List<String> getDateList(int past,Date date) {
List<String> result = new ArrayList<>(past);
for(int i = past - 1 ; i > 0 ; i--){
result.add(getPastDate(i,date));
}
//今天的日期
result.add(new SimpleDateFormat("yyyy-MM-dd").format(date));
return result;
}
} }

View File

@ -14,7 +14,7 @@ public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrappe
/** /**
* 假如有有html 代码是自己传来的 需要设定对应的name 不过滤 * 假如有有html 代码是自己传来的 需要设定对应的name 不过滤
*/ */
private static final List<String> noFilterNames = Arrays.asList("attach","push_ip"); private static final List<String> noFilterNames = Arrays.asList("attach","push_ip","content");
public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) { public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
super(request); super(request);

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.AuthorCodeDO;
import com.java2nb.novel.service.AuthorCodeService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 作家邀请码表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:29:15
*/
@Controller
@RequestMapping("/novel/authorCode")
public class AuthorCodeController {
@Autowired
private AuthorCodeService authorCodeService;
@GetMapping()
@RequiresPermissions("novel:authorCode:authorCode")
String AuthorCode() {
return "novel/authorCode/authorCode";
}
@ApiOperation(value = "获取作家邀请码表列表", notes = "获取作家邀请码表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:authorCode:authorCode")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<AuthorCodeDO> authorCodeList = authorCodeService.list(query);
int total = authorCodeService.count(query);
PageBean pageBean = new PageBean(authorCodeList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增作家邀请码表页面", notes = "新增作家邀请码表页面")
@GetMapping("/add")
@RequiresPermissions("novel:authorCode:add")
String add() {
return "novel/authorCode/add";
}
@ApiOperation(value = "修改作家邀请码表页面", notes = "修改作家邀请码表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:authorCode:edit")
String edit(@PathVariable("id") Long id, Model model) {
AuthorCodeDO authorCode = authorCodeService.get(id);
model.addAttribute("authorCode", authorCode);
return "novel/authorCode/edit";
}
@ApiOperation(value = "查看作家邀请码表页面", notes = "查看作家邀请码表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:authorCode:detail")
String detail(@PathVariable("id") Long id, Model model) {
AuthorCodeDO authorCode = authorCodeService.get(id);
model.addAttribute("authorCode", authorCode);
return "novel/authorCode/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增作家邀请码表", notes = "新增作家邀请码表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:authorCode:add")
public R save( AuthorCodeDO authorCode) {
if (authorCodeService.save(authorCode) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改作家邀请码表", notes = "修改作家邀请码表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:authorCode:edit")
public R update( AuthorCodeDO authorCode) {
authorCodeService.update(authorCode);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除作家邀请码表", notes = "删除作家邀请码表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:authorCode:remove")
public R remove( Long id) {
if (authorCodeService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除作家邀请码表", notes = "批量删除作家邀请码表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:authorCode:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
authorCodeService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.AuthorDO;
import com.java2nb.novel.service.AuthorService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 作者表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:16:51
*/
@Controller
@RequestMapping("/novel/author")
public class AuthorController {
@Autowired
private AuthorService authorService;
@GetMapping()
@RequiresPermissions("novel:author:author")
String Author() {
return "novel/author/author";
}
@ApiOperation(value = "获取作者表列表", notes = "获取作者表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:author:author")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<AuthorDO> authorList = authorService.list(query);
int total = authorService.count(query);
PageBean pageBean = new PageBean(authorList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增作者表页面", notes = "新增作者表页面")
@GetMapping("/add")
@RequiresPermissions("novel:author:add")
String add() {
return "novel/author/add";
}
@ApiOperation(value = "修改作者表页面", notes = "修改作者表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:author:edit")
String edit(@PathVariable("id") Long id, Model model) {
AuthorDO author = authorService.get(id);
model.addAttribute("author", author);
return "novel/author/edit";
}
@ApiOperation(value = "查看作者表页面", notes = "查看作者表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:author:detail")
String detail(@PathVariable("id") Long id, Model model) {
AuthorDO author = authorService.get(id);
model.addAttribute("author", author);
return "novel/author/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增作者表", notes = "新增作者表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:author:add")
public R save( AuthorDO author) {
if (authorService.save(author) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改作者表", notes = "修改作者表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:author:edit")
public R update( AuthorDO author) {
authorService.update(author);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除作者表", notes = "删除作者表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:author:remove")
public R remove( Long id) {
if (authorService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除作者表", notes = "批量删除作者表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:author:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
authorService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.BookDO;
import com.java2nb.novel.service.BookService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 小说表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:46
*/
@Controller
@RequestMapping("/novel/book")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping()
@RequiresPermissions("novel:book:book")
String Book() {
return "novel/book/book";
}
@ApiOperation(value = "获取小说表列表", notes = "获取小说表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:book:book")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<BookDO> bookList = bookService.list(query);
int total = bookService.count(query);
PageBean pageBean = new PageBean(bookList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增小说表页面", notes = "新增小说表页面")
@GetMapping("/add")
@RequiresPermissions("novel:book:add")
String add() {
return "novel/book/add";
}
@ApiOperation(value = "修改小说表页面", notes = "修改小说表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:book:edit")
String edit(@PathVariable("id") Long id, Model model) {
BookDO book = bookService.get(id);
model.addAttribute("book", book);
return "novel/book/edit";
}
@ApiOperation(value = "查看小说表页面", notes = "查看小说表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:book:detail")
String detail(@PathVariable("id") Long id, Model model) {
BookDO book = bookService.get(id);
model.addAttribute("book", book);
return "novel/book/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增小说表", notes = "新增小说表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:book:add")
public R save( BookDO book) {
if (bookService.save(book) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改小说表", notes = "修改小说表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:book:edit")
public R update( BookDO book) {
bookService.update(book);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除小说表", notes = "删除小说表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:book:remove")
public R remove( Long id) {
if (bookService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除小说表", notes = "批量删除小说表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:book:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
bookService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.CategoryDO;
import com.java2nb.novel.service.CategoryService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 新闻类别表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:03:41
*/
@Controller
@RequestMapping("/novel/category")
public class CategoryController {
@Autowired
private CategoryService categoryService;
@GetMapping()
@RequiresPermissions("novel:category:category")
String Category() {
return "novel/category/category";
}
@ApiOperation(value = "获取新闻类别表列表", notes = "获取新闻类别表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:category:category")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<CategoryDO> categoryList = categoryService.list(query);
int total = categoryService.count(query);
PageBean pageBean = new PageBean(categoryList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增新闻类别表页面", notes = "新增新闻类别表页面")
@GetMapping("/add")
@RequiresPermissions("novel:category:add")
String add() {
return "novel/category/add";
}
@ApiOperation(value = "修改新闻类别表页面", notes = "修改新闻类别表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:category:edit")
String edit(@PathVariable("id") Integer id, Model model) {
CategoryDO category = categoryService.get(id);
model.addAttribute("category", category);
return "novel/category/edit";
}
@ApiOperation(value = "查看新闻类别表页面", notes = "查看新闻类别表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:category:detail")
String detail(@PathVariable("id") Integer id, Model model) {
CategoryDO category = categoryService.get(id);
model.addAttribute("category", category);
return "novel/category/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增新闻类别表", notes = "新增新闻类别表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:category:add")
public R save( CategoryDO category) {
if (categoryService.save(category) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改新闻类别表", notes = "修改新闻类别表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:category:edit")
public R update( CategoryDO category) {
categoryService.update(category);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除新闻类别表", notes = "删除新闻类别表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:category:remove")
public R remove( Integer id) {
if (categoryService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除新闻类别表", notes = "批量删除新闻类别表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:category:batchRemove")
public R remove(@RequestParam("ids[]") Integer[] ids) {
categoryService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.NewsDO;
import com.java2nb.novel.service.NewsService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 新闻表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:05:51
*/
@Controller
@RequestMapping("/novel/news")
public class NewsController {
@Autowired
private NewsService newsService;
@GetMapping()
@RequiresPermissions("novel:news:news")
String News() {
return "novel/news/news";
}
@ApiOperation(value = "获取新闻表列表", notes = "获取新闻表列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:news:news")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<NewsDO> newsList = newsService.list(query);
int total = newsService.count(query);
PageBean pageBean = new PageBean(newsList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增新闻表页面", notes = "新增新闻表页面")
@GetMapping("/add")
@RequiresPermissions("novel:news:add")
String add() {
return "novel/news/add";
}
@ApiOperation(value = "修改新闻表页面", notes = "修改新闻表页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:news:edit")
String edit(@PathVariable("id") Long id, Model model) {
NewsDO news = newsService.get(id);
model.addAttribute("news", news);
return "novel/news/edit";
}
@ApiOperation(value = "查看新闻表页面", notes = "查看新闻表页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:news:detail")
String detail(@PathVariable("id") Long id, Model model) {
NewsDO news = newsService.get(id);
model.addAttribute("news", news);
return "novel/news/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增新闻表", notes = "新增新闻表")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:news:add")
public R save( NewsDO news) {
if (newsService.save(news) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改新闻表", notes = "修改新闻表")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:news:edit")
public R update( NewsDO news) {
newsService.update(news);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除新闻表", notes = "删除新闻表")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:news:remove")
public R remove( Long id) {
if (newsService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除新闻表", notes = "批量删除新闻表")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:news:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
newsService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.PayDO;
import com.java2nb.novel.service.PayService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
* 充值订单
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:57
*/
@Controller
@RequestMapping("/novel/pay")
public class PayController {
@Autowired
private PayService payService;
@GetMapping()
@RequiresPermissions("novel:pay:pay")
String Pay() {
return "novel/pay/pay";
}
@ApiOperation(value = "获取充值订单列表", notes = "获取充值订单列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:pay:pay")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<PayDO> payList = payService.list(query);
int total = payService.count(query);
PageBean pageBean = new PageBean(payList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增充值订单页面", notes = "新增充值订单页面")
@GetMapping("/add")
@RequiresPermissions("novel:pay:add")
String add() {
return "novel/pay/add";
}
@ApiOperation(value = "修改充值订单页面", notes = "修改充值订单页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:pay:edit")
String edit(@PathVariable("id") Long id, Model model) {
PayDO pay = payService.get(id);
model.addAttribute("pay", pay);
return "novel/pay/edit";
}
@ApiOperation(value = "查看充值订单页面", notes = "查看充值订单页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:pay:detail")
String detail(@PathVariable("id") Long id, Model model) {
PayDO pay = payService.get(id);
model.addAttribute("pay", pay);
return "novel/pay/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增充值订单", notes = "新增充值订单")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:pay:add")
public R save( PayDO pay) {
if (payService.save(pay) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改充值订单", notes = "修改充值订单")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:pay:edit")
public R update( PayDO pay) {
payService.update(pay);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除充值订单", notes = "删除充值订单")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:pay:remove")
public R remove( Long id) {
if (payService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除充值订单", notes = "批量删除充值订单")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:pay:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
payService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,83 @@
package com.java2nb.novel.controller;
import com.java2nb.common.utils.DateUtils;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
import com.java2nb.novel.domain.AuthorCodeDO;
import com.java2nb.novel.service.*;
import com.java2nb.test.service.OrderService;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 统计
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:40:12
*/
@Controller
@RequestMapping("/novel/stat")
public class StatController {
@Autowired
private UserService userService;
@Autowired
private AuthorService authorService;
@Autowired
private BookService bookService;
@Autowired
private PayService orderPayService;
@ResponseBody
@GetMapping("/countSta")
public R countUser() {
Map map = new HashMap<>(0);
int userCount = userService.count(map);
int authorCount = authorService.count(map);
int bookCount = bookService.count(map);
int orderCount = orderPayService.count(map);
return R.ok().put("userCount",userCount)
.put("authorCount",authorCount)
.put("bookCount",bookCount)
.put("orderCount",orderCount);
}
@ResponseBody
@GetMapping("/tableSta")
@SneakyThrows
public R tableSta() {
Date currentDate = new Date();
List<String> dateList = DateUtils.getDateList(7,currentDate);
Date minDate = new SimpleDateFormat("yyyy-MM-dd").parse(dateList.get(0));
Map<Object,Object> userTableSta = userService.tableSta(minDate);
Map<Object,Object> bookTableSta = bookService.tableSta(minDate);
Map<Object,Object> authorTableSta = authorService.tableSta(minDate);
Map<Object,Object> orderTableSta = orderPayService.tableSta(minDate);
return R.ok().put("dateList",dateList)
.put("userTableSta",userTableSta)
.put("bookTableSta",bookTableSta)
.put("authorTableSta",authorTableSta)
.put("orderTableSta",orderTableSta)
;
}
}

View File

@ -0,0 +1,135 @@
package com.java2nb.novel.controller;
import java.util.List;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import io.swagger.annotations.ApiOperation;
import com.java2nb.novel.domain.UserDO;
import com.java2nb.novel.service.UserService;
import com.java2nb.common.utils.PageBean;
import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:08
*/
@Controller
@RequestMapping("/novel/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping()
@RequiresPermissions("novel:user:user")
String User() {
return "novel/user/user";
}
@ApiOperation(value = "获取列表", notes = "获取列表")
@ResponseBody
@GetMapping("/list")
@RequiresPermissions("novel:user:user")
public R list(@RequestParam Map<String, Object> params) {
//查询列表数据
Query query = new Query(params);
List<UserDO> userList = userService.list(query);
int total = userService.count(query);
PageBean pageBean = new PageBean(userList, total);
return R.ok().put("data", pageBean);
}
@ApiOperation(value = "新增页面", notes = "新增页面")
@GetMapping("/add")
@RequiresPermissions("novel:user:add")
String add() {
return "novel/user/add";
}
@ApiOperation(value = "修改页面", notes = "修改页面")
@GetMapping("/edit/{id}")
@RequiresPermissions("novel:user:edit")
String edit(@PathVariable("id") Long id, Model model) {
UserDO user = userService.get(id);
model.addAttribute("user", user);
return "novel/user/edit";
}
@ApiOperation(value = "查看页面", notes = "查看页面")
@GetMapping("/detail/{id}")
@RequiresPermissions("novel:user:detail")
String detail(@PathVariable("id") Long id, Model model) {
UserDO user = userService.get(id);
model.addAttribute("user", user);
return "novel/user/detail";
}
/**
* 保存
*/
@ApiOperation(value = "新增", notes = "新增")
@ResponseBody
@PostMapping("/save")
@RequiresPermissions("novel:user:add")
public R save( UserDO user) {
if (userService.save(user) > 0) {
return R.ok();
}
return R.error();
}
/**
* 修改
*/
@ApiOperation(value = "修改", notes = "修改")
@ResponseBody
@RequestMapping("/update")
@RequiresPermissions("novel:user:edit")
public R update( UserDO user) {
userService.update(user);
return R.ok();
}
/**
* 删除
*/
@ApiOperation(value = "删除", notes = "删除")
@PostMapping("/remove")
@ResponseBody
@RequiresPermissions("novel:user:remove")
public R remove( Long id) {
if (userService.remove(id) > 0) {
return R.ok();
}
return R.error();
}
/**
* 删除
*/
@ApiOperation(value = "批量删除", notes = "批量删除")
@PostMapping("/batchRemove")
@ResponseBody
@RequiresPermissions("novel:user:batchRemove")
public R remove(@RequestParam("ids[]") Long[] ids) {
userService.batchRemove(ids);
return R.ok();
}
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.AuthorCodeDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 作家邀请码表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:29:15
*/
@Mapper
public interface AuthorCodeDao {
AuthorCodeDO get(Long id);
List<AuthorCodeDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(AuthorCodeDO authorCode);
int update(AuthorCodeDO authorCode);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,35 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.AuthorDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 作者表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:16:51
*/
@Mapper
public interface AuthorDao {
AuthorDO get(Long id);
List<AuthorDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(AuthorDO author);
int update(AuthorDO author);
int remove(Long id);
int batchRemove(Long[] ids);
List<Map<Object, Object>> tableSta(Date minDate);
}

View File

@ -0,0 +1,35 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.BookDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 小说表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:46
*/
@Mapper
public interface BookDao {
BookDO get(Long id);
List<BookDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(BookDO book);
int update(BookDO book);
int remove(Long id);
int batchRemove(Long[] ids);
List<Map<Object, Object>> tableSta(Date minDate);
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.CategoryDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 新闻类别表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:03:41
*/
@Mapper
public interface CategoryDao {
CategoryDO get(Integer id);
List<CategoryDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(CategoryDO category);
int update(CategoryDO category);
int remove(Integer id);
int batchRemove(Integer[] ids);
}

View File

@ -0,0 +1,32 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.NewsDO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 新闻表
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:05:51
*/
@Mapper
public interface NewsDao {
NewsDO get(Long id);
List<NewsDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(NewsDO news);
int update(NewsDO news);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,35 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.PayDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
* 充值订单
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:57
*/
@Mapper
public interface PayDao {
PayDO get(Long id);
List<PayDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(PayDO pay);
int update(PayDO pay);
int remove(Long id);
int batchRemove(Long[] ids);
List<Map<Object, Object>> tableSta(Date minDate);
}

View File

@ -0,0 +1,35 @@
package com.java2nb.novel.dao;
import com.java2nb.novel.domain.UserDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
/**
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:08
*/
@Mapper
public interface UserDao {
UserDO get(Long id);
List<UserDO> list(Map<String,Object> map);
int count(Map<String,Object> map);
int save(UserDO user);
int update(UserDO user);
int remove(Long id);
int batchRemove(Long[] ids);
List<Map<Object, Object>> tableSta(Date minDate);
}

View File

@ -0,0 +1,121 @@
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.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 作家邀请码表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:29:15
*/
public class AuthorCodeDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//邀请码
private String inviteCode;
//有效时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date validityTime;
//是否使用过0未使用1:使用过
private Integer isUse;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//创建人ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long createUserId;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置:邀请码
*/
public void setInviteCode(String inviteCode) {
this.inviteCode = inviteCode;
}
/**
* 获取:邀请码
*/
public String getInviteCode() {
return inviteCode;
}
/**
* 设置:有效时间
*/
public void setValidityTime(Date validityTime) {
this.validityTime = validityTime;
}
/**
* 获取:有效时间
*/
public Date getValidityTime() {
return validityTime;
}
/**
* 设置是否使用过0未使用1:使用过
*/
public void setIsUse(Integer isUse) {
this.isUse = isUse;
}
/**
* 获取是否使用过0未使用1:使用过
*/
public Integer getIsUse() {
return isUse;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置创建人ID
*/
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
/**
* 获取创建人ID
*/
public Long getCreateUserId() {
return createUserId;
}
}

View File

@ -0,0 +1,176 @@
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.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 作者表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:16:51
*/
public class AuthorDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//用户ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long userId;
//邀请码
private String inviteCode;
//笔名
private String penName;
//手机号码
private String telPhone;
//QQ或微信账号
private String chatAccount;
//电子邮箱
private String email;
//作品方向0男频1女频
private Integer workDirection;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//0正常1封禁
private Integer status;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置用户ID
*/
public void setUserId(Long userId) {
this.userId = userId;
}
/**
* 获取用户ID
*/
public Long getUserId() {
return userId;
}
/**
* 设置:邀请码
*/
public void setInviteCode(String inviteCode) {
this.inviteCode = inviteCode;
}
/**
* 获取:邀请码
*/
public String getInviteCode() {
return inviteCode;
}
/**
* 设置:笔名
*/
public void setPenName(String penName) {
this.penName = penName;
}
/**
* 获取:笔名
*/
public String getPenName() {
return penName;
}
/**
* 设置:手机号码
*/
public void setTelPhone(String telPhone) {
this.telPhone = telPhone;
}
/**
* 获取:手机号码
*/
public String getTelPhone() {
return telPhone;
}
/**
* 设置QQ或微信账号
*/
public void setChatAccount(String chatAccount) {
this.chatAccount = chatAccount;
}
/**
* 获取QQ或微信账号
*/
public String getChatAccount() {
return chatAccount;
}
/**
* 设置:电子邮箱
*/
public void setEmail(String email) {
this.email = email;
}
/**
* 获取:电子邮箱
*/
public String getEmail() {
return email;
}
/**
* 设置作品方向0男频1女频
*/
public void setWorkDirection(Integer workDirection) {
this.workDirection = workDirection;
}
/**
* 获取作品方向0男频1女频
*/
public Integer getWorkDirection() {
return workDirection;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置0正常1封禁
*/
public void setStatus(Integer status) {
this.status = status;
}
/**
* 获取0正常1封禁
*/
public Integer getStatus() {
return status;
}
}

View File

@ -0,0 +1,493 @@
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.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 小说表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:46
*/
public class BookDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//作品方向0男频1女频'
private Integer workDirection;
//分类ID
private Integer catId;
//分类名
private String catName;
//子分类ID
private Integer catChildId;
//子分类名
private String catChildName;
//小说封面
private String picUrl;
//小说名
private String bookName;
//男主角姓名
private String heroName;
//女主角姓名
private String ladyName;
//作品风格0甜宠1虐恋2其他
private Integer bookStyle;
//作品标签
private String bookLabel;
//作者id
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long authorId;
//作者名
private String authorName;
//书籍描述
private String bookDesc;
//评分,预留字段
private Float score;
//书籍状态0连载中1已完结
private Integer bookStatus;
//点击量
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long visitCount;
//总字数
private Integer wordCount;
//评论数
private Integer commentCount;
//昨日订阅数
private Integer yesterdayBuy;
//最新目录ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long lastIndexId;
//最新目录名
private String lastIndexName;
//最新目录更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastIndexUpdateTime;
//是否收费1收费0免费
private Integer isVip;
//状态0入库1上架
private Integer status;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//爬虫源站ID
private Integer crawlSourceId;
//抓取的源站小说ID
private String crawlBookId;
//最后一次的抓取时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date crawlLastTime;
//是否已停止更新0未停止1已停止
private Integer crawlIsStop;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置作品方向0男频1女频'
*/
public void setWorkDirection(Integer workDirection) {
this.workDirection = workDirection;
}
/**
* 获取作品方向0男频1女频'
*/
public Integer getWorkDirection() {
return workDirection;
}
/**
* 设置分类ID
*/
public void setCatId(Integer catId) {
this.catId = catId;
}
/**
* 获取分类ID
*/
public Integer getCatId() {
return catId;
}
/**
* 设置:分类名
*/
public void setCatName(String catName) {
this.catName = catName;
}
/**
* 获取:分类名
*/
public String getCatName() {
return catName;
}
/**
* 设置子分类ID
*/
public void setCatChildId(Integer catChildId) {
this.catChildId = catChildId;
}
/**
* 获取子分类ID
*/
public Integer getCatChildId() {
return catChildId;
}
/**
* 设置:子分类名
*/
public void setCatChildName(String catChildName) {
this.catChildName = catChildName;
}
/**
* 获取:子分类名
*/
public String getCatChildName() {
return catChildName;
}
/**
* 设置:小说封面
*/
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
/**
* 获取:小说封面
*/
public String getPicUrl() {
return picUrl;
}
/**
* 设置:小说名
*/
public void setBookName(String bookName) {
this.bookName = bookName;
}
/**
* 获取:小说名
*/
public String getBookName() {
return bookName;
}
/**
* 设置:男主角姓名
*/
public void setHeroName(String heroName) {
this.heroName = heroName;
}
/**
* 获取:男主角姓名
*/
public String getHeroName() {
return heroName;
}
/**
* 设置:女主角姓名
*/
public void setLadyName(String ladyName) {
this.ladyName = ladyName;
}
/**
* 获取:女主角姓名
*/
public String getLadyName() {
return ladyName;
}
/**
* 设置作品风格0甜宠1虐恋2其他
*/
public void setBookStyle(Integer bookStyle) {
this.bookStyle = bookStyle;
}
/**
* 获取作品风格0甜宠1虐恋2其他
*/
public Integer getBookStyle() {
return bookStyle;
}
/**
* 设置:作品标签
*/
public void setBookLabel(String bookLabel) {
this.bookLabel = bookLabel;
}
/**
* 获取:作品标签
*/
public String getBookLabel() {
return bookLabel;
}
/**
* 设置作者id
*/
public void setAuthorId(Long authorId) {
this.authorId = authorId;
}
/**
* 获取作者id
*/
public Long getAuthorId() {
return authorId;
}
/**
* 设置:作者名
*/
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
/**
* 获取:作者名
*/
public String getAuthorName() {
return authorName;
}
/**
* 设置:书籍描述
*/
public void setBookDesc(String bookDesc) {
this.bookDesc = bookDesc;
}
/**
* 获取:书籍描述
*/
public String getBookDesc() {
return bookDesc;
}
/**
* 设置:评分,预留字段
*/
public void setScore(Float score) {
this.score = score;
}
/**
* 获取:评分,预留字段
*/
public Float getScore() {
return score;
}
/**
* 设置书籍状态0连载中1已完结
*/
public void setBookStatus(Integer bookStatus) {
this.bookStatus = bookStatus;
}
/**
* 获取书籍状态0连载中1已完结
*/
public Integer getBookStatus() {
return bookStatus;
}
/**
* 设置:点击量
*/
public void setVisitCount(Long visitCount) {
this.visitCount = visitCount;
}
/**
* 获取:点击量
*/
public Long getVisitCount() {
return visitCount;
}
/**
* 设置:总字数
*/
public void setWordCount(Integer wordCount) {
this.wordCount = wordCount;
}
/**
* 获取:总字数
*/
public Integer getWordCount() {
return wordCount;
}
/**
* 设置:评论数
*/
public void setCommentCount(Integer commentCount) {
this.commentCount = commentCount;
}
/**
* 获取:评论数
*/
public Integer getCommentCount() {
return commentCount;
}
/**
* 设置:昨日订阅数
*/
public void setYesterdayBuy(Integer yesterdayBuy) {
this.yesterdayBuy = yesterdayBuy;
}
/**
* 获取:昨日订阅数
*/
public Integer getYesterdayBuy() {
return yesterdayBuy;
}
/**
* 设置最新目录ID
*/
public void setLastIndexId(Long lastIndexId) {
this.lastIndexId = lastIndexId;
}
/**
* 获取最新目录ID
*/
public Long getLastIndexId() {
return lastIndexId;
}
/**
* 设置:最新目录名
*/
public void setLastIndexName(String lastIndexName) {
this.lastIndexName = lastIndexName;
}
/**
* 获取:最新目录名
*/
public String getLastIndexName() {
return lastIndexName;
}
/**
* 设置:最新目录更新时间
*/
public void setLastIndexUpdateTime(Date lastIndexUpdateTime) {
this.lastIndexUpdateTime = lastIndexUpdateTime;
}
/**
* 获取:最新目录更新时间
*/
public Date getLastIndexUpdateTime() {
return lastIndexUpdateTime;
}
/**
* 设置是否收费1收费0免费
*/
public void setIsVip(Integer isVip) {
this.isVip = isVip;
}
/**
* 获取是否收费1收费0免费
*/
public Integer getIsVip() {
return isVip;
}
/**
* 设置状态0入库1上架
*/
public void setStatus(Integer status) {
this.status = status;
}
/**
* 获取状态0入库1上架
*/
public Integer getStatus() {
return status;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置爬虫源站ID
*/
public void setCrawlSourceId(Integer crawlSourceId) {
this.crawlSourceId = crawlSourceId;
}
/**
* 获取爬虫源站ID
*/
public Integer getCrawlSourceId() {
return crawlSourceId;
}
/**
* 设置抓取的源站小说ID
*/
public void setCrawlBookId(String crawlBookId) {
this.crawlBookId = crawlBookId;
}
/**
* 获取抓取的源站小说ID
*/
public String getCrawlBookId() {
return crawlBookId;
}
/**
* 设置:最后一次的抓取时间
*/
public void setCrawlLastTime(Date crawlLastTime) {
this.crawlLastTime = crawlLastTime;
}
/**
* 获取:最后一次的抓取时间
*/
public Date getCrawlLastTime() {
return crawlLastTime;
}
/**
* 设置是否已停止更新0未停止1已停止
*/
public void setCrawlIsStop(Integer crawlIsStop) {
this.crawlIsStop = crawlIsStop;
}
/**
* 获取是否已停止更新0未停止1已停止
*/
public Integer getCrawlIsStop() {
return crawlIsStop;
}
}

View File

@ -0,0 +1,135 @@
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.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 新闻类别表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:03:41
*/
public class CategoryDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
private Integer id;
//分类名
private String name;
//排序
private Integer sort;
//
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long createUserId;
//
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//
//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 setName(String name) {
this.name = name;
}
/**
* 获取:分类名
*/
public String getName() {
return name;
}
/**
* 设置:排序
*/
public void setSort(Integer sort) {
this.sort = sort;
}
/**
* 获取:排序
*/
public Integer getSort() {
return sort;
}
/**
* 设置:
*/
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
/**
* 获取:
*/
public Long getCreateUserId() {
return createUserId;
}
/**
* 设置:
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:
*/
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
/**
* 获取:
*/
public Long getUpdateUserId() {
return updateUserId;
}
/**
* 设置:
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:
*/
public Date getUpdateTime() {
return updateTime;
}
}

View File

@ -0,0 +1,180 @@
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.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 新闻表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:05:51
*/
public class NewsDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//类别ID
private Integer catId;
//分类名
private String catName;
//来源
private String sourceName;
//标题
private String title;
//内容
private String content;
//发布时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//发布人ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long createUserId;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
//更新人ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long updateUserId;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置类别ID
*/
public void setCatId(Integer catId) {
this.catId = catId;
}
/**
* 获取类别ID
*/
public Integer getCatId() {
return catId;
}
/**
* 设置:分类名
*/
public void setCatName(String catName) {
this.catName = catName;
}
/**
* 获取:分类名
*/
public String getCatName() {
return catName;
}
/**
* 设置:来源
*/
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
/**
* 获取:来源
*/
public String getSourceName() {
return sourceName;
}
/**
* 设置:标题
*/
public void setTitle(String title) {
this.title = title;
}
/**
* 获取:标题
*/
public String getTitle() {
return title;
}
/**
* 设置:内容
*/
public void setContent(String content) {
this.content = content;
}
/**
* 获取:内容
*/
public String getContent() {
return content;
}
/**
* 设置:发布时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:发布时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置发布人ID
*/
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
/**
* 获取发布人ID
*/
public Long getCreateUserId() {
return createUserId;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
/**
* 设置更新人ID
*/
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
/**
* 获取更新人ID
*/
public Long getUpdateUserId() {
return updateUserId;
}
}

View File

@ -0,0 +1,166 @@
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.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 充值订单
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:57
*/
public class PayDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//保留
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long outTradeNo;
//订单号
private String tradeNo;
//保留
private Integer payChannel;
//交易香蕉币
private Integer totalAmount;
//支付用户ID
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long userId;
//支付状态0支付失败1支付成功2待支付
private Integer payStatus;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置:保留
*/
public void setOutTradeNo(Long outTradeNo) {
this.outTradeNo = outTradeNo;
}
/**
* 获取:保留
*/
public Long getOutTradeNo() {
return outTradeNo;
}
/**
* 设置:订单号
*/
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
/**
* 获取:订单号
*/
public String getTradeNo() {
return tradeNo;
}
/**
* 设置:保留
*/
public void setPayChannel(Integer payChannel) {
this.payChannel = payChannel;
}
/**
* 获取:保留
*/
public Integer getPayChannel() {
return payChannel;
}
/**
* 设置:交易香蕉币
*/
public void setTotalAmount(Integer totalAmount) {
this.totalAmount = totalAmount;
}
/**
* 获取:交易香蕉币
*/
public Integer getTotalAmount() {
return totalAmount;
}
/**
* 设置支付用户ID
*/
public void setUserId(Long userId) {
this.userId = userId;
}
/**
* 获取支付用户ID
*/
public Long getUserId() {
return userId;
}
/**
* 设置支付状态0支付失败1支付成功2待支付
*/
public void setPayStatus(Integer payStatus) {
this.payStatus = payStatus;
}
/**
* 获取支付状态0支付失败1支付成功2待支付
*/
public Integer getPayStatus() {
return payStatus;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
}

View File

@ -0,0 +1,177 @@
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.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:08
*/
public class UserDO implements Serializable {
private static final long serialVersionUID = 1L;
//主键
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long id;
//登录名
private String username;
//登录密码
private String password;
//昵称
private String nickName;
//用户头像
private String userPhoto;
//用户性别01
private Integer userSex;
//账户余额
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
//所以通过序列化成字符串来解决
@JsonSerialize(using = LongToStringSerializer.class)
private Long accountBalance;
//用户状态0正常
private Integer status;
//创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
//更新时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 设置:主键
*/
public void setId(Long id) {
this.id = id;
}
/**
* 获取:主键
*/
public Long getId() {
return id;
}
/**
* 设置:登录名
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取:登录名
*/
public String getUsername() {
return username;
}
/**
* 设置:登录密码
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取:登录密码
*/
public String getPassword() {
return password;
}
/**
* 设置:昵称
*/
public void setNickName(String nickName) {
this.nickName = nickName;
}
/**
* 获取:昵称
*/
public String getNickName() {
return nickName;
}
/**
* 设置:用户头像
*/
public void setUserPhoto(String userPhoto) {
this.userPhoto = userPhoto;
}
/**
* 获取:用户头像
*/
public String getUserPhoto() {
return userPhoto;
}
/**
* 设置用户性别01
*/
public void setUserSex(Integer userSex) {
this.userSex = userSex;
}
/**
* 获取用户性别01
*/
public Integer getUserSex() {
return userSex;
}
/**
* 设置:账户余额
*/
public void setAccountBalance(Long accountBalance) {
this.accountBalance = accountBalance;
}
/**
* 获取:账户余额
*/
public Long getAccountBalance() {
return accountBalance;
}
/**
* 设置用户状态0正常
*/
public void setStatus(Integer status) {
this.status = status;
}
/**
* 获取用户状态0正常
*/
public Integer getStatus() {
return status;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:更新时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:更新时间
*/
public Date getUpdateTime() {
return updateTime;
}
}

View File

@ -0,0 +1,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.AuthorCodeDO;
import java.util.List;
import java.util.Map;
/**
* 作家邀请码表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:29:15
*/
public interface AuthorCodeService {
AuthorCodeDO get(Long id);
List<AuthorCodeDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(AuthorCodeDO authorCode);
int update(AuthorCodeDO authorCode);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,33 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.AuthorDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 作者表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-05-13 11:16:51
*/
public interface AuthorService {
AuthorDO get(Long id);
List<AuthorDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(AuthorDO author);
int update(AuthorDO author);
int remove(Long id);
int batchRemove(Long[] ids);
Map<Object, Object> tableSta(Date minDate);
}

View File

@ -0,0 +1,33 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.BookDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 小说表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:46
*/
public interface BookService {
BookDO get(Long id);
List<BookDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(BookDO book);
int update(BookDO book);
int remove(Long id);
int batchRemove(Long[] ids);
Map<Object, Object> tableSta(Date minDate);
}

View File

@ -0,0 +1,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.CategoryDO;
import java.util.List;
import java.util.Map;
/**
* 新闻类别表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:03:41
*/
public interface CategoryService {
CategoryDO get(Integer id);
List<CategoryDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(CategoryDO category);
int update(CategoryDO category);
int remove(Integer id);
int batchRemove(Integer[] ids);
}

View File

@ -0,0 +1,30 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.NewsDO;
import java.util.List;
import java.util.Map;
/**
* 新闻表
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 10:05:51
*/
public interface NewsService {
NewsDO get(Long id);
List<NewsDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(NewsDO news);
int update(NewsDO news);
int remove(Long id);
int batchRemove(Long[] ids);
}

View File

@ -0,0 +1,33 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.PayDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 充值订单
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:57
*/
public interface PayService {
PayDO get(Long id);
List<PayDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(PayDO pay);
int update(PayDO pay);
int remove(Long id);
int batchRemove(Long[] ids);
Map<Object, Object> tableSta(Date minDate);
}

View File

@ -0,0 +1,33 @@
package com.java2nb.novel.service;
import com.java2nb.novel.domain.UserDO;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
*
*
* @author xiongxy
* @email 1179705413@qq.com
* @date 2020-12-01 03:49:08
*/
public interface UserService {
UserDO get(Long id);
List<UserDO> list(Map<String, Object> map);
int count(Map<String, Object> map);
int save(UserDO user);
int update(UserDO user);
int remove(Long id);
int batchRemove(Long[] ids);
Map<Object, Object> tableSta(Date minDate);
}

View File

@ -0,0 +1,60 @@
package com.java2nb.novel.service.impl;
import com.java2nb.common.utils.ShiroUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.java2nb.novel.dao.AuthorCodeDao;
import com.java2nb.novel.domain.AuthorCodeDO;
import com.java2nb.novel.service.AuthorCodeService;
@Service
public class AuthorCodeServiceImpl implements AuthorCodeService {
@Autowired
private AuthorCodeDao authorCodeDao;
@Override
public AuthorCodeDO get(Long id){
return authorCodeDao.get(id);
}
@Override
public List<AuthorCodeDO> list(Map<String, Object> map){
return authorCodeDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return authorCodeDao.count(map);
}
@Override
public int save(AuthorCodeDO authorCode){
authorCode.setIsUse(0);
authorCode.setCreateTime(new Date());
authorCode.setCreateUserId(ShiroUtils.getUserId());
return authorCodeDao.save(authorCode);
}
@Override
public int update(AuthorCodeDO authorCode){
return authorCodeDao.update(authorCode);
}
@Override
public int remove(Long id){
return authorCodeDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return authorCodeDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,66 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.java2nb.novel.dao.AuthorDao;
import com.java2nb.novel.domain.AuthorDO;
import com.java2nb.novel.service.AuthorService;
@Service
public class AuthorServiceImpl implements AuthorService {
@Autowired
private AuthorDao authorDao;
@Override
public AuthorDO get(Long id){
return authorDao.get(id);
}
@Override
public List<AuthorDO> list(Map<String, Object> map){
return authorDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return authorDao.count(map);
}
@Override
public int save(AuthorDO author){
return authorDao.save(author);
}
@Override
public int update(AuthorDO author){
return authorDao.update(author);
}
@Override
public int remove(Long id){
return authorDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return authorDao.batchRemove(ids);
}
@Override
public Map<Object, Object> tableSta(Date minDate) {
List<Map<Object, Object>> maps = authorDao.tableSta(minDate);
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("authorCount")));
}
}

View File

@ -0,0 +1,65 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.java2nb.novel.dao.BookDao;
import com.java2nb.novel.domain.BookDO;
import com.java2nb.novel.service.BookService;
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
@Override
public BookDO get(Long id){
return bookDao.get(id);
}
@Override
public List<BookDO> list(Map<String, Object> map){
return bookDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return bookDao.count(map);
}
@Override
public int save(BookDO book){
return bookDao.save(book);
}
@Override
public int update(BookDO book){
return bookDao.update(book);
}
@Override
public int remove(Long id){
return bookDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return bookDao.batchRemove(ids);
}
@Override
public Map<Object, Object> tableSta(Date minDate) {
List<Map<Object, Object>> maps = bookDao.tableSta(minDate);
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("bookCount")));
}
}

View File

@ -0,0 +1,58 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.java2nb.novel.dao.CategoryDao;
import com.java2nb.novel.domain.CategoryDO;
import com.java2nb.novel.service.CategoryService;
@Service
public class CategoryServiceImpl implements CategoryService {
@Autowired
private CategoryDao categoryDao;
@Override
public CategoryDO get(Integer id){
return categoryDao.get(id);
}
@Override
public List<CategoryDO> list(Map<String, Object> map){
return categoryDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return categoryDao.count(map);
}
@Override
public int save(CategoryDO category){
category.setCreateTime(new Date());
return categoryDao.save(category);
}
@Override
public int update(CategoryDO category){
category.setUpdateTime(new Date());
return categoryDao.update(category);
}
@Override
public int remove(Integer id){
return categoryDao.remove(id);
}
@Override
public int batchRemove(Integer[] ids){
return categoryDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,58 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.java2nb.novel.dao.NewsDao;
import com.java2nb.novel.domain.NewsDO;
import com.java2nb.novel.service.NewsService;
@Service
public class NewsServiceImpl implements NewsService {
@Autowired
private NewsDao newsDao;
@Override
public NewsDO get(Long id){
return newsDao.get(id);
}
@Override
public List<NewsDO> list(Map<String, Object> map){
return newsDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return newsDao.count(map);
}
@Override
public int save(NewsDO news){
news.setCreateTime(new Date());
return newsDao.save(news);
}
@Override
public int update(NewsDO news){
news.setUpdateTime(new Date());
return newsDao.update(news);
}
@Override
public int remove(Long id){
return newsDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return newsDao.batchRemove(ids);
}
}

View File

@ -0,0 +1,66 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.java2nb.novel.dao.PayDao;
import com.java2nb.novel.domain.PayDO;
import com.java2nb.novel.service.PayService;
@Service
public class PayServiceImpl implements PayService {
@Autowired
private PayDao payDao;
@Override
public PayDO get(Long id){
return payDao.get(id);
}
@Override
public List<PayDO> list(Map<String, Object> map){
return payDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return payDao.count(map);
}
@Override
public int save(PayDO pay){
return payDao.save(pay);
}
@Override
public int update(PayDO pay){
return payDao.update(pay);
}
@Override
public int remove(Long id){
return payDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return payDao.batchRemove(ids);
}
@Override
public Map<Object, Object> tableSta(Date minDate) {
List<Map<Object, Object>> maps = payDao.tableSta(minDate);
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("orderCount")));
}
}

View File

@ -0,0 +1,65 @@
package com.java2nb.novel.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.java2nb.novel.dao.UserDao;
import com.java2nb.novel.domain.UserDO;
import com.java2nb.novel.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public UserDO get(Long id){
return userDao.get(id);
}
@Override
public List<UserDO> list(Map<String, Object> map){
return userDao.list(map);
}
@Override
public int count(Map<String, Object> map){
return userDao.count(map);
}
@Override
public int save(UserDO user){
return userDao.save(user);
}
@Override
public int update(UserDO user){
return userDao.update(user);
}
@Override
public int remove(Long id){
return userDao.remove(id);
}
@Override
public int batchRemove(Long[] ids){
return userDao.batchRemove(ids);
}
@Override
public Map<Object, Object> tableSta(Date minDate) {
List<Map<Object, Object>> maps = userDao.tableSta(minDate);
return maps.stream().collect(Collectors.toMap(x -> x.get("staDate"), x -> x.get("userCount")));
}
}

View File

@ -10,7 +10,7 @@ import com.java2nb.system.domain.DeptDO;
import com.java2nb.system.domain.RoleDO; import com.java2nb.system.domain.RoleDO;
import com.java2nb.system.domain.UserDO; import com.java2nb.system.domain.UserDO;
import com.java2nb.system.service.RoleService; import com.java2nb.system.service.RoleService;
import com.java2nb.system.service.UserService; import com.java2nb.system.service.SysUserService;
import com.java2nb.system.vo.UserVO; import com.java2nb.system.vo.UserVO;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -27,10 +27,10 @@ import java.util.Map;
@RequestMapping("/sys/user") @RequestMapping("/sys/user")
@Controller @Controller
public class UserController extends BaseController { public class SysUserController extends BaseController {
private String prefix="system/user" ; private String prefix="system/user" ;
@Autowired @Autowired
UserService userService; SysUserService userService;
@Autowired @Autowired
RoleService roleService; RoleService roleService;
@Autowired @Autowired

View File

@ -15,7 +15,7 @@ import org.apache.ibatis.annotations.Param;
* @date 2019-10-03 09:45:11 * @date 2019-10-03 09:45:11
*/ */
@Mapper @Mapper
public interface UserDao { public interface SysUserDao {
UserDO get(Long userId); UserDO get(Long userId);

View File

@ -13,7 +13,7 @@ import com.java2nb.system.domain.UserDO;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@Service @Service
public interface UserService { public interface SysUserService {
UserDO get(Long id); UserDO get(Long id);
List<UserDO> list(Map<String, Object> map); List<UserDO> list(Map<String, Object> map);

View File

@ -8,8 +8,6 @@ import java.util.Objects;
import com.java2nb.system.dao.*; import com.java2nb.system.dao.*;
import com.java2nb.system.domain.RoleDataPermDO; import com.java2nb.system.domain.RoleDataPermDO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -30,7 +28,7 @@ public class RoleServiceImpl implements RoleService {
@Autowired @Autowired
RoleMenuDao roleMenuMapper; RoleMenuDao roleMenuMapper;
@Autowired @Autowired
UserDao userMapper; SysUserDao userMapper;
@Autowired @Autowired
UserRoleDao userRoleMapper; UserRoleDao userRoleMapper;
@Autowired @Autowired

View File

@ -19,21 +19,21 @@ import org.springframework.transaction.annotation.Transactional;
import com.java2nb.common.domain.Tree; import com.java2nb.common.domain.Tree;
import com.java2nb.system.dao.DeptDao; import com.java2nb.system.dao.DeptDao;
import com.java2nb.system.dao.UserDao; import com.java2nb.system.dao.SysUserDao;
import com.java2nb.system.dao.UserRoleDao; import com.java2nb.system.dao.UserRoleDao;
import com.java2nb.system.domain.DeptDO; import com.java2nb.system.domain.DeptDO;
import com.java2nb.system.domain.UserDO; import com.java2nb.system.domain.UserDO;
import com.java2nb.system.domain.UserRoleDO; import com.java2nb.system.domain.UserRoleDO;
import com.java2nb.system.service.UserService; import com.java2nb.system.service.SysUserService;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@Transactional @Transactional
@Service @Service
public class UserServiceImpl implements UserService { public class SysUserServiceImpl implements SysUserService {
@Autowired @Autowired
UserDao userMapper; SysUserDao userMapper;
@Autowired @Autowired
UserRoleDao userRoleMapper; UserRoleDao userRoleMapper;
@Autowired @Autowired
@ -44,7 +44,7 @@ public class UserServiceImpl implements UserService {
private JnConfig jnConfig; private JnConfig jnConfig;
@Autowired @Autowired
DeptService deptService; DeptService deptService;
private static final Logger logger = LoggerFactory.getLogger(UserService.class); private static final Logger logger = LoggerFactory.getLogger(SysUserService.class);
@Override @Override
// @Cacheable(value = "user",key = "#id") // @Cacheable(value = "user",key = "#id")

View File

@ -6,7 +6,6 @@ import com.java2nb.common.config.ApplicationContextRegister;
import com.java2nb.system.dao.DataPermDao; import com.java2nb.system.dao.DataPermDao;
import com.java2nb.system.dao.DeptDao; import com.java2nb.system.dao.DeptDao;
import com.java2nb.system.domain.DataPermDO; import com.java2nb.system.domain.DataPermDO;
import com.java2nb.system.domain.UserToken;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.AuthenticationToken;
@ -18,10 +17,9 @@ import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import com.java2nb.common.utils.ShiroUtils; import com.java2nb.common.utils.ShiroUtils;
import com.java2nb.system.dao.UserDao; import com.java2nb.system.dao.SysUserDao;
import com.java2nb.system.domain.UserDO; import com.java2nb.system.domain.UserDO;
import com.java2nb.system.service.MenuService; import com.java2nb.system.service.MenuService;
@ -48,7 +46,7 @@ public class UserRealm extends AuthorizingRealm {
map.put("username", username); map.put("username", username);
String password = new String((char[]) token.getCredentials()); String password = new String((char[]) token.getCredentials());
UserDao userMapper = ApplicationContextRegister.getBean(UserDao.class); SysUserDao userMapper = ApplicationContextRegister.getBean(SysUserDao.class);
// 查询用户信息 // 查询用户信息
UserDO user = userMapper.list(map).get(0); UserDO user = userMapper.list(map).get(0);

View File

@ -10,7 +10,7 @@ spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://128.0.0.1:3306/novel_biz?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root username: root
password: test123456 password: test123456
#password: #password:

View File

@ -3,7 +3,7 @@ server:
# tomcat: # tomcat:
# max-threads: 1000 # max-threads: 1000
# min-spare-threads: 30 # min-spare-threads: 30
port: 8082 port: 80
# uri-encoding: utf-8 # uri-encoding: utf-8
#security: #security:
# basic: # basic:

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.AuthorCodeDao">
<select id="get" resultType="com.java2nb.novel.domain.AuthorCodeDO">
select `id`,`invite_code`,`validity_time`,`is_use`,`create_time`,`create_user_id` from author_code where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.AuthorCodeDO">
select `id`,`invite_code`,`validity_time`,`is_use`,`create_time`,`create_user_id` from author_code
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="inviteCode != null and inviteCode != ''"> and invite_code = #{inviteCode} </if>
<if test="validityTime != null and validityTime != ''"> and validity_time = #{validityTime} </if>
<if test="isUse != null and isUse != ''"> and is_use = #{isUse} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by create_time desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from author_code
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="inviteCode != null and inviteCode != ''"> and invite_code = #{inviteCode} </if>
<if test="validityTime != null and validityTime != ''"> and validity_time = #{validityTime} </if>
<if test="isUse != null and isUse != ''"> and is_use = #{isUse} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.AuthorCodeDO" useGeneratedKeys="true" keyProperty="id">
insert into author_code
(
`invite_code`,
`validity_time`,
`is_use`,
`create_time`,
`create_user_id`
)
values
(
#{inviteCode},
#{validityTime},
#{isUse},
#{createTime},
#{createUserId}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.AuthorCodeDO" useGeneratedKeys="true" keyProperty="id">
insert into author_code
(
<if test="id != null"> `id`, </if>
<if test="inviteCode != null"> `invite_code`, </if>
<if test="validityTime != null"> `validity_time`, </if>
<if test="isUse != null"> `is_use`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="createUserId != null"> `create_user_id` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="inviteCode != null"> #{inviteCode}, </if>
<if test="validityTime != null"> #{validityTime}, </if>
<if test="isUse != null"> #{isUse}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="createUserId != null"> #{createUserId} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.AuthorCodeDO">
update author_code
<set>
<if test="inviteCode != null">`invite_code` = #{inviteCode}, </if>
<if test="validityTime != null">`validity_time` = #{validityTime}, </if>
<if test="isUse != null">`is_use` = #{isUse}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="createUserId != null">`create_user_id` = #{createUserId}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from author_code where id = #{value}
</delete>
<delete id="batchRemove">
delete from author_code where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.AuthorDao">
<select id="get" resultType="com.java2nb.novel.domain.AuthorDO">
select `id`,`user_id`,`invite_code`,`pen_name`,`tel_phone`,`chat_account`,`email`,`work_direction`,`create_time`,`status` from author where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.AuthorDO">
select `id`,`user_id`,`invite_code`,`pen_name`,`tel_phone`,`chat_account`,`email`,`work_direction`,`create_time`,`status` from author
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
<if test="inviteCode != null and inviteCode != ''"> and invite_code = #{inviteCode} </if>
<if test="penName != null and penName != ''"> and pen_name = #{penName} </if>
<if test="telPhone != null and telPhone != ''"> and tel_phone = #{telPhone} </if>
<if test="chatAccount != null and chatAccount != ''"> and chat_account = #{chatAccount} </if>
<if test="email != null and email != ''"> and email = #{email} </if>
<if test="workDirection != null and workDirection != ''"> and work_direction = #{workDirection} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from author
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
<if test="inviteCode != null and inviteCode != ''"> and invite_code = #{inviteCode} </if>
<if test="penName != null and penName != ''"> and pen_name = #{penName} </if>
<if test="telPhone != null and telPhone != ''"> and tel_phone = #{telPhone} </if>
<if test="chatAccount != null and chatAccount != ''"> and chat_account = #{chatAccount} </if>
<if test="email != null and email != ''"> and email = #{email} </if>
<if test="workDirection != null and workDirection != ''"> and work_direction = #{workDirection} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.AuthorDO" useGeneratedKeys="true" keyProperty="id">
insert into author
(
`user_id`,
`invite_code`,
`pen_name`,
`tel_phone`,
`chat_account`,
`email`,
`work_direction`,
`create_time`,
`status`
)
values
(
#{userId},
#{inviteCode},
#{penName},
#{telPhone},
#{chatAccount},
#{email},
#{workDirection},
#{createTime},
#{status}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.AuthorDO" useGeneratedKeys="true" keyProperty="id">
insert into author
(
<if test="id != null"> `id`, </if>
<if test="userId != null"> `user_id`, </if>
<if test="inviteCode != null"> `invite_code`, </if>
<if test="penName != null"> `pen_name`, </if>
<if test="telPhone != null"> `tel_phone`, </if>
<if test="chatAccount != null"> `chat_account`, </if>
<if test="email != null"> `email`, </if>
<if test="workDirection != null"> `work_direction`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="status != null"> `status` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="userId != null"> #{userId}, </if>
<if test="inviteCode != null"> #{inviteCode}, </if>
<if test="penName != null"> #{penName}, </if>
<if test="telPhone != null"> #{telPhone}, </if>
<if test="chatAccount != null"> #{chatAccount}, </if>
<if test="email != null"> #{email}, </if>
<if test="workDirection != null"> #{workDirection}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="status != null"> #{status} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.AuthorDO">
update author
<set>
<if test="userId != null">`user_id` = #{userId}, </if>
<if test="inviteCode != null">`invite_code` = #{inviteCode}, </if>
<if test="penName != null">`pen_name` = #{penName}, </if>
<if test="telPhone != null">`tel_phone` = #{telPhone}, </if>
<if test="chatAccount != null">`chat_account` = #{chatAccount}, </if>
<if test="email != null">`email` = #{email}, </if>
<if test="workDirection != null">`work_direction` = #{workDirection}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="status != null">`status` = #{status}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from author where id = #{value}
</delete>
<delete id="batchRemove">
delete from author where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="tableSta" resultType="map">
SELECT
DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate,
COUNT( 1 ) authorCount
FROM
AUTHOR
WHERE
create_time >= #{minDate}
GROUP BY
DATE_FORMAT( create_time, "%Y-%m-%d" )
ORDER BY
staDate
</select>
</mapper>

View File

@ -0,0 +1,306 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.BookDao">
<select id="get" resultType="com.java2nb.novel.domain.BookDO">
select `id`,`work_direction`,`cat_id`,`cat_name`,`cat_child_id`,`cat_child_name`,`pic_url`,`book_name`,`hero_name`,`lady_name`,`book_style`,`book_label`,`author_id`,`author_name`,`book_desc`,`score`,`book_status`,`visit_count`,`word_count`,`comment_count`,`yesterday_buy`,`last_index_id`,`last_index_name`,`last_index_update_time`,`is_vip`,`status`,`update_time`,`create_time`,`crawl_source_id`,`crawl_book_id`,`crawl_last_time`,`crawl_is_stop` from book where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.BookDO">
select `id`,`work_direction`,`cat_id`,`cat_name`,`cat_child_id`,`cat_child_name`,`pic_url`,`book_name`,`hero_name`,`lady_name`,`book_style`,`book_label`,`author_id`,`author_name`,`book_desc`,`score`,`book_status`,`visit_count`,`word_count`,`comment_count`,`yesterday_buy`,`last_index_id`,`last_index_name`,`last_index_update_time`,`is_vip`,`status`,`update_time`,`create_time`,`crawl_source_id`,`crawl_book_id`,`crawl_last_time`,`crawl_is_stop` from book
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="workDirection != null and workDirection != ''"> and work_direction = #{workDirection} </if>
<if test="catId != null and catId != ''"> and cat_id = #{catId} </if>
<if test="catName != null and catName != ''"> and cat_name = #{catName} </if>
<if test="catChildId != null and catChildId != ''"> and cat_child_id = #{catChildId} </if>
<if test="catChildName != null and catChildName != ''"> and cat_child_name = #{catChildName} </if>
<if test="picUrl != null and picUrl != ''"> and pic_url = #{picUrl} </if>
<if test="bookName != null and bookName != ''"> and book_name = #{bookName} </if>
<if test="heroName != null and heroName != ''"> and hero_name = #{heroName} </if>
<if test="ladyName != null and ladyName != ''"> and lady_name = #{ladyName} </if>
<if test="bookStyle != null and bookStyle != ''"> and book_style = #{bookStyle} </if>
<if test="bookLabel != null and bookLabel != ''"> and book_label = #{bookLabel} </if>
<if test="authorId != null and authorId != ''"> and author_id = #{authorId} </if>
<if test="authorName != null and authorName != ''"> and author_name = #{authorName} </if>
<if test="bookDesc != null and bookDesc != ''"> and book_desc = #{bookDesc} </if>
<if test="score != null and score != ''"> and score = #{score} </if>
<if test="bookStatus != null and bookStatus != ''"> and book_status = #{bookStatus} </if>
<if test="visitCount != null and visitCount != ''"> and visit_count = #{visitCount} </if>
<if test="wordCount != null and wordCount != ''"> and word_count = #{wordCount} </if>
<if test="commentCount != null and commentCount != ''"> and comment_count = #{commentCount} </if>
<if test="yesterdayBuy != null and yesterdayBuy != ''"> and yesterday_buy = #{yesterdayBuy} </if>
<if test="lastIndexId != null and lastIndexId != ''"> and last_index_id = #{lastIndexId} </if>
<if test="lastIndexName != null and lastIndexName != ''"> and last_index_name = #{lastIndexName} </if>
<if test="lastIndexUpdateTime != null and lastIndexUpdateTime != ''"> and last_index_update_time = #{lastIndexUpdateTime} </if>
<if test="isVip != null and isVip != ''"> and is_vip = #{isVip} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="crawlSourceId != null and crawlSourceId != ''"> and crawl_source_id = #{crawlSourceId} </if>
<if test="crawlBookId != null and crawlBookId != ''"> and crawl_book_id = #{crawlBookId} </if>
<if test="crawlLastTime != null and crawlLastTime != ''"> and crawl_last_time = #{crawlLastTime} </if>
<if test="crawlIsStop != null and crawlIsStop != ''"> and crawl_is_stop = #{crawlIsStop} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from book
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="workDirection != null and workDirection != ''"> and work_direction = #{workDirection} </if>
<if test="catId != null and catId != ''"> and cat_id = #{catId} </if>
<if test="catName != null and catName != ''"> and cat_name = #{catName} </if>
<if test="catChildId != null and catChildId != ''"> and cat_child_id = #{catChildId} </if>
<if test="catChildName != null and catChildName != ''"> and cat_child_name = #{catChildName} </if>
<if test="picUrl != null and picUrl != ''"> and pic_url = #{picUrl} </if>
<if test="bookName != null and bookName != ''"> and book_name = #{bookName} </if>
<if test="heroName != null and heroName != ''"> and hero_name = #{heroName} </if>
<if test="ladyName != null and ladyName != ''"> and lady_name = #{ladyName} </if>
<if test="bookStyle != null and bookStyle != ''"> and book_style = #{bookStyle} </if>
<if test="bookLabel != null and bookLabel != ''"> and book_label = #{bookLabel} </if>
<if test="authorId != null and authorId != ''"> and author_id = #{authorId} </if>
<if test="authorName != null and authorName != ''"> and author_name = #{authorName} </if>
<if test="bookDesc != null and bookDesc != ''"> and book_desc = #{bookDesc} </if>
<if test="score != null and score != ''"> and score = #{score} </if>
<if test="bookStatus != null and bookStatus != ''"> and book_status = #{bookStatus} </if>
<if test="visitCount != null and visitCount != ''"> and visit_count = #{visitCount} </if>
<if test="wordCount != null and wordCount != ''"> and word_count = #{wordCount} </if>
<if test="commentCount != null and commentCount != ''"> and comment_count = #{commentCount} </if>
<if test="yesterdayBuy != null and yesterdayBuy != ''"> and yesterday_buy = #{yesterdayBuy} </if>
<if test="lastIndexId != null and lastIndexId != ''"> and last_index_id = #{lastIndexId} </if>
<if test="lastIndexName != null and lastIndexName != ''"> and last_index_name = #{lastIndexName} </if>
<if test="lastIndexUpdateTime != null and lastIndexUpdateTime != ''"> and last_index_update_time = #{lastIndexUpdateTime} </if>
<if test="isVip != null and isVip != ''"> and is_vip = #{isVip} </if>
<if test="status != null and status != ''"> and status = #{status} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="crawlSourceId != null and crawlSourceId != ''"> and crawl_source_id = #{crawlSourceId} </if>
<if test="crawlBookId != null and crawlBookId != ''"> and crawl_book_id = #{crawlBookId} </if>
<if test="crawlLastTime != null and crawlLastTime != ''"> and crawl_last_time = #{crawlLastTime} </if>
<if test="crawlIsStop != null and crawlIsStop != ''"> and crawl_is_stop = #{crawlIsStop} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.BookDO">
insert into book
(
`id`,
`work_direction`,
`cat_id`,
`cat_name`,
`cat_child_id`,
`cat_child_name`,
`pic_url`,
`book_name`,
`hero_name`,
`lady_name`,
`book_style`,
`book_label`,
`author_id`,
`author_name`,
`book_desc`,
`score`,
`book_status`,
`visit_count`,
`word_count`,
`comment_count`,
`yesterday_buy`,
`last_index_id`,
`last_index_name`,
`last_index_update_time`,
`is_vip`,
`status`,
`update_time`,
`create_time`,
`crawl_source_id`,
`crawl_book_id`,
`crawl_last_time`,
`crawl_is_stop`
)
values
(
#{id},
#{workDirection},
#{catId},
#{catName},
#{catChildId},
#{catChildName},
#{picUrl},
#{bookName},
#{heroName},
#{ladyName},
#{bookStyle},
#{bookLabel},
#{authorId},
#{authorName},
#{bookDesc},
#{score},
#{bookStatus},
#{visitCount},
#{wordCount},
#{commentCount},
#{yesterdayBuy},
#{lastIndexId},
#{lastIndexName},
#{lastIndexUpdateTime},
#{isVip},
#{status},
#{updateTime},
#{createTime},
#{crawlSourceId},
#{crawlBookId},
#{crawlLastTime},
#{crawlIsStop}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.BookDO">
insert into book
(
<if test="id != null"> `id`, </if>
<if test="workDirection != null"> `work_direction`, </if>
<if test="catId != null"> `cat_id`, </if>
<if test="catName != null"> `cat_name`, </if>
<if test="catChildId != null"> `cat_child_id`, </if>
<if test="catChildName != null"> `cat_child_name`, </if>
<if test="picUrl != null"> `pic_url`, </if>
<if test="bookName != null"> `book_name`, </if>
<if test="heroName != null"> `hero_name`, </if>
<if test="ladyName != null"> `lady_name`, </if>
<if test="bookStyle != null"> `book_style`, </if>
<if test="bookLabel != null"> `book_label`, </if>
<if test="authorId != null"> `author_id`, </if>
<if test="authorName != null"> `author_name`, </if>
<if test="bookDesc != null"> `book_desc`, </if>
<if test="score != null"> `score`, </if>
<if test="bookStatus != null"> `book_status`, </if>
<if test="visitCount != null"> `visit_count`, </if>
<if test="wordCount != null"> `word_count`, </if>
<if test="commentCount != null"> `comment_count`, </if>
<if test="yesterdayBuy != null"> `yesterday_buy`, </if>
<if test="lastIndexId != null"> `last_index_id`, </if>
<if test="lastIndexName != null"> `last_index_name`, </if>
<if test="lastIndexUpdateTime != null"> `last_index_update_time`, </if>
<if test="isVip != null"> `is_vip`, </if>
<if test="status != null"> `status`, </if>
<if test="updateTime != null"> `update_time`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="crawlSourceId != null"> `crawl_source_id`, </if>
<if test="crawlBookId != null"> `crawl_book_id`, </if>
<if test="crawlLastTime != null"> `crawl_last_time`, </if>
<if test="crawlIsStop != null"> `crawl_is_stop` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="workDirection != null"> #{workDirection}, </if>
<if test="catId != null"> #{catId}, </if>
<if test="catName != null"> #{catName}, </if>
<if test="catChildId != null"> #{catChildId}, </if>
<if test="catChildName != null"> #{catChildName}, </if>
<if test="picUrl != null"> #{picUrl}, </if>
<if test="bookName != null"> #{bookName}, </if>
<if test="heroName != null"> #{heroName}, </if>
<if test="ladyName != null"> #{ladyName}, </if>
<if test="bookStyle != null"> #{bookStyle}, </if>
<if test="bookLabel != null"> #{bookLabel}, </if>
<if test="authorId != null"> #{authorId}, </if>
<if test="authorName != null"> #{authorName}, </if>
<if test="bookDesc != null"> #{bookDesc}, </if>
<if test="score != null"> #{score}, </if>
<if test="bookStatus != null"> #{bookStatus}, </if>
<if test="visitCount != null"> #{visitCount}, </if>
<if test="wordCount != null"> #{wordCount}, </if>
<if test="commentCount != null"> #{commentCount}, </if>
<if test="yesterdayBuy != null"> #{yesterdayBuy}, </if>
<if test="lastIndexId != null"> #{lastIndexId}, </if>
<if test="lastIndexName != null"> #{lastIndexName}, </if>
<if test="lastIndexUpdateTime != null"> #{lastIndexUpdateTime}, </if>
<if test="isVip != null"> #{isVip}, </if>
<if test="status != null"> #{status}, </if>
<if test="updateTime != null"> #{updateTime}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="crawlSourceId != null"> #{crawlSourceId}, </if>
<if test="crawlBookId != null"> #{crawlBookId}, </if>
<if test="crawlLastTime != null"> #{crawlLastTime}, </if>
<if test="crawlIsStop != null"> #{crawlIsStop} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.BookDO">
update book
<set>
<if test="workDirection != null">`work_direction` = #{workDirection}, </if>
<if test="catId != null">`cat_id` = #{catId}, </if>
<if test="catName != null">`cat_name` = #{catName}, </if>
<if test="catChildId != null">`cat_child_id` = #{catChildId}, </if>
<if test="catChildName != null">`cat_child_name` = #{catChildName}, </if>
<if test="picUrl != null">`pic_url` = #{picUrl}, </if>
<if test="bookName != null">`book_name` = #{bookName}, </if>
<if test="heroName != null">`hero_name` = #{heroName}, </if>
<if test="ladyName != null">`lady_name` = #{ladyName}, </if>
<if test="bookStyle != null">`book_style` = #{bookStyle}, </if>
<if test="bookLabel != null">`book_label` = #{bookLabel}, </if>
<if test="authorId != null">`author_id` = #{authorId}, </if>
<if test="authorName != null">`author_name` = #{authorName}, </if>
<if test="bookDesc != null">`book_desc` = #{bookDesc}, </if>
<if test="score != null">`score` = #{score}, </if>
<if test="bookStatus != null">`book_status` = #{bookStatus}, </if>
<if test="visitCount != null">`visit_count` = #{visitCount}, </if>
<if test="wordCount != null">`word_count` = #{wordCount}, </if>
<if test="commentCount != null">`comment_count` = #{commentCount}, </if>
<if test="yesterdayBuy != null">`yesterday_buy` = #{yesterdayBuy}, </if>
<if test="lastIndexId != null">`last_index_id` = #{lastIndexId}, </if>
<if test="lastIndexName != null">`last_index_name` = #{lastIndexName}, </if>
<if test="lastIndexUpdateTime != null">`last_index_update_time` = #{lastIndexUpdateTime}, </if>
<if test="isVip != null">`is_vip` = #{isVip}, </if>
<if test="status != null">`status` = #{status}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="crawlSourceId != null">`crawl_source_id` = #{crawlSourceId}, </if>
<if test="crawlBookId != null">`crawl_book_id` = #{crawlBookId}, </if>
<if test="crawlLastTime != null">`crawl_last_time` = #{crawlLastTime}, </if>
<if test="crawlIsStop != null">`crawl_is_stop` = #{crawlIsStop}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from book where id = #{value}
</delete>
<delete id="batchRemove">
delete from book where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="tableSta" resultType="map">
SELECT
DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate,
COUNT( 1 ) bookCount
FROM
BOOK
WHERE
create_time >= #{minDate}
GROUP BY
DATE_FORMAT( create_time, "%Y-%m-%d" )
ORDER BY
staDate
</select>
</mapper>

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.CategoryDao">
<select id="get" resultType="com.java2nb.novel.domain.CategoryDO">
select `id`,`name`,`sort`,`create_user_id`,`create_time`,`update_user_id`,`update_time` from news_category where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.CategoryDO">
select `id`,`name`,`sort`,`create_user_id`,`create_time`,`update_user_id`,`update_time` from news_category
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="name != null and name != ''"> and name = #{name} </if>
<if test="sort != null and sort != ''"> and sort = #{sort} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from news_category
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="name != null and name != ''"> and name = #{name} </if>
<if test="sort != null and sort != ''"> and sort = #{sort} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.CategoryDO">
insert into news_category
(
`id`,
`name`,
`sort`,
`create_user_id`,
`create_time`,
`update_user_id`,
`update_time`
)
values
(
#{id},
#{name},
#{sort},
#{createUserId},
#{createTime},
#{updateUserId},
#{updateTime}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.CategoryDO">
insert into news_category
(
<if test="id != null"> `id`, </if>
<if test="name != null"> `name`, </if>
<if test="sort != null"> `sort`, </if>
<if test="createUserId != null"> `create_user_id`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="updateUserId != null"> `update_user_id`, </if>
<if test="updateTime != null"> `update_time` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="name != null"> #{name}, </if>
<if test="sort != null"> #{sort}, </if>
<if test="createUserId != null"> #{createUserId}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="updateUserId != null"> #{updateUserId}, </if>
<if test="updateTime != null"> #{updateTime} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.CategoryDO">
update news_category
<set>
<if test="name != null">`name` = #{name}, </if>
<if test="sort != null">`sort` = #{sort}, </if>
<if test="createUserId != null">`create_user_id` = #{createUserId}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="updateUserId != null">`update_user_id` = #{updateUserId}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from news_category where id = #{value}
</delete>
<delete id="batchRemove">
delete from news_category where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.NewsDao">
<select id="get" resultType="com.java2nb.novel.domain.NewsDO">
select `id`,`cat_id`,`cat_name`,`source_name`,`title`,`content`,`create_time`,`create_user_id`,`update_time`,`update_user_id` from news where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.NewsDO">
select `id`,`cat_id`,`cat_name`,`source_name`,`title`,`content`,`create_time`,`create_user_id`,`update_time`,`update_user_id` from news
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="catId != null and catId != ''"> and cat_id = #{catId} </if>
<if test="catName != null and catName != ''"> and cat_name = #{catName} </if>
<if test="sourceName != null and sourceName != ''"> and source_name = #{sourceName} </if>
<if test="title != null and title != ''"> and title like concat('%',#{title},'%') </if>
<if test="content != null and content != ''"> and content = #{content} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from news
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="catId != null and catId != ''"> and cat_id = #{catId} </if>
<if test="catName != null and catName != ''"> and cat_name = #{catName} </if>
<if test="sourceName != null and sourceName != ''"> and source_name = #{sourceName} </if>
<if test="title != null and title != ''"> and title = #{title} </if>
<if test="content != null and content != ''"> and content = #{content} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="createUserId != null and createUserId != ''"> and create_user_id = #{createUserId} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
<if test="updateUserId != null and updateUserId != ''"> and update_user_id = #{updateUserId} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.NewsDO">
insert into news
(
`id`,
`cat_id`,
`cat_name`,
`source_name`,
`title`,
`content`,
`create_time`,
`create_user_id`,
`update_time`,
`update_user_id`
)
values
(
#{id},
#{catId},
#{catName},
#{sourceName},
#{title},
#{content},
#{createTime},
#{createUserId},
#{updateTime},
#{updateUserId}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.NewsDO">
insert into news
(
<if test="id != null"> `id`, </if>
<if test="catId != null"> `cat_id`, </if>
<if test="catName != null"> `cat_name`, </if>
<if test="sourceName != null"> `source_name`, </if>
<if test="title != null"> `title`, </if>
<if test="content != null"> `content`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="createUserId != null"> `create_user_id`, </if>
<if test="updateTime != null"> `update_time`, </if>
<if test="updateUserId != null"> `update_user_id` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="catId != null"> #{catId}, </if>
<if test="catName != null"> #{catName}, </if>
<if test="sourceName != null"> #{sourceName}, </if>
<if test="title != null"> #{title}, </if>
<if test="content != null"> #{content}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="createUserId != null"> #{createUserId}, </if>
<if test="updateTime != null"> #{updateTime}, </if>
<if test="updateUserId != null"> #{updateUserId} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.NewsDO">
update news
<set>
<if test="catId != null">`cat_id` = #{catId}, </if>
<if test="catName != null">`cat_name` = #{catName}, </if>
<if test="sourceName != null">`source_name` = #{sourceName}, </if>
<if test="title != null">`title` = #{title}, </if>
<if test="content != null">`content` = #{content}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="createUserId != null">`create_user_id` = #{createUserId}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}, </if>
<if test="updateUserId != null">`update_user_id` = #{updateUserId}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from news where id = #{value}
</delete>
<delete id="batchRemove">
delete from news where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.PayDao">
<select id="get" resultType="com.java2nb.novel.domain.PayDO">
select `id`,`out_trade_no`,`trade_no`,`pay_channel`,`total_amount`,`user_id`,`pay_status`,`create_time`,`update_time` from order_pay where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.PayDO">
select `id`,`out_trade_no`,`trade_no`,`pay_channel`,`total_amount`,`user_id`,`pay_status`,`create_time`,`update_time` from order_pay
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="outTradeNo != null and outTradeNo != ''"> and out_trade_no = #{outTradeNo} </if>
<if test="tradeNo != null and tradeNo != ''"> and trade_no = #{tradeNo} </if>
<if test="payChannel != null and payChannel != ''"> and pay_channel = #{payChannel} </if>
<if test="totalAmount != null and totalAmount != ''"> and total_amount = #{totalAmount} </if>
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
<if test="payStatus != null and payStatus != ''"> and pay_status = #{payStatus} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from order_pay
<where>
<if test="id != null and id != ''"> and id = #{id} </if>
<if test="outTradeNo != null and outTradeNo != ''"> and out_trade_no = #{outTradeNo} </if>
<if test="tradeNo != null and tradeNo != ''"> and trade_no = #{tradeNo} </if>
<if test="payChannel != null and payChannel != ''"> and pay_channel = #{payChannel} </if>
<if test="totalAmount != null and totalAmount != ''"> and total_amount = #{totalAmount} </if>
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
<if test="payStatus != null and payStatus != ''"> and pay_status = #{payStatus} </if>
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
<if test="updateTime != null and updateTime != ''"> and update_time = #{updateTime} </if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.PayDO">
insert into order_pay
(
`id`,
`out_trade_no`,
`trade_no`,
`pay_channel`,
`total_amount`,
`user_id`,
`pay_status`,
`create_time`,
`update_time`
)
values
(
#{id},
#{outTradeNo},
#{tradeNo},
#{payChannel},
#{totalAmount},
#{userId},
#{payStatus},
#{createTime},
#{updateTime}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.PayDO">
insert into order_pay
(
<if test="id != null"> `id`, </if>
<if test="outTradeNo != null"> `out_trade_no`, </if>
<if test="tradeNo != null"> `trade_no`, </if>
<if test="payChannel != null"> `pay_channel`, </if>
<if test="totalAmount != null"> `total_amount`, </if>
<if test="userId != null"> `user_id`, </if>
<if test="payStatus != null"> `pay_status`, </if>
<if test="createTime != null"> `create_time`, </if>
<if test="updateTime != null"> `update_time` </if>
)
values
(
<if test="id != null"> #{id}, </if>
<if test="outTradeNo != null"> #{outTradeNo}, </if>
<if test="tradeNo != null"> #{tradeNo}, </if>
<if test="payChannel != null"> #{payChannel}, </if>
<if test="totalAmount != null"> #{totalAmount}, </if>
<if test="userId != null"> #{userId}, </if>
<if test="payStatus != null"> #{payStatus}, </if>
<if test="createTime != null"> #{createTime}, </if>
<if test="updateTime != null"> #{updateTime} </if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.PayDO">
update order_pay
<set>
<if test="outTradeNo != null">`out_trade_no` = #{outTradeNo}, </if>
<if test="tradeNo != null">`trade_no` = #{tradeNo}, </if>
<if test="payChannel != null">`pay_channel` = #{payChannel}, </if>
<if test="totalAmount != null">`total_amount` = #{totalAmount}, </if>
<if test="userId != null">`user_id` = #{userId}, </if>
<if test="payStatus != null">`pay_status` = #{payStatus}, </if>
<if test="createTime != null">`create_time` = #{createTime}, </if>
<if test="updateTime != null">`update_time` = #{updateTime}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from order_pay where id = #{value}
</delete>
<delete id="batchRemove">
delete from order_pay where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="tableSta" resultType="map">
SELECT
DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate,
COUNT( 1 ) orderCount
FROM
order_pay
WHERE
create_time >= #{minDate}
GROUP BY
DATE_FORMAT( create_time, "%Y-%m-%d" )
ORDER BY
staDate
</select>
</mapper>

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.dao.UserDao">
<select id="get" resultType="com.java2nb.novel.domain.UserDO">
select `id`,`username`,`password`,`nick_name`,`user_photo`,`user_sex`,`account_balance`,`status`,`create_time`,`update_time` from user where id = #{value}
</select>
<select id="list" resultType="com.java2nb.novel.domain.UserDO">
select
`id`,`username`,`password`,`nick_name`,`user_photo`,`user_sex`,`account_balance`,`status`,`create_time`,`update_time`
from user
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="username != null and username != ''">and username = #{username}</if>
<if test="password != null and password != ''">and password = #{password}</if>
<if test="nickName != null and nickName != ''">and nick_name = #{nickName}</if>
<if test="userPhoto != null and userPhoto != ''">and user_photo = #{userPhoto}</if>
<if test="userSex != null and userSex != ''">and user_sex = #{userSex}</if>
<if test="accountBalance != null and accountBalance != ''">and account_balance = #{accountBalance}</if>
<if test="status != null and status != ''">and status = #{status}</if>
<if test="createTime != null and createTime != ''">and create_time = #{createTime}</if>
<if test="updateTime != null and updateTime != ''">and update_time = #{updateTime}</if>
</where>
<choose>
<when test="sort != null and sort.trim() != ''">
order by ${sort} ${order}
</when>
<otherwise>
order by id desc
</otherwise>
</choose>
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>
<select id="count" resultType="int">
select count(*) from user
<where>
<if test="id != null and id != ''">and id = #{id}</if>
<if test="username != null and username != ''">and username = #{username}</if>
<if test="password != null and password != ''">and password = #{password}</if>
<if test="nickName != null and nickName != ''">and nick_name = #{nickName}</if>
<if test="userPhoto != null and userPhoto != ''">and user_photo = #{userPhoto}</if>
<if test="userSex != null and userSex != ''">and user_sex = #{userSex}</if>
<if test="accountBalance != null and accountBalance != ''">and account_balance = #{accountBalance}</if>
<if test="status != null and status != ''">and status = #{status}</if>
<if test="createTime != null and createTime != ''">and create_time = #{createTime}</if>
<if test="updateTime != null and updateTime != ''">and update_time = #{updateTime}</if>
</where>
</select>
<insert id="save" parameterType="com.java2nb.novel.domain.UserDO">
insert into user
(
`id`,
`username`,
`password`,
`nick_name`,
`user_photo`,
`user_sex`,
`account_balance`,
`status`,
`create_time`,
`update_time`
)
values
(
#{id},
#{username},
#{password},
#{nickName},
#{userPhoto},
#{userSex},
#{accountBalance},
#{status},
#{createTime},
#{updateTime}
)
</insert>
<insert id="saveSelective" parameterType="com.java2nb.novel.domain.UserDO">
insert into user
(
<if test="id != null">`id`,</if>
<if test="username != null">`username`,</if>
<if test="password != null">`password`,</if>
<if test="nickName != null">`nick_name`,</if>
<if test="userPhoto != null">`user_photo`,</if>
<if test="userSex != null">`user_sex`,</if>
<if test="accountBalance != null">`account_balance`,</if>
<if test="status != null">`status`,</if>
<if test="createTime != null">`create_time`,</if>
<if test="updateTime != null">`update_time`</if>
)
values
(
<if test="id != null">#{id},</if>
<if test="username != null">#{username},</if>
<if test="password != null">#{password},</if>
<if test="nickName != null">#{nickName},</if>
<if test="userPhoto != null">#{userPhoto},</if>
<if test="userSex != null">#{userSex},</if>
<if test="accountBalance != null">#{accountBalance},</if>
<if test="status != null">#{status},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateTime != null">#{updateTime}</if>
)
</insert>
<update id="update" parameterType="com.java2nb.novel.domain.UserDO">
update user
<set>
<if test="username != null">`username` = #{username},</if>
<if test="password != null">`password` = #{password},</if>
<if test="nickName != null">`nick_name` = #{nickName},</if>
<if test="userPhoto != null">`user_photo` = #{userPhoto},</if>
<if test="userSex != null">`user_sex` = #{userSex},</if>
<if test="accountBalance != null">`account_balance` = #{accountBalance},</if>
<if test="status != null">`status` = #{status},</if>
<if test="createTime != null">`create_time` = #{createTime},</if>
<if test="updateTime != null">`update_time` = #{updateTime}</if>
</set>
where id = #{id}
</update>
<delete id="remove">
delete from user where id = #{value}
</delete>
<delete id="batchRemove">
delete from user where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="tableSta" resultType="map">
SELECT
DATE_FORMAT( create_time, "%Y-%m-%d" ) AS staDate,
COUNT( 1 ) userCount
FROM
USER
WHERE
create_time >= #{minDate}
GROUP BY
DATE_FORMAT( create_time, "%Y-%m-%d" )
ORDER BY
staDate
</select>
</mapper>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.system.dao.UserDao"> <mapper namespace="com.java2nb.system.dao.SysUserDao">
<select id="get" resultType="com.java2nb.system.domain.UserDO"> <select id="get" resultType="com.java2nb.system.domain.UserDO">
select `user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district` from sys_user where user_id = #{value} select `user_id`,`username`,`name`,`password`,`dept_id`,`email`,`mobile`,`status`,`user_id_create`,`gmt_create`,`gmt_modified`,`sex`,`birth`,`pic_id`,`live_address`,`hobby`,`province`,`city`,`district` from sys_user where user_id = #{value}

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/author/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,244 @@
var prefix = "/novel/author"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'inviteCode',
title: '邀请码'
},
{
field: 'penName',
title: '笔名'
},
{
field: 'telPhone',
title: '手机号码'
},
{
field: 'chatAccount',
title: 'QQ或微信账号'
},
{
field: 'email',
title: '电子邮箱'
},
{
field: 'workDirection',
title: '作品方向',
formatter: function (value, row, index) {
return formatDict("work_direction", value);
}
},
{
field: 'createTime',
title: '入驻时间'
},
{
field: 'status',
title: '状态',
formatter: function (value, row, index) {
return value == 1 ? '封禁' : '正常';
}
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
if(row.status==1) {
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="恢复正常" onclick="edit(\''
+ row.id
+ '\',0)"><i >恢复正常</i></a> ';
}else{
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="封禁" onclick="edit(\''
+ row.id
+ '\',1)"><i >封禁</i></a> ';
}
return e ;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id,status) {
$.ajax({
cache: true,
type: "POST",
url: "/novel/author/update",
data: {'id':id,'status':status},// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
reLoad();
} else {
parent.layer.alert(data.msg)
}
}
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/author/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,115 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/authorCode/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
inviteCode: {
required: true
}, validityTime: {
required: true
}, },
messages: {
inviteCode: {
required: icon + "请选择邀请码"
}, validityTime: {
required: icon + "请选择有效时间"
}, }
})
}

View File

@ -0,0 +1,212 @@
var prefix = "/novel/authorCode"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'inviteCode',
title: '邀请码'
},
{
field: 'validityTime',
title: '有效时间'
},
{
field: 'isUse',
title: '是否使用过',
formatter: function (value, row, index) {
return value == 1 ? '使用过' : '未使用';
}
},
{
field: 'createTime',
title: '创建时间'
},
/* {
field: 'createUserId',
title: '创建人ID'
},*/
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
/* var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';*/
/* var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';*/
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,115 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/authorCode/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
inviteCode:
{
required: true
}, validityTime:
{
required: true
}, },
messages: {
inviteCode:
{
required: icon + "请选择邀请码"
}, validityTime:
{
required: icon + "请选择有效时间"
}, }
})
}

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/book/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,363 @@
var prefix = "/novel/book"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'workDirection',
title: '作品方向0男频1女频'
},
{
field: 'catId',
title: '分类ID'
},
{
field: 'catName',
title: '分类名'
},
{
field: 'catChildId',
title: '子分类ID'
},
{
field: 'catChildName',
title: '子分类名'
},
{
field: 'picUrl',
title: '小说封面'
},
{
field: 'bookName',
title: '小说名'
},
{
field: 'heroName',
title: '男主角姓名'
},
{
field: 'ladyName',
title: '女主角姓名'
},
{
field: 'bookStyle',
title: '作品风格0甜宠1虐恋2其他'
},
{
field: 'bookLabel',
title: '作品标签'
},
{
field: 'authorId',
title: '作者id'
},
{
field: 'authorName',
title: '作者名'
},
{
field: 'bookDesc',
title: '书籍描述'
},
{
field: 'score',
title: '评分预留字段'
},
{
field: 'bookStatus',
title: '书籍状态0连载中1已完结'
},
{
field: 'visitCount',
title: '点击量'
},
{
field: 'wordCount',
title: '总字数'
},
{
field: 'commentCount',
title: '评论数'
},
{
field: 'yesterdayBuy',
title: '昨日订阅数'
},
{
field: 'lastIndexId',
title: '最新目录ID'
},
{
field: 'lastIndexName',
title: '最新目录名'
},
{
field: 'lastIndexUpdateTime',
title: '最新目录更新时间'
},
{
field: 'isVip',
title: '是否收费1收费0免费'
},
{
field: 'status',
title: '状态0入库1上架'
},
{
field: 'updateTime',
title: '更新时间'
},
{
field: 'createTime',
title: '创建时间'
},
{
field: 'crawlSourceId',
title: '爬虫源站ID'
},
{
field: 'crawlBookId',
title: '抓取的源站小说ID'
},
{
field: 'crawlLastTime',
title: '最后一次的抓取时间'
},
{
field: 'crawlIsStop',
title: '是否已停止更新0未停止1已停止'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/book/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,111 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/category/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
name: {
required: true
}, },
messages: {
name: {
required: icon + "请选择分类名"
}, }
})
}

View File

@ -0,0 +1,193 @@
var prefix = "/novel/category"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'name',
title: '分类名'
},
{
field: 'sort',
title: '排序'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,109 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/category/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
name:
{
required: true
}, },
messages: {
name:
{
required: icon + "请选择分类名"
}, }
})
}

View File

@ -0,0 +1,123 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/news/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
catId: {
required: true
}, catName: {
required: true
}, title: {
required: true
}, content: {
required: true
}, },
messages: {
catId: {
required: icon + "请选择类别ID"
}, catName: {
required: icon + "请选择分类名"
}, title: {
required: icon + "请选择标题"
}, content: {
required: icon + "请选择内容"
}, }
})
}

View File

@ -0,0 +1,127 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/news/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
catId:
{
required: true
}, catName:
{
required: true
}, title:
{
required: true
}, content:
{
required: true
}, },
messages: {
catId:
{
required: icon + "请选择类别ID"
}, catName:
{
required: icon + "请选择分类名"
}, title:
{
required: icon + "请选择标题"
}, content:
{
required: icon + "请选择内容"
}, }
})
}

View File

@ -0,0 +1,206 @@
var prefix = "/novel/news"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'catName',
title: '分类名'
},
{
field: 'sourceName',
title: '来源'
},
{
field: 'title',
title: '标题'
},
{
field: 'createTime',
title: '发布时间'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/pay/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/pay/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,225 @@
var prefix = "/novel/pay"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'outTradeNo',
title: '保留'
},
{
field: 'tradeNo',
title: '订单号'
},
{
field: 'payChannel',
title: '保留'
},
{
field: 'totalAmount',
title: '交易香蕉币'
},
{
field: 'userId',
title: '支付用户ID'
},
{
field: 'payStatus',
title: '支付状态0支付失败1支付成功2待支付'
},
{
field: 'createTime',
title: '创建时间'
},
{
field: 'updateTime',
title: '更新时间'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

View File

@ -0,0 +1,107 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
save();
}
});
function save() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/user/save",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,103 @@
var E = window.wangEditor;
$("[id^='contentEditor']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(13);
var editor = new E('#contentEditor' + relName);
// 自定义菜单配置
editor.customConfig.menus = [
'head', // 标题
'bold', // 粗体
'fontSize', // 字号
'fontName', // 字体
'italic', // 斜体
'underline', // 下划线
'strikeThrough', // 删除线
'foreColor', // 文字颜色
//'backColor', // 背景颜色
//'link', // 插入链接
'list', // 列表
'justify', // 对齐方式
'quote', // 引用
'emoticon', // 表情
'image', // 插入图片
//'table', // 表格
//'video', // 插入视频
//'code', // 插入代码
'undo', // 撤销
'redo' // 重复
];
editor.customConfig.onchange = function (html) {
// html 即变化之后的内容
$("#" + relName).val(html);
}
editor.customConfig.uploadImgShowBase64 = true;
editor.create();
editor.txt.html($("#" + relName).val());
})
$("[id^='picImage']").each(function (index, ele) {
var relName = $(ele).attr("id").substring(8);
layui.use('upload', function () {
var upload = layui.upload;
//执行实例
var uploadInst = upload.render({
elem: '#picImage' + relName, //绑定元素
url: '/common/sysFile/upload', //上传接口
size: 1000,
accept: 'file',
done: function (r) {
$("#picImage" + relName).attr("src", r.fileName);
$("#" + relName).val(r.fileName);
},
error: function (r) {
layer.msg(r.msg);
}
});
});
});
$().ready(function () {
validateRule();
});
$.validator.setDefaults({
submitHandler: function () {
update();
}
});
function update() {
$.ajax({
cache: true,
type: "POST",
url: "/novel/user/update",
data: $('#signupForm').serialize(),// 你的formid
async: false,
error: function (request) {
parent.layer.alert("Connection error");
},
success: function (data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> ";
$("#signupForm").validate({
ignore: "",
rules: {
},
messages: {
}
})
}

View File

@ -0,0 +1,231 @@
var prefix = "/novel/user"
$(function () {
load();
});
function load() {
$('#exampleTable')
.bootstrapTable(
{
method: 'get', // 服务器数据的请求方式 get or post
url: prefix + "/list", // 服务器数据的加载地址
// showRefresh : true,
// showToggle : true,
// showColumns : true,
iconSize: 'outline',
toolbar: '#exampleToolbar',
striped: true, // 设置为true会有隔行变色效果
dataType: "json", // 服务器返回的数据类型
pagination: true, // 设置为true会在底部显示分页条
// queryParamsType : "limit",
// //设置为limit则会发送符合RESTFull格式的参数
singleSelect: false, // 设置为true将禁止多选
// contentType : "application/x-www-form-urlencoded",
// //发送到服务器的数据编码类型
pageSize: 10, // 如果设置了分页,每页数据条数
pageNumber: 1, // 如果设置了分布,首页页码
//search : true, // 是否显示搜索框
showColumns: false, // 是否显示内容下拉框(选择显示的列)
sidePagination: "server", // 设置在哪里进行分页,可选值为"client" 或者 "server"
queryParams: function (params) {
//说明传入后台的参数包括offset开始索引limit步长sort排序列orderdesc或者,以及所有列的键值对
var queryParams = getFormJson("searchForm");
queryParams.limit = params.limit;
queryParams.offset = params.offset;
return queryParams;
},
// //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果
// queryParamsType = 'limit' ,返回参数必须包含
// limit, offset, search, sort, order 否则, 需要包含:
// pageSize, pageNumber, searchText, sortName,
// sortOrder.
// 返回false将会终止请求
responseHandler: function (rs) {
if (rs.code == 0) {
return rs.data;
} else {
parent.layer.alert(rs.msg)
return {total: 0, rows: []};
}
},
columns: [
{
checkbox: true
},
{
title: '序号',
formatter: function () {
return arguments[2] + 1;
}
},
{
field: 'id',
title: '主键'
},
{
field: 'username',
title: '登录名'
},
{
field: 'password',
title: '登录密码'
},
{
field: 'nickName',
title: '昵称'
},
{
field: 'userPhoto',
title: '用户头像'
},
{
field: 'userSex',
title: '用户性别01'
},
{
field: 'accountBalance',
title: '账户余额'
},
{
field: 'status',
title: '用户状态0正常'
},
{
field: 'createTime',
title: '创建时间'
},
{
field: 'updateTime',
title: '更新时间'
},
{
title: '操作',
field: 'id',
align: 'center',
formatter: function (value, row, index) {
var d = '<a class="btn btn-primary btn-sm ' + s_detail_h + '" href="#" mce_href="#" title="详情" onclick="detail(\''
+ row.id
+ '\')"><i class="fa fa-file"></i></a> ';
var e = '<a class="btn btn-primary btn-sm ' + s_edit_h + '" href="#" mce_href="#" title="编辑" onclick="edit(\''
+ row.id
+ '\')"><i class="fa fa-edit"></i></a> ';
var r = '<a class="btn btn-warning btn-sm ' + s_remove_h + '" href="#" title="删除" mce_href="#" onclick="remove(\''
+ row.id
+ '\')"><i class="fa fa-remove"></i></a> ';
return d + e + r;
}
}]
});
}
function reLoad() {
$('#exampleTable').bootstrapTable('refresh');
}
function add() {
layer.open({
type: 2,
title: '增加',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/add' // iframe的url
});
}
function detail(id) {
layer.open({
type: 2,
title: '详情',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/detail/' + id // iframe的url
});
}
function edit(id) {
layer.open({
type: 2,
title: '编辑',
maxmin: true,
shadeClose: false, // 点击遮罩关闭层
area: ['800px', '520px'],
content: prefix + '/edit/' + id // iframe的url
});
}
function remove(id) {
layer.confirm('确定要删除选中的记录?', {
btn: ['确定', '取消']
}, function () {
$.ajax({
url: prefix + "/remove",
type: "post",
data: {
'id': id
},
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
})
}
function resetPwd(id) {
}
function batchRemove() {
var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组
if (rows.length == 0) {
layer.msg("请选择要删除的数据");
return;
}
layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", {
btn: ['确定', '取消']
// 按钮
}, function () {
var ids = new Array();
// 遍历所有选择的行数据取每条数据对应的ID
$.each(rows, function (i, row) {
ids[i] = row['id'];
});
$.ajax({
type: 'POST',
data: {
"ids": ids
},
url: prefix + '/batchRemove',
success: function (r) {
if (r.code == 0) {
layer.msg(r.msg);
reLoad();
} else {
layer.msg(r.msg);
}
}
});
}, function () {
});
}

File diff suppressed because one or more lines are too long

View File

@ -125,17 +125,17 @@ $(document).ready(function(){
rules:{ rules:{
pwdOld:{ pwdOld:{
required:true, required:true,
minlength:6 minlength:5
}, },
pwdNew:{ pwdNew:{
required:true, required:true,
minlength:6, minlength:5,
isdiff:true, isdiff:true,
//issame:true, //issame:true,
}, },
confirm_password:{ confirm_password:{
required:true, required:true,
minlength:6, minlength:5,
issame:true, issame:true,
} }
@ -143,17 +143,17 @@ $(document).ready(function(){
messages:{ messages:{
pwdOld : { pwdOld : {
required:'必填', required:'必填',
minlength:$.validator.format('密码长度要大于6') minlength:$.validator.format('密码长度要大于5')
}, },
pwdNew:{ pwdNew:{
required:'必填', required:'必填',
minlength:$.validator.format('密码长度要大于6'), minlength:$.validator.format('密码长度要大于5'),
isdiff:'原密码与新密码不能重复', isdiff:'原密码与新密码不能重复',
}, },
confirm_password:{ confirm_password:{
required:'必填', required:'必填',
minlength:$.validator.format('密码长度要大于6'), minlength:$.validator.format('密码长度要大于5'),
issame:'新密码要与确认新密码一致', issame:'新密码要与确认新密码一致',
} }

View File

@ -0,0 +1,18 @@
-- 菜单SQL
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
VALUES ('1', '作者表', 'novel/author', 'novel:author:author', '1', 'fa', '6');
-- 按钮父菜单ID
set @parentId = @@identity;
-- 菜单对应按钮SQL
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '查看', null, 'novel:author:detail', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '新增', null, 'novel:author:add', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '修改', null, 'novel:author:edit', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '删除', null, 'novel:author:remove', '2', null, '6';
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
SELECT @parentId, '批量删除', null, 'novel:author:batchRemove', '2', null, '6';

Some files were not shown because too many files have changed in this diff Show More