Uninote
Uninote
用户根目录
每日点滴
 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 

mynote_mod

mynote_release

点赞(0) 阅读(316) 举报
目录
标题