HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

Biaofun基础widgets教程-SizedBox部分

1 SizedBox
两种用法:一是可用来设置两个widget之间的间距,二是可以用来限制子组件的大小
Biaofun基础widgets教程-SizedBox部分
2 构造函数

SizedBox({   
    Key key,   
    this.width,   
    this.height,   
    Widget child   
})

3 常用属性标梵互动
3.1 width:SizedBox的宽
width: 250,
3.2 height:SizedBox的高
height: 250,
3.3 child:SizedBox的子widget
child: Text("内容"),
4.显示效果

5.代码
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
// 字体适配
import '../../utils/app_size.dart';

class ListSizedBox extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: Text('SizedBox'),
backgroundColor: Color(0xFFfafcff),
bottom: TabBar(labelColor: Color(0xff030303), tabs: [
Tab(
text: "效果",
),
Tab(
text: "属性",
)
]),
),
body: TabBarView(children: [
Container(
decoration: new BoxDecoration(
color: new Color(0xffffffff),
borderRadius: new BorderRadius.circular((AppSize.width(20))),
),
child: ShowEffect()),
Container(
decoration: new BoxDecoration(
color: new Color(0xffffffff),
borderRadius: new BorderRadius.circular((AppSize.width(20))),
),
child: ShowAttribute()),
]),
),
);
}
}

// 效果
class ShowEffect extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Row(children: <Widget>[
SizedBox(
width: 150.0,
height: 150.0,
child: Container(
margin: EdgeInsets.all(20.0),
width: 200.0,
height: 200.0,
color: Colors.blue,
),
),
SizedBox(
width: 100.0,
height: 100.0,
child: Container(
margin: EdgeInsets.all(20.0),
width: 200.0,
height: 200.0,
color: Colors.yellow,
),
),
SizedBox(
width: 100.0,
height: 100.0,
child: Container(
margin: EdgeInsets.all(20.0),
width: 200.0,
height: 200.0,
color: Colors.red,
),
)
]);
}
}

// 属性
class ShowAttribute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: FutureBuilder(
future: rootBundle.loadString('lib/markdown/sizedBox.md'),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Markdown(
data: snapshot.data,
selectable: true,
);
} else {
return Center(
child: Text("加载中..."),
);
}
},
),
);
}
}

本文来源:标梵互动 https://www.biaofun.com/

继续阅读 »

1 SizedBox
两种用法:一是可用来设置两个widget之间的间距,二是可以用来限制子组件的大小
Biaofun基础widgets教程-SizedBox部分
2 构造函数

SizedBox({   
    Key key,   
    this.width,   
    this.height,   
    Widget child   
})

3 常用属性标梵互动
3.1 width:SizedBox的宽
width: 250,
3.2 height:SizedBox的高
height: 250,
3.3 child:SizedBox的子widget
child: Text("内容"),
4.显示效果

5.代码
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
// 字体适配
import '../../utils/app_size.dart';

class ListSizedBox extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: Text('SizedBox'),
backgroundColor: Color(0xFFfafcff),
bottom: TabBar(labelColor: Color(0xff030303), tabs: [
Tab(
text: "效果",
),
Tab(
text: "属性",
)
]),
),
body: TabBarView(children: [
Container(
decoration: new BoxDecoration(
color: new Color(0xffffffff),
borderRadius: new BorderRadius.circular((AppSize.width(20))),
),
child: ShowEffect()),
Container(
decoration: new BoxDecoration(
color: new Color(0xffffffff),
borderRadius: new BorderRadius.circular((AppSize.width(20))),
),
child: ShowAttribute()),
]),
),
);
}
}

// 效果
class ShowEffect extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Row(children: <Widget>[
SizedBox(
width: 150.0,
height: 150.0,
child: Container(
margin: EdgeInsets.all(20.0),
width: 200.0,
height: 200.0,
color: Colors.blue,
),
),
SizedBox(
width: 100.0,
height: 100.0,
child: Container(
margin: EdgeInsets.all(20.0),
width: 200.0,
height: 200.0,
color: Colors.yellow,
),
),
SizedBox(
width: 100.0,
height: 100.0,
child: Container(
margin: EdgeInsets.all(20.0),
width: 200.0,
height: 200.0,
color: Colors.red,
),
)
]);
}
}

// 属性
class ShowAttribute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: FutureBuilder(
future: rootBundle.loadString('lib/markdown/sizedBox.md'),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Markdown(
data: snapshot.data,
selectable: true,
);
} else {
return Center(
child: Text("加载中..."),
);
}
},
),
);
}
}

本文来源:标梵互动 https://www.biaofun.com/

收起阅读 »

DCloud授权登录接入文档

auth2.0授权 插件授权登录 auth2.0授权登录 web登录授权

简介

DCloud用户开放平台,https://open.dcloud.net.cn,是DCloud为三方开发者服务商提供的开放平台。

DCloud将数百万开发者的流量通过开放平台提供给三方开发者服务商。

使用场景:

1.三方的开发者服务商,比如Git服务商,可以制作HBuilderX插件,并且将账户打通。比如在HBuilderX插件中注册项目的右键菜单,在HBuilderX中对项目点右键,一键上传源码到某Git服务商,且无需再重复注册三方Git服务账户。
2.第三方网站,可以申请web授权给自己网站,用户无需在网站注册,直接可以跳转到DCloud登录授权页面进行登录后回跳到网站进行登录。

