Java实现天猫精灵与智能设备的对接

       天猫精灵与公司智能设备的对接。刚接到这个任务的时候对于一个刚毕业一个月的应届生我来说,有点像巨石,不过经历了10多天的自己琢磨,还是终于把这个新东西搞出来了。楼主是学的java,但在查询相关文章的时候发现没有一篇是用java实现的。所以在这里写一篇关于实现的文章阐述一下这个对接里面所需要的一些细节以及,实现流程。首先我们需要了解的是Aligenie开发者平台。

https://open.bot.tmall.com/ 

这里有必要贴一张整个接入的流程图

 

这个平台的登录可以用淘宝账号登录。登录后

我们需要先进行技能的创建,点击添加新技能

技能信息这一栏信息我就不做过多的阐述自己随便填一下就是了。作为测试取名Test或者什么其他的都OK。填写完成后点击下一步:

这个页面对开发者来说真的可谓是重中之重。

第一栏账户授权链接应填写我们开发者为Aligenie平台提供的授权登录页面(自己编写)

第二栏,第三栏Client ID和Client Secret这里设置的作用就是平台识别你新建技能用的可以自己随便填写。

Aceess Token URL这个地址需要解释一下官方文档中标识如下:

这个地址其实就是当你完成授权登录这一步后会返回一个code值,然后将code值添加进OAuth2.0请求中将整个请求转发给

你填写AccessTokenURL方法接口中去。通过传递的code换取访问令牌

https://XXXXX/token?grant_type=authorization_code&client_id=XXXXX&client_secret=XXXXXX&code=XXXXXXXX&redirect_uri=https%3A%2F%2Fopen.bot.tmall.com%2Foauth%2Fcallback

 

最后一个必填项 开发者网关地址是当平台接受到你的返回的AccessToken后要将平台的智能家居协议发送到的一个接口。该接口用来接收协议然后按照官方文档给出的返回json体的格式返回你要接入的智能设备的一些参数。

上述的设备发现请求就是平台向网关地址中Post协议。而下面的就是你需要返回的东西。注册技能的地址填写就这么几个要点。

这边填写完后先不用上线什么的先做一个本地的测试再说。填完后我们返回技能主页会出现该技能的图标点进去。这时我们需要测试自己的技能,点击账户配置会跳转到你所写的登录页面。登录页的账号密码填写公司中存储的用户的账号密码就可。

当跳转到这个界面时我们看网址信息

http://www.XXXXX.com/test2/merchantHTML/merchantlogin.jsp?redirect_uri=https%3A%2F%2Fopen.bot.tmall.com%2Foauth%2Fcallback%3FskillId%3D18105%26token%3DMjM0MDgzODYwMEFGRUhJTkZEVlE%3D&client_id=hbsycjn2010&response_type=code&state=0.5252341172795741

从redirect后的信息都是平台为我们自己加上的。登录成功后我们需要将请求转发给我们生成Code并生成与Code对应的AcessToken的这个接口中为平台反馈AcessToken。

我这里用的是SSM框架实现的

 

userService.java

package com.obj.service;import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.obj.dao.userDao;
import com.obj.entity.user;@Service
public class userService {@Resourceprivate userDao userdao;public user UserLogin(String username,String password){return userdao.UserLogin(username, password);}public user IdentifyUsername(String username){return userdao.IdentifyUsername(username);}public user IdentifyPassword(String username,String password){return userdao.IdentifyPassword(username, password);}
}

userDao.java

package com.obj.dao;
import com.obj.entity.*;
public interface userDao {public user UserLogin(String username,String password);public user IdentifyUsername(String username);public user IdentifyPassword(String username,String password);}

 

userMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper  
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="com.obj.dao.userDao">    <resultMap type="user" id="userResult">  <result property="Id" column="Id"/> <result property="username" column="username"/>  <result property="password" column="password"/> </resultMap>  <select id="UserLogin" parameterType="String" resultType="user">  select * from user where user=#{0} and password=#{1}  </select> <select id="IdentifyUsername" parameterType="String" resultType="user">  select * from user where user=#{0}; </select> <select id="IdentifyPassword" parameterType="String" resultType="user">  select * from user where user=#{0} and password=#{1}  </select> 
</mapper>

testController.java

