作家后台完善

This commit is contained in:
xiongxiaoyang 2020-11-17 10:25:31 +08:00
parent 2c3e346ea7
commit f625ee38e1
12 changed files with 1016 additions and 99 deletions

View File

@ -2,7 +2,9 @@ package com.java2nb.novel.controller;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException;
import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.entity.Author;
import com.java2nb.novel.entity.Book;
@ -58,15 +60,7 @@ public class AuthorController extends BaseController{
@PostMapping("addBook")
public ResultBean addBook(@RequestParam("bookDesc") String bookDesc,Book book,HttpServletRequest request){
//查询作家信息
Author author = authorService.queryAuthor(getUserDetails(request).getId());
//判断作者状态是否正常
if(author.getStatus()==1){
//封禁状态不能发布小说
return ResultBean.fail(ResponseStatus.AUTHOR_STATUS_FORBIDDEN);
}
Author author = checkAuthor(request);
//bookDesc不能使用book对象来接收否则会自动去掉前面的空格
book.setBookDesc(bookDesc
@ -83,14 +77,7 @@ public class AuthorController extends BaseController{
* */
@PostMapping("updateBookStatus")
public ResultBean updateBookStatus(Long bookId,Byte status,HttpServletRequest request){
//查询作家信息
Author author = authorService.queryAuthor(getUserDetails(request).getId());
//判断作者状态是否正常
if(author.getStatus()==1){
//封禁状态不能发布小说
return ResultBean.fail(ResponseStatus.AUTHOR_STATUS_FORBIDDEN);
}
Author author = checkAuthor(request);
//更新小说状态,上架或下架
bookService.updateBookStatus(bookId,status,author.getId());
@ -100,24 +87,79 @@ public class AuthorController extends BaseController{
/**
* 删除章节
*/
@PostMapping("deleteIndex")
public ResultBean deleteIndex(Long indexId, HttpServletRequest request) {
Author author = checkAuthor(request);
//删除章节
bookService.deleteIndex(indexId, author.getId());
return ResultBean.ok();
}
/**
* 更新章节名
*/
@PostMapping("updateIndexName")
public ResultBean updateIndexName(Long indexId, String indexName, HttpServletRequest request) {
Author author = checkAuthor(request);
//更新章节名
bookService.updateIndexName(indexId, indexName, author.getId());
return ResultBean.ok();
}
/**
* 发布章节内容
* */
*/
@PostMapping("addBookContent")
public ResultBean addBookContent(Long bookId,String indexName,String content,Byte isVip,HttpServletRequest request){
//查询作家信息
Author author = authorService.queryAuthor(getUserDetails(request).getId());
public ResultBean addBookContent(Long bookId, String indexName, String content,Byte isVip, HttpServletRequest request) {
Author author = checkAuthor(request);
//判断作者状态是否正常
if(author.getStatus()==1){
//封禁状态不能发布小说
return ResultBean.fail(ResponseStatus.AUTHOR_STATUS_FORBIDDEN);
}
content = content.replaceAll("\\n","<br>")
.replaceAll("\\s","&nbsp;");
content = content.replaceAll("\\n", "<br>")
.replaceAll("\\s", "&nbsp;");
//发布章节内容
bookService.addBookContent(bookId,indexName,content,isVip,author.getId());
bookService.addBookContent(bookId, indexName, content,isVip, author.getId());
return ResultBean.ok();
}
/**
* 查询章节内容
*/
@PostMapping("queryIndexContent")
public ResultBean queryIndexContent(Long indexId, HttpServletRequest request) {
Author author = checkAuthor(request);
String content = bookService.queryIndexContent(indexId, author.getId());
content = content.replaceAll("<br>", "\n")
.replaceAll("&nbsp;", " ");
return ResultBean.ok(content);
}
/**
* 更新章节内容
*/
@PostMapping("updateBookContent")
public ResultBean updateBookContent(Long indexId, String indexName, String content, HttpServletRequest request) {
Author author = checkAuthor(request);
content = content.replaceAll("\\n", "<br>")
.replaceAll("\\s", "&nbsp;");
//更新章节内容
bookService.updateBookContent(indexId, indexName, content, author.getId());
return ResultBean.ok();
}
@ -151,6 +193,28 @@ public class AuthorController extends BaseController{
));
}
private Author checkAuthor(HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request);
if (userDetails == null) {
throw new BusinessException(ResponseStatus.NO_LOGIN);
}
//查询作家信息
Author author = authorService.queryAuthor(userDetails.getId());
//判断作者状态是否正常
if (author.getStatus() == 1) {
//封禁状态不能发布小说
throw new BusinessException(ResponseStatus.AUTHOR_STATUS_FORBIDDEN);
}
return author;
}

View File

@ -167,7 +167,15 @@ public class BookController extends BaseController{
* */
@PostMapping("queryNewIndexList")
public ResultBean queryNewIndexList(Long bookId){
return ResultBean.ok(bookService.queryIndexList(bookId,"index_num desc",10));
return ResultBean.ok(bookService.queryIndexList(bookId,"index_num desc",1,10));
}
/**
* 目录页
* */
@PostMapping("/queryIndexList")
public ResultBean indexList(Long bookId,@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,@RequestParam(value = "orderBy") String orderBy) {
return ResultBean.ok(new PageInfo<>(bookService.queryIndexList(bookId,orderBy,page,pageSize)));
}

View File

@ -101,9 +101,11 @@ public class PageController extends BaseController{
public String bookDetail(@PathVariable("bookId") Long bookId, Model model) {
Book book = bookService.queryBookDetail(bookId);
model.addAttribute("book",book);
//查询首章目录ID
Long firstBookIndexId = bookService.queryFirstBookIndexId(bookId);
model.addAttribute("firstBookIndexId",firstBookIndexId);
if(book.getLastIndexId() != null) {
//查询首章目录ID
Long firstBookIndexId = bookService.queryFirstBookIndexId(bookId);
model.addAttribute("firstBookIndexId", firstBookIndexId);
}
return ThreadLocalUtil.getTemplateDir()+"book/book_detail";
}
@ -114,7 +116,7 @@ public class PageController extends BaseController{
public String indexList(@PathVariable("bookId") Long bookId, Model model) {
Book book = bookService.queryBookDetail(bookId);
model.addAttribute("book",book);
List<BookIndex> bookIndexList = bookService.queryIndexList(bookId,null,null);
List<BookIndex> bookIndexList = bookService.queryIndexList(bookId,null,1,null);
model.addAttribute("bookIndexList",bookIndexList);
model.addAttribute("bookIndexCount",bookIndexList.size());
return ThreadLocalUtil.getTemplateDir()+"book/book_index";

View File

@ -66,10 +66,12 @@ public interface BookService {
* 查询目录列表
* @param bookId 书籍ID
* @param orderBy 排序
*@param limit 查询条数
* @param page 查询页码
*@param pageSize 分页大小
*@return 目录集合
* */
List<BookIndex> queryIndexList(Long bookId, String orderBy, Integer limit);
List<BookIndex> queryIndexList(Long bookId, String orderBy, Integer page, Integer pageSize);
/**
* 查询目录
@ -244,4 +246,36 @@ public interface BookService {
* @return 作品列表
*/
List<Book> queryBookList(Long authorId);
/**
* 删除章节
* @param indexId
* @param authorId 作家ID
*/
void deleteIndex(Long indexId, Long authorId);
/**
* 更新章节名
* @param indexId
* @param indexName
* @param authorId
*/
void updateIndexName(Long indexId, String indexName, Long authorId);
/**
* 查询章节内容
* @param indexId
* @param authorId
* @return
*/
String queryIndexContent(Long indexId, Long authorId);
/**
* 更新章节内容
* @param indexId
* @param indexName
* @param content
* @param authorId
*/
void updateBookContent( Long indexId, String indexName, String content, Long authorId);
}

View File

@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.mybatis.dynamic.sql.SortSpecification;
import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
@ -32,6 +33,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.orderbyhelper.OrderByHelper;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@ -41,6 +43,7 @@ import java.util.stream.Collectors;
import static com.java2nb.novel.mapper.BookCategoryDynamicSqlSupport.bookCategory;
import static com.java2nb.novel.mapper.BookCommentDynamicSqlSupport.bookComment;
import static com.java2nb.novel.mapper.BookContentDynamicSqlSupport.bookContent;
import static com.java2nb.novel.mapper.BookContentDynamicSqlSupport.content;
import static com.java2nb.novel.mapper.BookDynamicSqlSupport.*;
import static com.java2nb.novel.mapper.BookIndexDynamicSqlSupport.bookIndex;
import static org.mybatis.dynamic.sql.SqlBuilder.*;
@ -233,12 +236,12 @@ public class BookServiceImpl implements BookService {
}
@Override
public List<BookIndex> queryIndexList(Long bookId, String orderBy, Integer limit) {
public List<BookIndex> queryIndexList(Long bookId, String orderBy, Integer page, Integer pageSize) {
if (StringUtils.isNotBlank(orderBy)) {
OrderByHelper.orderBy(orderBy);
}
if (limit != null) {
PageHelper.startPage(1, limit);
if (page != null && pageSize != null) {
PageHelper.startPage(page, pageSize);
}
SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip)
@ -250,6 +253,7 @@ public class BookServiceImpl implements BookService {
return bookIndexMapper.selectMany(selectStatement);
}
@Override
public BookIndex queryBookIndex(Long bookIndexId) {
SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount, BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip)
@ -488,7 +492,7 @@ public class BookServiceImpl implements BookService {
PageHelper.startPage(page, pageSize);
SelectStatementProvider selectStatement = select(id, bookName, visitCount, yesterdayBuy,lastIndexName, status)
SelectStatementProvider selectStatement = select(id, bookName, picUrl, catName, visitCount, yesterdayBuy, lastIndexUpdateTime, updateTime, wordCount, lastIndexName, status)
.from(book)
.where(authorId, isEqualTo(authorService.queryAuthor(userId).getId()))
.orderBy(BookDynamicSqlSupport.createTime.descending())
@ -538,10 +542,6 @@ public class BookServiceImpl implements BookService {
//并不是更新自己的小说
return;
}
if(book.getStatus() != 1){
//小说未上架不能设置VIP
isVip = 0;
}
Long lastIndexId = new IdWorker().nextId();
Date currentDate = new Date();
int wordCount = content.length();
@ -608,5 +608,211 @@ public class BookServiceImpl implements BookService {
.render(RenderingStrategies.MYBATIS3));
}
@Transactional(rollbackFor = Exception.class)
@Override
public void deleteIndex(Long indexId, Long authorId) {
//查询小说章节表信息
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
.from(bookIndex)
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
if (bookIndices.size() > 0) {
BookIndex bookIndex = bookIndices.get(0);
//获取小说ID
Long bookId = bookIndex.getBookId();
//查询小说表信息
List<Book> books = bookMapper.selectMany(
select(wordCount, BookDynamicSqlSupport.authorId)
.from(book)
.where(id, isEqualTo(bookId))
.build()
.render(RenderingStrategy.MYBATIS3));
if (books.size() > 0) {
Book book = books.get(0);
int wordCount = book.getWordCount();
//作者ID相同表明该小说是登录用户发布可以删除
if (book.getAuthorId().equals(authorId)) {
//删除目录表和内容表记录
bookIndexMapper.deleteByPrimaryKey(indexId);
bookContentMapper.delete(deleteFrom(bookContent).where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId)).build()
.render(RenderingStrategies.MYBATIS3));
//更新总字数
wordCount = wordCount - bookIndex.getWordCount();
//更新最新章节
Long lastIndexId = null;
String lastIndexName = null;
Date lastIndexUpdateTime = null;
List<BookIndex> lastBookIndices = bookIndexMapper.selectMany(
select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.createTime)
.from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId))
.orderBy(BookIndexDynamicSqlSupport.indexNum.descending())
.limit(1)
.build()
.render(RenderingStrategy.MYBATIS3));
if (lastBookIndices.size() > 0) {
BookIndex lastBookIndex = lastBookIndices.get(0);
lastIndexId = lastBookIndex.getId();
lastIndexName = lastBookIndex.getIndexName();
lastIndexUpdateTime = lastBookIndex.getCreateTime();
}
//更新小说主表信息
bookMapper.update(update(BookDynamicSqlSupport.book)
.set(BookDynamicSqlSupport.wordCount)
.equalTo(wordCount)
.set(updateTime)
.equalTo(new Date())
.set(BookDynamicSqlSupport.lastIndexId)
.equalTo(lastIndexId)
.set(BookDynamicSqlSupport.lastIndexName)
.equalTo(lastIndexName)
.set(BookDynamicSqlSupport.lastIndexUpdateTime)
.equalTo(lastIndexUpdateTime)
.where(id, isEqualTo(bookId))
.build()
.render(RenderingStrategies.MYBATIS3));
}
}
}
}
@Override
public void updateIndexName(Long indexId, String indexName, Long authorId) {
//查询小说章节表信息
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
.from(bookIndex)
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
if (bookIndices.size() > 0) {
BookIndex bookIndex = bookIndices.get(0);
//获取小说ID
Long bookId = bookIndex.getBookId();
//查询小说表信息
List<Book> books = bookMapper.selectMany(
select(wordCount, BookDynamicSqlSupport.authorId)
.from(book)
.where(id, isEqualTo(bookId))
.build()
.render(RenderingStrategy.MYBATIS3));
if (books.size() > 0) {
Book book = books.get(0);
//作者ID相同表明该小说是登录用户发布可以修改
if (book.getAuthorId().equals(authorId)) {
bookIndexMapper.update(
update(BookIndexDynamicSqlSupport.bookIndex)
.set(BookIndexDynamicSqlSupport.indexName)
.equalTo(indexName)
.set(BookIndexDynamicSqlSupport.updateTime)
.equalTo(new Date())
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId))
.build()
.render(RenderingStrategy.MYBATIS3));
}
}
}
}
@Override
public String queryIndexContent(Long indexId, Long authorId) {
//查询小说章节表信息
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
.from(bookIndex)
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
if (bookIndices.size() > 0) {
BookIndex bookIndex = bookIndices.get(0);
//获取小说ID
Long bookId = bookIndex.getBookId();
//查询小说表信息
List<Book> books = bookMapper.selectMany(
select(wordCount, BookDynamicSqlSupport.authorId)
.from(book)
.where(id, isEqualTo(bookId))
.build()
.render(RenderingStrategy.MYBATIS3));
if (books.size() > 0) {
Book book = books.get(0);
//作者ID相同表明该小说是登录用户发布
if (book.getAuthorId().equals(authorId)) {
return bookContentMapper.selectMany(
select(content)
.from(bookContent)
.where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId))
.limit(1)
.build().render(RenderingStrategy.MYBATIS3))
.get(0).getContent();
}
}
}
return "";
}
@Transactional(rollbackFor = Exception.class)
@Override
public void updateBookContent(Long indexId, String indexName, String content, Long authorId) {
//查询小说章节表信息
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
.from(bookIndex)
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
if (bookIndices.size() > 0) {
BookIndex bookIndex = bookIndices.get(0);
//获取小说ID
Long bookId = bookIndex.getBookId();
//查询小说表信息
List<Book> books = bookMapper.selectMany(
select(wordCount, BookDynamicSqlSupport.authorId)
.from(book)
.where(id, isEqualTo(bookId))
.build()
.render(RenderingStrategy.MYBATIS3));
if (books.size() > 0) {
Book book = books.get(0);
//作者ID相同表明该小说是登录用户发布可以修改
if (book.getAuthorId().equals(authorId)) {
Date currentDate = new Date();
int wordCount = content.length();
//更新小说目录表
int update = bookIndexMapper.update(
update(BookIndexDynamicSqlSupport.bookIndex)
.set(BookIndexDynamicSqlSupport.indexName)
.equalTo(indexName)
.set(BookIndexDynamicSqlSupport.wordCount)
.equalTo(wordCount)
.set(BookIndexDynamicSqlSupport.updateTime)
.equalTo(currentDate)
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId))
.build().render(RenderingStrategy.MYBATIS3));
//更新小说内容表
bookContentMapper.update(
update(BookContentDynamicSqlSupport.bookContent)
.set(BookContentDynamicSqlSupport.content)
.equalTo(content)
.where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId))
.build().render(RenderingStrategy.MYBATIS3));
}
}
}
}
}