当然不止是Git服务商、网站,所有其他开发者服务商,如测试、加固、多渠道发布、招聘...,均可通过DCloud用户开放平台共享DCloud的开发者资源。

插件授权使用步骤:

  1. 三方开发商需要在DCloud用户开放平台注册插件应用
  2. 开发HBuilderX插件,调用 hx.authorize.login API,拿到code码。文档详见:https://hx.dcloud.net.cn/ExtensionDocs/Api/README?id=authorize
  3. 插件将code码传到三方开发商服务器,从服务器端向 DCloud用户开放平台 的服务器请求,获取用户信息。文档具体见下。

WEB授权使用步骤:
1.第三方网站需要在DCloud用户开放平台注册授权WEB

  1. 在自己网站拼接url登录链接
  2. 用户登录完成后DCloud会携带code回跳到对应的第三方网址
  3. 第三方网站根据code在服务器端 DCloud用户开放平台 的服务器请求,获取用户信息 文档具体见下。

这套授权体系是国际标准的 OAuth2.0 授权机制。什么是OAuth2.0?
在用户授权的情况下,得到用于换取用户信息的令牌(code码)。拿到用户的授权令牌后,开发者在服务端通过接口换取accessToken,通过accessToken换取用户授权的基本信息。

OAuth2.0 授权登录流程

接入准备

DCloud用户开放平台创建授权,拿到client_id、client_secret

插件授权接入步骤

DCloud用户开放平台创建插件授权时,需要填写插件id。重点解释下这个概念。

HBuilderX的所有插件,发布时均需发布到DCloud插件市场,地址:https://ext.dcloud.net.cn/。HBuilderX用户从插件市场获取插件来使用。

插件市场的每个插件都有一个唯一的插件id,该id由插件作者上传插件时自行输入,提交插件时会进行验重,与其他插件的id不冲突即可使用。

目前创建授权是免审的,可以直接获取到client_id和client_secret。

插件接入流程图

接入流程

1. 通过HX提供的hx.authorize.login()方法获取code HX登录授权api接口
2. 开发者服务商获取到code后在自己服务器端去获取accessToken
3. 通过接口获取accessToken
请求过程建议将 参数 放在 Body 中传值,以保证数据安全。

开发者服务商从自己的服务器端发送请求到DCloud的服务器,地址如下:
https://account.dcloud.net.cn/dcloudOauthv2/accessToken?code={code}&client_id={client_id}&app_secret={app_secret}
请求方式
POST
返回json数据格式

{  
    "ret": 0,   // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "f06e27a0-1e85-11eb-bc60-8fdcccfc955b",     // access_token  
        "access_token_ttl": "2020-12-04 18:10:17",                  // access_token过期时间  
        "refresh_token": "30895c20-1e80-11eb-9c0e-ef6813716901",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 17:29:08"                  // refresh_token过期时间  
    }  
}
4. 通过accessToken获取用户信息

地址
https://account.dcloud.net.cn/dcloudOauthv2/userInfo?access_token={access_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "nickname": "phil123",      // 用户昵称  
        "avatar": "",               // 用户头像地址  
        "uid": "e4541ee0-dada-11ea-a0b7-3f6acaa2391b",  // 用户uid  
        "email": "",        // 用户邮箱 如果用户授权了  
    "phone": "",        // 用户手机号码 如果用户授权了  
    }  
}
accessToken过期后可以通过refreshToken进行获取新的access_token

地址
https://account.dcloud.net.cn/dcloudOauthv2/accessTokenByRefreshToken?refresh_token={refresh_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "88e3b460-1e95-11eb-b2c2-b30587156981",     // access_token  
        "access_token_ttl": "2020-12-04 20:01:56",                  // access_token过期时间  
        "refresh_token": "28c86600-1e87-11eb-b70f-ef63535e6ee0",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 18:19:01"                  // refresh_token过期时间  
    }  
}

WEB授权接入步骤

在DCloud用户开放平台创建WEB授权时,需要填写域名。拿到client_id、client_secret

WEB授权接入流程图

点击体验WEB授权示例

接入流程

1. 拼接DCloud登录授权url链接地址

https://account.dcloud.net.cn/oauth2/webAuthorize?client_id={client_id}&redirect_uri={redirect}&response_type=code
用户登录授权完成后会回跳到redirect并在url参数内携带code参数
注意:
redirect需要进行encodeURIComponent转码
redirect的主域名需要和在开放平台式申请时填写的域名保持一致

2. 开发者服务商获取到code后在自己服务器端去获取accessToken
3. 通过接口获取accessToken
请求过程建议将 参数 放在 Body 中传值,以保证数据安全。

开发者服务商从自己的服务器端发送请求到DCloud的服务器,地址如下:
https://account.dcloud.net.cn/dcloudOauthv2/accessToken?code={code}&client_id={client_id}&client_secret={client_secret}
请求方式
POST
返回json数据格式

{  
    "ret": 0,   // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "f06e27a0-1e85-11eb-bc60-8fdcccfc955b",     // access_token  
        "access_token_ttl": "2020-12-04 18:10:17",                  // access_token过期时间  
        "refresh_token": "30895c20-1e80-11eb-9c0e-ef6813716901",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 17:29:08"                  // refresh_token过期时间  
    }  
}
4. 通过accessToken获取用户信息

