vue服务端打包exe怎么实现的?

Vue.js 是一个流行的 JavaScript 前端框架,它提供了一种简单、灵活、高效的方式来构建交互式的 Web 应用程序。Vue.jsphpweb打包exe 主要用于开发单页应用程序(SPA),但是它也可以在服务端渲染(SSR)的情况下使用。在本文中,我们将介绍如何使用 Vue.js 在服务端打包成可执行文件(exe)。

## 什么是服务端渲染(SSR)

服务端渲染(SSR)是指在服务器端生成 HTML 页面,将其发送到客户端浏览器进行显示的过程。相比于传统的客户端渲染,服务端渲染可以提高应用程序的性能和搜索引擎优化(SEO)。因为在客户端渲染的情况下,浏览器必须通过 Ajax 或者 WebSocket 等方式向服务器请求数据,然后再通过 JavaScript 渲染 HTML 页面。而在服务端渲染的情况下,浏览器直接接收到完整的 HTML 页面,无需再通过 JavaScript 渲染。

## 为什么需要将 Vue.js 打包成可执行文件

将 Vue.js 打包成可执行文件的主要原因是可以方便地将应用程序部署到生产环境中。通常情况下,我们需要将 Vue.js 应用程序打包成静态文件,然后将其部署到 Web 服务器上。但是在某些情况下,我们可能需要将应用程序打包成可执行文件,例如:

– 部署到没有 Web 服务器的环境中,例如桌面应用程序或者服务端应用程序。

– 部署到需要离线运行的环境中,例如在没有网络连接的情况下运行应用程序。

## 如何将 Vue.js 打包成可执行文件

桌面软件快速开发框架 Vue.js 打包成可执行文件的过程可以分为以下几个步骤:

### 1. 使用 Vue CLI 创建项目

首先,我们需要使用 Vue CLI 创建一个新的项目。Vue CLI 是一个官方的脚手架工具,可以帮助我们快速创建 Vue.js 项目,并提供了许多有用的插件和工具。

“`bash

vue create my-project

“`

### 2. 配置服务端渲染(SSR)

接下来,我们需要配置服务端渲染(SSR)。Vue.js 提供了一个官方的插件 `vue-cli-plugin-ssr`,可以帮助我们快速配置服务端渲染(SSR)。安装该插件:

“`bash

vue add ssr

“`

### 3. 编写服务端代码

接下来,我们需要编写服务端代码。服务端代码主要负责在服务器端生成 HTML 页面,并将其发送到客户端浏览器进行显示。Vue.js 提供了一个官方的库 `vue-server-renderer`,可以帮助我们在服务端生成 HTML 页面。以下是一个简单的服务端代码示例:

“`javascript

const Vue = require(‘vue’)

const serverRenderer = require(‘vue-server-renderer’).createRenderer()

const app = new Vue({

template: ‘Hello World’

})

serverRenderer.renderToString(app, (err, html) =>

{

if (err) {

console.error(err)

} else {

console.log(html)

}

})

“`

### 4. 打包服务端代码

最后,我们需要将服务端代码打包成可执行文件。我们可以使用 `pkg` 工具将 Node.js 应用程序打包成可执行文件。安装 `pkg`:

“`bash

npm install -g pkg

“`

然后,在项目根目录下创建一个 `package.json` 文件,并添加以下内容:

“`json

{

“name”: “my-app”,

“version”: “1.0.0”,

“main”: “server.js”

}

“`

其中,`server.js` 是我们编写的服务端代码文件。接着,运行以下命令:

“`bash

pkg .

“`

该命令会将整个项目打包成可执行文件,并将其输出到当前目录下。

## 总结

将 Vue.js 打包成可执行文件可以方便地将应用程序部署到生产环境中,并且可以在没有网络连接的情况下运行应用程序。本文介绍了如何使用 Vue.js 在服务端打包成可执行文件,包括配置服务端渲染(SSR)、编写服务端代码和打包服务端代码。

什么是个推服务端tcp链接SDK?

什么是个推服务端tcp链接SDK?

服务端tcp链接SDK

