GVKun编程网logo

一个项目带你掌握uni-app+uniCloud实战,同时搞定前后端!(uni app对接后端接口)

2

在本文中,我们将给您介绍关于一个项目带你掌握uni-app+uniCloud实战,同时搞定前后端!的详细内容,并且为您解答uniapp对接后端接口的相关问题,此外,我们还将为您提供关于7.app和ap

在本文中,我们将给您介绍关于一个项目带你掌握uni-app+uniCloud实战,同时搞定前后端!的详细内容,并且为您解答uni app对接后端接口的相关问题,此外,我们还将为您提供关于7.app 和 app 后端的通讯、ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j、Android APP 卸载守护,双 APP 相互守护、Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示的知识。

本文目录一览:

一个项目带你掌握uni-app+uniCloud实战,同时搞定前后端!(uni app对接后端接口)

一个项目带你掌握uni-app+uniCloud实战,同时搞定前后端!(uni app对接后端接口)

不知道你们有没有这种时候,脑子里想到一个好点子,却因为不会后端技术(或者前端技术),想法只能是想法。


但今天要给大家介绍的这个工具组合,可以让你一个人搞定前后端并快速上线无论你是想做一些小程序实现自己的想法,还是0成本搞副业、创业,这个组合都能帮到你。有人曾用这个组合开发出一款小程序,拿到了天使轮投资。


这个组合就是uni-app+uniCloud。


uniCloud 是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台以往如果你想做全栈,你得学后端语言、数据库设计、sql、服务器运维等等,但用uniCloud,你只需要会JavaScript和一些延伸技术这对前端工程师来说太友好了,简直是通往全栈的捷径。

而uni-app是跨端开发神器,我们只需编写一套代码,就可以发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台,非常方便。


uni-app功能框架图


利用uni-app加上uniCloud,你的想法可以快速完成并上线。并且uni-app和uniCloud是免费使用的,除了开发的时间成本,你不需要额外的现金投入如果你想工作之余赚点钱,或者想利用自己的技术创业,那学会使用uni-app和uniCloud是再好不过的选择。


如何使用uni-app+uniCloud开发产品?


大家不用去看文档和找官方教程了,案例比较少且文档不是很清晰。


给大家推荐一个《uni-app+uniCloud实战训练营》,主讲大帅老师将带大家用这两个工具从0到1开发一个基于个人书架的社交小程序,大帅老师可是靠这个小程序拿到过天使轮投资的


如果你想一个人搞定前后端,做些小工具赚点外快,那无论你是前端开发者还是后端开发者,来学习都会有收获!


uni-app+uniCloud实战训练营

3天直播+5天社群服务+惊喜福利

仅需0.99元

扫码立刻加入

 

参加直播课,课后还能获得


《从0开始学习:初识Flutter》视频课

《从0学习创建微信小游戏项目》视频课

《非常实用的前端开发优化技巧》视频课

《农场果园种菜偷菜uniCloud版》源码


PS:报名后一定要加班班微信

以便激活课程和后续领资料


为什么推荐这个训练营?
0 1

主讲老师精通跨端云开发

是连续创业的独立开发者



主讲大帅老师,也许你没有听过他的名字,但你大概率用过他开发的程序员鼓励师插件:彩虹屁老婆——能在你敲代码的时候给你爱的鼓励,还能变换各种声音和形象。



2019年垃圾分类刚实行的时候,大帅老师用1天时间开发的垃圾拍照分类小程序,2 周积累 6 万用户,懂一点运营知识的朋友应该知道这 6 万用户背后的经济价值,以及 2 周 0 预算实现 6 万粉的难度。


他还是一位连续创业者,曾进入黑马创业大赛决赛,熟知作为独立开发者的变现逻辑。


挖到过钻石的人才能带你找到钻石。这三天,大帅老师会基于【有社交功能的个人书架项目】,教你如何利用跨端云开发技术制作小程序以及如何推广自己的小程序。


大帅老师在B站也会经常发布一些项目教程,感兴趣的可以到B站围观。



0 2

带你从0到1快速上线一个项目



本次训练营的实战项目是【有社交功能的个人书架管理小程序】。大帅老师曾靠这个产品拿到过天使轮投资。


这个小程序的起初想法很简单,就是想整理下家里过多的图书,做一个电子书架。后来想到,每个人家里都有图书,如果让大家能直观看到附近的人家里都有什么书,让书流动起来,是不是就可以互相交流、因书结缘呢?于是就添加了地图等各种功能。


(项目截图)


在这三天里,大帅老师将带着大家用uni-app和uniCloud,从0开始上线这款产品,同时搞定前后端。


