book article 文章
book article 文章
book article sum
mynote核心。
目前支持两种格式:
1 文件格式二:zrtf html;客户端 格式
2 文件格式一:markdown 格式,此格式支持在页面上编辑。
lv1=mynote lv2= type=todo
book页面需要展示的元素:
1 作者、头像
2 创建时间、更新时间
3 上一篇、下一篇(同时显示标题)
现在是每次读取所有的文章,动态计算next、previous
文章表
lv1=mynote lv2= type=todo
article 表新增title字段,E:\uninote\mynote\basic\models\api\Userinfo.php all_recommend 等地方不再返回 article_id
article_id 规范为path
item规范为aid
文章操作
应用内操作
指使用包括网站、app、小程序等一切mynote提供的应用进行的操作。
目前,在页面上仅支持markdown格式的操作,其他格式的文件,请在外部操作:
支持的操作:新建、save、rename、mv、del、新建文件夹等;
所有的操作都放在锁中_git_op_lock
lv1=mynote lv2= type=todo
冲突的报错不明确,以及所有的errno
lv1=mynote lv2= type=todo
前端翻译错误代码
编辑
lv1=mynote lv2= type=todo
异步保存,不要卡死
避免多个请求乱序返回:返回值还需要带上old version,和当前version比较,相同才更新,不同不更新。??
一个version还需要带上minor version,从1开始计数。以version#min_version表示。
比如第一次保存时,传参为123a#1,第二次则为123a#2,一次类推。当server保存了#2时,则不应该保存之前的版本。
保存成功返回给前端,更新version。minor version重置。
每次加载编辑页面时,后台分配一个唯一id,在save时保存此id对应的version#min_version。如果version匹配,则校验min。每十分钟清理一次,超过10分钟的。
or 用redis ttl来解决
lv1=mynote lv2= type=todo
当前文章没有修改时,disable保存按钮
如何判断没有修改?记录下原始的内容?
enable条件:有修改&上次保存已经完成
所有内容原样保存,eg:
%<>.,+=_-/*\[]{}~!@#$%^&()
保存时检测到服务器端有更新,提示:是否合并并刷新?注意刷新后之前的修改无法撤销(ctrl+z失效)
自动保存
自动保存冲突时:警告冲突
通过客户端拉取并解决冲突。
手动保存
自动保存、手动保存差异?
手动tag
手动指定tag,用户可以只查看tag,非tag可能会被清理以节省空间
历史版本查看
lv1= lv2= type=todo
操作菜单
hover时显示toolbar
lv1= lv2= type=todo
复制链接、新窗口中打开链接
这个非当前用户都可以看到
应用外操作
指任何mynote以外第三方提供的操作方式。完成后再通过git上传到服务器。见git文章管理 。
lv1=mynote lv2= type=
git文章管理
无论用户是在内、外部操作,最终都是通过git来存储的。如果存在并发修改,也是通过git来自动合并的。
如需应用外管理,参见git remote url & git ssh key 。
lv1= lv2= type=
文章信息索引
除了在git中存储了文章的完整信息,还在数据库中维护了一张文章的索引表(article),包含以下信息:
lv1=mynote lv2= type=todo
获取文章内容时,需要传入version,与当前version不一致时,需要动态的从git中获取。git show
更新
lv1=mynote lv2= type=todo
1 用户在应用内操作时,同时更新索引
2 workman 定时器 timer
lv1=mynote lv2= type=todo
git server 交互放timer中?
lv1=mynote lv2= type=todo
数据库和文件系统一致性检查
不一致怎么处理?
lv1= lv2= type=
workman 定时器 timer;应用外更新同步
old way, crontab :
cd /home/www/mynote/basic/web/docs && ./test.sh >> /tmp/cron_test.txt 2>&1
new way:
workman for windows
全部重新索引(无任何git操作):E:\uninote\mynote\basic\web\docs\init.sh
lv1=mynote lv2= type=todo
init.sh:先删除,再插入,这种方式会导致文章id全部改变,并且个人动态全部更新。
lv1=mynote lv2= type=todo
标记用户有合并失败,提示用户处理
lv1=mynote lv2= type=todo
workman 优化:
8080端口,不要workman来监听
去掉不需要的周转,比如用户保存文件,直接更新相关信息,不要再走老流程
update.sh(核心为update.php)
- ikb:\Application\Shell::index
- 对于新注册的用户,初始化用户git仓库
- 从git server上拉取用户新的更新,如果有,合并、推送之,并更新索引(文章信息索引 )。
如果合并失败,则将master分支推送到git server的online_master。
注意,需要www用户执行./update.sh(Linux 下以其他用户身份运行程序-- su、sudo、runuser )
另外,大部分操作都是在锁中进行的,见加锁
test case:
init clone & update
lv1=mynote lv2= type=todo
优化:用户表新增字段记录上次同步的version v1。
update时使用当前version v2,计算v2、v1 diff;如果成功,更新v1;
使用事务
lv1= lv2= type=
article logs
\Application\Shell
self::_log($info, "./logs/update_docs.log");
update.php ct_log: /root/mynote/basic/web/docs/logs/logs.txt
lv1= lv2= type=
文件格式一:markdown
toc、标题集成
lv1=mynote lv2= type=todo
没有变化要尝试合并
lv1=mynote lv2= type=todo
安全:
禁止rename 可以任意移动文件
禁用docs下的php文件执行
给docs目录增加白名单,只有白名单中的文件类型允许访问
彻底禁用用户脚本?
lv1=mynote lv2= type=todo
_get_aid 直接拿到aid,需要workman重构
lv1=mynote lv2= type=todo
del:
E:\uninote\mynote\basic\web\link\take\lib\graphics
Md.php 提取到class level var:
{$_SESSION['user_info']['username']}
lv1=mynote lv2= type=todo
markdown也需要唯一id(分析得出,但可能丢失)
lv1= lv2= type=
加锁
所有操作都需要加锁
lv1=mynote lv2= type=todo
所有操作都需要带version,并在服务器上进行合并
编辑-rename测试
通过php file 加锁、加锁
fopen($path, "x");
fopen 什么时候异常?在linux服务器上,如果文件存在抛出异常,但其他平台,直接输出警告。
function create_file_lock($path, &$output = null)
function release_file_lock($f, $path)
编辑
关闭时需要确认保存
lv1=mynote lv2= type=todo
全屏加快捷键
lv1=mynote lv2= type=todo
添加保存并退出功能(发布),跳转到当前编辑页面,进行查看
图片上传
选择图片
剪贴板:ctrl c(从浏览器、微信、word等)、截图、本地文件(暂不支持)
lv1= lv2= type=
文件格式二:zrtf html;客户端
lv1= lv2= type=todo
fh client文章间跳转问题
windows server,fh html生成
SHA-1: 1c8a63e21a32abb41dede9911f347f8ed1a98e85
* mynote client <a>标签处理:查询href引用路径,如果在数据库中,则转为id形式
lv1= lv2= type=
文章查看 & 目录结构
SHA-1: dcb27f36d27dd01162395fa59ebb8f4d026c3354
* 使用phpQuery对资源进行处理:img、css转为的绝对路径;移除script
使用phpQuery处理为绝对路径
util.js中动态加载pi.js等,这个现在无法处理,因此彻底禁用(移除)了js,只保留了大纲的json数据。
tree.js
/**
* 导航信息的全局变量
*/
var main_src;
var iframe_src;
var cur_aid = null; // 当前浏览的article id
var outline_num; // 当前浏览的大纲
lv1= lv2= type=
中文路径
使用git在服务器上会自动转为utf8编码,直接使用工具上传,会保持原始的编码。
apache url编码 似乎windows下没有解决方案
用户文章浏览
lv1= lv2= type=
使用iframe的原因
必须用iframe,不然相对路径无法控制
无法回退
css相互影响(content影响framework)
无法open in new tab
用户选择某一篇文章时,主frame的url也跟着改变,这样刷新时能知道上次浏览的iframe地址。iframe也跟着load
刷新后,目录结构、文章标题都会定位到上次浏览位置;同时图标也会变化
lv1= lv2= type=todo
链接跳转
文章链接:如果是链接当本作者,则页面跳转;如果是其他作者或者站外链接,则新窗口打开。
两种链接,以不同颜色显示(区分样式)。
上一篇 下一篇
同上,也要本页面打开
上一篇、下一篇的链接形式,要从
lv1= lv2= type=todo
浏览方式
排序,默认tree,还可以时间排序。。
lv1= lv2= type=todo
点击标题自动切换url 修改url
这样方便复制给别人。
https://demo.fastadmin.net/docs/command#%E4%B8%80%E9%94%AE%E7%94%9F%E6%88%90%E8%8F%9C%E5%8D%95-2
利用JS实现前端路由
http://doc.scrapy.org/en/latest/intro/overview.html#what-s-next
链接图标放前面
https://github.com/coolwanglu/pdf2htmlEX
大纲自动折叠、定位,并且带高亮
参考掘金
lv1= lv2= type=
查看选定文章
1、要保证在加载的过程中,可读。随着文章加载的内容增加,要调整文章高度。
2、加载完成后需要滚动到顶部。TODO:这里是onload滚动还是documentReady时滚动??目前,还没法保证绝对滚动到top,cyb/help这篇文章就不行
如果带小标题锚点,则不要滚动
这里面涉及到太多异步的问题(加断点调试和正常运行看到的结果不一样)
lv1= lv2= type=todo
鼠标hover图片上时改为放大镜,并显示图片边框。
路径排序
同windows排序结果
lv1= lv2= type=todo
文章可见性
public、private、private-local(不上传到server)
分组:支持不同的组,有不同的可见性
评论
点击头像到作者首页
es 搜索
mynote es