地址
https://account.dcloud.net.cn/dcloudOauthv2/userInfo?access_token={access_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "nickname": "phil123",      // 用户昵称  
        "avatar": "",               // 用户头像地址  
        "uid": "e4541ee0-dada-11ea-a0b7-3f6acaa2391b",  // 用户uid  
        "email": "",        // 用户邮箱 如果用户授权了  
    "phone": "",        // 用户手机号码 如果用户授权了  
    }  
}
accessToken过期后可以通过refreshToken进行获取新的access_token

地址
https://account.dcloud.net.cn/dcloudOauthv2/accessTokenByRefreshToken?refresh_token={refresh_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "88e3b460-1e95-11eb-b2c2-b30587156981",     // access_token  
        "access_token_ttl": "2020-12-04 20:01:56",                  // access_token过期时间  
        "refresh_token": "28c86600-1e87-11eb-b70f-ef63535e6ee0",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 18:19:01"                  // refresh_token过期时间  
    }  
}

案例

csdn开发了HBuilderX插件,无需额外注册csdn账户,即可在HBuilderX中一键上传项目到gitcode代码托管平台。
详见:https://ext.dcloud.net.cn/plugin?id=4882

HBuilderX中也预置了该插件的入口:

同时,csdn的官网也支持了HBuilder登录,开发者可以使用DCloud的账户直接登录csdn。

继续阅读 »

简介

DCloud用户开放平台,https://open.dcloud.net.cn,是DCloud为三方开发者服务商提供的开放平台。

DCloud将数百万开发者的流量通过开放平台提供给三方开发者服务商。

使用场景:

1.三方的开发者服务商,比如Git服务商,可以制作HBuilderX插件,并且将账户打通。比如在HBuilderX插件中注册项目的右键菜单,在HBuilderX中对项目点右键,一键上传源码到某Git服务商,且无需再重复注册三方Git服务账户。
2.第三方网站,可以申请web授权给自己网站,用户无需在网站注册,直接可以跳转到DCloud登录授权页面进行登录后回跳到网站进行登录。

当然不止是Git服务商、网站,所有其他开发者服务商,如测试、加固、多渠道发布、招聘...,均可通过DCloud用户开放平台共享DCloud的开发者资源。

插件授权使用步骤:

  1. 三方开发商需要在DCloud用户开放平台注册插件应用
  2. 开发HBuilderX插件,调用 hx.authorize.login API,拿到code码。文档详见:https://hx.dcloud.net.cn/ExtensionDocs/Api/README?id=authorize
  3. 插件将code码传到三方开发商服务器,从服务器端向 DCloud用户开放平台 的服务器请求,获取用户信息。文档具体见下。

WEB授权使用步骤:
1.第三方网站需要在DCloud用户开放平台注册授权WEB

  1. 在自己网站拼接url登录链接
  2. 用户登录完成后DCloud会携带code回跳到对应的第三方网址
  3. 第三方网站根据code在服务器端 DCloud用户开放平台 的服务器请求,获取用户信息 文档具体见下。

这套授权体系是国际标准的 OAuth2.0 授权机制。什么是OAuth2.0?
在用户授权的情况下,得到用于换取用户信息的令牌(code码)。拿到用户的授权令牌后,开发者在服务端通过接口换取accessToken,通过accessToken换取用户授权的基本信息。

OAuth2.0 授权登录流程

接入准备

DCloud用户开放平台创建授权,拿到client_id、client_secret

插件授权接入步骤

DCloud用户开放平台创建插件授权时,需要填写插件id。重点解释下这个概念。

HBuilderX的所有插件,发布时均需发布到DCloud插件市场,地址:https://ext.dcloud.net.cn/。HBuilderX用户从插件市场获取插件来使用。

插件市场的每个插件都有一个唯一的插件id,该id由插件作者上传插件时自行输入,提交插件时会进行验重,与其他插件的id不冲突即可使用。

目前创建授权是免审的,可以直接获取到client_id和client_secret。

插件接入流程图

接入流程

1. 通过HX提供的hx.authorize.login()方法获取code HX登录授权api接口
2. 开发者服务商获取到code后在自己服务器端去获取accessToken
3. 通过接口获取accessToken
请求过程建议将 参数 放在 Body 中传值,以保证数据安全。

开发者服务商从自己的服务器端发送请求到DCloud的服务器,地址如下:
https://account.dcloud.net.cn/dcloudOauthv2/accessToken?code={code}&client_id={client_id}&app_secret={app_secret}
请求方式
POST
返回json数据格式

{  
    "ret": 0,   // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "f06e27a0-1e85-11eb-bc60-8fdcccfc955b",     // access_token  
        "access_token_ttl": "2020-12-04 18:10:17",                  // access_token过期时间  
        "refresh_token": "30895c20-1e80-11eb-9c0e-ef6813716901",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 17:29:08"                  // refresh_token过期时间  
    }  
}
4. 通过accessToken获取用户信息

地址
https://account.dcloud.net.cn/dcloudOauthv2/userInfo?access_token={access_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "nickname": "phil123",      // 用户昵称  
        "avatar": "",               // 用户头像地址  
        "uid": "e4541ee0-dada-11ea-a0b7-3f6acaa2391b",  // 用户uid  
        "email": "",        // 用户邮箱 如果用户授权了  
    "phone": "",        // 用户手机号码 如果用户授权了  
    }  
}
accessToken过期后可以通过refreshToken进行获取新的access_token

