welcome to xlongwei.com

欢迎大家一起学习、交流、分享


QQ:9167702333 邮箱:admin@xlongwei.com

pdnovel剖度小说批量上架工具


分类 Java   关键字 分享   标签 java   web   mysql   discuz   发布 hongwei  1446038743467
注意 转载须保留原文链接,译文链接,作者译者等信息。  
pdnovel剖度小说是附加于Discuz的一款小说插件,为了批量上架一些古典文学作品,因而开发了这款批量上架工具,然后用一个小时就上架了著名的四大名著,demo地址:http://cms.xlongwei.com/demo/pdnovel.html

四大名著阅读地址:
http://bbs.xlongwei.com/pdnovel.php?mod=list&catid=131


pdnovel剖度小说数据库涉及共13张表,想要批量上架必须生成章节的sql文件和独立的小说文本文件,为了简化复杂度,批量上架工具仅处理了pre_pdnovel_volume和pre_pdnovel_chapter两张表,使用此工具生成文件下载后仅需导入sql文件到数据库、复制小说文本到相应目录即可。

批量上传工具界面的介绍:红色表示必要配置,绿色表示主要步骤;只要识别章节目录正确,就可以生成下载链接了。

只有上传文本时会提交小说正文,其他操作都只会下载小说正文,服务端使用session保存小说正文和相关配置

页面提交的请求包括动作action和其他相关参数,动作有:text上传文本,upload上传文件,trim去掉空行空格,chapters识别章节目录,options设置卷章号,download生成下载链接,clear清空设置,replace替换文本等。详见:页面源码后台代码

生成下载链接的代码
private String generate(String novel, String chapters, int novelid, int volumnid, int chapterid, Map<String, String> options) {
	Pattern chapter = Pattern.compile(chapters); Matcher matcher = null;
	Map<Integer, SqlInsert> sqlInserts = new LinkedHashMap<>(); SqlInsert sqlInsert = null;
	int words=-1, totalWords=0, chapterorder=1; String volumename = options.get("volumename"); String postdate = DateUtil.format(new Date(), FormatType.MYSQL);
	File dir = new File(GlobalConfig.getProperty("uploads_temp_file")+"/"+novelid+"/"+volumnid);
	if(!dir.exists()) dir.mkdirs(); else FileUtil.clear(dir); //检查目录是否存在,必要时清空章节目录,避免打包下载时有意外的文件
	String lineSeparator = "Windows".equals(options.get("lineSeparator")) ? FileUtil.dosLineSeparator : FileUtil.unixLineSeparator;
	TextWriter txt = null, sql=new TextWriter(dir.getPath()+"/"+volumnid+".sql",FileUtil.CharsetNames.UTF_8).setLineSeparator(lineSeparator);
	for(String line:StringUtil.linesToList(novel)) {
		if((matcher=chapter.matcher(line)).matches()) {
			sqlInsert = new SqlInsert("pre_pdnovel_chapter"); //可用于生成单值insert,也可以生成多值批量insert
			sqlInsert.addColumn("chapterid", String.valueOf(chapterid), Type.TrimToEmpty);
			sqlInsert.addColumn("novelid", String.valueOf(novelid), Type.TrimToEmpty);
			sqlInsert.addColumn("volumeid", String.valueOf(volumnid), Type.TrimToEmpty);
			sqlInsert.addColumn("posterid", StringUtil.firstNotBlank(options.get("posterid"),"1"), Type.TrimToEmpty);
			sqlInsert.addColumn("poster", StringUtil.firstNotBlank(options.get("poster"),"xlongwei"), Type.TrimToEmpty);
			sqlInsert.addColumn("postdate", postdate, Type.TrimToEmpty);
			sqlInsert.addColumn("lastupdate", postdate, Type.TrimToEmpty);
			sqlInsert.addColumn("chaptername", matcher.group(0), Type.TrimToEmpty);
			sqlInsert.addColumn("chapterorder", String.valueOf(chapterorder), Type.TrimToEmpty);
			sqlInsert.addColumn("chaptertype", "0", Type.TrimToEmpty);
			sqlInsert.addColumn("chaptercontent", novelid+"/"+volumnid+"/"+chapterorder+".txt", Type.TrimToEmpty);
			sqlInserts.put(chapterorder, sqlInsert);
			if(chapterorder>1) {
				SqlInsert sqlInsert2 = sqlInserts.get(chapterorder-1); //读到第二章时,才能知道第一章有多少字
				if(sqlInsert2!=null) sqlInsert2.addColumn("chapterwords", String.valueOf(words), Type.TrimToEmpty);
				if(words!=-1) totalWords+=words; 
			}
			if(txt!=null) txt.close();
			txt=new TextWriter(dir.getPath()+"/"+String.valueOf(chapterorder)+".txt",FileUtil.CharsetNames.UTF_8).setLineSeparator(lineSeparator);
			words = 0; chapterid++; chapterorder++;
		}else {
			if(words!=-1) words+=line.length();
			if(txt!=null) txt.writeln(line);
		}
	}
	if(txt!=null) txt.close();
	sqlInsert = sqlInserts.get(chapterorder-1); //更新最后一章的字数
	if(sqlInsert!=null)sqlInsert.addColumn("chapterwords", String.valueOf(words), Type.TrimToEmpty);
	for(Integer order:sqlInserts.keySet()) {
		sql.writeln(sqlInserts.get(order).toString());
	}
	sqlInsert = new SqlInsert("pre_pdnovel_volume");
	sqlInsert.addColumn("novelid", String.valueOf(novelid), Type.TrimToEmpty);
	sqlInsert.addColumn("volumeid", String.valueOf(volumnid), Type.TrimToEmpty);
	sqlInsert.addColumn("volumename", volumename, Type.TrimToEmpty);
	sqlInsert.addColumn("volumeorder", StringUtil.firstNotBlank(options.get("volumeorder"),"1"), Type.TrimToEmpty);
	sqlInsert.addColumn("volumewords", String.valueOf(totalWords), Type.TrimToEmpty); //单卷的字数也计算出来了
	sqlInsert.addColumn("volumechapters", String.valueOf(sqlInserts.size()), Type.TrimToEmpty);
	sql.writeln(sqlInsert.toString());
	sql.close();
	
	FileUtil.zip(dir, new File(dir.getParent(), volumnid+".zip")); //以前写的zip方法,没想到派上了大用场,打包下载就靠它了
	return GlobalConfig.getProperty("uploads_temp")+novelid+"/"+volumnid+".zip";
}

详细步骤还可以参考:pdnovel剖度小说批量上架之流畅版
pdnovel剖度小说批量上架之上传文件处理pdnovel剖度小说批量上架步骤