🦄 Best beautiful java blog, worth a try

Overview

Tale Blog

Tale

Tale's English meaning for the Story, I believe that every person who insists on writing a blog is a story; Chinese you call it Collapse does not matter.

Tale uses a lightweight mvc framework Blade for development, the default theme using a beautiful pinghsu, if you think this project is good, please support it star.

demo website:https://tale.biezhi.me

Build Status License @biezhi on zhihu Gitter

QuickStart  |  Contribution  |  Donate  |  Video  |  中文

Here is a throughput graph of the repository for the last few weeks:

Throughput Graph

Feature

  • Simple design, beautiful interface
  • Markdown article published
  • Custom article links
  • Support multiple themes
  • Support plugin extension
  • Support Emoji
  • Support Netease cloud music player
  • Support for attachments and database backups
  • Deployment is simple, do not rely on Tomcat
  • No database, sqlite embedded

Interface Preview

tale1.png tale_022.png tale_03.png tale_04.png tale_05.png tale_06.png tale_07.png tale_08.png

OpenSource Agreement

MIT

Thanks

Comments
  • markdown 内容过长时后台报错

    markdown 内容过长时后台报错

    2019/01/09 16:04:23 ERROR [   worker@thread-3 ] c.b.m.h.DefaultExceptionHandler :  io.netty.handler.codec.http.multipart.HttpPostRequestDecoder$ErrorDataDecoderException: java.io.IOException: Unable to create temporary file, C:\Users\zaoangod\AppData\Local\Temp\Attr_7037299340806213142_{"cid":"","title":"原生 JS 代替 jQuery","slug":"","tags":"","content":"# Query Selector\n\n常用的 class、id、属性选择器都可以使用 `document.querySelector` 或 `document.querySelectorAll` 替代。区别是\n* `document.querySelector` 返回第一个匹配的 Element\n* `document.querySelectorAll` 返回所有匹配的 Element 组成的 NodeList。它可以通过 `[].slice.call()` 把它转成 Array\n\n> 注意: `document.querySelector` 和 `document.querySelectorAll` 性能很差。如果想提高性能,尽量使用 `document.getElementById`、 `document.getElementsByClassName` 或 `document.getElementsByTagName`\n\n## 选择器查询\n```js\n\ jQuery\n$('selector');\n\n\ Native\ndocument.querySelectorAll('selector');\n```\n\n## class 查询\n```js\n\ jQuery\n$('.class');\n\n\ Native\ndocument.querySelectorAll('.class');\n\ or\ndocument.getElementsByClassName('class');\n```\n\n## id 查询\n```js\n\ jQuery\n$('#id');\n\n\ Native\ndocument.querySelector('#id');\n\ or\ndocument.getElementById('id');\n```\n\n## 属性查询\n```js\n\ jQuery\n$('a[target.att
    	at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBodyAttributes(HttpPostStandardRequestDecoder.java:605)
    	at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBody(HttpPostStandardRequestDecoder.java:360)
    	at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.offer(HttpPostStandardRequestDecoder.java:289)
    	at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.offer(HttpPostStandardRequestDecoder.java:46)
    	at io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.offer(HttpPostRequestDecoder.java:227)
    	at com.blade.mvc.http.HttpRequest.init(HttpRequest.java:359)
    	at com.blade.server.netty.HttpServerHandler.buildWebContext(HttpServerHandler.java:95)
    	at com.blade.server.netty.HttpServerHandler.lambda$channelRead0$0(HttpServerHandler.java:84)
    	at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602)
    	at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577)
    	at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:442)
    	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
    	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
    	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462)
    	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897)
    	at java.lang.Thread.run(Thread.java:748)
    Caused by: java.io.IOException: Unable to create temporary file, C:\Users\zaoangod\AppData\Local\Temp\Attr_7037299340806213142_{"cid":"","title":"原生 JS 代替 jQuery","slug":"","tags":"","content":"# Query Selector\n\n常用的 class、id、属性选择器都可以使用 `document.querySelector` 或 `document.querySelectorAll` 替代。区别是\n* `document.querySelector` 返回第一个匹配的 Element\n* `document.querySelectorAll` 返回所有匹配的 Element 组成的 NodeList。它可以通过 `[].slice.call()` 把它转成 Array\n\n> 注意: `document.querySelector` 和 `document.querySelectorAll` 性能很差。如果想提高性能,尽量使用 `document.getElementById`、 `document.getElementsByClassName` 或 `document.getElementsByTagName`\n\n## 选择器查询\n```js\n\ jQuery\n$('selector');\n\n\ Native\ndocument.querySelectorAll('selector');\n```\n\n## class 查询\n```js\n\ jQuery\n$('.class');\n\n\ Native\ndocument.querySelectorAll('.class');\n\ or\ndocument.getElementsByClassName('class');\n```\n\n## id 查询\n```js\n\ jQuery\n$('#id');\n\n\ Native\ndocument.querySelector('#id');\n\ or\ndocument.getElementById('id');\n```\n\n## 属性查询\n```js\n\ jQuery\n$('a[target.att
    	at java.io.File$TempDirectory.generateFile(File.java:1921)
    	at java.io.File.createTempFile(File.java:2010)
    	at java.io.File.createTempFile(File.java:2070)
    	at io.netty.handler.codec.http.multipart.AbstractDiskHttpData.tempFile(AbstractDiskHttpData.java:90)
    	at io.netty.handler.codec.http.multipart.AbstractDiskHttpData.addContent(AbstractDiskHttpData.java:163)
    	at io.netty.handler.codec.http.multipart.DiskAttribute.addContent(DiskAttribute.java:99)
    	at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.setFinalBuffer(HttpPostStandardRequestDecoder.java:614)
    	at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBodyAttributes(HttpPostStandardRequestDecoder.java:539)
    	... 16 more
    
    

    文章中有 = 会报错

    opened by zaoangod 11
  • 关于标题展示的随机图片

    关于标题展示的随机图片

    大佬,又来找你了。

    static\img\rand 貌似只能20张。我添加到40张,多出来的不会显示。序号也排好了。发了很多测试文章都没有显示我添加的图片。发现是${show_thumb(article)},这里面article的cid确定图片的路径,应该怎么才能改动最大的cid,让它能显示我自己的图片呢?

    bug discussion 
    opened by OJZen 11
  • 自定义访问路径出问题

    自定义访问路径出问题

    问题描述

    1. 发布文章填写了自定义访问路径,但在实际访问时确无法无法访问,所有的文章在首页查看、后台编辑时打开都不是原本的文章,新添加了一个“友链”页面,打开也变成了“关于”的页面。查看tale.db数据库文件发现所有文章数据均正常。
    2. 后台文章编辑将自定义访问路径删除后保存,再打开还是会存在。

    问题重现

    我之前用的是tale-1.2.15版本,昨天(2017.10.29)晚上新换了服务器就重新下载了最新版本,版本号未知,使用Nginx代理,重新部署好以后,将原tale/resources/下的upload和tale.db复制到了新的resources目录下,测试的时候最开始正常,但是在点了一些链接,大概2分钟之后出现问题。之前的版本未发现此问题。

    其他:

    尝试过重启tale和重启服务器,没有效果。 这是我的服务器地址,可以访问查看具体的错误体现。暂时保留此状态几天,打算过几天恢复旧版本。

    question 
    opened by veir-panda 10
  • Jetty 这个 咋设置 java.lang.IllegalStateException: Form too large: 248817 > 200000

    Jetty 这个 咋设置 java.lang.IllegalStateException: Form too large: 248817 > 200000

    java.lang.IllegalStateException: Form too large: 248817 > 200000 at org.eclipse.jetty.server.Request.extractFormParameters(Request.java:495) at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:433) at org.eclipse.jetty.server.Request.getParameters(Request.java:363) at org.eclipse.jetty.server.Request.getParameter(Request.java:995) at com.blade.mvc.http.wrapper.ServletRequest.query(ServletRequest.java:274) at com.blade.mvc.view.resolve.MethodArgument.getArgs(MethodArgument.java:79) at com.blade.mvc.view.resolve.RouteViewResolve.handle(RouteViewResolve.java:50) at com.blade.mvc.dispatch.DispatcherHandler.routeHandle(DispatcherHandler.java:184) at com.blade.mvc.dispatch.DispatcherHandler.handle(DispatcherHandler.java:94) at com.blade.mvc.dispatch.DispatcherServlet.service(DispatcherServlet.java:39) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:830) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:543) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1584) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1228) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:481) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1553) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1130) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.Server.handle(Server.java:564) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:318) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:112) at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590) at java.lang.Thread.run(Unknown Source) # # @biezhi

    opened by a100488 9
  • 老铁,最新的10月17的这个有点问题啊

    老铁,最新的10月17的这个有点问题啊

    发布文章不能用 Markdown。 会出这两个错误:

    dropzone.min.js:1 Uncaught Error: No URL provided.
        at new c (dropzone.min.js:1)
        at Function.a.discover (dropzone.min.js:1)
        at a._autoDiscoverFunction (dropzone.min.js:2)
        at HTMLDocument.f (dropzone.min.js:2)
    jquery.min.js:2 Uncaught Error: Dropzone already attached.
        at new c (dropzone.min.js:1)
        at HTMLDivElement.<anonymous> (dropzone.min.js:2)
        at Function.each (jquery.min.js:2)
        at r.fn.init.each (jquery.min.js:2)
        at r.fn.init.undefined.jQuery.fn.dropzone (dropzone.min.js:2)
        at HTMLDocument.<anonymous> (article.js?v=v1.0:140)
        at j (jquery.min.js:2)
        at k (jquery.min.js:2)
    
    question 
    opened by afx919 9
  • 端口改成80,启动服务报错

    端口改成80,启动服务报错

    我在resources/app.properties添加一行server.port=80,启动服务器报错 io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:501) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:486) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:989) at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:254) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:364) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at java.lang.Thread.run(Thread.java:748)

    question discussion 
    opened by gqb 7
  • 我想把tale作为systemd启动,我自己写的service,启动后退出。不知道什么问题

    我想把tale作为systemd启动,我自己写的service,启动后退出。不知道什么问题

    操作系统: uname : linux 3.10.0-514.26.2.el7.x86_64 系统:centos7.3

    我想把tale作为systemd启动,我自己写的service,启动后退出。不知道什么问题。 [Unit] 2 Description=tale 3 [Service] 4 Type=forking 5 ExecReload=/usr/bin/bash /opt/tale/tale/tool.sh reload 6 ExecStart=/usr/bin/bash /opt/tale/tale/tool.sh start 7 ExecStop=/usr/bin/bash /opt/tale/tale/tool.sh stop 8 [Install] 9 WantedBy=multi-user.target

    systemctl status tale

    ● tale.service - tale Loaded: loaded (/etc/systemd/system/tale.service; enabled; vendor preset: disabled) Active: inactive (dead) since Sat 2019-01-26 21:25:23 CST; 3s ago Process: 2773 ExecStop=/usr/bin/bash /opt/tale/tale/tool.sh stop (code=exited, status=0/SUCCESS) Process: 2768 ExecStart=/usr/bin/bash /opt/tale/tale/tool.sh start (code=exited, status=0/SUCCESS)

    Jan 26 21:25:22 izj6cgykrq171a8wb4394uz systemd[1]: Starting tale... Jan 26 21:25:22 izj6cgykrq171a8wb4394uz bash[2768]: Starting tale ... Jan 26 21:25:23 izj6cgykrq171a8wb4394uz bash[2768]: [Failed] Jan 26 21:25:23 izj6cgykrq171a8wb4394uz bash[2773]: ================================ Jan 26 21:25:23 izj6cgykrq171a8wb4394uz bash[2773]: warn: tale is not running Jan 26 21:25:23 izj6cgykrq171a8wb4394uz bash[2773]: ================================ Jan 26 21:25:23 izj6cgykrq171a8wb4394uz systemd[1]: Started tale.

    是我的脚本有问题吗

    opened by flycat0112 6
  • mvn打包并运行问题

    mvn打包并运行问题

    git clone tale源码后 运行mvn package打包成tale.jar文件 java -jar tale.jar运行时 错误提示: Exception in thread "main" java.lang.NoClassDefFoundError: com/blade/Blade at com.tale.Application.main(Application.java:16) Caused by: java.lang.ClassNotFoundException: com.blade.Blade at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more

    opened by troyforever 6
  • 页面管理出现问题。

    页面管理出现问题。

    Windows server部署。 从这里下载的:http://static.biezhi.me/tale-least.zip?10281

    我的网址是:www.ougaojun.com

    问题:点击关于,跳转到www.ougaojun.com/about,出现404,而且404页面缺少了css样式,需要刷新才有完整的css。在后台管理里面的页面管理已经确认添加了about页面。也尝试过添加其它页面,比如about2,当时是可以访问,过了一会又不行了。

    opened by OJZen 6
  • Failed to load native library:sqlite-3.15.1

    Failed to load native library:sqlite-3.15.1

    tale 版本: 1.2.11

    在 docker 里运行时碰到的这个报错

    下面贴一下完整的输出:

    pi@debian:~/src/tale/tale$ docker run --rm -p 9009:9000 -v "$PWD":/usr/src/myapp -w /usr/src/myapp openjdk:8-jdk-alpine java -jar tale-1.2.11.jar
    Unable to find image 'openjdk:8-jdk-alpine' locally
    8-jdk-alpine: Pulling from library/openjdk
    627beaf3eaaf: Pull complete 
    1de20f2d8b83: Pull complete 
    3e00029ebfe3: Pull complete 
    Digest: sha256:ea4d99e7bec5f301c6cb875196261487bc1bbd78f7b1a9d19d6795b512dfe355
    Status: Downloaded newer image for openjdk:8-jdk-alpine
    [tale] 2017-03-22 15:14:05,518 INFO  [main] com.blade.embedd.EmbedJettyServer | add classpath: /usr/src/myapp/resources/
    [tale] 2017-03-22 15:14:05,558 INFO  [main] org.eclipse.jetty.util.log | Logging initialized @516ms to org.eclipse.jetty.util.log.Slf4jLog
    [tale] 2017-03-22 15:14:05,985 INFO  [main] com.blade.embedd.EmbedJettyServer | add classpath : /usr/src/myapp/resources/
    [tale] 2017-03-22 15:14:06,027 INFO  [main] org.eclipse.jetty.server.Server | jetty-9.4.0.v20161208
    [tale] 2017-03-22 15:14:06,309 INFO  [main] org.eclipse.jetty.webapp.StandardDescriptorProcessor | NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
    [tale] 2017-03-22 15:14:06,321 INFO  [main] org.eclipse.jetty.server.session | DefaultSessionIdManager workerName=node0
    [tale] 2017-03-22 15:14:06,321 INFO  [main] org.eclipse.jetty.server.session | No SessionScavenger set, using defaults
    [tale] 2017-03-22 15:14:06,325 INFO  [main] org.eclipse.jetty.server.session | Scavenging every 660000ms
    [tale] 2017-03-22 15:14:06,347 INFO  [main] com.blade.mvc.context.BladeInitListener | jdk.version	=> 1.8.0_121
    [tale] 2017-03-22 15:14:06,348 INFO  [main] com.blade.mvc.context.BladeInitListener | user.dir		=> /usr/src/myapp
    [tale] 2017-03-22 15:14:06,348 INFO  [main] com.blade.mvc.context.BladeInitListener | java.io.tmpdir	=> /tmp
    [tale] 2017-03-22 15:14:06,348 INFO  [main] com.blade.mvc.context.BladeInitListener | user.timezone	=> GMT
    [tale] 2017-03-22 15:14:06,348 INFO  [main] com.blade.mvc.context.BladeInitListener | file.encoding	=> UTF-8
    [tale] 2017-03-22 15:14:06,351 INFO  [main] com.blade.mvc.context.BladeInitListener | blade.webroot	=> jar:file:/usr/src/myapp/tale-1.2.11.jar!/
    [tale] 2017-03-22 15:14:06,395 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/article/publish
    [tale] 2017-03-22 15:14:06,397 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/article/:cid
    [tale] 2017-03-22 15:14:06,404 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/article/publish
    [tale] 2017-03-22 15:14:06,405 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/article/modify
    [tale] 2017-03-22 15:14:06,409 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/article
    [tale] 2017-03-22 15:14:06,409 INFO  [main] com.blade.mvc.route.Routers | Add Route => ALL	/admin/article/delete
    [tale] 2017-03-22 15:14:06,410 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/attach/upload
    [tale] 2017-03-22 15:14:06,411 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/attach
    [tale] 2017-03-22 15:14:06,411 INFO  [main] com.blade.mvc.route.Routers | Add Route => ALL	/admin/attach/delete
    [tale] 2017-03-22 15:14:06,413 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/install
    [tale] 2017-03-22 15:14:06,414 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/install
    [tale] 2017-03-22 15:14:06,415 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/reload
    [tale] 2017-03-22 15:14:06,417 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/backup
    [tale] 2017-03-22 15:14:06,419 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/setting
    [tale] 2017-03-22 15:14:06,420 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/password
    [tale] 2017-03-22 15:14:06,426 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/setting
    [tale] 2017-03-22 15:14:06,427 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/profile
    [tale] 2017-03-22 15:14:06,428 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/advanced
    [tale] 2017-03-22 15:14:06,429 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin
    [tale] 2017-03-22 15:14:06,430 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/index
    [tale] 2017-03-22 15:14:06,432 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/profile
    [tale] 2017-03-22 15:14:06,433 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/links/save
    [tale] 2017-03-22 15:14:06,434 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/links
    [tale] 2017-03-22 15:14:06,435 INFO  [main] com.blade.mvc.route.Routers | Add Route => ALL	/admin/links/delete
    [tale] 2017-03-22 15:14:06,436 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/login
    [tale] 2017-03-22 15:14:06,437 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/login
    [tale] 2017-03-22 15:14:06,438 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/category/save
    [tale] 2017-03-22 15:14:06,439 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/category
    [tale] 2017-03-22 15:14:06,441 INFO  [main] com.blade.mvc.route.Routers | Add Route => ALL	/admin/category/delete
    [tale] 2017-03-22 15:14:06,442 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/tag/:name
    [tale] 2017-03-22 15:14:06,445 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/tag/:name.html
    [tale] 2017-03-22 15:14:06,446 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/tag/:name/:page
    [tale] 2017-03-22 15:14:06,447 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/tag/:name/:page.html
    [tale] 2017-03-22 15:14:06,448 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/:pagename
    [tale] 2017-03-22 15:14:06,449 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/:pagename.html
    [tale] 2017-03-22 15:14:06,450 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/article/:cid
    [tale] 2017-03-22 15:14:06,450 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/article/:cid.html
    [tale] 2017-03-22 15:14:06,450 INFO  [main] com.blade.mvc.route.Routers | Add Route => ALL	/logout
    [tale] 2017-03-22 15:14:06,451 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/category/:keyword/:page
    [tale] 2017-03-22 15:14:06,451 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/category/:keyword/:page.html
    [tale] 2017-03-22 15:14:06,452 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/category/:keyword
    [tale] 2017-03-22 15:14:06,452 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/category/:keyword.html
    [tale] 2017-03-22 15:14:06,454 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/links
    [tale] 2017-03-22 15:14:06,454 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/links.html
    [tale] 2017-03-22 15:14:06,456 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/archives
    [tale] 2017-03-22 15:14:06,456 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/archives.html
    [tale] 2017-03-22 15:14:06,457 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/feed
    [tale] 2017-03-22 15:14:06,457 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/feed.xml
    [tale] 2017-03-22 15:14:06,458 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/page/:p
    [tale] 2017-03-22 15:14:06,459 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/page/:pageIndex.html
    [tale] 2017-03-22 15:14:06,459 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/
    [tale] 2017-03-22 15:14:06,460 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/comment
    [tale] 2017-03-22 15:14:06,460 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/search/:keyword
    [tale] 2017-03-22 15:14:06,460 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/search/:keyword.html
    [tale] 2017-03-22 15:14:06,461 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/search/:keyword/:page
    [tale] 2017-03-22 15:14:06,462 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/search/:keyword/:page.html
    [tale] 2017-03-22 15:14:06,462 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/comments
    [tale] 2017-03-22 15:14:06,463 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/comments
    [tale] 2017-03-22 15:14:06,464 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/comments/delete
    [tale] 2017-03-22 15:14:06,465 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/comments/status
    [tale] 2017-03-22 15:14:06,466 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/themes/setting
    [tale] 2017-03-22 15:14:06,468 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/themes/setting
    [tale] 2017-03-22 15:14:06,469 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/themes/active
    [tale] 2017-03-22 15:14:06,469 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/themes
    [tale] 2017-03-22 15:14:06,471 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/page/modify
    [tale] 2017-03-22 15:14:06,472 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/page/new
    [tale] 2017-03-22 15:14:06,473 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/page/:cid
    [tale] 2017-03-22 15:14:06,473 INFO  [main] com.blade.mvc.route.Routers | Add Route => POST	/admin/page/publish
    [tale] 2017-03-22 15:14:06,473 INFO  [main] com.blade.mvc.route.Routers | Add Route => GET	/admin/page
    [tale] 2017-03-22 15:14:06,474 INFO  [main] com.blade.mvc.route.Routers | Add Route => ALL	/admin/page/delete
    [tale] 2017-03-22 15:14:06,497 INFO  [main] com.blade.mvc.route.Routers | Add Interceptor: BEFORE	/.*
    [tale] 2017-03-22 15:14:06,497 INFO  [main] com.blade.mvc.route.Routers | Add Interceptor: AFTER	/.*
    [tale] 2017-03-22 15:14:06,523 WARN  [main] com.blade.ioc.Ioc | Duplicated Bean: com.tale.init.WebContext
    Failed to load native library:sqlite-3.15.1-b5aece83-7811-4432-be54-d322b463a038-libsqlitejdbc.so. osinfo: Linux/x86_64
    java.lang.UnsatisfiedLinkError: /tmp/sqlite-3.15.1-b5aece83-7811-4432-be54-d322b463a038-libsqlitejdbc.so: Error relocating /tmp/sqlite-3.15.1-b5aece83-7811-4432-be54-d322b463a038-libsqlitejdbc.so: __isnan: symbol not found
    [tale] 2017-03-22 15:14:06,658 INFO  [main] org.eclipse.jetty.server.AbstractConnector | Started ServerConnector@62917d6{HTTP/1.1,[http/1.1]}{0.0.0.0:9000}
    Exception in thread "main" java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open_utf8([BI)V
    	at org.sqlite.core.NativeDB._open_utf8(Native Method)
    	at org.sqlite.core.NativeDB._open(NativeDB.java:71)
    	at org.sqlite.core.DB.open(DB.java:174)
    	at org.sqlite.core.CoreConnection.open(CoreConnection.java:220)
    	at org.sqlite.core.CoreConnection.<init>(CoreConnection.java:76)
    	at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:24)
    	at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:24)
    	at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:45)
    	at org.sqlite.JDBC.createConnection(JDBC.java:114)
    	at org.sqlite.JDBC.connect(JDBC.java:88)
    	at java.sql.DriverManager.getConnection(DriverManager.java:664)
    	at java.sql.DriverManager.getConnection(DriverManager.java:270)
    	at com.tale.init.SqliteJdbc.importSql(SqliteJdbc.java:49)
    	at com.tale.init.WebContext.register(WebContext.java:105)
    	at com.blade.ioc.IocApplication.lambda$initBeans$4(IocApplication.java:125)
    	at java.util.ArrayList.forEach(ArrayList.java:1249)
    	at com.blade.ioc.IocApplication.initBeans(IocApplication.java:125)
    	at com.blade.mvc.context.BladeInitListener.contextInitialized(BladeInitListener.java:79)
    	at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:865)
    	at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:532)
    	at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:828)
    	at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:344)
    	at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1480)
    	at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1442)
    	at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:788)
    	at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:261)
    	at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:540)
    	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131)
    	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:113)
    	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
    	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131)
    	at org.eclipse.jetty.server.Server.start(Server.java:452)
    	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105)
    	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
    	at org.eclipse.jetty.server.Server.doStart(Server.java:419)
    	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    	at com.blade.embedd.EmbedJettyServer.startup(EmbedJettyServer.java:166)
    	at com.blade.embedd.EmbedJettyServer.startup(EmbedJettyServer.java:74)
    	at com.blade.Blade.startNoJoin(Blade.java:499)
    	at com.blade.Blade.start(Blade.java:472)
    	at com.blade.Blade.start(Blade.java:478)
    	at com.tale.Application.main(Application.java:11)
    

    在树莓派上运行也是一样的错误,不知道是不是 sqlite 版本的问题

    bug 
    opened by yangxuan8282 6
  • IOException: 远程主机强迫关闭了一个现有的连接

    IOException: 远程主机强迫关闭了一个现有的连接

    2018/12/17 19:29:34 ERROR [ worker@threadㄧ1 ] c.b.s.n.HttpServerDispatcher : 远程主机强迫关闭了一个现有的连接。 java.io.IOException: 远程主机强迫关闭了一个现有的连接。 at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) at sun.nio.ch.IOUtil.read(IOUtil.java:192) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1108) at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:628) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) at java.lang.Thread.run(Thread.java:745)

    opened by pl1612127 5
  • Stored XSS vulnerability

    Stored XSS vulnerability

    Stored XSS vulnerability

    Process

    1. The XSS vulnerability can be triggered by entering a JavaScript statement starting with "> at the logo of the backend administration

      image-20221228163244635

    2. XSS vulnerability can be triggered by visiting any page

      image-20221228163933449

    opened by Shydlock 0
  • ip blacklist bypass vulnerability

    ip blacklist bypass vulnerability

    ip blacklist bypass vulnerability

    Process

    1. Set up ip blacklist for 127.0.0.1(Due to the existence of a system bug, only 27.0.0.1 can be set here, but it is limited to 127.0.0.1)

      image-20221228143409429

    2. Re-visit the page and find that it has been restricted by the ip blacklist

      image-20221228143545991

      image-20221228143614180

    3. But here you can bypass the blacklist restriction by setting the X-Real-IP request header

      image-20221228143727705

    Key issues in the code

    1. ipAddress() in com.blade.kit.WebKit

      image-20221228144054228

    opened by Shydlock 0
  • There is a security problem with admin route verification, which leads to direct access without login

    There is a security problem with admin route verification, which leads to direct access without login

    ezbypass,/%61dmin/api/logs image

    For post requests, you only need to configure the X-CSRF-TOKEN request header and the corresponding session Therefore, an attacker can directly modify the template file to get rce. image

    And the template engine does not open the sandbox. it makes it particularly easy for attackers. Just need to set the parameter content to #set(in=new java.io.InputStreamReader(java.lang.Runtime::getRuntime().exec('xxx').getInputStream()))#set(buf=new java.io.BufferedReader(in)) Then visit the page. (At the same time, this route /admin/api/template/save has a arbitrary file read) Env: Win10 JDK8u261 tale v2.0.5

    opened by Siebene 0
  • 项目跑起来后 , 后台报错

    项目跑起来后 , 后台报错

    在发布文章模块报错 Uncaught ReferenceError: VueLoading is not defined Uncaught ReferenceError: moment is not defined 文章管理模块报错 Uncaught ReferenceError: VueLoading is not defined TypeError: Cannot read property 'show' of undefined Uncaught TypeError: Cannot read property 'hide' of undefined ReferenceError: moment is not defined

    opened by cq20057877 1