地址
https://account.dcloud.net.cn/dcloudOauthv2/accessTokenByRefreshToken?refresh_token={refresh_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "88e3b460-1e95-11eb-b2c2-b30587156981",     // access_token  
        "access_token_ttl": "2020-12-04 20:01:56",                  // access_token过期时间  
        "refresh_token": "28c86600-1e87-11eb-b70f-ef63535e6ee0",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 18:19:01"                  // refresh_token过期时间  
    }  
}

WEB授权接入步骤

在DCloud用户开放平台创建WEB授权时,需要填写域名。拿到client_id、client_secret

WEB授权接入流程图

点击体验WEB授权示例

接入流程

1. 拼接DCloud登录授权url链接地址

https://account.dcloud.net.cn/oauth2/webAuthorize?client_id={client_id}&redirect_uri={redirect}&response_type=code
用户登录授权完成后会回跳到redirect并在url参数内携带code参数
注意:
redirect需要进行encodeURIComponent转码
redirect的主域名需要和在开放平台式申请时填写的域名保持一致

2. 开发者服务商获取到code后在自己服务器端去获取accessToken
3. 通过接口获取accessToken
请求过程建议将 参数 放在 Body 中传值,以保证数据安全。

开发者服务商从自己的服务器端发送请求到DCloud的服务器,地址如下:
https://account.dcloud.net.cn/dcloudOauthv2/accessToken?code={code}&client_id={client_id}&client_secret={client_secret}
请求方式
POST
返回json数据格式

{  
    "ret": 0,   // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "f06e27a0-1e85-11eb-bc60-8fdcccfc955b",     // access_token  
        "access_token_ttl": "2020-12-04 18:10:17",                  // access_token过期时间  
        "refresh_token": "30895c20-1e80-11eb-9c0e-ef6813716901",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 17:29:08"                  // refresh_token过期时间  
    }  
}
4. 通过accessToken获取用户信息

地址
https://account.dcloud.net.cn/dcloudOauthv2/userInfo?access_token={access_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "nickname": "phil123",      // 用户昵称  
        "avatar": "",               // 用户头像地址  
        "uid": "e4541ee0-dada-11ea-a0b7-3f6acaa2391b",  // 用户uid  
        "email": "",        // 用户邮箱 如果用户授权了  
    "phone": "",        // 用户手机号码 如果用户授权了  
    }  
}
accessToken过期后可以通过refreshToken进行获取新的access_token

地址
https://account.dcloud.net.cn/dcloudOauthv2/accessTokenByRefreshToken?refresh_token={refresh_token}
请求方式
POST
返回json数据格式

{  
    "ret": 0,       // 状态码 非0为错误码  
    "desc": "success",  // 描述  
    "data": {  
        "access_token": "88e3b460-1e95-11eb-b2c2-b30587156981",     // access_token  
        "access_token_ttl": "2020-12-04 20:01:56",                  // access_token过期时间  
        "refresh_token": "28c86600-1e87-11eb-b70f-ef63535e6ee0",    // refresh_token  
        "refresh_token_ttl": "2021-11-04 18:19:01"                  // refresh_token过期时间  
    }  
}

案例

csdn开发了HBuilderX插件,无需额外注册csdn账户,即可在HBuilderX中一键上传项目到gitcode代码托管平台。
详见:https://ext.dcloud.net.cn/plugin?id=4882

HBuilderX中也预置了该插件的入口:

同时,csdn的官网也支持了HBuilder登录,开发者可以使用DCloud的账户直接登录csdn。

收起阅读 »

贵阳创业公司诚聘前端开发工程师

招聘

薪资:4K-6K
要求:
一年及以上实际工作经验
精通JS、CSS
独立根据用户需求进行应用设计并实现,完美实现UI设计稿
熟练运用各类主流框架
有使用Vue或uniapp开发和应用上线经验
有意者欢迎联系QQ:2455212990或电话:13123616566

继续阅读 »

薪资:4K-6K
要求:
一年及以上实际工作经验
精通JS、CSS
独立根据用户需求进行应用设计并实现,完美实现UI设计稿
熟练运用各类主流框架
有使用Vue或uniapp开发和应用上线经验
有意者欢迎联系QQ:2455212990或电话:13123616566

收起阅读 »

应用程序开发模式的具体区别是什么?

混合开发 小程序

如今移动互联网发展迅速,大家都在用智能手机,所以很多企业都在开发自己的app产品,我们经常用的微信、支付宝、微博、抖音等都是app产品,虽然很多人说开发app的作用不大,但还是有很多新的app产品出现,所以不是说app不受欢迎,而是之前很多app营销运营模式发生了变化,所以app所扮演的角色仍然很重要。

有哪些应用程序开发的模式呢?第一,本地开发,本地开发是基于安卓和ios平台的官方开发语言开发的,比如我们常用的java语言,c语言等等,大多数智能手机上安装的app都是本地app,需要用户自己下载,本地app有很多优点,比如运行速度快,功能多,用户体验好,功能还可以扩展,缺点就是成本比较高,后期版本更新需要用户更新。
还有一种应用程序开发的方式是使用web语言开发的,通过移动设备上面的浏览器来访问和使用,web开发的app费用较低,并且可以在线使用,另外支持许多移动设备,但也有许多缺点,比如打开速度慢,因为是基于浏览器访问的,还有一点就是功能很少,可以说没有公众号和小程序实用,还有就是很难在手机上调用某些功能,所以如果想要更实用的话,建议不要开发webapp。
另外一种app开发方式也是有用户使用的,即混合app开发,简单地说就是把原生app和H5两种开发技术结合在一起开发的app,具体的比例可以根据难易程度而定,没有标准的比例,混合开发的app优点是与许多平台兼容,比web端的app实现更多的功能,还有一个优势就是可以离线使用,缺点是目前的app开发技术还不够成熟,性能不如原生app,所以如果想要开发更好的app应用,还是应该考虑原生app开发。
本文来源:标梵互动