功能说明:免费版本服务端sdk 使用 http连接,VIP版本使用 tcp 连接,可大大提高单推推送时的效率。

应用场景:单推需求较多的APP

使用说明:该功能为VIP功能,需对接单独的服务端SDK,请联系个推商务咨询。

支付宝服务端如何接收通知及验签?

支付宝服务端如何接收通知及验签?

以支付接口接收通知并处理为例。

Java 调用示例

Java 异步验签示例

//获取支付宝POST过来反馈信息 
    Map< String , String > params = new HashMap < String , String > ();
    Map requestParams = request.getParameterMap();
    for(Iterator iter = requestParams.keySet().iterator();iter.hasNext();){
   String name = (String)iter.next();
   String[] values = (String [])requestParams.get(name);
   String valueStr = "";
   for(int i = 0;i < values.length;i ++ ){
    valueStr =  (i==values.length-1)?valueStr + values [i]:valueStr + values[i] + ",";
   }
   //乱码解决,这段代码在出现乱码时使用。 
   //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); 
   params.put (name,valueStr);
    }
    //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。 
    //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) 
    boolean flag = AlipaySignature.rsaCheckV1 (params,alipaypublicKey, "UTF-8","RSA2");

Java异步验签示例(证书)

//获取支付宝POST过来反馈信息 
   Map<String,String> params = new HashMap<String,String>();
   Map requestParams = request.getParameterMap();
   for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext ();) {
    String name =  ( String )iter.next();
    String[] values = (String[])requestParams.get(name);
    String valueStr="";
    for(int i = 0;i < values.length; i++){
    valueStr = (i== values.length-1)?valueStr+values[i]:valueStr+values[i] + ",";
    }
   //乱码解决,这段代码在出现乱码时使用。 
   //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); 
   params.put(name,valueStr);
    }
   //切记alipayPublicCertPath是支付宝公钥证书路径,请去open.alipay.com对应应用下载。 
   //boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType) 
   boolean flag = AlipaySignature.rsaCertCheckV1(params,alipayPublicCertPath,"UTF-8","RSA2");

PHP 调用示例

PHP异步验签示例

php语言公钥与公钥证书验签方法相同。
$aop = new AopClient;
$aop->alipayrsaPublicKey = '请填写支付宝公钥/支付宝公钥证书路径';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");

C#调用示例

C#异步验签示例

验签方法中 keyFromFile 必传 false,否则验签失败。

// 获 取 支 付 宝 POST 过 来 通 知 消 息 , 并 以 “参 数 名 = 参 数 值 ” 的 形 式 组 成 数 组 
 // request 回 来 的 信 息 组 成 的 数 组 
  public Dictionary<string,string> GetRequestPost()
 {
    int  i = 0 ;
    IDictionary<string,string> sArray = new IDictionary<string,string>();
    NameValueCollection coll;
    // Load  Form  variables  into  NameValueCollection  variable . 
    coll = Request.Form ;
    //Get names of all forms into a string array . 
    String[] requestItem = coll.AllKeys;
    for (i = 0;i < requestItem.Length ; i++)
   {
      sArray.Add( requestItem[i], Request.Form[requestItem[i]]);
    }
    return sArray ;
 }
  // 切 记 alipaypublickey 是 支 付 宝 的 公 钥 , 请 去 open .alipay .com 对 应 应 用 下 查 看 。 
  // bool  RSACheckV1 ( IDictionary < string , string >  parameters , string  alipaypublicKey , string  charset , string  signType , bool  keyFromFile )
  bool flag = AlipaySignature.RSACheckV1(GetRequestPost(),alipaypublicKey,"UTF-8","RSA2",false);

C#异步验签示例(证书)