package com.obj.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.UUID;import javax.annotation.Resource;  
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.apache.oltu.oauth2.as.issuer.MD5Generator;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuer;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
import org.apache.oltu.oauth2.as.request.OAuthTokenRequest;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.client.OAuthClient;
import org.apache.oltu.oauth2.client.URLConnectionClient;
import org.apache.oltu.oauth2.client.request.OAuthBearerClientRequest;
import org.apache.oltu.oauth2.client.request.OAuthClientRequest;
import org.apache.oltu.oauth2.client.response.OAuthAccessTokenResponse;
import org.apache.oltu.oauth2.client.response.OAuthResourceResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.error.OAuthError;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.apache.oltu.oauth2.common.message.types.GrantType;
import org.apache.oltu.oauth2.common.message.types.ResponseType;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.obj.entity.application;
import com.obj.entity.user;
import com.obj.service.applicationService;
import com.obj.service.userService;@Controller
@RequestMapping("/Test")
public class testController {@Resourcepublic userService userservice;@Resourcepublic applicationService applicationservice;String grant_type = "authorization";String clientId ="xxxxx";String clientSecret = "xxxxx";String accessTokenUrl = "http://www.xxxx.com:8081/index.jsp";String userInfoUrl = null;String redirectUrl = "https://open.bot.tmall.com/oauth/callback";String response_type = "code";String code= null;String cutURL = "http://www.xxxx.com:8081/test2/merchantHTML/merchantlogin.jsp?";String OAuthURL = "http://www.xxxx.com:8081/test2/Test/responseCode.do?";int cutlength = cutURL.length();@RequestMapping("/userlogin")public String userlogin(HttpServletRequest request) throws IOException, OAuthSystemException{String url = request.getHeader("referer");System.out.println("请求跳转地址:"+url);String username = request.getParameter("username");String password = request.getParameter("password");user IdentifyUsername = userservice.IdentifyUsername(username);user IdentifyPassword = userservice.IdentifyPassword(username, password);if(IdentifyUsername != null ){if(IdentifyPassword != null){System.out.println("登录成功!");String outURL = java.net.URLDecoder.decode(url, "GBK");System.out.println("decode后跳转的地址:"+outURL);int outlength = outURL.length();String responseURL = outURL.substring(cutlength, outlength);System.out.println(responseURL);OAuthURL = OAuthURL + responseURL;System.out.println("decode后要跳转的地址:"+OAuthURL);return "redirect:" + OAuthURL;}else{System.out.println("密码错误!");}}else{System.out.println("用户名不存在!");}return "redirect:/";}@RequestMapping("/responseCode")public Object toShowUser(Model model, HttpServletRequest request) throws IOException{System.out.println("----------服务端/responseCode--------------------------------------------------------------");try {//构建OAuth 授权请求  OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request); oauthRequest.getClientId();oauthRequest.getResponseType();oauthRequest.getRedirectURI();String token = oauthRequest.getParam("token");System.out.println(oauthRequest.getClientId());System.out.println(oauthRequest.getResponseType());System.out.println(oauthRequest.getRedirectURI());System.out.println(oauthRequest.getParam("token"));if(oauthRequest.getClientId()!=null&&oauthRequest.getClientId()!=""){//设置授权码  String authorizationCode = UUID.randomUUID().toString().replace("-", "").substring(0, 18);System.out.println(authorizationCode);//利用oauth授权请求设置responseType,目前仅支持CODE,另外还有TOKEN  String responseType = oauthRequest.getParam(OAuth.OAUTH_RESPONSE_TYPE);//进行OAuth响应构建OAuthASResponse.OAuthAuthorizationResponseBuilder builder =OAuthASResponse.authorizationResponse(request, HttpServletResponse.SC_FOUND);//设置授权码builder.setParam("token", token);	   builder.setParam("state","11");builder.setCode(authorizationCode);//得到到客户端重定向地址String redirectURI = oauthRequest.getParam(OAuth.OAUTH_REDIRECT_URI);//构建响应final OAuthResponse response = builder.location(redirectURI).buildQueryMessage();System.out.println("服务端/responseCode内,返回的回调路径:"+response.getLocationUri());System.out.println("----------服务端/responseCode--------------------------------------------------------------");String responceUri =response.getLocationUri();System.out.println(responceUri);//根据OAuthResponse返回ResponseEntity响应HttpHeaders headers = new HttpHeaders();try {headers.setLocation(new URI(response.getLocationUri()));} catch (URISyntaxException e) {// TODO Auto-generated catch blocke.printStackTrace();}String strURL = "http://www.xxxx.com/test2/Test/responseAccessToken.do?grant_type=authorization_code&client_id=hbsycjn2010&client_secret=ainipinxin&redirect_uri=https://open.bot.tmall.com/oauth/callback&code=" + authorizationCode;URL url = new URL(strURL);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setInstanceFollowRedirects(true);connection.setRequestMethod("POST"); // 设置请求方式connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式connection.connect();	return "redirect:"+responceUri;// https://open.bot.tmall.com/oauth/callback?skillId=18105&code=0b58444322e04d9c8e&state=11&token=MjM0MDgzODYwMEFGRUhJTkZEVlE%3D}} catch (OAuthSystemException e) {e.printStackTrace();} catch (OAuthProblemException e) {e.printStackTrace();}System.out.println("----------服务端/responseCode--------------------------------------------------------------");return null;	}@RequestMapping(value = "/responseAccessToken",method = RequestMethod.POST)  public HttpEntity token(HttpServletRequest request) throws OAuthSystemException{JSONObject jsonObject = new JSONObject();System.out.println("--------服务端/responseAccessToken-----------------------------------------------------------");OAuthIssuer oauthIssuerImpl=null;OAuthResponse response=null;//构建OAuth请求  try {OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);String authCode = oauthRequest.getParam(OAuth.OAUTH_CODE); String clientSecret = oauthRequest.getClientSecret();if(clientSecret!=null||clientSecret!=""){//生成Access TokenoauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator());final String accessToken = oauthIssuerImpl.accessToken();final String refreshToken = oauthIssuerImpl.refreshToken();jsonObject.put("access_token", accessToken);jsonObject.put("refresh_token", refreshToken);jsonObject.put("expires_in", 1760000);System.out.println(jsonObject.toString());System.out.println("--oooo---");//生成OAuth响应response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setAccessToken(accessToken).setRefreshToken(refreshToken).setParam("expires_in", "17600000").buildJSONMessage();System.out.println(response.getBody());}System.out.println("--------服务端/responseAccessToken-----------------------------------------------------------");//根据OAuthResponse生成ResponseEntityreturn new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));} catch (OAuthSystemException e) {response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setParam("error", "101").setParam("error_description", "内部错误").buildJSONMessage();// TODO Auto-generated catch blockjsonObject.put("error", 101);jsonObject.put("error_dercription", "内部错误");System.out.println(jsonObject.toString());return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));} catch (OAuthProblemException e) {// TODO Auto-generated catch blockresponse = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setParam("error", "102").setParam("error_description", "参数错误").buildJSONMessage();jsonObject.put("error", 102);jsonObject.put("error_dercription", "参数错误");System.out.println(jsonObject.toString());return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));}// System.out.println("--------服务端/responseAccessToken-----------------------------------------------------------");// return null;}@RequestMapping(value ="/getMessage",method = RequestMethod.POST)@ResponseBodypublic JSONObject getMessage(HttpServletRequest request, HttpServletResponse response,BufferedReader br){//System.out.println("hi");//Header部分JSONObject MerchineList = new JSONObject();JSONArray jSONArray = new JSONArray();JSONObject header = new JSONObject();JSONObject payload = new JSONObject();List<JSONObject> devices =  new ArrayList();List<JSON> properties = new ArrayList();List actions = new ArrayList();JSONObject extentions = new JSONObject();System.out.print(request.getHeaderNames());Enumeration<?> enum1 = request.getHeaderNames();while (enum1.hasMoreElements()) {String key = (String) enum1.nextElement();String value = request.getHeader(key);System.out.println(key + "\t" + value);}//body部分String inputLine;String str = "";try {while ((inputLine = br.readLine()) != null) {str += inputLine;}br.close();} catch (IOException e) {System.out.println("IOException: " + e);}System.out.println("str:" + str);JSONObject recieveHeader = new JSONObject();recieveHeader = JSON.parseObject(str);String str1 = recieveHeader.getString("header");System.out.println("header:" + recieveHeader.getString("header"));JSONObject recieveMessageId = new JSONObject();recieveMessageId = JSON.parseObject(str1);System.out.println("messageId:" + recieveMessageId.getString("messageId"));header.put("namespace", "AliGenie.Iot.Device.Discovery");header.put("name", "DiscoveryDevicesResponse");header.put("messageId", recieveMessageId.getString("messageId"));header.put("payLoadVersion", "1");JSONObject device = new JSONObject();JSONObject propertie = new JSONObject();device.put("deviceId", "34ea34cf2e63");device.put("deviceName", "单孔插座");device.put("deviceType", "outlet");device.put("zone", "test");device.put("brand", "test");device.put("model", "test");device.put("icon", "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1531878000&di=c989660f4b827a0049c3b7aec4fe38e1&src=http://img.czvv.com/sell/599adfe4d2f0b1b2f118606f/20170905113247194.jpg");propertie.put("name", "powerstate");propertie.put("value", "off");properties.add(propertie);device.put("properties", properties);actions.add("TurnOn");actions.add("TurnOff");device.put("actions", actions);extentions.put("extension1", "tset");extentions.put("extension2", "test");device.put("extentions", extentions);devices.add(device);payload.put("devices", devices);MerchineList.put("header", header);MerchineList.put("payload", payload);System.out.println(MerchineList.toString());return MerchineList;}}

点击登录并授权,如果在生成CODE,通过生成的CODE换取AccessToken返回给平台这几步上都没有差错则会跳转到一下界面。

此时说明已经将智能设备接入到了平台中。这是你可以操作自己的天猫精灵,说打开单孔插座,天猫精灵就会做出相应的反应同样会发送一条JSON数据段给你的开发者网关地址。以上便是整个接入的过程。

web开发的小伙伴在第一次跳转到这个界面的时候可能会出现您还没有智能设备接入的空白界面。不要急着质疑是不是自己的代码写错了。这时你可以打开手机上的天猫精灵APP在App中点击智能设备看看有没有相关的智能设备接入进去,如果没有这时再返回去仔细的检查代码。

 

 

 

 

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

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

相关文章

esp8266对接天猫精灵 微信控制

首先注册账号采用贝壳物联的服务器 添加自己的接口 资料下载地址 链接&#xff1a;https://pan.baidu.com/s/13TWrygx8w6r6llGWlS3kQg 提取码&#xff1a;IH23 链接&#xff1a;https://pan.baidu.com/s/11irBUU56Ck_qceQNSJkNMw 提取码&#xff1a;llal 相关的修改在脚…

esp8266接入天猫精灵教程,附开源app控制

超简单&#xff0c;两步完事 第一步 下载程序到esp8266第二步 绑定天猫精灵第三步 &#xff08;附&#xff09;开源app控制 第一步 下载程序到esp8266 下载地址: 点击下载 本demo 是利用arduino IDE开发&#xff0c;关于arduino IDE 的ESP8266环境配置可参考&#xff1a;环境…

使用ESP8266通过Blinker平台接入天猫精灵控制电视/空调

目录 演示视频 1.准备工作1.1 原理1.2 使用的硬件以及硬件连接图1.3 开发环境准备 2.解码空调红外键值2.1 把ESP8266红外接收的实例&#xff0c;上传到NodeMCU中2.2 读取红外键值 3. 配置Blinker App的UI界面4.Arduino程序的编写4.1 控制逻辑4.2 新建一个Arduino程序&#xff0…

蓝牙mesh设备接入天猫精灵或者百度音响

天猫与百度双网关方案 验证双vendor 支持天猫精灵&百度 一、mesh配网协议&#xff08;mesh provisioning&#xff09; 1.1、Provisioning协议栈 1.2、PB-ADV (通过百度或天猫精灵音响直接配网) The PB-ADV bear用来传输Generic Provisioning PDUs类型&#xff0c;PB-AD…

国内就能用的Chat-GPT分享

人工智能在语音理解与交互的新里程碑 AI聊天平台 在人工智能&#xff08;AI&#xff09;领域&#xff0c;语言模型的发展日新月异。这其中&#xff0c;OpenAI所推出的GPT系列语言模型尤为显眼&#xff0c;尤其是其中的一员——ChatGPT&#xff0c;已经在人工智能的语言理解与…

速看!又一个 Redis 高危漏洞,可植入隐秘后门允许命令执行

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; 被研究人员称之为Redigo的一种基于Go的新的恶意软件&#xff0c;它一直针对有CVE-2022-0543漏洞的Redis服务器并植入一个隐秘的后门允许命令执行。 CVE-2022-0543是Redis&#xff0…

嗖的一下!3分钟用ChatGPT生成海南旅游思维导图!

大家好&#xff0c;我是菜鸟哥&#xff01; 五一长假即将来临&#xff0c;很多小伙伴都要准备出去玩了&#xff01;旅游肯定要做攻略啊&#xff0c;比如热门的景点海南三亚&#xff0c;北京&#xff0c;上海&#xff0c;成都这些都是打卡的网红景点&#xff01;小编比较喜欢去海…

【成为架构师课程系列】怎样进行概念架构(Conceptual Architecture)?

目录 前言 什么是概念架构 概念架构阶段的3个步骤 初步设计 高层分割 分层式概念服

【成为架构师课程系列】使用 Cache-Aside 模式将数据存储在缓存中( Using the Cache-Aside pattern to store data in the cache)

目录 前言 背景和问题 解决方案 问题和注意事项 何时使用此模式 例子 前言 按需将数据从数据存储加载到缓存中(Cache-Aside )。这种模式可以提高性能,还有助于保持缓存中保存的数据与底层数据存储中的数据之间的一致性。

ChatGPT Plus会员如何充值的问题

在这个高度信息化的时代&#xff0c;人工智能已经成为我们生活的一部分。 而ChatGPT更是凭借其高度驯化的对话式语言模型迅速收获了上亿的庞大客群。 今年3月&#xff0c;更先进更强大的GPT4.0官宣发布&#xff0c;强大功能更新的同时&#xff0c;客户需要支付一定订阅费用才…

基于hexo和aws云搭建个人博客,0基础0费用,有点豪横(2W字超详细图文教程)

这是篇概述文章&#xff0c;详细参考Hexo建站专栏 最近几个月一直在整理之前的技术笔记&#xff0c;目前虽在体系上还尚有欠缺&#xff0c;但内容方面整理的七七八八了&#xff0c;这些内容一部分记录在了云笔记中另一部分记录在了博客上。于是决定搭建一个个人的技术…

Linux 内核观测技术 eBPF 中文入门指南

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; 很早前就想写一篇关于 eBPF 的文章&#xff0c;但是迟迟没有动手&#xff0c;这两天有点时间&#xff0c;所以就来写一篇。这文章主要还是简单的介绍 eBPF 是用来干什么的&#xff…

【AIGC使用教程】AutoGPT 安装使用完全教程

欢迎关注【AIGC使用教程】 专栏 【AIGC使用教程】SciSpace 论文阅读神器 【AIGC使用教程】Microsoft Edge/Bing Chat 注册使用完全指南 【AIGC使用教程】GitHub Copilot 免费注册及在 VS Code 中的安装使用 【AIGC使用教程】GitHub Copilot 免费注册及在 PyCharm 中的安装使用 …

上海亚商投顾:沪指放量大涨 券商等权重板块全线飙升

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日集体反弹&#xff0c;沪指、深成指单边拉升&#xff0c;午后均涨超2%&#xff0c;上证50大涨超2.7%&a…

上海亚商投顾:创业板指大涨近2% 电商概念再爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日震荡反弹&#xff0c;创业板指高开高走&#xff0c;午后涨近2%&#xff0c;宁德时代盘中涨近4%。军工板块…

上海亚商投顾:沪指尾盘快速反弹微幅收跌 6G概念大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日震荡调整&#xff0c;临近尾盘集体回升&#xff0c;石油、保险等权重蓝筹走低&#xff0c;上证50盘中…

ChatGPT网站源码V4.8.0+支持Ai绘画+支持用户套餐+好友邀请功能+管理后台+在线安装+一键在线更新+永久更新!

ChatGPT网站源码V4.8.0支持Ai绘画支持用户套餐好友邀请功能管理后台在线安装一键在线更新永久更新&#xff01; 安装教程: 一台VPS服务器 服务器安装宝塔 解析域名&#xff0c;绑定服务器 上传系统程序至根目录 创建数据库 访问首页在线安装配置数据库 PHP版本选择:7.3 安装完成…

关于语言模型私有化部署的讨论 | AIGC实践

上周在与TC同行关于AIGC实践的线上交流中&#xff0c;大家普遍比较关心的一个实践切入点是&#xff1a;语言模型的私有化部署——简单来说&#xff0c;就是在企业内部&#xff0c;部署一个属于自己的“ChatGPT”&#xff0c;对于本行业/专业知识&#xff0c;以及企业独有的产品…

VsCode的常用插件安装与插件介绍

VsCode的常用插件安装与插件介绍 0. 导读1. Chinese (Simplified) (简体中文)2. ChatGPT中文版 0. 导读 该插件安装使用的方式&#xff0c;皆为在扩展方式的安装&#xff1b; 如图所示&#xff0c;在联网的情况下搜索对应的插件 1. Chinese (Simplified) (简体中文) 插件介…

EI投稿经验和流程

最近需要投一篇&#xff0c;记录下来过程。 文章目录 参考知乎查了下基本要求去B站看看 写作工具来找一个样本看看参考chatGPT写作开始画重点&#xff01;&#xff01;&#xff01;写作格式详细要求 投稿 参考 知乎查了下基本要求 1、EI稿件控制7页以上&#xff0c;3000单词字…