继续阅读 »

如今移动互联网发展迅速,大家都在用智能手机,所以很多企业都在开发自己的app产品,我们经常用的微信、支付宝、微博、抖音等都是app产品,虽然很多人说开发app的作用不大,但还是有很多新的app产品出现,所以不是说app不受欢迎,而是之前很多app营销运营模式发生了变化,所以app所扮演的角色仍然很重要。

有哪些应用程序开发的模式呢?第一,本地开发,本地开发是基于安卓和ios平台的官方开发语言开发的,比如我们常用的java语言,c语言等等,大多数智能手机上安装的app都是本地app,需要用户自己下载,本地app有很多优点,比如运行速度快,功能多,用户体验好,功能还可以扩展,缺点就是成本比较高,后期版本更新需要用户更新。
还有一种应用程序开发的方式是使用web语言开发的,通过移动设备上面的浏览器来访问和使用,web开发的app费用较低,并且可以在线使用,另外支持许多移动设备,但也有许多缺点,比如打开速度慢,因为是基于浏览器访问的,还有一点就是功能很少,可以说没有公众号和小程序实用,还有就是很难在手机上调用某些功能,所以如果想要更实用的话,建议不要开发webapp。
另外一种app开发方式也是有用户使用的,即混合app开发,简单地说就是把原生app和H5两种开发技术结合在一起开发的app,具体的比例可以根据难易程度而定,没有标准的比例,混合开发的app优点是与许多平台兼容,比web端的app实现更多的功能,还有一个优势就是可以离线使用,缺点是目前的app开发技术还不够成熟,性能不如原生app,所以如果想要开发更好的app应用,还是应该考虑原生app开发。
本文来源:标梵互动

收起阅读 »

关于H5和uniapp中webview通信(踩坑日记)

在uniapp中webview会变成一个iframe,用uni.postMessage传递参数的时候在webview使用@message实际上是接收不到参数的,文档中又说可以使用$emit和$on,我亲测是不行,不排除我可能写错了吧。分享一下我的解决办法:
H5页面依旧是使用uni.postMessage,只是在web-view的页面要使用 window.addEventListener("message", this.receviceMsg);这里this.receviceMsg是@messgae调用的方法名~@message可以不需要啦!!!希望对大家有用~

继续阅读 »

在uniapp中webview会变成一个iframe,用uni.postMessage传递参数的时候在webview使用@message实际上是接收不到参数的,文档中又说可以使用$emit和$on,我亲测是不行,不排除我可能写错了吧。分享一下我的解决办法:
H5页面依旧是使用uni.postMessage,只是在web-view的页面要使用 window.addEventListener("message", this.receviceMsg);这里this.receviceMsg是@messgae调用的方法名~@message可以不需要啦!!!希望对大家有用~

收起阅读 »

国产社区都这么流氓吗????

git可以直接下载,gitee必须注册才能下载~
然后这个论坛,绑定了手机号还要强制绑邮箱才能发帖?

管理者心态太差了吧???

git可以直接下载,gitee必须注册才能下载~
然后这个论坛,绑定了手机号还要强制绑邮箱才能发帖?

管理者心态太差了吧???

关于MacOS 10.13.6系统,2.9.7正式版,运行ios真机,提示mdb错误的解决方案。

HBuilderX

此帖子仅仅适用于HBuilderX 2.9.7版本,不适用于其它版本。其它HBuilderX版本请忽略此贴。


关于MacOS 10.13.6系统,2.9.7正式版,运行ios真机,提示mdb错误的解决方案。

环境

MacOSX: 10.13.6系统
HBuilderX: 2.9.7正式版
手机系统:ios

问题

运行ios真机,提示mdb错误,具体错误如下:

Library not loaded: @executable_path/lib/libplist.3.dylib  
Referenced from: /Applications/HBuilderX.app/Contents/HBuilderX/plugins/launcher/tools/mdb/mdb  
Reason: Incompatible library version: mdb requires version 7.0.0 or later, but libplist.3.dylib provides version 5.0.0

受影响的操作系统

影响范围: MacOSX 10.13.6。

MacOSX 10.14.X, 10.15.X, 11.0.X, 不受影响。

原因

2020年10月,为了解决MacOSX big sur 11操作系统无法连接ios真机的问题,引出的新问题。

解决方案

下载附件中的mdb.zip,替换本机的mdb。

正式版替换路径:

/Applications/HBuilderX.app/Contents/HBuilderX/plugins/launcher/tools/mdb

alpha版本替换路径:

/Applications/HBuilderX-Alpha.app/Contents/HBuilderX/plugins/launcher/tools/mdb

MacOSX big sur 11.0.1 beta版本, 连接模拟器或android真机出错的解决方案

下载此ls.jar,替换本机的ls.jar. 下载地址:macosx big sur 11 beta ls.jar 下载地址

