ocument.write 是直接写入到页面的内容流,如果在写之前没有调用 document.open, 浏览器会自动调用 open。每次写完关闭之后重新调用该函数,会导致页面被重写。
innerHTML 则是 DOM 页面元素的一个属性,代表该元素的 html 内容。你可以精确到某一个具体的元素来进行更改。如果想修改 document 的内容,则需要修改。
document.documentElement.innerElement
innerHTML 将内容写入某个 DOM 节点,不会导致页面全部重绘。
innerHTML 很多情况下都优于 document.write,其原因在于其允许更精确的控制要刷新页面的那一个部分。
根据百度百科的记录,
在互联网时代,把网站的服务封装成一系列计算机易识别的数据接口开放出去,供第三方开发者使用,这种行为就叫做Open API,提供开放API的平台本身就被称为开放平台。
百度百科
我们也可以通过一些案例来快速认识开放平台,例如支付宝的开放平台:
又如抖音开放平台:
以及微信开放平台:
总结下来,开放平台一般有以下特点:
1、二级域名通常使用open,例如:open.xxx.com
2、使用人群和用户对象主要是开发者,因此需要开发者申请入驻
3、开放平台核心提供的是OpenAPI,不同开发者或不同应用,拥有不同的接口调用权限
4、开放平台还需要为开发者用户提供配套完成的产品功能体系,以便让开发者可以在平台上查看和管理账号、核心业务数据,甚至订单信息
5、需要提供在线的接口文档,即便是游客也能访问查看
6、一个账号可以创建或申请多个应用
7、平台侧,需要有一个内部管理后台,对开发者账号、应用、API接口权限、流量统计等进行通用的管理
下面,以 接口大师,也就是PhalApi开源框架的专业版,介绍和分享如何在1在时间内,搭建自己的OpenAPI和开放平台。
接口大师,主要是基于主流的PHP开发语言+MySQL数据库开发的,所以技术很通用。
运行环境要求如下:
官方推荐使用:CentOS 7 + PHP 7 + MySQL 5.6 + Nginx
正式的服务器环境,建议使用更高配置的服务器。
第1步、在获取到接口大师的源代码后,将项目源代码包上传到服务器,并进行解压。假设解压目录为:/www/phalapi-pro。
源代码压缩包解压后有:
第2步、进行Web服务器的配置。
如果使用的是Nginx,参考以下Nginx配置,配置好重启Nginx。
server
{
listen 80;
server_name open.phalapi.net;
index index.html index.php;
root /www/phalapi-pro/public;
location ~ .*\.(php|php5)?$
{
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 管理后台
if (!-e $request_filename) {
rewrite ^/admin/(.*) /admin/index.html;
}
# 开放平台
if (!-e $request_filename) {
rewrite ^/platform/(.*) /platform/index.html;
}
# 静态资源缓存
location ~.*\.(js|css|html|png|jpg)$
{
expires 3d;
}
# 限制上传的PHP文件,都只能是下载,而非执行
location ~* /uploads/.*\.(php|php5)?$
{
}
access_log /var/log/nginx/open.phalapi.net.access.log;
error_log /var/log/nginx/open.phalapi.net.error.log;
}
温馨提示:请把open.phalapi.net换成你自己的域名。
第3步、安装向导
安装地址:http://你的域名/install ,或者打开首页:http://你的域名/,点击进入安装向导。
进入安装向导后,同意安装。检测通过后,下一步。
根据表单,填写数据库的相关配置,以及管理员的账号和密码。下一步。
温馨提示:重点修改你的项目名称、你的数据库连接、管理员登录密码。
安装成功。
成功安装后,就可以开始使用你的自己的开放平台了。
默认的开放平台首页类似如下,你可以根据自己的需求进行二次开发。
首页,主要是给游客以及已注册的用户访问和使用的,提供了新手引导和开放平台介绍的内容。
通过顶部菜单,可以看到有以下访问入口:
开放平台是提供给你的开发者使用的,开发者可以是内部的也可以是外部的,或者第三方开发者。
当开发者需要使用开放平台时,第一件事情是需要注册新账号。
注册成功后,即可登录:
登录成功后,即可进入开放平台,进行应用管理、查看接口权限、查看流量统计、提交工单以及开发者个人中心等。例如在开放平台的首页可以看到:我的应用、我的订单、我的套餐、API总数、接口流量统计、我的工单等。
在开放平台左下方,以及首页的顶部菜单,都可以明显看到有OpenAPI接口文档的入口。这些是开发者需要重点查看、开发对接、调用和依赖的API接口。
进入到OpenAPI,可以看到有接口分类页:
接口搜索页:
接口详情页:
在接口详情页,同时提供了在线接口测试的功能。
管理后台,是提供给内部管理员使用的,以便对开发者、应用、接口、业务数据等进行全面的管理和维护。
例如,管理后台的登录界面:
为方便区分,开发者平台是蓝色主题,管理后台是黄色主题。
成功登录后,可以进行管理后台首页。
通过左侧菜单,可以看到有很丰富和完善的功能和菜单。
在完成接口大师的安装,以及简单的认识和使用后,就可以根据自己的需要,基于接口大师进行二次开发,把自己需要开放的荥接口,需要共享的数据对外提供给你的开发者。
下面以Hello World为示例,讲解如何快速二次开发,添加自己的API接口。
创建./src/app/Api/HelloWorld.php文件,并添加以下PHP代码:
<?php
namespace App\Api;
use App\Common\Api;
/**
* Hello World示例
*/
class HelloWorld extends Api {
/**
* 接口示例
* @desc 一个开放接口示例,可直接访问,不需要任何验证,因为配置了service_whitelist白名单。熟悉后可删除此示例接口。
* @return string content 一句话
*/
public function say() {
return array('content'=> 'Hello PhalApi Pro!');
}
}
这样就可以手动添加一个自己的新接口了,后面的接口文档、接口权限、接口统计等,都可以由接口大师自动生成。
例如接口分页会显示此接口模块和接口名称:
Hello World的接口详情页:
在开放平台,开发者可以看到此接口是否有调用权限(由于当前开发者的应用未审核通过,所以不具备任何接口的调用权限):
在管理后台,可以看到此接口的权限以及进行分配:
接口大师,还有一个亮点和创新的功能,就是可以通过界面,直接自动生成OpenAPI的PHP代码,甚至连代码都不需要编写,就可以生成你的接口或CURD数据接口。
只需要填写接口的类名和方法名,就可以快速生成接口文件的源代码,保存后,效果就和前面手动编写接口一样。非常方便。
可以通过演示账号,直接登录,在线体验。
以及接口大师5合1产品矩阵的效果汇总如下:
接口大师,整体技术架构设计如下:
更多内容,请参考 接口大师的 技术文档。http://www.yesx2.com/wiki/#/
PhalApi Pro 2.0 技术文档
前言
简介
安装
一、使用手册
1.1 API接口系统使用手册
1.2 Platform开放平台使用手册
1.3 Admin管理后台使用手册
二、产品介绍
2.1 整体架构及业务流程
2.2 账号体系
2.3 开放接口权限
2.4 重要项目配置
三、API接口开发文档
3.1 接口分类
3.2 在线接口文档
3.3 如何调用接口
3.4 如何开发接口
3.5 接口调试
3.6 计划任务
3.7 连接其他数据库
3.8 第二套接口验签方案
四、前端开发文档
4.1 Platform开放平台开发文档
4.2 Admin管理后台开发文档
五、附录
5.1 版本更新日记
5.2 数据库表结构
5.3 联系我们
5.4 如何编写开发手册
5.5 文档编写规范
.NET的SelectPdf Html到Pdf转换器-社区版是.NET的SelectPdf库中提供的功能强大的html到pdf转换器的免费版本。
转换器提供了许多强大的选项(将任何网页转换为pdf,将任何html字符串转换为pdf,html5 / css3 / javascript支持,页眉和页脚支持等),唯一的限制是它最多可以生成pdf文档。5页长。
.NET的免费HTML至Pdf转换器–社区版功能:最多生成5页pdf文档,将任何网页转换为pdf,将任何原始html字符串转换为pdf,设置pdf页面设置(页面大小,页面方向,页面边距) ,在转换过程中调整内容大小以适合pdf页面,设置pdf文档属性,设置pdf查看器首选项,设置pdf安全性(密码,权限),设置转换延迟和网页导航超时,自定义页眉和页脚,在页眉中支持html和页脚,自动和手动分页符,在每个页面上重复html表头,支持@media类型屏幕和打印,支持内部和外部链接,基于html元素自动生成书签,支持HTTP标头,支持HTTP cookie,支持需要身份验证的网页,支持代理服务器,启用/禁用javascript,修改颜色空间,多线程支持,HTML5 / CSS3支持,Web字体支持等等。
1、nuget 引用
Install-Package Select.HtmlToPdf
2、方法
using SelectPdf;
using System.Collections.Specialized;
using System.IO;
using System.Web;
namespace BQoolCommon.Helpers.File
{
public class WebToPdf
{
public WebToPdf()
{
//SelectPdf.GlobalProperties.LicenseKey="your-license-key";
}
/// <summary>
/// 將 Html 轉成 PDF,並儲存成檔案
/// </summary>
/// <param name="html">html</param>
/// <param name="fileName">絕對路徑</param>
public void SaveToFileByHtml(string html, string fileName)
{
var doc=SetPdfDocument(html);
doc.Save(fileName);
}
/// <summary>
/// 傳入 Url 轉成 PDF,並儲存成檔案
/// </summary>
/// <param name="url">url</param>
/// <param name="fileName">絕對路徑</param>
/// <param name="httpCookies">Cookies</param>
public void SaveToFileByUrl(string url, string fileName, NameValueCollection httpCookies)
{
var doc=SetPdfDocument(url, httpCookies);
doc.Save(fileName);
}
/// <summary>
/// 將 Html 轉成 PDF,並輸出成 byte[] 格式
/// </summary>
/// <param name="html">html</param>
/// <returns></returns>
public byte[] GetFileByteByHtml(string html)
{
var doc=SetPdfDocument(html);
return doc.Save();
}
/// <summary>
/// 傳入 Url 轉成 PDF,並輸出成 byte[] 格式
/// </summary>
/// <param name="url">url</param>
/// <param name="httpCookies">Cookies</param>
/// <returns></returns>
public byte[] GetFileByteByUrl(string url, NameValueCollection httpCookies)
{
var doc=SetPdfDocument(url, httpCookies);
return doc.Save();
}
/// <summary>
/// 將 Html 轉成 PDF,並輸出成 Stream 格式
/// </summary>
/// <param name="html">html</param>
/// <returns></returns>
public Stream GetFileStreamByHtml(string html)
{
var doc=SetPdfDocument(html);
var pdfStream=new MemoryStream();
doc.Save(pdfStream);
pdfStream.Position=0;
return pdfStream;
}
/// <summary>
/// 傳入 Url 轉成 PDF,並輸出成 Stream 格式
/// </summary>
/// <param name="html">html</param>
/// <returns></returns>
public Stream GetFileStreamByUrl(string url, NameValueCollection httpCookies)
{
var doc=SetPdfDocument(url, httpCookies);
var pdfStream=new MemoryStream();
doc.Save(pdfStream);
pdfStream.Position=0;
return pdfStream;
}
private PdfDocument SetPdfDocument(string html)
{
var converter=new HtmlToPdf();
converter.Options.WebPageWidth=1200;
html=HttpUtility.HtmlDecode(html);
return converter.ConvertHtmlString(html);
}
private PdfDocument SetPdfDocument(string url, NameValueCollection httpCookies)
{
var converter=new HtmlToPdf();
converter.Options.WebPageWidth=1200;
if (httpCookies != && httpCookies.Count !=0)
{
converter.Options.HttpCookies.Add(httpCookies);
}
return converter.ConvertUrl(url);
}
}
}
3、调用
/// <summary>
/// 下载pdf
/// </summary>
public void Downpdf(string data)
{
var stream=new BQoolCommon.Helpers.File.WebToPdf().GetFileStreamByHtml(Gethtml(data));
Response.Clear();
//二进制流数据(如常见的文件下载)
Response.ContentType="application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode("Profit and Loss Statement.pdf", System.Text.Encoding.UTF8));
var bytes=StreamToBytes(stream);
Response.BinaryWrite(bytes);
Response.Flush();
stream.Close();
stream.Dispose();
Response.End();
}
那么如何获取指定页面的html 呢 传入对应的model 获得指定动态的html
private string Gethtml(string data)
{
string str="";
str=this.ControllerContext.RenderViewToString("ProfitDetails", data);
return str;
}
using BQoolCommon.Helpers.Format;
using Newtonsoft.Json;
using OrdersManager.Models.ViewModel.Report;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace OrdersManager.Web.Infrastructure
{
public static class HelperExtensions
{
public static string RenderViewToString(this ControllerContext context, string viewName, string data)
{
if (string.IsOrEmpty(viewName))
viewName=context.RouteData.GetRequiredString("action");
context.Controller.ViewData.Model=JsonConvert.DeserializeObject<ProfitDetailsmodel>(StringTools.Base64Decode(StringTools.Base64Decode(data)));
using (var sw=new StringWriter())
{
ViewEngineResult viewResult=ViewEngines.Engines.FindPartialView(context, viewName);
var viewContext=new ViewContext(context,
viewResult.View,
context.Controller.ViewData,
context.Controller.TempData,
sw);
try
{
viewResult.View.Render(viewContext, sw);
}
catch (Exception ex)
{
throw;
}
return sw.GetStringBuilder().ToString();
}
}
}
}
https://www.nuget.org/packages/Select.HtmlToPdf/
*请认真填写需求信息,我们会在24小时内与您取得联系。