Giter Club home page Giter Club logo

blossom-editor / blossom Goto Github PK

View Code? Open in Web Editor NEW
3.0K 15.0 236.0 61.66 MB

A markdown editor that you can deploy on your own servers to achieve cloud storage and device synchronization(支持私有部署的云端存储双链笔记软件)

Home Page: https://www.wangyunf.com/blossom-doc/index

License: MIT License

Shell 0.02% Java 42.86% JavaScript 0.15% TypeScript 10.20% HTML 2.99% Vue 37.15% CSS 2.81% SCSS 3.74% Dockerfile 0.08%
editor markdown blog client-server

blossom's Issues

[BUG]快捷键异常

客户端:MacOS 1.7.0
问题:在文章页面,使用CMD+1 展开或者收缩目录栏(全程不松开CMD),不松开CMD继续按1无反应,反而按其他数字比如2,会执行CMD+1的逻辑,然后再按任何数字键都没有效果了。
希望效果:在不松开CMD的情况下继续按数字键可以按照正常逻辑执行

【建议】Web端文章URI优化

目前效果:image
Web端在已经定位到某文章的情况下,URI没有指向这篇文章,如果需要将文章分享给朋友,URL分享出去别人打开是文章的首页,而不是我希望分享的那篇文章

希望效果:URI可以定位到具体文章,或者增加一个分享按钮自动复制能够准确定位到当前文章的URL

[BUG] 服务端天气相关报错日志

环境

  • 系统:Windows11
  • 数据库: MySQL 8.0
  • 容器环境:Docker For Windows
  • 使用版本:1.5.0

请求URL

/weather?location=101100101

响应

{
  "code": "20000",
  "msg": "成功",
  "data": {}
}

服务端报错日志

2023-10-03 21:11:44 21:11:44.561 ERROR[999-exec-3] [84.B1] c.b.b.t.hefeng.WeatherManager  77 : 获取城市信息失败,body : [{"code":"401"}]
2023-10-03 21:11:44 21:11:44.561 ERROR[999-exec-3] [84.B1] c.b.b.t.hefeng.WeatherManager  86 : 获取当天气失败,body : [{"code":"401"}]
2023-10-03 21:11:44 21:11:44.562 ERROR[999-exec-3] [84.B1] c.b.b.t.hefeng.WeatherManager  98 : 获取3日天气预报失败,body : [{"code":"401"}]
2023-10-03 21:11:44 21:11:44.562 ERROR[999-exec-3] [84.B1] c.b.b.t.hefeng.WeatherManager  111: 获取小时预报失败,body : [{"code":"401"}]}

支持个人OKR

Blossom里有TODO,有没有考虑加入个人OKR相关的功能?

功能可以参考 Vision

[建议&讨论]关于导入导出支持更多格式

目前导出可以支持导出为MD文件和HTML文件,但是导入的话只支持MD文件和TXT文件,比较单一,希望可以增加更多形式的导入导出,比如ZIP和MHT文件的导入,方便从其他笔记平台进行迁移;
MHT这种格式也是我最近发现的,为知笔记可以导出为MHT文件,这个文件的好处是他把笔记完整的导出为一个文件,这个文件里包含了所有文件及多媒体图片;
ZIP这种格式本质上是一个网页和一个资源包的合集,可以一次性将文章和图片进行导入;

当然,如果可以针对性的找几个其他笔记平台的导出格式进行匹配,那样更好了。比如常见的一些笔记平台:语雀、obsidian、思源、为知、有道、印象笔记、Notion,其他的一些开源笔记如trilium、Joplin等。

【建议】Blossom图标填充功能

创建文件选择图标时,选中图标后还需要返回设置页面手动输入图标名称,不方便,建议选中后直接返回设置页面并将选中的图标内容自动填入,或者选中后会自动复制图标名称
image

图片上传后无预览显示

作者你好,根据你的博客部署教程,我使用了docker部署,完成部署后尝试上传图片,上传后的页面如下图所示
WeCom截圖_20231219213649
回头查看后端容器输出的日志,得到结果如下
WeCom截圖_20231219213730
看起来,上传并没有报错,也看不出来图片预览这一功能在哪一个环节出错了,想咨询一下这个情况可以怎么排查解决

[建议]关于Editor功能的文档列表界面的一些建议

1、建议新增完文件夹或者文章后,列表可以自动刷新;
2、建议新增文件夹或者文章时,可以根据选择的类型增加默认的图标,比如选择文件夹默认一个文件夹的图标,选择文章则默认一个文档的图标;如果需要修改,则保持现在的功能,允许自行调整;(目前如果默认不设置图标的话,在列表中分不清是文件夹还是文章)
image