Releases(v2.0.5)
Owner
Tale Blog System
简洁美观的Java博客系统
Tale Blog System
First experiments to try to render the Doom WAD maps using only standard libraries. Test 004 - https://youtu.be/-6mePgg7gXE

JavaDoomWADMapRendererTests Test 001 (07/set/2022) - https://youtu.be/MpY0PICdcwM First experiments to try to render the Doom WAD maps using only stan

Leo 6 Oct 17, 2022
A beautiful material calendar with endless scroll, range selection and a lot more!

CrunchyCalendar A light, powerful and easy to use Calendar Widget with a number out of the box features: Infinite vertical scrolling in both direction

CleverPumpkin 484 Jan 7, 2023
A beautiful Clock Widget for your Desktop! (tested on Windows)

ClockWidget A beautiful Clock Widget for your Desktop! (tested on Windows) This is a clock widget that I programmed in the first year of Computer Scie

Hasan Tuna 7 Dec 15, 2022
Java based open source static site/blog generator for developers & designers.

JBake JBake is a Java based open source static site/blog generator for developers. Documentation Full documentation is available on jbake.org. Contrib

JBake 1k Dec 30, 2022
A simple blog post api made with spring,mysql.Following tutorial by @FadatareRamesh(Java Guides)

blogAPI A simple blog post api made with spring,mysql.Following tutorial by @FadatareRamesh(Java Guides) Frontend server(made using Angular) can be fo

