微信登录的接口

目录

    • 第一步:生成微信扫描二维码(网页内嵌的二维码)接口
    • 第二步:处理微信回调 ,获取扫描人信息

微信开放平台:

https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html

第一步:生成微信扫描二维码(网页内嵌的二维码)接口

提供了第二种获取 code 的方式,支持网站将微信登录二维码内嵌到自己页面中,用户使用微信扫码授权后通过 JS 将code返回给网站。 JS微信登录主要用途:网站希望用户在网站内就能完成登录,无需跳转到微信域下登录后再返回,提升微信登录的流畅性与成功率。 网站内嵌二维码微信登录 JS 实现办法:

步骤1:在页面中先引入如下 JS 文件(支持https):

http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js

步骤2:在需要使用微信登录的地方实例以下 JS 对象:

var obj = new WxLogin({self_redirect:true,id:"login_container", appid: "", scope: "", redirect_uri: "",state: "",style: "",href: ""});

参数说明
在这里插入图片描述
我们需要写必须的那几个参数;

生成微信扫描二维码(网页内嵌的二维码)接口.此几口返回的数据是:生成二维码需要的参数

注意:接口的后台需要准备这几个参数:

appid : 应用唯一标识,在微信开放平台提交应用审核通过后获得
scope :应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
redirect_uri : 重定向地址,需要进行UrlEncode
state : 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验

1.需要在显示二维码的页面 引入前端api接口:

import weixinApi from ‘@/api/weixin’

