-
[置顶]软件接口设计怎么做?前后端分离软件接口设计思路
本文关于软件接口设计怎么做?前后端分离软件接口设计思路。好的系统架构离不开好的接口设计,因此,真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。为什么在接口制定标准中说:一流的企业做标准,二流的企业...
-
[置顶]接口管理如何做?接口实现版本管理的意义和最佳方法
本文关于接口管理如何做?接口实现版本管理的意义和最佳方法。API版本管理的重要性不言而喻,对于API的设计者和使用者而言,版本管理都有着非常重要的意义。下面会从WEB API 版本管理的角度提供几种常...
-
[置顶]实现API管理系统的关键
下面将通过几个关键词的形式说明API管理的重要性和未来的实现方式。1.生命周期管理在整个API生命周期中更深入地集成所有工具将进一步提高生命周期循环的速度,而且更重要的是提供满足消费者需求的API。这...
-
{{list.f_name}}
{{list.f_name}}
删除
export default {
},
data(){
return {
mess:init_data,
cart_mess:[]
}
},
methods:{
},
init:function(){
let self = this;
//初始化购物车
this.$http.post('/search_cart',{user_id:2333}).then(response => {
if(response.data.errcode===0){
let data = response.data;
self.cart_mess = data.data;
}
}, response => {
// error callback
});
}
}
my_server.js
//初始化查询商品列表
app.get('/',function(req,res){
var selectSQL = 'select * from t_list limit 4';
conn.query(selectSQL, function (err2, rows) {
if (err2) console.log(err2);
var seach_result = JSON.stringify(rows);
res.render('index',{//pug(jade)是express默认模板
init_data:seach_result,
});
});
});
初始化查询购物车列表
这里逻辑是根据用户id查出商品id,再根据商品id查出商品信息添加到页面上
用promise写异步逻辑
app.post('/search_cart', function (req, res) {
return new Promise(function(resolve){
let return_data = {
req :req
};
resolve(return_data);
})
.then(function(return_data){
let user_id=return_data.req.body.user_id;
let query = 'SELECT * FROM t_item_user WHERE f_uid = ?';
let query_param = user_id;
return new Promise(function(resolve){
conn.query(query,query_param, function (err2, rows) {
resolve(rows);
});
});
}).then(function(rows){
if(rows.length>0){
let query_item = 'SELECT * FROM t_list WHERE f_id in (?)';
let whereIn = [];
for(let i=0,len=rows.length;i
whereIn.push(rows[i].f_item_id);
}
conn.query(query_item,[whereIn], function (err2, rowss) {//异步分两次查。。。。
if (err2){
console.log(err2);
}
let $return={
errcode:0,
errmsg:'',
data:rowss,
};
res.end(JSON.stringify($return));//返回
});
}else if(rows.length==0){
let $return={
errcode:0,
errmsg:'',
data:''
};
res.end(JSON.stringify($return));//返回
}
});
});
3.加入购物车
list.vue页面的请求
add_to_cart:function (e) {
let item_id = parseInt(e.currentTarget.getAttribute('data-id'));//vue获取当前dom对象
let data = {id:2333,item_id:item_id};
$.ajax({
type: "post",
url: "/add_to_cart",
dataType: "json" alt="用vue和node写的简易购物车实现" title="用vue和node写的简易购物车实现" width="200" height="150">
-
气温变化对比图
2、获取模板内容并填充数据
/**
* @description 获取模板
*/
public static String getContent(String fileName,Object data){
String templatePath=getPDFTemplatePath(fileName);//根据PDF名称查找对应的模板名称
String templateFileName=getTemplateName(templatePath);
String templateFilePath=getTemplatePath(templatePath);
if(StringUtils.isEmpty(templatePath)){
throw new FreeMarkerException("templatePath can not be empty!");
}
try{
Configuration config = new Configuration(Configuration.VERSION_2_3_25);//FreeMarker配置
config.setDefaultEncoding("UTF-8");
config.setDirectoryForTemplateLoading(new File(templateFilePath));//注意这里是模板所在文件夹,不是文件
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
config.setLogTemplateExceptions(false);
Template template = config.getTemplate(templateFileName);//根据模板名称 获取对应模板
StringWriter writer = new StringWriter();
template.process(data, writer);//模板和数据的匹配
writer.flush();
String html = writer.toString();
return html;
}catch (Exception ex){
throw new FreeMarkerException("FreeMarkerUtil process fail",ex);
}
}
3、导出模板到PDF文件
/**
* @description 导出pdf到文件
* @param fileName 输出PDF文件名
* @param data 模板所需要的数据
*
*/
public String exportToFile(String fileName,Object data){
String htmlData= FreeMarkerUtil.getContent(fileName, data);//获取FreeMarker的模板数据
if(StringUtils.isEmpty(saveFilePath)){
saveFilePath=getDefaultSavePath(fileName);//设置PDF文件输出路径
}
File file=new File(saveFilePath);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
FileOutputStream outputStream=null;
try{
//设置输出路径
outputStream=new FileOutputStream(saveFilePath);
//设置文档大小
Document document = new Document(PageSize.A4);//IText新建PDF文档
PdfWriter writer = PdfWriter.getInstance(document, outputStream);//设置文档和输出流的关系
//设置页眉页脚
PDFBuilder builder = new PDFBuilder(headerFooterBuilder,data);
builder.setPresentFontSize(10);
writer.setPageEvent(builder);
//输出为PDF文件
convertToPDF(writer,document,htmlData);
}catch(Exception ex){
throw new PDFException("PDF export to File fail",ex);
}finally{
IOUtils.closeQuietly(outputStream);
}
return saveFilePath;
}
4、测试工具类
public String createPDF(Object data, String fileName){
//pdf保存路径
try {
//设置自定义PDF页眉页脚工具类
PDFHeaderFooter headerFooter=new PDFHeaderFooter();
PDFKit kit=new PDFKit();
kit.setHeaderFooterBuilder(headerFooter);
//设置输出路径
kit.setSaveFilePath("/Users/fgm/Desktop/pdf/hello.pdf”);//设置出书路径
String saveFilePath=kit.exportToFile(fileName,data);
return saveFilePath;
} catch (Exception e) {
log.error("PDF生成失败{}", ExceptionUtils.getFullStackTrace(e));
return null;
}
}
public static void main(String[] args) {
ReportKit360 kit=new ReportKit360();
TemplateBO templateBO=new TemplateBO();//配置模板数据
templateBO.setTemplateName("Hello iText! Hello freemarker! Hello jFreeChart!");
templateBO.setFreeMarkerUrl("http://zheng-hang.com/chm/freemarker2_3_24/ref_directive_if.html");
templateBO.setITEXTUrl("http://developers.itextpdf.com/examples-itext5");
templateBO.setJFreeChartUrl("http://yiibai.com/jfreechart/jfreechart_referenced_apis.html");
templateBO.setImageUrl("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png" alt="java根据模板动态生成PDF实例" title="java根据模板动态生成PDF实例" width="200" height="150">
-
var vm = new MVVM({
el: '#mvvm-app" alt="Vue原理剖析 实现双向绑定MVVM" title="Vue原理剖析 实现双向绑定MVVM" width="200" height="150">
-
th:inline
定义js脚本可以使用变量
th:action
表单提交的地址