null 1 Feb 2, 2022
Spring MVC backend written in Java for my wiki/blog

blog-api Spring MVC backend written in Java for my wiki/blog. Why Spring? Spring MVC and other parts of the Spring framework are still immensely popul

null 0 Mar 16, 2022
Application for creating blog posts, developed with Java using Spring Framework for backend and Angular along with PrimeNG Library for frontend development.

Application for creating blog posts, developed with Java using Spring Framework for backend and Angular along with PrimeNG Library for frontend development.

Áureo Carmelino 10 Nov 27, 2022
Escrevendo Testes para o Blog Pessoal

Implementando testes com o Spring Testing no Blog Pessoal Nesta atividade iremos implementar os testes nas Camadas Model, Repository e Controller da C

Rafael Queiróz 13 Dec 12, 2022
Projeto Base - Spring Security - Blog Pessoal

Implementando a Camada de Segurança com o Spring Security no Blog Pessoal Nesta atividade iremos implementar a camada de segurança da aplicação com o

Rafael Queiróz 10 Aug 9, 2021
A blog recipes API for you to share and search for food recipes

A blog recipes API for you to share and search for food recipes

java dojo 3 Apr 15, 2022
A personal blog based on Vue+SpringBoot+MySql+Redis+Shiro+JWT

项目:Vue-SpringBoot-PersonalBlog 个人博客网址:http://www.huchao.vip/blogs CSDN:毛_三月 介绍 一个基于SpringBoot + Vue+MybatisPlus+Shiro+JWT+Redis开发的前后端分离博客项目,带有超级详细开发文档