主要涉及到的技术点:


  • 微信小程序自定义导航实现

  • 微信小程序getUserProfile

  • JWT用户凭证机制

  • uniCloud云函数,公共模块

  • 云函数操作云数据库

  • 云数据库聚合查询

  • 云函数开发爬虫

  • 微信小程序海报机制设计

  • 微信小程序订阅消息


0 3

技术、业务两手抓

不仅讲技术实战,还讲传播引流



对于程序员来讲,技术方面好上手,但是一个产品开发出来,如何传播、如何推广、如何吸引流量是另一个范畴的事情,酒香也怕巷子深。


所以,在前两天技术实战的基础上,第三天的课程,会告诉你如何去传播产品,吸引流量。具体课程内容如下:



0 4

专业老师答疑

及作业点评


本次训练营除了主讲大帅老师,还配备有专业的助教老师,你在课程或者做作业中遇到的技术问题,都可以在微信群中提问,助教看到后会及时帮你解决。


除了上课,还会有作业点评,让你知道自己的问题在哪,有反馈,有建议,让你学有所得.


同时,助教老师还将在社群收集面试简历,在课上交由老师进行分析,幸运学员还可获得简历修改的福利名额哦



0 5

参加课程

还将获得惊喜福利!


来上课的同学,每天都能获得高质量资料。


3天课程全部上完的同学,还可额外获赠大帅老师出品的DCloud售价899元的《农场果园种菜偷菜uniCloud版》源码!



仅需0.99元

扫码立刻加入

 

PS:报名后一定要加班班微信

以便激活课程和后续领资料

本文分享自微信公众号 - 前端进阶学习交流(gh_cf4e462f0835)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

7.app 和 app 后端的通讯

7.app 和 app 后端的通讯

【转载】 作者:曾健生,公众号 IDappbackend

                 比目科技

 

经常有开发者问:app 和后端通讯是用 http 协议还是私有的协议?是用长连接还是短连接?通过阅读本文,帮你解除上面的疑问。

 

1)是用 http 协议还是私有的协议?

 

在间谍电视剧中,经常能看到间谍们的书信都是用暗号的,就算书信被敌人截取了不怕,需要耗费一定的时间,敌人才能解开书信中的秘密。

 

在电影 < 阿凡达 >, 为提升故事真实性,詹姆斯卡梅隆甚至找到语言学家,专为纳美人创造了一种自己的语言。我们看这部电影的时候,根本听不懂潘多拉星球上的纳美外星人到底说什么?纳美语共有大约 1000 个单词,全球能够掌握其语法的人只有创造这门语言的 PaulFrommer 教授一人,而且就算他本人也仍然在学习如何更流畅的说纳美语。

 

如果间谍们使用的都是大家都懂的中文,敌人截取到书信,就能立刻知道里面的内容。

 

如果潘多拉星球上的纳美外星人说的是中文,那么很多人一听就知道他们是说啥。

 

同样的,app 和后端的通讯,可以分为用通用的语言通讯,还是用暗语通讯两种方式。

 

通用的语言有很多种,例如英语和中文,在网络的通讯中,通用的协议有很多,其中 http 是被最广泛使用的。如果是私有的协议,那就只能自己设计了。

 

http 是最方便的,如果是私有协议,包含协议的封装和拆解,工作量大,前端程序员和后端程序员都要增加很多额外的工作量。而且私有协议对程序员的要求高,不适合从 web 网站转过来的开发者。除非是手游,不然用 http 就好了。

 

2app 和服务器通讯使用长连接还是短连接?

 

假设现在通过手机拨打另外一个人的手机,手机通话费用非常便宜(甚至可以忽略),但是有两个注意的地方:

1。一台手机同一时间只能接听一个电话。

2。一台手机接听电话前非常麻烦,要拨号啦,要等接听,这需要一段时间。

 

app 和服务器通讯使用长连接还是短连接这个问题,可以等同于上面电话模型,是一直保持着通话,还是有需要时才拨号通话这个问题?

 

app 和服务器通讯使用长连接,就相当于一直保持着通话,服务器能保持的通讯数量有限,如果通讯满了,那其他 app 就不能和服务端通讯了。这种通讯方式,多数是使用 socket websocket 连接长时间连接,对程序员的要求比较高,开发比较困难,除了手游和聊天推送服务外,不建议使用。

 

app 和服务器通讯使用短连接,就相当于需要时才拨号通话。这种通讯方式,配合 http 协议,是现在主流的通讯方式,开发效率高,有大量的第三方资源,使用非常广泛,推荐使用这种方式。

3app 和后端是怎么通讯的?

 

相信大家都用过银行的柜员机 (ATM) 的查询余额,转帐,取款等操作。

 

当在柜员机取款的时候,我们输入要取款的金额,隔一会钱就出来了,如果因为有什么问题不能取款(例如超过取款金额的限制),屏幕上也会显示出错误的信息。

 