View File

@ -0,0 +1,16 @@
//格式化时间函数
Date.prototype.Format = function (fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //
"s+": this.getSeconds(), //
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};

View File

@ -109,16 +109,24 @@
<script src="/layui/layui.all.js" type="text/javascript"></script>
<script src="/javascript/header.js" type="text/javascript"></script>
<script src="/javascript/user.js" type="text/javascript"></script>
<script src="/javascript/common.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
var bookId = getSearchString("bookId");
search(1, 10);
function search(curr, limit) {
var data = {'curr':curr,'limit':limit};
if(bookId){
data.bookId = bookId;
}
$.ajax({
type: "POST",
url: "/author/listIncomeDailyByPage",
data: {'curr':curr,'limit':limit},
data: data,
dataType: "json",
success: function (data) {
if (data.code == 200) {

View File

@ -60,7 +60,11 @@
<li><input type="text" id="bookIndex" name="bookIndex" class="s_input" ></li>
<b>章节内容</b><li id="contentLi">
<textarea name="bookContent" rows="30" cols="80" id="bookContent"
class="textarea"></textarea></li>
class="textarea"></textarea></li><br/>
<b>是否收费</b>
<li><input type="radio" name="isVip" value="0" checked >免费
<input type="radio" name="isVip" value="1" >收费</li>
<li style="margin-top: 10px"><input type="button" onclick="addBookContent()" name="btnRegister" value="提交"
@ -118,13 +122,6 @@
<script language="javascript" type="text/javascript">
var bookStatus = getSearchString("bookStatus");
if(bookStatus == 1){
$("#contentLi").after("<b>是否收费:</b>\n" +
" <li><input type=\"radio\" name=\"isVip\" value=\"0\" checked >免费\n" +
" <input type=\"radio\" name=\"isVip\" value=\"1\" >收费</li><br/>");
}
var lock = false;
function addBookContent() {
@ -153,11 +150,7 @@
}
var isVip = 0;
if(bookStatus == 1){
isVip = $("input:checked[name=isVip]").val();
}
var isVip = $("input:checked[name=isVip]").val();
@ -170,7 +163,7 @@
success: function (data) {
if (data.code == 200) {
window.location.href = '/author/index.html';
window.location.href = '/author/index_list.html?bookId='+bookId;
} else {

View File

@ -0,0 +1,220 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<title>作家管理系统-小说精品屋</title>
<link rel="stylesheet" href="/css/base.css?v=1"/>
<link rel="stylesheet" href="/css/user.css"/>
</head>
</head>
<body class="">
<div class="header">
<div class="mainNav" id="mainNav">
<div class="box_center cf"
style="text-align: center;height: 44px;line-height: 48px;color: #fff;font-size: 16px;">
小说精品屋作家管理
</div>
</div>
</div>
<div class="main box_center cf">
<div class="userBox cf">
<div class="my_l">
<ul class="log_list">
<li><a class="link_4 on" href="/author/index.html">作品管理</a></li>
<li><a class="link_2 " href="/author/author_income_detail.html">稿费收入</a></li>
</ul>
</div>
<div class="my_r">
<div class="my_bookshelf">
<div class="userBox cf">
<form method="post" action="./register.html" id="form2">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwUKLTIzNjMxNDQxNw9kFgJmD2QWAmYPFgIeBFRleHQFqAE8YSBocmVmPSIvc2VhcmNoLmFzcHg/c2VhcmNoS2V5PeWWu+Wuiembr++8jOeLhOazve+8jOeBteW8gu+8jOWJjeS4luS7iueUn++8jOWGpeeOi+msvOWkqyIgdGFyZ2V0PSJfYmxhbmsiPuWWu+Wuiembr++8jOeLhOazve+8jOeBteW8gu+8jOWJjeS4luS7iueUn++8jOWGpeeOi+msvOWkqzwvYT5kZOquoASBvnvPbc/TYIQiLhSPJ8GKnYQrmk7jGhb5AC5Q">
</div>
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="23AA6834">
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"
value="/wEdAAVece19BIZ9HiByRfHz3pfnqKSXUE1UN51mNFrIuw38c3Y2+Mc6SrnAqio3oCKbxYZZ1lS+gZUZKpbsAea8j7ASAv40DHFcQ/NE7tJUnABeyQ3d9sFDIcFCYNqlVtprfLoh4JFy0U+R/CcMuyAiWTz7">
</div>
<div class="user_l">
<div></div>
<h3>小说章节内容填写</h3>
<ul class="log_list">
<li><span id="LabErr"></span></li>
<b>章节名</b>
<li><input type="text" id="bookIndex" name="bookIndex" class="s_input" ></li>
<b>章节内容</b>
<li id="contentLi">
<textarea name="bookContent" rows="30" cols="80" id="bookContent"
class="textarea"></textarea>
</li>
<li style="margin-top: 10px"><input type="button" onclick="addBookContent()" name="btnRegister" value="提交"
id="btnRegister" class="btn_red">
</li>
</ul>
</div>
</form>
</div>
<!--<div id="divData" class="updateTable">
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th class="name">
爬虫源已开启的爬虫源
</th>
<th class="chapter">
成功爬取数量websocket实现
</th>
<th class="time">
目标爬取数量
</th>
<th class="goread">
状态正在运行已停止一次只能运行一个爬虫源
</th>
<th class="goread">
操作启动停止
</th>
</tr>
</thead>
<tbody id="bookShelfList">
</tbody>
</table>
<div class="pageBox cf" id="shellPage">
</div>
</div>-->
</div>
</div>
</div>
</div>
</body>
<script src="/javascript/jquery-1.8.0.min.js" type="text/javascript"></script>
<script src="/layui/layui.all.js" type="text/javascript"></script>
<script src="/javascript/header.js" type="text/javascript"></script>
<script src="/javascript/user.js" type="text/javascript"></script>
<script src="/javascript/common.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
var bookId = getSearchString("bookId");
var indexId = getSearchString("indexId");
var indexName = decodeURI(decodeURI(getSearchString("indexName")));
var isVip = getSearchString("isVip");
$("#bookIndex").val(indexName);
if(isVip == 1){
$("#contentLi").after("<b>是否收费:</b>\n" +
" <li><input type=\"radio\" disabled name=\"isVip\" value=\"0\" >免费\n" +
" <input type=\"radio\" disabled name=\"isVip\" value=\"1\" checked >收费</li><br/>");
}else{
$("#contentLi").after("<b>是否收费:</b>\n" +
" <li><input type=\"radio\" disabled name=\"isVip\" value=\"0\" checked >免费\n" +
" <input type=\"radio\" disabled name=\"isVip\" value=\"1\" >收费</li><br/>");
}
$.ajax({
type: "POST",
url: "/author/queryIndexContent",
data: {'indexId':indexId},
dataType: "json",
success: function (data) {
if (data.code == 200) {
$("#bookContent").html(data.data);
} else {
layer.alert(data.msg);
}
},
error: function () {
lock = false;
layer.alert('网络异常');
}
})
var lock = false;
function addBookContent() {
if(lock){
return;
}
lock = true;
var indexName = $("#bookIndex").val();
if(!indexName){
$("#LabErr").html("章节名不能为空!");
lock = false;
return;
}
var content = $("#bookContent").val();
if(!content){
$("#LabErr").html("章节内容不能为空!");
lock = false;
return;
}
$.ajax({
type: "POST",
url: "/author/updateBookContent",
data: {'indexId':indexId,'indexName':indexName,'content':content},
dataType: "json",
success: function (data) {
if (data.code == 200) {
window.location.href = '/author/index_list.html?bookId='+bookId;
} else {
lock = false;
$("#LabErr").html(data.msg);
}
},
error: function () {
lock = false;
layer.alert('网络异常');
}
})
}
</script>
</html>

View File

@ -8,6 +8,19 @@
<title>作家管理系统-小说精品屋</title>
<link rel="stylesheet" href="/css/base.css?v=1"/>
<link rel="stylesheet" href="/css/user.css" />
<style type="text/css">
.redBtn{
padding: 5px;
border-radius: 20px;
border: 1px solid #f80;
background: #f80;
color: #fff;
}
a.redBtn:hover{
color: #fff;
}
</style>
</head>
</head>
<body class="">
@ -35,7 +48,11 @@
</div>
<div class="my_r">
<div class="my_bookshelf">
<div id="noContentDiv" >
<div class="tc" style="margin-top: 200px"><a href="/author/book_add.html" class="btn_red">创建作品</a></div>
</div>
<div class="my_bookshelf" id="hasContentDiv" style="display: none">
<div class="title cf">
<h2 class="fl">小说列表</h2>
<div class="fr"><a href="/author/book_add.html" class="btn_red">发布小说</a></div>
@ -45,23 +62,23 @@
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th class="style">
序号
<th class="goread">
书名
</th>
<th class="name">
小说名
<th class="goread">
分类
</th>
<th class="goread">
点击量
</th>
<th class="goread">
昨日订阅量
</th>
<th class="name">
最新章节
昨日订阅数
</th>
<th class="goread">
状态
更新时间
</th>
<th class="goread">
总字数
</th>
<th class="goread">
操作
@ -119,6 +136,7 @@
<script src="/layui/layui.all.js" type="text/javascript"></script>
<script src="/javascript/header.js" type="text/javascript"></script>
<script src="/javascript/user.js" type="text/javascript"></script>
<script src="/javascript/date.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
search(1, 5);
@ -134,28 +152,41 @@
if (data.code == 200) {
var bookList = data.data.list;
if (bookList.length > 0) {
$("#hasContentDiv").css("display","block");
$("#noContentDiv").css("display","none");
var bookListHtml = "";
for(var i=0;i<bookList.length;i++){
var book = bookList[i];
bookListHtml+=(" <tr class=\"book_list\" vals=\"291\">\n" +
" <td class=\"style bookclass\">\n" +
" ["+(i+1)+"]\n" +
" </td>\n" +
" <td class=\"name\">\n" +
/* " <td class=\"style bookclass\">\n" +
" ["+(i+1)+"]\n" +
" </td>\n" +*/
" <td class=\"goread\">\n" +
"<img width='50' height='70' src='"+book.picUrl+"'/><br/>" +
" "+book.bookName+"</td>\n" +
" <td class=\"goread\" >"
+book.catName+"</td>\n" +
" <td class=\"goread\" valsc=\"291|2037554|1\">"
+book.visitCount+"</td>\n" +
" <td class=\"goread\" valsc=\"291|2037554|1\">"
+book.yesterdayBuy+"</td>\n" +
" <td class=\"name\">\n" +
" "+book.lastIndexName+"\n" +
" </td>\n" +
" <td class=\"goread\" id='bookStatus"+book.id+"'>"+(book.status==0?'免费':'上架')+
" <td class=\"goread\">\n" +
" "+new Date(Date.parse(book.lastIndexUpdateTime?book.lastIndexUpdateTime:book.updateTime)).Format("yyyy-MM-dd hh:mm")+"更新\n" +
" </td>\n" +
" <td class=\"goread\" valsc=\"291|2037554|1\">"
+book.wordCount+"</td>\n" +
" <td class=\"goread\" id='opt"+book.id+"'>" +
"<a href='javascript:updateBookStatus(\""+book.id+"\","+book.status+")'>"+(book.status==0?'上架':'下架')+" </a><br/>" +
"<a href='/author/content_add.html?bookStatus="+book.status+"&bookId="+book.id+"'>发布章节 </a>" +
"<a target='_blank' class='redBtn' href='/author/index_list.html?bookId="+book.id+"'>章节管理 </a><br/>" +
"<a target='_blank' href='/author/author_income_detail.html?bookId="+book.id+"'>薪酬查询 </a><br/>"+
"<a target='_blank' href='/book/"+book.id+".html'>作品信息</a>"+
"</td> </tr>");
}
$("#bookList").html(bookListHtml);

View File

@ -0,0 +1,330 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<title>作家管理系统-小说精品屋</title>
<link rel="stylesheet" href="/css/base.css?v=1"/>
<link rel="stylesheet" href="/css/user.css"/>
<style type="text/css">
.redBtn {
padding: 5px;
border-radius: 20px;
border: 1px solid #f80;
background: #f80;
color: #fff;
}
a.redBtn:hover {
color: #fff;
}
</style>
</head>
</head>
<body class="">
<div class="header">
<div class="mainNav" id="mainNav">
<div class="box_center cf"
style="text-align: center;height: 44px;line-height: 48px;color: #fff;font-size: 16px;">
小说精品屋作家管理
</div>
</div>
</div>
<div class="main box_center cf">
<div class="userBox cf">
<div class="my_l">
<ul class="log_list">
<li><a class="link_4 on" href="/author/index.html">作品管理</a></li>
<li><a class="link_2 " href="/author/author_income_detail.html">稿费收入</a></li>
</ul>
</div>
<div class="my_r">
<div id="noContentDiv">
<div class="tc" style="margin-top: 200px"><a href="javascript:addContent()" class="btn_red">新建章节</a>
</div>
</div>
<div class="my_bookshelf" id="hasContentDiv" style="display: none">
<div class="title cf">
<h2 class="fl">章节列表</h2>
<div class="fr"><a href="javascript:addContent()" class="btn_red">新建章节</a></div>
</div>
<div id="divData" class="updateTable">
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<!-- <th class="style">
序号
</th>-->
<th class="name">
章节名
</th>
<th class="goread">
更新时间
</th>
<th class="goread">
是否收费
</th>
<th class="goread">
操作
</th>
</tr>
</thead>
<tbody id="bookList">
</tbody>
</table>
<div class="pageBox cf" id="shellPage">
</div>
</div>
<!--<div id="divData" class="updateTable">
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th class="name">
爬虫源已开启的爬虫源
</th>
<th class="chapter">
成功爬取数量websocket实现
</th>
<th class="time">
目标爬取数量
</th>
<th class="goread">
状态正在运行已停止一次只能运行一个爬虫源
</th>
<th class="goread">
操作启动停止
</th>
</tr>
</thead>
<tbody id="bookShelfList">
</tbody>
</table>
<div class="pageBox cf" id="shellPage">
</div>
</div>-->
</div>
</div>
</div>
</div>
</body>
<script src="/javascript/jquery-1.8.0.min.js" type="text/javascript"></script>
<script src="/layui/layui.all.js" type="text/javascript"></script>
<script src="/javascript/header.js" type="text/javascript"></script>
<script src="/javascript/user.js" type="text/javascript"></script>
<script src="/javascript/date.js" type="text/javascript"></script>
<script src="/javascript/common.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
var bookId = getSearchString("bookId");
var indexCount = 0;
search(1, 5);
function search(curr, limit) {
$.ajax({
type: "POST",
url: "/book/queryIndexList",
data: {'bookId': bookId, 'curr': curr, 'limit': limit, 'orderBy': 'index_num desc'},
dataType: "json",
success: function (data) {
if (data.code == 200) {
var bookList = data.data.list;
if (bookList.length > 0) {
indexCount = bookList.length;
$("#hasContentDiv").css("display", "block");
$("#noContentDiv").css("display", "none");
var bookListHtml = "";
for (var i = 0; i < bookList.length; i++) {
var book = bookList[i];
bookListHtml += (" <tr class=\"book_list\" vals=\"291\">\n" +
/* " <td class=\"style bookclass\">\n" +
" ["+(i+1)+"]\n" +
" </td>\n" +*/
" <td id='name" + book.id + "' class=\"name\">\n" +
" " + book.indexName + "</td>\n" +
" <td class=\"goread\">\n" +
" " + new Date(Date.parse(book.updateTime)).Format("yyyy-MM-dd hh:mm") + "<br/>更新\n" +
" </td>\n" +
" <td class=\"goread\" valsc=\"291|2037554|1\">"
+ (book.isVip == 1 ? '收费' : '免费') + "</td>\n" +
" <td class=\"goread\" id='opt" + book.id + "'>" +
"<a class='redBtn' href='javascript:updateIndex(\"" + book.id + "\"," + book.isVip + ")'>修改 </a><br/>" +
"<a href='javascript:deleteIndex(\"" + book.id + "\")'>删除 </a><br/>" +
"</td> </tr>");
}
$("#bookList").html(bookListHtml);
layui.use('laypage', function () {
var laypage = layui.laypage;
//执行一个laypage实例
laypage.render({
elem: 'shellPage' //注意这里的 test1 ID不用加 #
, count: data.data.total //数据总数从服务端得到,
, curr: data.data.pageNum
, limit: data.data.pageSize
, jump: function (obj, first) {
//obj包含了当前分页的所有参数比如
console.log(obj.curr); //得到当前页以便向服务端请求对应页的数据
console.log(obj.limit); //得到每页显示的条数
//首次不执行
if (!first) {
search(obj.curr, obj.limit);
} else {
}
}
});
});
}
} else if (data.code == 1001) {
//未登录
location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href);
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert('网络异常');
}
})
}
function addContent() {
location.href = "/author/content_add.html?indexCount=" + indexCount + "&bookId=" + bookId;
}
function updateIndex(indexId, isVip) {
var indexName = $.trim($("#name" + indexId).text());
location.href = "/author/content_update.html?bookId=" + bookId
+ "&indexId=" + indexId
+ "&indexName=" + encodeURI(encodeURI(indexName))
+ "&isVip=" + isVip;
/*
var indexName = $("#name"+indexId).text();
var htmlStr = "<input type=\"text\" value=\""+$.trim(indexName)+"\">";
$("#name"+indexId).html(htmlStr);
$("#name"+indexId).find("input").focus();
$("#name"+indexId).find("input").select();
$("#name"+indexId).find("input").keyup(function(event){
if(event.keyCode ==13){
$(this).blur();
}
});
$("#name"+indexId).find("input").blur(function () {
var indexName = $(this).val();
$.ajax({
type: "POST",
url: "/author/updateIndexName",
data: {'indexId':indexId,'indexName':indexName},
dataType: "json",
success: function (data) {
if (data.code == 200) {
$("#name"+indexId).html(indexName);
} else if (data.code == 1001) {
//未登录
location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href);
}else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert('网络异常');
}
})
});*/
}
function deleteIndex(indexId) {
layer.confirm('确认要删除吗删除后数据无法找回', {
btn: ['确定', '取消']//按钮
}, function (index) {
layer.close(index);
$.ajax({
type: "POST",
url: "/author/deleteIndex",
data: {'indexId': indexId},
dataType: "json",
success: function (data) {
if (data.code == 200) {
location.reload();
} else if (data.code == 1001) {
//未登录
location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href);
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert('网络异常');
}
})
});
}
</script>
</html>

View File

@ -45,7 +45,7 @@
<a class="icon_hide" href="javascript:void(0)" onclick=""><i></i>收起</a>
<a class="icon_show" href="javascript:void(0)" onclick=""><i></i>展开</a>
</div>
<div class="btns">
<div class="btns" id="optBtn">
<a th:href="'/book/'+${book.id}+'/'+${firstBookIndexId}+'.html'" class="btn_ora">点击阅读</a>
<span id="cFavs"><a href="javascript:void(0);" class="btn_ora_white btn_addsj"
onclick="javascript:BookDetail.AddFavorites(37,0,0);">加入书架</a>
@ -196,27 +196,32 @@
var pathname = window.location.pathname;
var bookId = pathname.substring(pathname.lastIndexOf("/") + 1, pathname.lastIndexOf("."))
//查询章节信息
$.ajax({
type: "POST",
url: "/book/queryBookIndexAbout",
data: {'bookId': bookId, 'lastBookIndexId': $("#lastBookIndexId").val()},
dataType: "json",
success: function (data) {
if (data.code == 200) {
var bookIndexData = data.data;
$("#bookIndexCount").html("(" + bookIndexData.bookIndexCount + "章)");
$("#lastBookContent").html(bookIndexData.lastBookContent + "...");
var lastBookIndexId = $("#lastBookIndexId").val();
if(lastBookIndexId){
$.ajax({
type: "POST",
url: "/book/queryBookIndexAbout",
data: {'bookId': bookId, 'lastBookIndexId': lastBookIndexId},
dataType: "json",
success: function (data) {
if (data.code == 200) {
var bookIndexData = data.data;
$("#bookIndexCount").html("(" + bookIndexData.bookIndexCount + "章)");
$("#lastBookContent").html(bookIndexData.lastBookContent + "...");
} else {
layer.alert(data.msg);
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert('网络异常');
}
},
error: function () {
layer.alert('网络异常');
}
})
})
}else{
$("#optBtn").remove();
}
</script>
<script language="javascript" type="text/javascript">
//查询是否在书架