Chao. Hu 26 Dec 20, 2022
Event promoted by DevSuperior to improve the best practices of Spring with Java and has React JS as an additional.

Semana-Spring-React (sds3.0) Introduction SDS3 is an event promoted by DevSuperior which aims to help students and programming professionals to enter

Gilson Vieira de Souza 5 Oct 25, 2021
A fast and reliable Java micro-library which chooses the sorting algorithm that best fits your needs and sorts the parameter.

A fast and reliable Java micro-library which chooses the sorting algorithm that best fits your needs and sorts the parameter.

Simone Nicol 2 Feb 19, 2022
Get Best Resources on every Domain here!

Useful Resources for Developers To join DEVs Dungeon GitHub Organization, click here ➤ If you find this REPOSITORY helpful, then do give it a ?? by pr

DEVs Dungeon 192 Dec 29, 2022
Spring Boot REST API authentication best practices using JWT

Spring Boot REST API authentication best practices using JWT Token based API authentication with Spring Security and JWT (JSON web Token) Overview Thi

Prafful Lachhwani 34 Dec 22, 2022
Observing a sequence of objects that can be numerically ranked best and worst.

Optimal-Stopping The Secretary Problem from Optimal Stopping. https://en.wikipedia.org/wiki/Optimal_stopping Observing a sequence of objects that can

null 1 Feb 3, 2022
Best practice of monolithic spring application starter

Best practice of monolithic spring application starter

전지환 4 Jul 19, 2022
"Some" Utilities you can use for your Java projects "freely"! Files are compiled with Java-8 and above, but mostly Java-11.

✨ Java-SomeUtils ?? "Some" Utilities you can use for your Java projects "freely"! *"Freely"* forcing you to include the license into your program. Fil

JumperBot_ 2 Jan 6, 2023
Java-Programs---For-Practice is one of the Java Programming Practice Series By Shaikh Minhaj ( minhaj-313 ). This Series will help you to level up your Programming Skills. This Java Programs are very much helpful for Beginners.

Java-Programs---For-Practice is one of the Java Programming Practice Series By Shaikh Minhaj ( minhaj-313 ). This Series will help you to level up your Programming Skills. This Java Programs are very much helpful for Beginners. If You Have any doubt or query you can ask me here or you can also ask me on My LinkedIn Profile

Shaikh Minhaj 3 Nov 8, 2022