api-project常用公共业务开发API文档
个人日常api-project使用样例
- api引入
- 接口签名
- 缓存工厂和它的老朋友自动更新
- LaTex数学公式
- UML序列图和流程图
- 离线写博客
- 导入导出Markdown文件
- 丰富的快捷键
api引入(Meavn)
meavn仓库地址
<repositories>
<repository>
<id>api-project-mvn-rep</id>
<url>https://raw.github.com/ccycc88/mvn-repo/master/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
meavn依赖
<dependency>
<groupId>com.api</groupId>
<artifactId>api-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
接口签名
接口签名主要用于服务对外提供接口的一种安全认证。服务端为需要接口访问应用提供唯一的appId与appId对应的keyt。
应用请求服务端接口需要依据约定算法协议生成对应的签名串。服务端接收到请求参数,依据appId及对应的keyt和参与签名的参数进行认定。
签名算法
- 签名参数去除空值参数
- 依据参数名递减排序
- 将参数_name参数_val&参数_name参数_val进行连接
- 连接的字符串&keyt
- 最终字符串通过MD5生成最终签名值
创建签名串
Map<String, String> m = Maps.newHashMap();
m.put("34567", "345");
m.put("fh", "2345");
m.put("kl", "457");
String keyt = "keyt23";
String sign = ApiSignUtil.buildSign(m, keyt);
-
生成签名串
- appId与keyt为一一对应,其他参数是一些任意参数,根据业务需求。
验证签名串
Map<String, String> m = Maps.newHashMap();
m.put("34567", "345");
m.put("fh", "2345");
m.put("kl", "457");
m.put("sign", "3529D3639A445BBC9A7EFCC30543F5F5");
String keyt = "keyt23";
boolean succ = ApiSignUtil.validateSign(m,keyt);
-
生成签名串
- 通过appId获取keyt,依据请求参数和keyt进行验证请求是否合法。
缓存工厂和它的老朋友自动更新
为了应用执行效率,及缓存不可缺少的业务场景。缓存工厂通用管理缓存工具,使代码整洁易懂。在缓存的实现中你可以使用redis,memorycache或集合等待。
当然缺少不了他的老朋友自动更新。
缓存实现
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import com.google.common.collect.Maps;
public class RuleCache extends Cache{
private static final String CACHE_PREFIX = "rule";
//保存的缓存
private Map<String, Map<String, String[]>> rcache = Maps.newHashMap();
private ReentrantLock lock = new ReentrantLock();
//初始化缓存
@Override
public void init() {
// TODO Auto-generated method stub
rcache.put("",null);
}
//用于周期性刷新缓存
@Override
public void refresh() {
// TODO Auto-generated method stub
lock.lock();
try {
rcache.clear();
rcache.put("ddd", null)
} finally {
// TODO: handle finally clause
lock.unlock();
}
}
//重写该方法用于判断是否存在
@Override
public boolean exist(String... key) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean exist(String hkey, String... key) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean exist(String[] hkeys, String... key) throws Exception {
// TODO Auto-generated method stub
return false;
}
//重写该方法用于判断是否存在某值
@Override
public boolean existObject(String obj, String... key) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean existObject(String[] objs, String... key) throws Exception {
// TODO Auto-generated method stub
return false;
}
//查询某key对应的值
@Override
public <T> T get(Class<T> clz, String... key) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> T get(Class<T> clz, String hkey, String... key) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> T get(Class<T> clz, int index, String... key) throws Exception {
// TODO Auto-generated method stub
return null;
}
//删除key对应的缓存
@Override
public void delete(String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void delete(String hkey, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void delete(String[] hkeys, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void deleteObject(String obj, String... key) throws Exception {
// TODO Auto-generated method stub
}
//删除缓存中的某数据
@Override
public void deleteObject(String[] objs, String... key) throws Exception {
// TODO Auto-generated method stub
}
//向缓存中插入数据
@Override
public void put(String value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(TimeUnit unit, long expire_in, String value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(Map<String, String> value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(String hkey, String value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(TimeUnit unit, long expire_in, String hkey, String value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(TimeUnit unit, long expire_in, Map<String, String> value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(List<String> value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(TimeUnit unit, long expire_in, List<String> value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(Set<String> value, String... key) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void put(TimeUnit unit, long expire_in, Set<String> value, String... key) throws Exception {
// TODO Auto-generated method stub
}
//通过正则匹配对应key
@Override
public String[] keys(String pattern) throws Exception {
// TODO Auto-generated method stub
return null;
}
public String buildkey(String... key) {
return CACHE_PREFIX.concat(":").concat(key[0]);
}
}
缓存获取
Cache cache = CacheFactory.getInstance(RuleCache.class).getCache();
-
获取缓存
- 获取cache实例,便可以对缓存进行增删改查等,屏蔽缓存内部操作是什么redis或集合等
缓存自动刷新
//为缓存设置自动刷新周期(单位秒)
CacheFactory.getInstance(RuleCache.class).setDelay(20l);
//开启缓存自动刷新
AutoUpdater.getInstance().automaticUpdate();
-
自动刷新
- 缓存设置他要刷新的周期(单位秒),AutoUpdater到点会调用缓存的refresh()方法对缓存进行更新。AutoUpdater是在应用启动时对应用所有设定周期的缓存都进行任务化。因为automaticUpdate()方法只能被调用一次,如果要动态增加或删除缓存任务使用AutoUpdater中的addUpdateTask(CacheFactory factory),deleteTask(Class<?> clz),这样的业务场景比较少吧!
快捷键
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y
Markdown及扩展
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]
使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。
本编辑器支持 Markdown Extra , 扩展了很多好用的功能。具体请参考Github.
表格
Markdown Extra 表格语法:
项目 | 价格 |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
可以使用冒号来定义对齐方式:
项目 | 价格 | 数量 |
---|---|---|
Computer | 1600 元 | 5 |
Phone | 12 元 | 12 |
Pipe | 1 元 | 234 |
###定义列表
Markdown Extra 定义列表语法:
项目1
项目2
: 定义 A
: 定义 B
-
项目3
-
定义 C
-
定义 D
定义D内容
代码块
代码块语法遵循标准markdown代码,例如:
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
###脚注
生成一个脚注1.
目录
用 [TOC]
来生成目录:
文章目录
数学公式
使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.
- 行内公式,数学公式为: Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N。
- 块级公式:
x = − b ± b 2 − 4 a c 2 a x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} x=2a−b±b2−4ac
更多LaTex语法请参考 这儿.
UML 图:
可以渲染序列图:
或者流程图:
离线写博客
即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.youkuaiyun.com/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。
用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。
博客发表后,本地缓存将被删除。
用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。
**注意:**虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱。
##浏览器兼容
- 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
- IE9以下不支持
- IE9,10,11存在以下问题
- 不支持离线功能
- IE9不支持文件导入导出
- IE10不支持拖拽文件导入
这里是 脚注 的 内容. ↩︎