备注:替换前,要关闭HBuilderX

正式版替换路径:

/Applications/HBuilderX.app/Contents/HBuilderX/plugins/ls

alpha版本替换路径:

/Applications/HBuilderX-Alpha.app/Contents/HBuilderX/plugins/ls
继续阅读 »

此帖子仅仅适用于HBuilderX 2.9.7版本,不适用于其它版本。其它HBuilderX版本请忽略此贴。


关于MacOS 10.13.6系统,2.9.7正式版,运行ios真机,提示mdb错误的解决方案。

环境

MacOSX: 10.13.6系统
HBuilderX: 2.9.7正式版
手机系统:ios

问题

运行ios真机,提示mdb错误,具体错误如下:

Library not loaded: @executable_path/lib/libplist.3.dylib  
Referenced from: /Applications/HBuilderX.app/Contents/HBuilderX/plugins/launcher/tools/mdb/mdb  
Reason: Incompatible library version: mdb requires version 7.0.0 or later, but libplist.3.dylib provides version 5.0.0

受影响的操作系统

影响范围: MacOSX 10.13.6。

MacOSX 10.14.X, 10.15.X, 11.0.X, 不受影响。

原因

2020年10月,为了解决MacOSX big sur 11操作系统无法连接ios真机的问题,引出的新问题。

解决方案

下载附件中的mdb.zip,替换本机的mdb。

正式版替换路径:

/Applications/HBuilderX.app/Contents/HBuilderX/plugins/launcher/tools/mdb

alpha版本替换路径:

/Applications/HBuilderX-Alpha.app/Contents/HBuilderX/plugins/launcher/tools/mdb

MacOSX big sur 11.0.1 beta版本, 连接模拟器或android真机出错的解决方案

下载此ls.jar,替换本机的ls.jar. 下载地址:macosx big sur 11 beta ls.jar 下载地址

备注:替换前,要关闭HBuilderX

正式版替换路径:

/Applications/HBuilderX.app/Contents/HBuilderX/plugins/ls

alpha版本替换路径:

/Applications/HBuilderX-Alpha.app/Contents/HBuilderX/plugins/ls
收起阅读 »

Solarized Dark——HBuilder X主题

主题 HBuilder


主题:雅蓝
设置方法:修改Settings.json,保存,重启

{  
    "theme-custom.name": "Solarized Dark",  
    "theme-custom.author": "cxjfun",  
    "theme-custom.version": "0.0.1",  
    "theme-custom.date": "2020-11-06",  
    "editor.colorScheme": "Atom One Dark",  
    "workbench.colorCustomizations": {  
        "[Atom One Dark]": {  
            "button.background": "#16825d",  
            "button.foreground": "#ffffff",  
            "button.hoverBackground": "#329171",  
            "console.background": "#1e1e1e",  
            "debug.foreground": "#008cb3",  
            "editor.background": "#002b37",  
            "editor.foreground": "#fff",  
            "editorGroup.border": "#37575e",  
            "editorSuggestWidget.background": "#002b36",  
            "editorSuggestWidget.border": "#004052",  
            "editorSuggestWidget.link": "#16825d",  
            "editorSuggestWidget.selectedBackground": "#005a6f",  
            "extensionButton.border": "#16825d",  
            "extensionButton.checkColor": "#ffffff",  
            "extensionButton.prominentBackground": "#16825d",  
            "extensionButton.prominentForeground": "#fff3d5",  
            "extensionButton.prominentHoverBackground": "#329171",  
            "focusBorder": "#00b4e6",  
            "input.background": "#003847",  
            "input.border": "#003847",  
            "input.foreground": "#ffffff",  
            "inputList.border": "#00212b",  
            "inputList.foreground": "#3c3c3c",  
            "inputList.hoverBackground": "#003847",  
            "inputList.titleColor": "#ffffff",  
            "inputOption.activeBorder": "#16825d",  
            "inputValidation.infoBackground": "#00212b",  
            "list.activeSelectionBackground": "#005a6f",  
            "list.foreground": "#ffffff",  
            "list.highlightForeground": "#ffffff",  
            "list.hoverBackground": "#003946",  
            "minimap.handle.background": "#004052",  
            "notificationLink.foreground": "#16825d",  
            "notifications.background": "#003847",  
            "notifications.border": "#003847",  
            "outlineBackground": "#00212b",  
            "panelTitle.activeForeground": "#008cb3",  
            "scrollbarSlider.background": "#304a50",  
            "scrollbarSlider.hoverBackground": "#465356",  
            "settings.dropdownBackground": "#002b36",  
            "settings.dropdownBorder": "#16825d",  
            "settings.dropdownForeground": "#ffffff",  
            "settings.dropdownListBorder": "#002b36",  
            "settings.textInputBackground": "#00212b",  
            "settings.textInputBorder": "#002b36",  
            "settings.textInputDisableBackground": "#002b36",  
            "sideBar.background": "#004052",  
            "sideBar.border": "#004052",  
            "statusBar.background": "#006480",  
            "statusBar.foreground": "#ffffff",  
            "tab.activeBackground": "#002b37",  
            "tab.activeForeground": "#ffffff",  
            "tab.border": "#002b37",  
            "tab.hoverBackground": "#004052",  
            "tab.inactiveBackground": "#004052",  
            "tab.inactiveForeground": "#999999",  
            "terminal.background": "#00212b",  
            "toolBar.background": "#003847",  
            "toolBar.border": "#003847",  
            "toolBar.hoverBackground": "#003847"  
        }  
    },  
    "explorer.iconTheme": "vs-seti"  
}