在整个过程中,我们只要输入金额,获得结果(取款成功或不成功),就行了,至于柜员机内部是怎么处理,我们不需要理会。

 

柜员机这种把内部的处理遮蔽的做法极大方便了我们的使用。

 

同样的,在后端,也只提供了一系列的功能给 app 使用,这系列的功能以 api 的形式提供。

 

api 的定义:APIApplicationProgramming Interface, 应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

 

app 调用 api 的时候,只需要明确下面3点:

1。这个 api 是干啥的(柜员机例子中,是取款功能,还是查询余额 , 还是转账)

2。知道要输入什么(柜员机例子中,取款要输入金钱)

3。知道结果是什么(柜员机例子中,取款是成功还是失败)

 

至于 api 内部是怎么处理的,app 根本无需理会。

 

api,一般是以 http 的形式调用的,通过 http 传入参数,返回结果。其中,结果一般是以 json 格式返回的,因为 json 格式被众多计算机语言支持,而且省流量。

ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j

ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j

如何解决ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j

我正在Rails上执行此应用程序,页面加载正常,但在控制台中显示:

Started GET "/vendor/assets/stylesheets/bootstrap.min.css" for ::1 at 2020-08-17 09:09:51 -0500

Started GET "/vendor/assets/javascripts/bootstrap.min.js" for ::1 at 2020-08-17 09:09:51 -0500
ActionController::RoutingError (No route matches [GET] 
"/vendor/assets/stylesheets/bootstrap.min.css"):
ActionController::RoutingError (No route matches [GET] 
"/vendor/assets/javascripts/bootstrap.min.js"):

在我的供应商文件夹中,我同时拥有文件夹,javascript和样式表,并分别位于各自的bootsrtrap.min中。 即使在application.html.erb中,我也有以下内容:

  <link href="vendor/assets/stylesheets/bootstrap.min.css" rel="stylesheet">
  <%= csrf_Meta_tags %>
  <%= stylesheet_link_tag    ''application'',media: ''all'',''data-turbolinks-track'': ''reload'' %>
  <%= javascript_include_tag ''application'',''data-turbolinks-track'': ''reload'' %>

</head>
<body>

  <!-- Navigation -->
  <nav>
    <div>
      <ahref="#">Instagram Clone</a>
      <buttontype="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
        <span></span>
      </button>
      <divid="navbarResponsive">
        <ul>
          <li>
            <ahref="#">Home
              <span>(current)</span>
            </a>
          </li>
          <li>
            <ahref="#">About</a>
          </li>
          <li>
            <ahref="#">Services</a>
          </li>
          <li>
            <ahref="#">Contact</a>
          </li>
        </ul>
      </div>
    </div>
  </nav>

  <!-- Page Content -->
  <div>
    <div>
      <div>
        <%= yield %>
      </div>
    </div>
  </div>

  <!-- Bootstrap core JavaScript -->
  <!--<script src="vendor/jquery/jquery.slim.min.js"></script>-->
  <script src="vendor/assets/javascripts/bootstrap.min.js"></script>
    
</body>
</html>

在js和CSS这两个应用程序文件中,我都放置了“ require bootsrtrap.min”,即使该错误仍然出现在控制台中。 会是什么?

解决方法

RoR不使用目录作为文件夹结构指示。因为有资产装载者。您应该将5s或更少的css导入application.css中,并将js导入application.js中。并使用自己的助手添加捆绑文件:

1。用纱安装靴子

yarn add bootstrap @popperjs/core jquery

npm i bootstrap @popperjs/core jquery

栏位不超过5

2。在Assets Pipeline中导入文件

app / assets / stylesheets / application.css:

//...
require bootstrap/dist/css/bootstrap.min
//...

但是,如果需要,我建议使用SCSS并仅导入所需的样式。

app / assets / javascript / application.js:

//...
//= require jquery
//= require @popperjs/core
//= require bootstrap/dist/js/bootstrap.min
//...

3。在布局中导入资产

app / views / layout / application.html.erb:

<head>
...
  <%= stylesheet_link_tag ''application'',media: ''all'' %>
</head>
<body>
...
  <%= javascript_include_tag ''application'' %>
</body>

使用webpack滚动6

2。在application.scss和application.js中导入Bootstrap

app / javascript / stylesheets / application.scss:

//...
import ''bootstrap''
//...

app / javascript / packs / application.js:

import ''jquery''
import ''popper.js''
import ''bootstrap''
import ''../stylesheets/application''

3。在布局中导入捆绑包

<head>
...
  <%= stylesheet_pack_tag ''application'',media: ''all'',''data-turbolinks-track'': ''reload'' %>
  <%= javascript_pack_tag ''application'',''data-turbolinks-track'': ''reload'' %>