// 获 取 支 付 宝 POST 过 来 通 知 消 息 , 并 以 “参 数 名 = 参 数 值 ” 的 形 式 组 成 数 组 
    // request 回 来 的 信 息 组 成 的 数 组 
     public Dictionary<string,string> GetRequestPost()
    {
       int  i = 0 ;
       IDictionary<string,string> sArray = new IDictionary<string,string>();
       NameValueCollection coll;
       // Load  Form  variables  into  NameValueCollection  variable . 
       coll = Request.Form ;
       //Get names of all forms into a string array . 
       String[] requestItem = coll.AllKeys;
       for (i = 0;i < requestItem.Length ; i++)
      {
         sArray.Add( requestItem[i], Request.Form[requestItem[i]]);
       }
       return sArray ;
    }
     // 切 记 alipayPublicCertPath 是 支付宝公钥证书路径 , 请 去 open .alipay .com 对 应 应 用 下 查 看 。 
     // bool  RSACheckV1 ( IDictionary < string , string >  parameters , string  alipayPublicCertPath , string  charset , string  signType)
  bool flag = AlipaySignature.RSACertCheckV1(dics, alipayPublicCertPath, "UTF-8", "RSA2");

OPPO开放平台 OPPO推送独立接口上传图片

OPPO开放平台 OPPO推送独立接口上传图片

上传图片

OPPO PUSH提供携带图片的消息推送能力,在使用图片推送前,需要先将图片上传到OPPO PUSH服务端,由OPPO PUSH服务端统一处理存储,推送消息时使用上传成功的图片ID作为图片索引,由OPPO PUSH服务将图片组装为消息体的内容部分并下发。

上传大图

接口

环境HTTPS请求地址备注
生产环境https://api-media.push.heytapmobi.com/媒体服务
沙箱环境暂无
描述内容
接口功能上传图片
请求方法POST
请求编码UTF-8
Content-Typemultipart/form-data
请求路径/server/v1/media/upload/big_picture

请求参数

图片文件按照multipart/form-data标准携带图片文件,图片要求尺寸876*324 px,文件大小1M以内,格式为PNG/JPG/JPEG。

名称类型必须默认描述
FILE图片文件
picture_ttlInt86400图片保存的存活时间(time_to_live) (单位:秒),最长30天

响应参数(JSON)

名称类型必须描述
codeInt返回码,请参考公共返回码与接口返回码
messageString错误详细信息,不存在则不填
dataString返回值,JSON类型,包含响应结构体
{
    "code": 0,
    "message": "success",
    "data": {
        "big_picture_id": xxxxxxxxx //大图id
      }
}

上传图标

接口

描述内容
接口功能上传图片
请求方法POST
请求编码UTF-8
Content-Typemultipart/form-data
请求路径/server/v1/media/upload/small_picture

请求参数

图片文件按照multipart/form-data标准携带图片文件,图片要求尺寸144*144 px,文件大小为50k以内,格式为PNG/JPG/JPEG

名称类型必须默认描述
FILE图片文件
picture_ttlInt86400图片保存的存活时间(time_to_live) (单位:秒),最长30天

响应参数(JSON)

名称类型必须描述
codeInt返回码,请参考公共返回码与接口返回码
messageString错误详细信息,不存在则不填
dataString返回值,JSON类型,包含响应结构体

响应示例

{
    "code": 0,
    "message": "success",
    "data": {
        "small_picture_id": xxxxxxxxx, //图标id
      }
}

OPPO推送服务端 Java SDK集成

OPPO推送服务端 Java SDK集成

接入准备

运行环境

SDK使用Java编写,接入前需确认是否安装Java环境并且版本为1.7及以上

获取SDK

1)开发者需要登录推送运营平台获取应用的AppKey, MasterSecret
2)下载SDK相关包:OPush_JAVA_SDK.zip

导入SDK

1)解压已下载的SDK包
2)将文件夹下所有jar文件放入项目工程的libs目录
3)刷新工程,确保文件出现在libs目录下。如果没有的话请手动添加

SDK类定义说明

类名使用说明
Sender发送消息工具类,可以发送单推、批量单推、广播消息
Environment枚举类
Environment.CHINA_PRODUCTION 中国
Environment.INTERNATIONAL 海外
Notification通知栏消息
Target推送目标类,包含推送目标类型、推送目标
TargetType推送目标类型,支持registration_id推送类型
Result服务器返回的结果
ReturnCode返回的状态码,根据这个状态可以自检请求参数的是否合法
ReturnCode.ErrorCode平台返回的状态码枚举类

详情见SDK javadoc

接入SDK示范

创建sender对象

SDK提供Sender类封装了OPPO Push推送服务的各类服务接口。因此,使用SDK推送消息或调用其他服务,首先要创建Sender对象。

// 使用appKey, masterSecret创建sender对象(每次发送消息都使用这个sender对象)
Sender sender = Sender.newBuilder()
        .appKey("appKey") // 设置appKey
        .masterSecret("masterSecret") // 设置masterSecret
        .env(Environment.CHINA_PRODUCTION)  // 中国
        .httpMaxConnection(64) // 设置http最大连接数
        .httpMaxRoute(64)   // 设置最大http路由连接数
        .httpConnectionTimeout(5000) // http连接超时时间
        .httpConnectRequestTimeout(5000) // 等待连接超时时间
        .httpSocketTimeout(5000) // socket超时时间
        .build();

推送消息

创建通知栏消息体

推送消息前,需要构造消息内容,SDK提供Notification类供开发者设置消息内容。

/**
 * 这是构造一个通知栏消息体Notification对象的实例方法。
 * 请注意,后续的例子会调用这个getNotification()方法
 * */
private Notification getNotification() {
    Notification notification = new Notification();
    
    // 标题,内容是必填项
    notification.setTitle("通知栏消息tile");
    notification.setContent("通知栏内容");

    /*
     * 以下参数非必填项,参考OPPO push服务端api文档进行设置,本示例选取部分参数进行示范
     */
    //通知栏样式 1. 标准样式  2. 长文本样式  3. 大图样式 【非必填,默认1-标准样式】
    notification.setStyle(1);
    // App开发者自定义消息Id,OPPO推送平台根据此ID做去重处理,对于广播推送相同appMessageId只会保存一次,对于单推相同appMessageId只会推送一次
    notification.setAppMessageId(UUID.randomUUID().toString());
    // 应用接收消息到达回执的回调URL,字数限制200以内,中英文均以一个计算
    notification.setCallBackUrl("http://www.test.com");
    // App开发者自定义回执参数,字数限制50以内,中英文均以一个计算
    notification.setCallBackParameter("");
    // 点击动作类型0,启动应用;1,打开应用内页(activity的intent action);2,打开网页;4,打开应用内页(activity);【非必填,默认值为0】;5,Intent scheme URL
    notification.setClickActionType(4);
    // 应用内页地址【click_action_type为1或4时必填,长度500】
    notification.setClickActionActivity("com.coloros.push.demo.component.InternalActivity");
    // 网页地址【click_action_type为2必填,长度500】
    notification.setClickActionUrl("http://www.test.com");
    // 动作参数,打开应用内页或网页时传递给应用或网页【JSON格式,非必填】,字符数不能超过4K,示例:{"key1":"value1","key2":"value2"}
    notification.setActionParameters("{\"key1\":\"value1\",\"key2\":\"value2\"}");
    // 展示类型 (0, “即时”),(1, “定时”)
    notification.setShowTimeType(1);
    // 定时展示开始时间(根据time_zone转换成当地时间),时间的毫秒数
    notification.setShowStartTime(System.currentTimeMillis() + 1000 * 60 * 3);
    // 定时展示结束时间(根据time_zone转换成当地时间),时间的毫秒数
    notification.setShowEndTime(System.currentTimeMillis() + 1000 * 60 * 5);
    // 是否进离线消息,【非必填,默认为True】
    notification.setOffLine(true);
    // 离线消息的存活时间(time_to_live) (单位:秒), 【off_line值为true时,必填,最长3天】
    notification.setOffLineTtl(24 * 3600);
    // 时区,默认值:(GMT+08:00)北京,香港,新加坡
    notification.setTimeZone("GMT+08:00");
    // 0:不限联网方式, 1:仅wifi推送
    notification.setNetworkType(0);
    return notification;
}

推送单推通知栏消息

// 创建通知栏消息体
Notification notification = getNotification(); 
// 创建推送目标对象,传入注册ID
Target target = Target.build("CN_8fa0618f178145d8c2a44091a1326411"); 
// 调用单推接口,推送消息,获得调用结果
Result result = sender.unicastNotification(notification, target); 
// 获取http请求状态码
result.getStatusCode(); 
// 获取平台返回码
result.getReturnCode(); 
// 获取平台返回的messageId
result.getMessageId();  

推送批量单推通知栏消息

// batch最大长度为1000,超出会导致请求失败
Map batch = new HashMap(); 
// 创建目标对象并加入到批量队列中
batch.put(Target.build("CN_ddfaa7db1e4ecf75014143bdbc3e53ea"), getNotification());
batch.put(Target.build("CN_8fa0618f178145d8c2a44091a1326411"), getNotification());
// 调用批量单推接口,推送消息,获得调用结果
Result result = sender.unicastBatchNotification(batch); 
// 获取http请求状态码
result.getStatusCode(); 
// 获取平台返回码
result.getReturnCode(); 
// 获取对应批量单推结果
List batchResult = result.getUnicastBatchResults(); 
for (Result.UnicastBatchResult record : batchResult) {
    record.getMessageId();
    record.getErrorCode();
    record.getErrorMessage();
    record.getTargetValue();
}

保存和发送广播通知栏消息

/**
 * 推送广播消息分为两步
 * 首先调用保存消息体接口,保存广播消息内容,得到消息ID
 * 使用消息ID调用广播推送接口,推送广播消息
 * */

// 创建通知栏消息体
Notification broadNotification = getNotification();

// 发送保存消息体请求
Result saveResult = sender.saveNotification(broadNotification); 
// 获取messageId
String messageId = saveResult.getMessageId(); 
// 获取http请求状态码
saveResult.getStatusCode(); 
// 获取平台返回码
saveResult.getReturnCode(); 


// 创建推送目标 广播目标接受多个注册ID,字符串中以英文分号';'分割
Target target = new Target(); 
target.setTargetValue("CN_ddfaa7db1e4ecf75014143bdbc3e53ea;CN_8fa0618f178145d8c2a44091a1326411");

// 发送广播消息
Result broadResult = sender.broadcastNotification(messageId, target); 
// 获取广播taskId
broadResult.getTaskId(); 
List errorList = broadResult.getBroadcastErrorResults();
// 如果大小为0,代表所有目标发送成功
if (errorList != null && errorList.size() > 0) { 
    for (Result.BroadcastErrorResult error : errorList) {
        // 错误码
        error.getErrorCode(); 
        // 目标
        error.getTargetValue(); 
    }
}

上传图片

如果要推送带图片的消息,需要先上传图片。
注意:仅广播通知栏消息 支持图片推送功能。

上传大图

// 指定图片文件
File bigPicture = new File("大图文件路径");
// 图片过期时间(单位秒),最长30天 
int bigPictureTtl = 86400; 
// 使用Sender调用上传大图接口 
Result uploadBigPicResult = sender.uploadBigPicture(bigPictureTtl, bigPicture); 
// 获取大图id,保存消息体填入
String bigPictureId = uploadBigPicResult.getBigPictureId(); 

// 创建消息体时选择图片推送消息类型(3表示图片推送),并传入图片ID
Notification notification = getNotification();
notification.setStyle(3);
notification.setBigPictureId(bigPictureId);

// 执行保存消息体,广播推送等后续操作
// save and send notification ...

上传图标

// 指定图片文件
File smallPicture = new File("小图文件路径");
// 图片过期时间(单位秒),最长30天
int smallPictureTtl = 86400;  
// 使用Sender对象调用上传小图接口
Result uploadSmallPicResult = sender.uploadSmallPicture(smallPictureTtl, smallPicture);
// 获取小图id,保存消息体
String smallPictureId = uploadSmallPicResult.getSmallPictureId(); 

// 创建消息体时选择图片推送消息类型(3表示图片推送),并传入图片ID
Notification notification = getNotification();
notification.setStyle(3);
notification.set(smallPictureId);

// 执行保存消息体,广播推送等后续操作
// save and send notification ...