2.然后在 mounted() 方法中添加以下方法

  mounted() {//初始化微信jsconst script = document.createElement('script')script.type = 'text/javascript'script.src = 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'document.body.appendChild(script)},

3、实例化微信JS对象
添加微信登录方法,即点击微信登录按钮,触发展示微信二维码的方法:

weixinLogin() {this.dialogAtrr.showLoginType = 'weixin'weixinApi.getLoginParam().then(response => {var obj = new WxLogin({self_redirect:true,id: 'weixinLogin', // 需要显示的容器idappid: response.data.appid, // 公众号appid wx*******scope: response.data.scope, // 网页默认即可redirect_uri: response.data.redirectUri, // 授权成功后回调的urlstate: response.data.state, // 可设置为简单的随机数加session用来校验style: 'black', // 提供"black"、"white"可选。二维码的样式href: '' // 外部css文件url,需要https})})
},

然后记得网关设置:

在这里插入图片描述

测试二维码展示:

第二步:处理微信回调 ,获取扫描人信息

在这里插入图片描述

手机点击确认后的:

请求网址: http://localhost:8160/api/ucenter/wx/callback?code=0815s6ll2O8vK94DBoll2u3htf45s6lP&state=1661166686989

请求网址: http://localhost:8160/api/ucenter/wx/callback?code=091927ll2UTvK94eW6nl2segEs3927lr&state=1661167265572

简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。

四、令牌与密码
令牌(token)与密码(password)的作用是一样的,都可以进入系统,但是有三点差异。

(1)令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。

(2)令牌可以被数据所有者撤销,会立即失效。以上例而言,屋主可以随时取消快递员的令牌。密码一般不允许被他人撤销。

(3)令牌有权限范围(scope),比如只能进小区的二号门。对于网络服务来说,只读令牌就比读写令牌更安全。密码一般是完整权限。

上面这些设计,保证了令牌既可以让第三方应用获得权限,同时又随时可控,不会危及系统安全。这就是 OAuth 2.0 的优点。

注意,只要知道了令牌,就能进入系统。系统一般不会再次确认身份,所以令牌必须保密,泄漏令牌与泄漏密码的后果是一样的。 这也是为什么令牌的有效期,一般都设置得很短的原因。


在这里插入图片描述

  1. 客户应用请求授权服务器获取Access Token
  2. 授权服务器咨询用户意见
  3. 用户同意授权
  4. 授权服务器颁发Access Token 给 客户应用

在这里插入图片描述

在这里插入图片描述

创建工具类:httpclint:

在server_user模块:
在这里插入图片描述

在common-util中引入httpclient依赖:

<!--httpclient--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>

在这里插入图片描述

在这里插入图片描述

第二步:通过 code 获取access_token

通过 code 获取access_token

https://api.weixin.qq.com/sns/oauth2/
access_token?appid=APPID
&secret=SECRET&
code=CODE&
grant_type=authorization_code

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

说明:我们根据返回openid判断是否需要绑定手机号码,如果需要绑定,那么我们要根据openid用户用户信息,然后更新上手机号码

前端:

3.4 回调返回页面
操作:yygh-site
说明:我们只期望返回一个空页面,然后跟登录层通信就可以了,其实就是一个过渡页面,所以我们要给这个过渡页面定义一个空模板

3.4.2回调返回页面
根据返回路径/weixin/cakkback,我们创建组件/weixin/cakkback.vue

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

说明:在页面我们就能够接收到返回来的参数

3.4.3 父组件定义回调方法
在myheader.vue添加方法

mounted() 中增加方法:

 // 微信登录回调处理let self = this;window["loginCallback"] = (name,token, openid) => {self.loginCallback(name, token, openid);}

然后methods中增加方法:

loginCallback(name, token, openid) {// 打开手机登录层,绑定手机号,改逻辑与手机登录一致if(openid != '') {this.userInfo.openid = openidthis.showLogin()} else {this.setCookies(name, token)}},

3.5 服务器绑定手机号码
页面绑定手机号码会把openid传递过来,我们根据openid找到用户信息,然后绑定手机号码
修改UserInfoServiceImpl类登录方法

 //绑定手机号码UserInfo userInfo = null;if(!StringUtils.isEmpty(loginVo.getOpenid())) {userInfo = this.selectWxInfoOpenId(loginVo.getOpenid());if(null != userInfo) {userInfo.setPhone(loginVo.getPhone());this.updateById(userInfo);} else {throw new YyghException(ResultCodeEnum.DATA_ERROR);}}if(userInfo == null){//判断是否第一次登录,根据手机号查询数据库,如果不存在相同的手机号就是第一次登录QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();wrapper.eq("phone",phone);userInfo = baseMapper.selectOne(wrapper);if(null==userInfo ){//第一次使用这个手机号登录//添加信息到数据库userInfo = new UserInfo();userInfo.setName("");userInfo.setPhone(phone);userInfo.setStatus(1);//设置可用//this.save(userInfo);//保存到数据库baseMapper.insert(userInfo);}}

在这里插入图片描述

package com.fan.yygh.user.controller;import com.alibaba.fastjson.JSONObject;
import com.fan.yygh.common.exception.YyghException;
import com.fan.yygh.common.result.Result;
import com.fan.yygh.common.result.ResultCodeEnum;
import com.fan.yygh.helper.JwtHelper;
import com.fan.yygh.model.user.UserInfo;
import com.fan.yygh.user.service.UserInfoService;
import com.fan.yygh.user.utils.ConstantPropertiesUtil;
import com.fan.yygh.user.utils.HttpClientUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
//微信操作的接口
@Api("微信")
@Controller
@RequestMapping("/api/ucenter/wx")
public class WeixinApiController {@Resourceprivate UserInfoService userInfoService;/*** 获取微信登录参数* 1.生成微信扫描二维码* 返回生成二维码需要的参数*/@GetMapping("getLoginParam")@ResponseBodypublic Result genQrConnect() throws UnsupportedEncodingException {String redirect_uri = URLEncoder.encode(ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL, "UTF-8");Map<String, Object> map = new HashMap<>();map.put("appid", ConstantPropertiesUtil.WX_OPEN_APP_ID);map.put("redirect_uri", redirect_uri);map.put("scope", "snsapi_login");map.put("state", System.currentTimeMillis()+"");//System.currentTimeMillis()+""return Result.ok(map);}//微信扫描后回调的方法@GetMapping("callback")public String callback(String code,String state){//第一步,获取 临时授权临时票据codeSystem.out.println("code:"+code);//第二步:拿着code和微信appid和秘钥appscrect(三个参数换一个参数),--》请求微信固定地址--》换取access_tokenStringBuffer baseAccessTokenUrl = new StringBuffer().append("https://api.weixin.qq.com/sns/oauth2/access_token").append("?appid=%s").append("&secret=%s").append("&code=%s").append("&grant_type=authorization_code");//baseAccessTokenUrl的参数填充String accessTokenUrl = String.format(baseAccessTokenUrl.toString(),ConstantPropertiesUtil.WX_OPEN_APP_ID, //参数一appidConstantPropertiesUtil.WX_OPEN_APP_SECRET, //参数二appscreccode); //参数三code//使用httpclient请求这个地址String accessTokenInfo  = null;try {//使用三个参数换取token,accessTokenInfo包含token令牌信息accessTokenInfo = HttpClientUtils.get(accessTokenUrl);//accessTokenUrl包含三个参数/*令牌accessTokenInfo:{"access_token":"60_jEgLorfJRsMwTfuDdzUN_7mApa4D7c","expires_in":7200,"refresh_token":"60_LPZ7M5sigEJ_wB09HKCeMETuYwLBjg","openid":"o3_SC5yAwrC4BO587_u3_llgcHZU","scope":"snsapi_login","unionid":"oWgGz1KqBehsbtgjrIjCR8-5hxkU"}*/System.out.println("使用code换取的access_token结果accessTokenInfo:"+accessTokenInfo);/*=============================以下是对换取的token做处理=======================================*///从返回字符串拿到两个值openid  和 access_tokenJSONObject jsonObject = JSONObject.parseObject(accessTokenInfo);String access_token = jsonObject.getString("access_token");String openid = jsonObject.getString("openid");//判断数据库是否存在微信的扫描人信息,根据openid判断UserInfo userInfo = userInfoService.selectWxInfoOpenId(openid);if(userInfo == null){ //数据库不存在微信信息//第三步:拿着openid 和access_token 请求微信地址,得到扫码人 信息//根据access_token获取微信用户的基本信息//先根据openid进行数据库查询// UserInfo userInfo = userInfoService.getByOpenid(openId);// 如果没有查到用户信息,那么调用微信个人信息获取的接口// if(null == userInfo){//如果查询到个人信息,那么直接进行登录//使用access_token换取受保护的资源:微信的个人信息//换取token的地址:   https://api.weixin.qq.com/sns/oauth2/access_token//换取user信息的地址:https://api.weixin.qq.com/sns/userinfoString baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +"?access_token=%s" +"&openid=%s";String userInfoUrl = String.format(baseUserInfoUrl, access_token, openid);String resultInfo = HttpClientUtils.get(userInfoUrl);//得到扫码 用户信息resultInfo,是一个json字符串/*扫码人信息resultInfo:{"openid":"o3_SC5yAwrC4BO587_u3_llgcHZUxxx","nickname":"xxx","sex":0,"language":"","city":"","province":"","country":"","headimgurl":"https:\23\/132","privilege":[],"unionid":"oWgGz1KqBehsbtgjrIjCR8-5hxkU"}*///================第四步:利用access_token 和openid  换取 扫码人信息=============System.out.println("扫码人信息resultInfo:"+resultInfo);//解析用户信息,将string转成json对象JSONObject resultUserInfoJson = JSONObject.parseObject(resultInfo);String nickname = resultUserInfoJson.getString("nickname");//得到用户昵称String headimgurl = resultUserInfoJson.getString("headimgurl");//得到用户头像//获取扫码人信息 并添加到数据库userInfo = new UserInfo();userInfo.setName(nickname);userInfo.setOpenid(openid);userInfo.setStatus(1);//保存到数据库userInfoService.save(userInfo);}//返回name和token令牌字符串HashMap<String, String> map = new HashMap<>();String name = userInfo.getName();if(StringUtils.isEmpty(name)){name = userInfo.getNickName();}if(StringUtils.isEmpty(name)){name = userInfo.getPhone();}map.put("name",name);//将名字放入map//要求每个微信用户要绑定手机号,判断userInfo是否有手机号,// 如果手机号为空,返回openid//如果手机号不为空,返回openid值是空字符串//前端判断:如果openid不为空,绑定手机号,如果openid为空,不需要绑定手机号if(StringUtils.isEmpty(userInfo.getPhone())){map.put("openid", userInfo.getOpenid());}else{map.put("openid","");}//产生token令牌字符串String token = JwtHelper.createToken(userInfo.getId(), name);map.put("token",token);//将令牌token放入map//登录成功后的页面跳转return "redirect:"+ ConstantPropertiesUtil.YYGH_BASE_URL + "/weixin/callback?token="+map.get("token")+"&openid="+map.get("openid")+"&name="+URLEncoder.encode(map.get("name"),"utf-8");} catch (Exception e) {throw new YyghException(ResultCodeEnum.FETCH_ACCESSTOKEN_FAILD);//return null;}}/*============我的微信二维码生成的方法====================*//*方法返回生成展示二维码的各种前端页面参数*/@ApiOperation("我的微信二维码生成的方法")@GetMapping("createWeixinImage")@ResponseBody  //此注解返回jsonpublic Result   createWeixinImage() throws UnsupportedEncodingException {//微信官方规定:redirect_uri		重定向地址,需要进行UrlEncodeString redirect_uri = URLEncoder.encode(ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL,"UTF-8");HashMap<String, Object> map = new HashMap<>();//从官网给的参数中获取appid,appid在配置文件中的map.put("appid",ConstantPropertiesUtil.WX_OPEN_APP_ID);//scope:应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可map.put("scope","snsapi_login");map.put("redirect_uri",redirect_uri);/*用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验*/map.put("state",System.currentTimeMillis()+"");return Result.ok(map);}}
package com.fan.yygh.user.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fan.yygh.common.exception.YyghException;
import com.fan.yygh.common.result.ResultCodeEnum;
import com.fan.yygh.helper.JwtHelper;
import com.fan.yygh.model.user.UserInfo;
import com.fan.yygh.user.mapper.UserInfoMapper;
import com.fan.yygh.user.service.UserInfoService;
import com.fan.yygh.vo.user.LoginVo;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;@Service //先继承《M是mapper,T是实体类》后实现
public class UserInfoImpl extends ServiceImpl<UserInfoMapper, UserInfo>implements UserInfoService {@Resourceprivate UserInfoMapper userInfoMapper;@Resourceprivate RedisTemplate<String,String> redisTemplate;//判断数据库是否存在微信的扫描人信息,根据openid判断@Overridepublic UserInfo selectWxInfoOpenId(String openid) {QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();wrapper.eq("openid",openid);UserInfo userInfo = baseMapper.selectOne(wrapper);return userInfo;}//用户手机号登录接口@Overridepublic Map<String, Object> loginUser(LoginVo loginVo) {//从vo中获取参数String phone = loginVo.getPhone();String code = loginVo.getCode();//参数校验if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){throw new YyghException(ResultCodeEnum.PARAM_ERROR);//ResultCodeEnum枚举类}//TODO 校验校验验证码//校验校验验证码String mobleCode = redisTemplate.opsForValue().get(phone);if(!code.equals(mobleCode)) {throw new YyghException(ResultCodeEnum.CODE_ERROR);}//绑定手机号码UserInfo userInfo = null;if(!StringUtils.isEmpty(loginVo.getOpenid())) {userInfo = this.selectWxInfoOpenId(loginVo.getOpenid());if(null != userInfo) {userInfo.setPhone(loginVo.getPhone());this.updateById(userInfo);} else {throw new YyghException(ResultCodeEnum.DATA_ERROR);}}if(userInfo == null){//判断是否第一次登录,根据手机号查询数据库,如果不存在相同的手机号就是第一次登录QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();wrapper.eq("phone",phone);userInfo = baseMapper.selectOne(wrapper);if(null==userInfo ){//第一次使用这个手机号登录//添加信息到数据库userInfo = new UserInfo();userInfo.setName("");userInfo.setPhone(phone);userInfo.setStatus(1);//设置可用//this.save(userInfo);//保存到数据库baseMapper.insert(userInfo);}}//校验是否被禁用if(userInfo.getStatus() == 0) {throw new YyghException(ResultCodeEnum.LOGIN_DISABLED_ERROR);}//返回给页面的map信息HashMap<String, Object> map = new HashMap<>();String name = userInfo.getName();if (StringUtils.isEmpty(name)) {//如果名字为空name = userInfo.getNickName();//用昵称代替名字}if(StringUtils.isEmpty(name)){name = userInfo.getPhone();//如果名字为空,用手机号代替名字}map.put("name",name);//返回name和token//利用工具生成tokenString token = JwtHelper.createToken(userInfo.getId(), name);map.put("token",token);//token  被写错了return map;  //记得返回map}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/47765.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IBOX NFT 数字藏品价格 监控 工具 科技

IBOX NFT 数字藏品价格监控工具 科技 -7月25号 由于原来的pc版本的科技使用的web端口&#xff0c;迫于ibox关闭的web端下单接口 所有不得已又开发了一个android的科技自用 锁单、监控、公告自动锁单、抢购、查询仓库交易信息 ibox 数字藏品最近比较火&#xff0c;所以开发…

通达信插件获取并存储通达信商品指数的实时数据

一、引子 通达信商品指数一共有23个&#xff0c;如下图所示&#xff1a; 如果想获取历史数据&#xff0c;只需要通过通达信的数据下载和导出功能即可&#xff0c;现在我们需要获取这23个指数的实时数据&#xff0c;通过导出功能就没有办法了。 在最初的阶段&#xff0c;考虑的…

免费获得筹码分布接口交易数据,Tushare的使用方法

在做量化交易时需要活动历史数据&#xff0c;Tushare是一个免费提供各类金融数据 , 助力智能投资与创新型投资的平台。在这个平台上可以免费获得股票、期货和外汇的各种数据。下面就给大家介绍一下Tushare的注册和使用方法。 使用流程是&#xff1a;1、用户注册 - 2、用户使用…

哪个软件能实盘测试策略,Quicklib提供期货CTA策略实盘模拟监控的好工具(原创)...

大家都知道开发期货程序化交易&#xff0c;是一个非常繁杂的工作&#xff0c;并且在策略实盘运行过程中&#xff0c;很难提供一个资金曲线进行查看&#xff0c;我开发了一款资金曲线分时图工具&#xff0c;可以将期货CTP账户的资金曲线绘制出来&#xff0c;方便检查实盘策略中的…

HCIA第二天笔记

思维导图 HCIA第二天笔记 IP报文头部 图 第二行分别是&#xff1a;标识字段&#xff0c;标志位和片偏移字段 标识字段&#xff1a;相当于序列号&#xff0c;假设给第一个分片的报文序号随即为x则后续的每个报文1 标志位&#xff1…

鸿蒙系统走进大学课堂,华为鸿蒙系统HarmonyOS课程走进高校,武汉大学等高校将授课...

推动华为鸿蒙系统HarmonyOS高速发展的机会来了&#xff0c;当前已得到权威确定&#xff0c;华为鸿蒙系统HarmonyOS课程将走进高校&#xff0c;在武汉大学等15个高校将正式开展harmonyOS授课。据业内人士表示&#xff0c;此举将推动鸿蒙系统HarmonyOS在国内的普及&#xff0c;包…

HCIA (学习笔记二)

华为eNSP 以上图拓扑图为例 增加拓展结构 可以在此对路由器进行拓展 将所需的拓展面板拖进拓展板即可 配置 华为根据所属权限不同把设备分为不同的视图 <huawei> 尖括号为用户视图—只有查看权限 [huawei] 方括号为系统视图—可以进行全局配置 [gaomin-GigabitEthern…

HCIA-HarmonyOS Application Developer——题目集3

题目1 1、&#xff08;多选&#xff09;开发者在使用JavaUl框架时&#xff0c;会用到各种组件来创建一个页面&#xff0c;以下哪些XML属性&#xff0c;是所有组件通用的? A、id B、width C、theme D、clickable 解析&#xff1a;&#xff08;ABCD&#xff09; 题目2 2、&…

华为技术官又出神作,鸿蒙操作系统完整文档笔记现已疯传

操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是管理和控制计算机硬件与软件资源的计算机程序&#xff0c;用户和计算机的接口&#xff0c;同时也是计算机硬件和其他软件的接口。 其能管理计算机系统的硬件、软件及数据资源&#xff0c;控制程序运行&a…

【鸿蒙应用开发】 【HCIA认证】学习笔记3

文章目录 1.正确的人&#xff0c;通过正确的设备&#xff0c;正确地使用数据2.HiLog3.架构图4.Data5.Image7.通知8.JS FA调用Java PA的机制9.NetworkID10.内核层 考点说明 1.正确的人&#xff0c;通过正确的设备&#xff0c;正确地使用数据 在搭载HarmonyOS的分布式终端上&…

华为鸿蒙系统深度研究 (PPT演示)

感谢阅读&#xff0c;欢迎扩散传播&#xff01;感谢&#xff01; ????点击关注GitHub科技???? 更多鸿蒙文章&#xff0c;共建鸿蒙生态 华为鸿蒙系统是安卓套壳&#xff1f;直接看代码 HarmonyOS到底是不是Android套皮&#xff1f; HarmonyOS完全升级攻略&#xff1a;消…

鸿蒙ArkTS第一次作业

主要目录配置文件作用&#xff1a; stage模型&#xff1a; FA模型&#xff1a; 语法基础知识&#xff1a; ArkTS 是华为自研的开发语言。是2022年下半年新推出的语言&#xff0c;它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩…

【鸿蒙应用开发】 【HCIA认证】学习笔记1

文章目录 1.page生命周期2.跨设备迁移Page3.原子化服务4.config.json5.visibility6.权限7.intent8.线程8.服务卡片10.APP Pack 考点说明 1.page生命周期 MainAbility拥有MainAbilitySlice1和MainAbilitySlice2 当MainAbilitySlice1导航到MainAbilitySlice2时 调用顺序是这样的…

【鸿蒙应用开发】 【HCIA认证】学习笔记2

文章目录 1.idl2.Service3.关系型数据库4.分布式接口5.视频播放功能开发步骤6.Java UI框架7.JS UI框架8.布局9.内外边距10.数字签名 考点说明 1.idl 在开发HarmonyOS应用时&#xff0c;如果客户端和服务端需要跨进程通信&#xff0c;可以使用idl来定义两者均认可的编程接口。 …

追着 chatGPT 打的 Claude 跑不动了?!

claude 据说是 openai 公司的副总裁因理念不合&#xff0c;出走创建的 anthropic 公司发明的聊天机器人&#xff0c;和 chatGPT一样&#xff0c;智能聊天功能都很不错。 大致水平在 强chatGPT3.5 左右。 前期因为免费试用&#xff0c;反应速度非常快&#xff0c;对国内也没有…

通达信上涨回调选股公式,选出二次走强的标的

本文首先编写二次走强指标公式&#xff0c;在此基础上增加过滤条件&#xff0c;编写上涨回调选股公式。 一、二次走强指标公式 指标公式的总体思路还是比较简单的&#xff0c;弱势、弱势反弹、强势、强势调整&#xff0c;这四个形态主要是处理画图&#xff0c;二次走强是信号&…

Dijkstra迪杰斯特拉算法的介绍(分为朴素dj和堆优化版dj),包含模板总结(必掌握)与具体例题应用

(&#x1f53a;)朴素dijkstra迪杰斯特拉算法 时间复杂度分析 寻找路径最短的点&#xff1a;O(n)加入集合S&#xff1a;O(n)更新距离&#xff1a;O(m)所以总的时间复杂度为O(n)精确&#xff1a;时间复杂度 O(nm), n表示点数&#xff0c;m表示边数 所有边若是正的,就不会有自环;…

斯坦福「红睡衣」计划:真·从零复刻ChatGPT!

源 | 新智元 大家好&#xff0c;这里是 NewBeeNLP。一起从零打造ChatGPT&#xff0c;AI从业者大团结&#xff01; Meta AI开源的大羊驼LLaMA模型彻底点燃了开源社区的热情&#xff0c;并在此基础上相继开发出了各种类ChatGPT的羊驼Alpaca, Vicuna等。 但Meta只是开源了LLaMA的权…

2023 Prompts_ChatGPT 提示语大全

ChatGPT Prompts 是一个专注于 ChatGPT 提示语的大全集合网站&#xff0c;涵盖了广泛的领域和主题。无论是想在日常生活中获取写作灵感&#xff0c;还是想在科技、文学、医学等领域提升写作效率和质量&#xff0c;用户都可以从该网站中找到适合自己的相关提示语。 该网站提供的…

如何不被薅羊毛

有赞微页面优惠券组件内有个便捷的功能&#xff1a;自动获取本店铺创建的优惠券&#xff0c;便于商家进行营销活动。但如果商家创建了用于测试的优惠券&#xff0c;却未考虑到该券会被微页面自动获取和推广。这时就可能会被消费者薅羊毛。为了避免损失发生&#xff0c;我们需要…