后续是否考虑增加一个docker-compose方式进行部署

当前的部署方式相对比较麻烦,
后续是否考虑增加一个docker-composedocker ci方式进行部署

docker compose

就是使用 docker compose 配置文件,直接启动进行

docker ci

就是使用 docker run ... 进行启动容器

一个请求

能不能增加同步手机日历/日程功能,如谷歌日历等

一些问题

  1. 本地上传文件报错(使用云数据库,本地调试)
    org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "undefined"
    	at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:133)
    	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
    	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)
    	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
    	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:555)
    	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at com.blossom.backend.base.auth.caffeine.CaffeineTokenAuthFilterProxy.doFilterInternal(CaffeineTokenAuthFilterProxy.java:104)
    	at com.blossom.backend.base.auth.filters.AuthFilterProxy.doFilter(AuthFilterProxy.java:53)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at com.blossom.backend.base.auth.filters.RequestWrapperFilter.doFilterInternal(RequestWrapperFilter.java:35)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at com.blossom.expand.tracker.core.adapter.spring.TrackerFilter.doFilter(TrackerFilter.java:52)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.lang.Thread.run(Thread.java:750)
    Caused by: java.lang.NumberFormatException: For input string: "undefined"
    	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    	at java.lang.Long.parseLong(Long.java:589)
    	at java.lang.Long.valueOf(Long.java:803)
    	at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:214)
    	at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115)
    	at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:429)
    	at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:402)
    	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:155)
    	at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73)
    	at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53)
    	at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:729)
    	at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125)
    	... 62 more
    
  2. sql 不规范,使用聚合函数查询时,select字段包括非聚合函数使用的
    1055-Expression#2of SELECT list is not in GROUP BY clause and contains non aggregated column'"blossom.blossom_to do.to do_name'which is not functionally dependent on colums in GROUP BY clause;this is incompatible with sql_mode=only_full_group_by
    
  3. sql 不规范,多表联合查询时,条件字段未指定表名
    Column'user_id' in where clause is ambiguous
    

[建议&讨论]关于任务和计划的功能一些不成熟的想法

目前TODO及PLAN功能是OK的,我觉得已经可以很好的管理每天的任务和计划,这里有一些不成熟的想法,可以讨论下。目前想到的有以下几点:
1、首先目前这样各自管理保留,并且作为默认的情况;然后新增plan计划新增可以选择关联对应的todo任务,或者todo任务新增的时候可以选择关联paln计划,这样可以实现计划和任务的关联性,计划作为目标,任务作为具体的过程;
2、任务和计划的新增界面,新增一个提醒时间,默认可以不选择,如果某个任务或者计划需要提醒的话可以维护提醒时间,调用系统的闹钟进行提醒或者弹框进行提醒;

[BUG]新增文档后所在目录异常

操作如下:我先在a目录下的b文章编写保存后,去a的同级目录c目录下去导入文章c(此时a目录已经被我收缩了),再点击刷新,又定位到了之前的b目录下了(a目录被自动展开),但是其实我现在的工作区应该在c文章;
如果我选择在c目录下创建文章而不是导入文章,创建后不需要点击刷新就跳回b文章了

希望效果:1. 新增文章后,工作区定为新增的文章位置 2. 刷新列表之后,所在的工作区不变

[建议]Home界面的一些建议

1、问候语目前是根据时间自动变化的,可以考虑支持可配置,然后可以设置自动变化,比如除了问候,还可以提示一些励志的名言;或者随机显示一些之前的文章;
2、Blossom Statistic区域,文章数和图片数2个按钮,可以支持点击直接跳转到EDITOR和PIC功能;
3、请求流量部分,支持自适应,目前不会自适应;
4、天气预报部分,建议由填写城市代码调整为选择城市,由程序自动去匹配代码给天气预报;
5、好像首页没有编辑热力图

[建议]颜色调整&代码行号展示

  1. 黑暗模式下,背景有点绿绿的,很多字体颜色还是灰色,很难看清,建议黑暗模式下优化字体/图标颜色进行优化
    image
  2. 希望可以展示代码块行号
  3. 主题颜色可以增加一些选择,比如比较大众的天蓝

图片资源配置

我的图片配置

  iaas:
    os-type: blossom
    blos:
      # 请以 /pic 结尾, 如果你在 nginx 中配置有代理, 注意别忘了添加你的代理路径
      domain: "https://blossom-esion.tocmcc.cn/bl/pic/"
      # 请以 / 开头, / 结尾, 简短的路径在文章中有更好的显示效果, 过长一定程度会使文章内容混乱
      default-path: "/home/esion/Appliaction/blossom/bl/img/"