继续阅读 »


主题:雅蓝
设置方法:修改Settings.json,保存,重启

{  
    "theme-custom.name": "Solarized Dark",  
    "theme-custom.author": "cxjfun",  
    "theme-custom.version": "0.0.1",  
    "theme-custom.date": "2020-11-06",  
    "editor.colorScheme": "Atom One Dark",  
    "workbench.colorCustomizations": {  
        "[Atom One Dark]": {  
            "button.background": "#16825d",  
            "button.foreground": "#ffffff",  
            "button.hoverBackground": "#329171",  
            "console.background": "#1e1e1e",  
            "debug.foreground": "#008cb3",  
            "editor.background": "#002b37",  
            "editor.foreground": "#fff",  
            "editorGroup.border": "#37575e",  
            "editorSuggestWidget.background": "#002b36",  
            "editorSuggestWidget.border": "#004052",  
            "editorSuggestWidget.link": "#16825d",  
            "editorSuggestWidget.selectedBackground": "#005a6f",  
            "extensionButton.border": "#16825d",  
            "extensionButton.checkColor": "#ffffff",  
            "extensionButton.prominentBackground": "#16825d",  
            "extensionButton.prominentForeground": "#fff3d5",  
            "extensionButton.prominentHoverBackground": "#329171",  
            "focusBorder": "#00b4e6",  
            "input.background": "#003847",  
            "input.border": "#003847",  
            "input.foreground": "#ffffff",  
            "inputList.border": "#00212b",  
            "inputList.foreground": "#3c3c3c",  
            "inputList.hoverBackground": "#003847",  
            "inputList.titleColor": "#ffffff",  
            "inputOption.activeBorder": "#16825d",  
            "inputValidation.infoBackground": "#00212b",  
            "list.activeSelectionBackground": "#005a6f",  
            "list.foreground": "#ffffff",  
            "list.highlightForeground": "#ffffff",  
            "list.hoverBackground": "#003946",  
            "minimap.handle.background": "#004052",  
            "notificationLink.foreground": "#16825d",  
            "notifications.background": "#003847",  
            "notifications.border": "#003847",  
            "outlineBackground": "#00212b",  
            "panelTitle.activeForeground": "#008cb3",  
            "scrollbarSlider.background": "#304a50",  
            "scrollbarSlider.hoverBackground": "#465356",  
            "settings.dropdownBackground": "#002b36",  
            "settings.dropdownBorder": "#16825d",  
            "settings.dropdownForeground": "#ffffff",  
            "settings.dropdownListBorder": "#002b36",  
            "settings.textInputBackground": "#00212b",  
            "settings.textInputBorder": "#002b36",  
            "settings.textInputDisableBackground": "#002b36",  
            "sideBar.background": "#004052",  
            "sideBar.border": "#004052",  
            "statusBar.background": "#006480",  
            "statusBar.foreground": "#ffffff",  
            "tab.activeBackground": "#002b37",  
            "tab.activeForeground": "#ffffff",  
            "tab.border": "#002b37",  
            "tab.hoverBackground": "#004052",  
            "tab.inactiveBackground": "#004052",  
            "tab.inactiveForeground": "#999999",  
            "terminal.background": "#00212b",  
            "toolBar.background": "#003847",  
            "toolBar.border": "#003847",  
            "toolBar.hoverBackground": "#003847"  
        }  
    },  
    "explorer.iconTheme": "vs-seti"  
}

收起阅读 »

离线推送,第三方厂商推送

走了不少弯路,写出来分享给大家,希望更多的人不要像我这像浪费时间了
直接上代码吧,

//app.vue中执行该方法
export function bindMsgClick(){
//监听系统通知栏消息点击事件
plus.push.addEventListener('click', function(msg){
//处理点击消息的业务逻辑代码
//{title:"标题",content:"内容",payload:"自定义数据"}
console.log(msg)
uni.navigateTo({
url: '///?reflush=true'
})
}, false);
plus.push.addEventListener('receive', function(msg){
plus.push.createMessage(msg.content, message.payload, {
title: message.title
})
});
}

//登录成功之后绑定cid
export function updateCid(){
var pinf = plus.push.getClientInfo();
console.log('client',pinf.clientid)
request.post("/**/",{client:pinf.clientid}).then(res=>{
console.log(res.data)
});
}

后端代码如下,