</head>

之后,您应该可以在所有应用程序中使用引导程序!

,

[解决方案]因此,在我的HTML(application.html.erb)内部,我有两个对js和css文件的调用:

<script src="assets/javascripts/bootstrap.min.js"></script>
  <%= javascript_include_tag ''application'',''data-turbolinks-track'': ''reload'' %>       
<link href="assets/stylesheets/bootstrap.min.css" rel="stylesheet">
  <%= csrf_meta_tags %>
  <%= stylesheet_link_tag    ''application'',''data-turbolinks-track'': 
  ''reload'' %>

正如您在上面看到的那样,在使用javascript的情况下,我有一个使用脚本的调用,而另一个使用了的调用,两者都造成了问题,所以您只需要评论一个,我就对该脚本进行评论对于我的java文件和CSS文件,一个。 像这样:

  <!--<link href="assets/stylesheets/bootstrap.min.css" rel="stylesheet">-->
    <!--<script src="assets/javascripts/bootstrap.min.js"></script>-->

对我来说,解决了这个问题,我真的尝试了所有事情,这就是解决方案哈哈。

Android APP 卸载守护,双 APP 相互守护

Android APP 卸载守护,双 APP 相互守护

介绍一种当用户或者其他软件卸载你的应用时,其守护应用守护该应用重新安装至系统的方案。


方案缺点:

1、当具有 root 权限的删除时无法守护 (rm data/app/*.apk)

2、当为非 root 手机时,采用显示安装,用户可选择取消安装

方案优点:

1、使用传统手法卸载软件时具有 root 权限时可顽固守护

2、双应用守护,无法卸载其中任何一个


方案原理:

采用 BroadcastReceiver 接收拦截的应用卸载的消息,(由于系统原因,当接收到消息时,系统已经卸载了该应用才发出的消息,所以无法像短信拦截一样直接拦截)。

1、 接收到应用卸载信息

2、判断包名是否为需要守护的包名

3、如果是则启动重新安装

4、使用静默安装

5、如果失败使用普通安装


方案代码:

BroadcastReceiver

public class ProtectReceiver extends BroadcastReceiver {
	private static final String TAG = "ProtectReceiver";
	private String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
	private String PRO_APK_PATH = "/sdcard/test.apk"//需修改

	@Override
	public void onReceive(Context context, Intent intent) {
		if (ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
		        //需修改
			if ("package:com.rapida.test".equals(intent.getDataString())) {
				reInstallApp(context);
			}
		}
	}

	private void reInstallApp(Context context) {
		if (!installSlient(context, PRO_APK_PATH)) {
			install(context, PRO_APK_PATH);
		}
	}

	private void install(Context context, String filePath) {
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + filePath),
				"application/vnd.android.package-archive");
		i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		context.startActivity(i);
	}

	private boolean installSlient(Context context, String filePath) {
		String[] args = { "pm""install""-r", filePath };
		ProcessBuilder processBuilder = new ProcessBuilder(args);

		Process process = null;
		BufferedReader successResult = null;
		BufferedReader errorResult = null;
		StringBuilder successMsg = new StringBuilder();
		StringBuilder errorMsg = new StringBuilder();
		boolean result = false;
		try {
			process = processBuilder.start();
			successResult = new BufferedReader(new InputStreamReader(
					process.getInputStream()));
			errorResult = new BufferedReader(new InputStreamReader(
					process.getErrorStream()));
			String s;

			while ((s = successResult.readLine()) != null) {
				successMsg.append(s);
			}

			while ((s = errorResult.readLine()) != null) {
				errorMsg.append(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
			result = false;
		} catch (Exception e) {
			e.printStackTrace();
			result = false;
		} finally {
			try {
				if (successResult != null) {
					successResult.close();
				}
				if (errorResult != null) {
					errorResult.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (process != null) {
				process.destroy();
			}
		}

		if (successMsg.toString().contains("Success")
				|| successMsg.toString().contains("success")) {
			result = true;
		} else {
			result = false;
		}

		return result;
	}

添加权限

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

添加 receiver

<receiver android:name=".ProtectReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
</receiver>


程序应用:

在需要守护的应用里添加如上代码,因为是相互守护,需要在两个应用里都添加如上代码。


Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示

Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示

Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示

Android 实现不同 Launcher 桌面角标的坑 (Badge)

 

今天的关于一个项目带你掌握uni-app+uniCloud实战,同时搞定前后端!uni app对接后端接口的分享已经结束,谢谢您的关注,如果想了解更多关于7.app 和 app 后端的通讯、ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j、Android APP 卸载守护,双 APP 相互守护、Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示的相关知识,请在本站进行查询。

本文标签: