Code Monkey home page Code Monkey logo

mark-idea's Introduction

📕 MarkIdea

MarkIdea 是一款开源免费的私有云笔记软件,支持跨平台部署,支持Markdown格式笔记,采用Git进行笔记的版本管理,亦可推送至远程Git仓库备份。

MarkIdea本身是一个Java程序,所以它可以部署多种平台上,包括但不限于Linux、macOS和Windows等,只要你的设备能安装jre或jdk即可,不依赖外部数据库(使用了Sqlite作为嵌入式数据库,当然稍微改改也可以使用mysql等其他数据库,不过我的想法近可能少依赖其他组件)。MarkIdea是B/S架构(浏览器/服务器),打开浏览器,访问网址即可,无需下载客户端。

使用MarkIdea记录的笔记是易于迁移,因为使用的笔记格式是Markdown——开放且轻量级的标记语言,不必担心商业软件的各种私有笔记格式在导入导出过程中样式丢失。倘若不再想使用MarkIdea,仅需要拷贝对应的目录出来即可,文件名即笔记的题目,文件夹名即笔记本名称。

MarkIdea基于Git来管理笔记的历史版本,想必大家也比较熟悉这个版本管理工具,采用Git管理笔记版本也方便有一天不再使用MarkIdea时还可以借助其他Git工具查看或恢复笔记历史。同时MarkIdea也支持推送至远程Git仓库备份,提高笔记的安全性。

如有bug,欢迎反馈。如需尝试可访问demo网站,用户名和密码均为admin,仅供尝试,服务器带宽较小,访问较为缓慢。亦可在知乎私信反馈

📮 功能介绍

登录页面

image-20200901190240696

输入用户名和密码即可登录或注册(可以在网站管理页面选择打开或关闭注册功能)。

主页面

main

主页面可以进行创建笔记本、新建笔记、移动笔记、公开笔记、搜索笔记和查看笔记历史等操作,点击左上角logo可以关闭或打开笔记侧边栏,右上角菜单可以选择进入设置页面或者注销登录。

笔记支持自动保存。

使用vditor作为编辑器提供了强大而丰富的功能。

设置页面

20210203202714

目前设置功能,包括文件管理(查看、上传和删除)、修改密码和设置备份至远程仓库、公开笔记管理(查看和删除)和编辑器设置(自定义编辑器样式、是否代码高亮、字数统计等)。

网站管理

20210203202816

目前支持自定义网站名称、登录有效时长、最大上传文件大小和是否开启注册功能,后续会进一步开放更多选项。

🔩 服务器部署

运行环境仅需要安装jdk8,请根据自己系统安装对应jdk8并配置好环境,在此不再赘述。

下载软件后,在该目录下进入命令行,运行下面一行命令

# <version> 替换下载文件名的版本号
# <your_username>替换为你想要的用户名
# <your_password>替换你想要的密码
java -jar note-<version>.jar --username=<your_username> --password=<your_password> 

打开浏览器,访问http://<server_ip>:8090,即可开始使用,用户名和密码即<your_username><your_password>

🖥️ 参与开发

欢迎各位参与本项目的开发中来,联系我

前端

前端是基于Vue + ElementUI + axios开发,参与开发需要你拥有前端技术栈基础。

后端

后端是基于Spring Boot开发,参与开发需要你熟悉JavaSpring Boot

打包流程

假设你从一个空白操作系统开始

  1. 前端仓库拉取(或者直接下载)至本地;

  2. 在电脑上安装Nodejs

  3. 命令行进入前端项目,依次运行

    # 安装依赖
    npm install
    # 打包
    npm run build
  4. 进入dist目录下,压缩dist目录下(不要直接压缩dist目录)的文件为zip文件,重命名为front.zip

  5. 安装maven和java;

  6. 后端仓库(即本仓库)拉取至本地;

  7. 拷贝front.zip至resources文件下;

  8. 命令行进入后端项目目录下,运行命令

    mvn package -Dmaven.test.skip=true

最后在target目录下,我们就可以拿到打包好的MarkIdea运行文件,note-<version>.jar

⏰ 注意事项

  1. 因为MarkDown编辑器采用的是vditor,实现了CommonMark规范,故无意义的空白换行均会被自动吞掉,如果你一定需要换行,请使用工具栏的强制换行按钮。

  2. 出于实现复杂度的考虑,笔记一旦被重命名或移动至其他笔记本,那么你无法再看见该笔记之前的本历史版本,但你仍然可以通过其他git工具查看到历史。

  3. 同理,被清理的笔记仍然可以通过其他git工具查看到,尽管MarkIdea上看不到了。

  4. 笔记名和笔记本名需要符合文件系统的要求。

🍉 更新记录

2021.08.03 增加公开笔记侧栏(点击左上角)

2021.04.09 修复登录时间设置bug、状态显示优化

2021.01.09 大纲固定等

2020.12.31 重命名笔记本、UI优化、自动保存笔记(10秒)

2020.12.27 工具栏固定,修复bug

2020.12.20 支持公开笔记,修复若干bug,升级编辑器

2020.10.10 支持搜索功能

2021.2.1 V0.4.4 UI优化、支持编辑器自定义设置和网站自定义设置

2021.12.26 支持笔记历史版本预览

🤖 计划

  1. 用户手册

mark-idea's People

Contributors

hansanshi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

mark-idea's Issues

字数统计功能

编辑器本身支持字数统计,但是markidea现在还没有,希望能加上。
另外,我在vscode里面使用v编辑器插件的时候,看到的字数统计好像只是全文所有字数,没有”选中内容“的字数统计。
有个需求,就是除了全文字数统计之外,希望能更详细一点,以下两种方式都可以
1、选中内容字数统计(这个在md编辑器中比较常见了)
2、大纲条目后面的字数统计(这个在任何通用编辑器中从未见过,但在小说写作软件中都有,我就是写小说,所以希望如果不难实现最好能实现这种字数统计方式)

如何迁移服务后数据能正常保存

作者您好:
感谢您开发的这个笔记系统,目前遇到了一个问题,我这边会在很多服务器进行部署该笔记,但是看源代码发现对应的文件都是存在classess文件夹下,如何实现 我迁移后也能正常看到对应的笔记本和内容呢?

手机浏览器如何实现Ctrl+z后退功能?

刚才编辑一个文件,不知道哪儿按错了把内容给全删除了,本来在电脑上Ctrl+z就能回退找回内容的,偏偏手机上无法实现,希望能增加这个功能。

新版本不读取本地文件,能不能考虑一下

我使用的方式不一样,因为手机上浏览器上优化不好,所以我在手机上用的其他客户端修改文件,但是0.4.4版本后发现不会像以前一样在打开时读取手机上修改过的文件了,开始不知道这个问题,弄丢了好多字。
我是用docker假设了同步程序和markidea,映射文件夹在同一个文件,在电脑上就用浏览器打开markidea,修改后会同步到手机,手机用其他客户端修改,然后同步到vps。
0.4.4的版本打开markidea,文件是最新的(会提示有内容没有保存),但是最新版打开markidea,文件是上一次在markidea中保存的版本(也会提示有内容没有保存),所以如果保存的话,那文件就还是上次的版本,手机上的修改就没了。
就是没法读取手机同步过来的最新版。
不知道能不能兼顾一下我这种使用方式。

另外有个建议,现在手机上都没有好用的markdown客户端,能不能开发一个简易的配套客户端,通过api连接markidea,利用客户端原生功能改变手机上使用浏览器中一些不好用的问题。

笔记本中的笔记排序逻辑问题

同一个笔记本下的笔记排序好像没有顺序规律,
既不是最近更新,也不是按照拼音首字母,建议这里可以有个排序逻辑
image

中文乱码

笔记里如果写有中文,刷新页面后会变成乱码。

Java环境:
openjdk version "16.0.2" 2021-07-20
OpenJDK Runtime Environment (build 16.0.2+7)
OpenJDK 64-Bit Server VM (build 16.0.2+7, mixed mode)

系统是Archlinux,内核是5.14.6-arch1-1

几个建议

1、自动保存:想要定时或连续保存,保证出现任何问题不丢文档,不知道能不能实现,毕竟是web不是客户端。(这个编辑器一保存就丢失焦点,如果做自动保存也得考虑这个问题。(这个是不是需要去编辑器提建议?)
2、编辑器工具栏已经固定位置了,大纲能不能固定位置?写长文比较需要这个,因为要回看某一个部分。
3、一个非常不重要的功能:全局自定义css样式,不知道有没有兴趣加上。

保存后,光标停留在编辑状态的位置

当前表现:正文编辑保存后,光标会跳到页面头部的位置
期望:保存后,光标保持在编辑状态时的位置,不要回到页面的顶部重新开始。
方便编辑时候随时ctrl+S,然后接着写。

自己编译遇到问题

自己编译运行遇到错误,请帮忙看下 非常谢谢!!!

jar 11.0.20.1

jar执行错误如下:

2023-11-28 10:49:31.787 INFO 2108475 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2023-11-28 10:49:31.787 INFO 2108475 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2023-11-28 10:49:31.790 INFO 2108475 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
2023-11-28 10:49:31.791 INFO 2108475 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2023-11-28 10:49:31.802 INFO 2108475 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-11-28 10:49:31.915 ERROR 2108475 --- [ main] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'noteServiceImpl': Unsatisfied dependency expressed through field 'userNoteCache'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.github.benmanes.caffeine.cache.LoadingCache<ink.markidea.note.entity.dto.UserNoteKey, java.lang.String>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value="")}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:893) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at ink.markidea.note.NoteApplication.main(NoteApplication.java:13) ~[classes!/:0.4.7]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[note-0.4.7.jar:0.4.7]
at org.springframework.boot.loader.Launcher.launch(Launcher.java:109) ~[note-0.4.7.jar:0.4.7]
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[note-0.4.7.jar:0.4.7]
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[note-0.4.7.jar:0.4.7]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.github.benmanes.caffeine.cache.LoadingCache<ink.markidea.note.entity.dto.UserNoteKey, java.lang.String>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value="")}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1714) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1270) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1224) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
... 28 common frames omitted

增加一个回到顶部按钮吧

长文回到顶部比较麻烦,希望增加一个按钮,当时最好不要用悬浮按钮,容易挡到输入框的内容(还要考虑移动浏览器状态)
放在输入框下面,用一个全宽度的按钮比较好。
Screenshot 2021-01-04 13.01.10.png

新版本好用,撒花

对于写长文来说,至少在电脑上进入可用的程度了。
提一下另外几个问题,不过我也没想到好的解决办法,先提一下看看。
1、手机浏览器,打不开大纲,所以使用不方便的问题还存在,倒是有可参考的实现方式,但是因为用的是vditor,这个功能不知道是不是能够实现:在顶部左上角或右上角固定一个浮动按钮,点击打开大纲,就像github的页面设计一样,你用手机浏览器打开github就能看到,左上角有一个三条横杠按钮。
2、批量替换功能有需要,可能需要vditor编辑器增加吧。
3、0.4.3版本的大纲样式有点问题,往下滚动页面,大纲固定之后最上面一条看不到。

希望可以公开笔记本

希望可以公开笔记本(用目录的形式展示),如果支持子笔记本后希望可以公开子笔记本

公开笔记页面无法通过跳转访问

之前提过这个问题。
比如我有一篇公开笔记,我使用301跳转或者反代等方式,将主域名跳转过来当做主页,但设置好后访问主域名却会进入登录界面。
一开始我以为是我设置问题,但实际上同样的方法跳转任何其他网页都没问题,所以我想到一个可能。
markidea的设定中可能有什么检查,在直接访问公开页面的时候不会触发,跳转过来则会触发,导致无法通过跳转方式访问公开笔记页面。
例如 191954.xyz 这个域名我已经设置好跳转一篇公开笔记了,但只会访问登录界面。
而 mail.191954.xyz 这个域名就可以正常跳转到阿里云邮箱。

rk3588 arm ubuntu直接跑出错了,arm环境有成功例子吗?

18:53:15.056 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.IllegalStateException: create a directory failed
at ink.markidea.note.context.config.ContextPropertyLoader.checkAndCreateDirIfNecessary(ContextPropertyLoader.java:130)
at ink.markidea.note.context.config.ContextPropertyLoader.addPathAndInitDir(ContextPropertyLoader.java:51)
at ink.markidea.note.context.config.ContextPropertyLoader.postProcessEnvironment(ContextPropertyLoader.java:36)
at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:200)
at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:188)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:80)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at ink.markidea.note.NoteApplication.main(NoteApplication.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:109)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)

设置界面增加版本号显示吧

0.4.2版本我更新了几次docker版,都没发现有什么变化,又看不到版本号,都不知道是什么情况,希望下一个版本显示下版本号。

默认打开大纲

希望能有默认打开大纲的设定,无论是用在设置中设定的方式或者记忆上次开关的方式都好。

建议增加webdav功能。

只有git这一种备份还是有些单薄了吧,希望能增加webdav功能,而且希望不只是用来做备份,而是可以直接把webdav空间当成根目录。
例如webdav中的文件夹就是笔记本,单个文件就是笔记。
这本身就是mi保存文件的结构,实现起来没有根本性的困难。
希望能采纳。

公开笔记访问原始网址可以,做跳转就不行,会进入登录界面。

https://note.191954.xyz/#/article/191954/2
这个公开笔记网址可以正常访问,但如果把191954.xyz做跳转到这里就不行。
跳转功能和方法应该是没有问题的,因为另一个跳转网址是正常的。
还是0.4版,docker镜像作者不更新(~ _ ~)
另外,忘记是哪个开源项目了,作者好像是找到了一个办法,把网址中的#号去掉了,你要不要研究下?当然,两个项目可能编程语言都不一样,不一定都能实现,这个不重要,顺口一提而已。

登录状态记不住?

还是和以前一样。
不过不知道是不是我的使用方法不一样造成的。
你可以去看看我那个docker实现方式的代码,是不是那个原因?
但是我又觉得不太可能,毕竟登录状态的记忆应该不会受到影响啊。
本地浏览器应该是没有问题的。

提一些功能需求

刚才无聊看了很多私有云笔记项目,发现了一些别的项目已经存在的我没有想到但有需求的功能。
1,多文档同时打开,标签化显示。
用过vscode之类代码编辑器的应该能秒懂这个功能。
2,双文档同时显示。
有时候需要同时看两个文档或进行对比,需求1虽然可以方便的切换文档查看,但是能够同时把两个文档并排显示就更方便了,这个做不了移动端,只要PC端就好了,做完需求1,这个顺便就能做了。
3,md切换思维导图。
这个非常有用,md文件格式和思维导图简直是天作之合,有现成的开源项目,不知道能不能集成。
https://github.com/gera2ld/markmap
4,后台设定网页标题和logo。
简单的非功能性建议,既然项目是给很多人用的用,这两自定义功能肯定要有,但优先级可以放到最后。
5,登录状态时长增加。
需要频繁登录有点麻烦,能不能像大部分网站那样,登录状态可以管很久。

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.