//发消息给个人
public static String sendMsg(String clientId){
// 获取应用基本信息
IGtPush push = new IGtPush(host, appKey, masterSecret);
// 选择透传通知模板,个推离线只支持透传
TransmissionTemplate template = new TransmissionTemplate();
template.setAppId(appId);
template.setAppkey(appKey);

    JSONObject msg = new JSONObject();  
    msg.put("title","离线消息测试");  
    msg.put("content","---离线消息测试---");  

    String payload = msg.toString();  
    template.setTransmissionContent(payload);    // 设置透传内容  
    template.setTransmissionType(2);    // 2代表客户端收到消息后需要自行处理  

    // 配置第三方厂商推送  
    Notify notify = new Notify();  
    notify.setTitle(msg.getString("title"));  
    notify.setContent(msg.getString("content"));  
    notify.setType(GtReq.NotifyInfo.Type._intent);  
    // 设置intent 注意格式要正确(修改你的包名)  
    notify.setIntent("intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;" +  
        "package=uni.包名.包名;" +  
        "component=uni.包名.包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +  
        "S.title=" + msg.getString("title") + ";" +  
        "S.content="+ msg.getString("content") + ";" +  
        "S.payload=" + payload + ";end");  
    notify.setPayload(payload);  
    template.set3rdNotifyInfo(notify);  

    List<String> appIds = new ArrayList<>();  
    appIds.add(appId);  
    SingleMessage message = new SingleMessage();  
    message.setData(template);  
    message.setOffline(true);  
    message.setOfflineExpireTime(8* 1000 * 3600);    // 离线有效时间 单位毫秒  
    message.setStrategyJson("{\"default\":4}");  
    Target target = new Target();  
    target.setAppId(appId);  
    target.setClientId(clientId);  
    IPushResult ret = null;  
    try {  
        ret = push.pushMessageToSingle(message, target);  
    } catch (RequestException e) {  
        e.printStackTrace();  
        ret = push.pushMessageToSingle(message, target, e.getRequestId());  
    }  
    if (ret != null) {  
        System.out.println(ret.getResponse().toString());  
        return ret.getResponse().toString();  
    } else {  
        System.out.println("服务器响应异常");  
        return "服务器响应异常";  
    }  
}  

在后台配置好自己申请的第三方厂商的key,就可以杀掉app进程,向app推送消息了
目前只在小米手机上测试通过了

继续阅读 »

走了不少弯路,写出来分享给大家,希望更多的人不要像我这像浪费时间了
直接上代码吧,

//app.vue中执行该方法
export function bindMsgClick(){
//监听系统通知栏消息点击事件
plus.push.addEventListener('click', function(msg){
//处理点击消息的业务逻辑代码
//{title:"标题",content:"内容",payload:"自定义数据"}
console.log(msg)
uni.navigateTo({
url: '///?reflush=true'
})
}, false);
plus.push.addEventListener('receive', function(msg){
plus.push.createMessage(msg.content, message.payload, {
title: message.title
})
});
}

//登录成功之后绑定cid
export function updateCid(){
var pinf = plus.push.getClientInfo();
console.log('client',pinf.clientid)
request.post("/**/",{client:pinf.clientid}).then(res=>{
console.log(res.data)
});
}

后端代码如下,

//发消息给个人
public static String sendMsg(String clientId){
// 获取应用基本信息
IGtPush push = new IGtPush(host, appKey, masterSecret);
// 选择透传通知模板,个推离线只支持透传
TransmissionTemplate template = new TransmissionTemplate();
template.setAppId(appId);
template.setAppkey(appKey);

    JSONObject msg = new JSONObject();  
    msg.put("title","离线消息测试");  
    msg.put("content","---离线消息测试---");  

    String payload = msg.toString();  
    template.setTransmissionContent(payload);    // 设置透传内容  
    template.setTransmissionType(2);    // 2代表客户端收到消息后需要自行处理  

    // 配置第三方厂商推送  
    Notify notify = new Notify();  
    notify.setTitle(msg.getString("title"));  
    notify.setContent(msg.getString("content"));  
    notify.setType(GtReq.NotifyInfo.Type._intent);  
    // 设置intent 注意格式要正确(修改你的包名)  
    notify.setIntent("intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;" +  
        "package=uni.包名.包名;" +  
        "component=uni.包名.包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;" +  
        "S.title=" + msg.getString("title") + ";" +  
        "S.content="+ msg.getString("content") + ";" +  
        "S.payload=" + payload + ";end");  
    notify.setPayload(payload);  
    template.set3rdNotifyInfo(notify);  

    List<String> appIds = new ArrayList<>();  
    appIds.add(appId);  
    SingleMessage message = new SingleMessage();  
    message.setData(template);  
    message.setOffline(true);  
    message.setOfflineExpireTime(8* 1000 * 3600);    // 离线有效时间 单位毫秒  
    message.setStrategyJson("{\"default\":4}");  
    Target target = new Target();  
    target.setAppId(appId);  
    target.setClientId(clientId);  
    IPushResult ret = null;  
    try {  
        ret = push.pushMessageToSingle(message, target);  
    } catch (RequestException e) {  
        e.printStackTrace();  
        ret = push.pushMessageToSingle(message, target, e.getRequestId());  
    }  
    if (ret != null) {  
        System.out.println(ret.getResponse().toString());  
        return ret.getResponse().toString();  
    } else {  
        System.out.println("服务器响应异常");  
        return "服务器响应异常";  
    }  
}  

在后台配置好自己申请的第三方厂商的key,就可以杀掉app进程,向app推送消息了
目前只在小米手机上测试通过了

收起阅读 »

H5 UDP客户端(安卓) 含接收、发送、中文消息

UDP

首先,我是在大佬的提示下,综合了一下,在安卓上解决了H5 UDP接收消息和发送消息的问题,而且中文也解决了。

我把代码发到CSDN上文章上了,点击这里,真实可用哦,

继续阅读 »

首先,我是在大佬的提示下,综合了一下,在安卓上解决了H5 UDP接收消息和发送消息的问题,而且中文也解决了。

我把代码发到CSDN上文章上了,点击这里,真实可用哦,

收起阅读 »