之后上传完图片路径是

https://blossom-esion.tocmcc.cn/bl/pic/home/esion/Appliaction/blossom/bl/img/U1/avatar.png

是不是图片需要自己配置反向代理,代理这个目录啊

mvn build failed

mvn version:

Apache Maven 3.9.4
Maven home: /usr/share/maven
Java version: 11.0.20.1, vendor: Oracle Corporation, runtime: /usr/lib64/jvm/java-11-openjdk-11
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "6.5.4-1-default", arch: "amd64", family: "unix"

error message:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project common-base: Compilation failure
[ERROR] /home/freak/Projects/blossom/blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/json/JsonUtil.java:[108,19] 对Module的引用不明确[ERROR] com.fasterxml.jackson.databind 中的类 com.fasterxml.jackson.databind.Module 和 java.lang 中的类 java.lang.Module 都匹配[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :common-base

连接nas自带的MariaDB报错

群晖NAS,连接了自带的MariaDB 10,日志显示数据库连接成功。但是后续还是报错了。
手动插入了 INSERT INTO base_sys_param (id, param_name, param_value, param_desc, open_state, cre_time, upd_time) SELECT 1, 'WEB_ARTICLE_URL', 'https://www.domain.com/blossom/#/articles?articleId=', '博客端文章地址,用于PC端直接调往WEB端阅读文章', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP WHERE NOT EXISTS (SELECT 1 FROM base_sys_param WHERE id = 1)
但不管用。

以下是日志信息。

2023-12-27T03:29:35.040636866Z,stdout, ... 34 common frames omitted

[建议]便签内容选中功能支持

不足:目前便签的内容不支持选择,所以无法复制,个人喜欢将一些常用的指令放在便签内,需要的时候直接就复制了。

目标:希望便签支持用户选中

关于内容搜索功能

没找到站内搜索的功能,文章很多的情况下,想全局搜索关键字找到对应的文档。 (难道是我没有发现吗 手动狗头。。。)

[建议]PLAN功能建议

1、新增计划的界面,如果之前的计划设置了重复天数,即使新的计划没有勾选重复,依旧会生成重复的计划,就像下图一样
image

[建议&讨论] 关于便签的优化建议

在有笔记的软件里使用便签,更多情况是快速记录一些灵感一闪、临时任务,杂七杂八暂时无法归类或者稍后整理的东西。这种场景一般要求记录的快,离开的也会很快。
所以希望便签的记录能够更加快捷化,比如有全局的快捷键直接到达便签的编辑页面,或者有桌面小插件随手记录便签。
而现在记录便签需要:
1.打开软件
2.点击note
3.鼠标挪到编辑区,点击编辑
步骤还不不太方便,希望能优化一下

七牛云无法使用

配置

  iaas:
    os-type: qiniu
    kodo:
      access-key: *****************************************************
      secret-key: *****************************************************
      bucket-name: static-***-***
      domain: https://static.***.***
      default-path: /blog

得到了链接

https://static.***.***/blog/U1/Snipaste_2022-12-09_11-07-18.png

但是并未上传

上传时也报错了:

POST https://upload.qiniup.com/mk
blk/285575 {ResponseInfo:com.qini
u.http.Response@1a9e617a,status:4
00,reqId:Z9IAAABc3te98YgX,xlog:
X-Log,xvia:,adress:upload.qiniu
p.c0m/157.0.149.246:443,
duratio
n:0.229000 s,error:incorrect reg
ion,please use up-z2.qiniup.com,
bucket is:static-***-*** err
or:incorrect region,please use u
p-z2.qiniup.com,bucket is:stati
c-esion-xyz}

登录异常

Snipaste_2023-09-28_11-25-43
不仅报空指针
图像_2023-09-28_113051473
登陆成功后,数据获取不到

客户端异常

Snipaste_2023-09-28_11-28-35
客户端退出时,未退出全部进程,导致第二次无法打开,需要杀死这几个进程才能重新打开

修改密码,创建账户错误

nested exception is org.apache.ibatis.exceptions.PersistenceException:

Error updating database. Cause: java.lang.IndexOutOfBoundsException: No group 2

The error may exist in com/blossom/backend/base/user/UserMapper.java (best guess)

The error may involve com.blossom.backend.base.user.UserMapper.insert-Inline

The error occurred while setting parameters

SQL: INSERT INTO base_user ( id, type, username, password, salt, nick_name, real_name ) VALUES ( ?, ?, ?, ?, ?, ?, ? )

Cause: java.lang.IndexOutOfBoundsException: No group 2

OIDC认证方案

是否考虑提供使用OAuth2或OIDC

单点登录可以简化自托管服务的账号管理

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.