【移动应用开发技术】微信公众号开发-素材消息管理接口_第1页
【移动应用开发技术】微信公众号开发-素材消息管理接口_第2页
【移动应用开发技术】微信公众号开发-素材消息管理接口_第3页
【移动应用开发技术】微信公众号开发-素材消息管理接口_第4页
【移动应用开发技术】微信公众号开发-素材消息管理接口_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】微信公众号开发-素材消息管理接口

开始本文是微信公众号开发者模式介绍及接入的后续,如没看过前文的话,可能看本文会有些懵逼。本文主要介绍微信公众平台的素材、消息管理接口的开发。由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信官方提供的测试号来进行开发。测试号的申请可参考下文:图文消息本小节我们来开发回复图文消息的功能,官方文档地址如下:

/wiki?t=resource/res_main&id=mp1421140543

/wiki?t=resource/res_main&id=mp1421140543回复图文消息所需传递的参数如下:注:多图文消息不会显示Description参数的信息官方的图文消息示例数据结构如下:<xml>

<ToUserName>

<![CDATA[toUser]]>

</ToUserName>

<FromUserName>

<![CDATA[fromUser]]>

</FromUserName>

<CreateTime>12345678</CreateTime>

<MsgType>

<![CDATA[news]]>

</MsgType>

<ArticleCount>2</ArticleCount>

<Articles>

<item>

<Title>

<![CDATA[title1]]>

</Title>

<Description>

<![CDATA[description1]]>

</Description>

<PicUrl>

<![CDATA[picurl]]>

</PicUrl>

<Url>

<![CDATA[url]]>

</Url>

</item>

<item>

<Title>

<![CDATA[title]]>

</Title>

<Description>

<![CDATA[description]]>

</Description>

<PicUrl>

<![CDATA[picurl]]>

</PicUrl>

<Url>

<![CDATA[url]]>

</Url>

</item>

</Articles>

</xml>图文消息都在Articles标签内,而每个item标签都包含一条图文消息,有多少个item标签就代表有多少条图文消息。在开发回复图文消息的时候,我们需要使用到一张图片来作为图文消息的封面,找一个图片文件放在工程的resources/static目录下即可,并确保能够在外网上访问:看完了官方的示例数据及文档,那么我们就来开发一下图文消息的回复吧。首先是创建一个基类,封装通用的字段,代码如下:packageorg.zero01.weixin.mqdemo.vo;

importcom.thoughtworks.xstream.annotations.XStreamAlias;

importlombok.Getter;

importlombok.Setter;

/**

*@program:mq-demo

*@description:图文消息基类

*@author:01

*@create:2018-07-0220:24

**/

@Getter

@Setter

publicclassBaseMassage{

/**

*接收方账号

*/

@XStreamAlias("ToUserName")

privateStringtoUserName;

/**

*发送方账号

*/

@XStreamAlias("FromUserName")

privateStringfromUserName;

/**

*消息创建时间(整型)

*/

@XStreamAlias("CreateTime")

privatelongcreateTime;

/**

*消息类型

*/

@XStreamAlias("MsgType")

privateStringmsgType;

}然后是具体的封装每条图文消息字段的对象,代码如下:packageorg.zero01.weixin.mqdemo.vo;

importcom.thoughtworks.xstream.annotations.XStreamAlias;

importlombok.Getter;

importlombok.Setter;

/**

*@program:mq-demo

*@description:图文消息对象

*@author:01

*@create:2018-07-0220:19

**/

@Getter

@Setter

publicclassNewsItem{

@XStreamAlias("Title")

privateStringtitle;

@XStreamAlias("Description")

privateStringdescription;

@XStreamAlias("PicUrl")

privateStringpicUrl;

@XStreamAlias("Url")

privateStringurl;

}接着是包含每条图文消息的容器对象,代码如下:packageorg.zero01.weixin.mqdemo.vo;

importcom.thoughtworks.xstream.annotations.XStreamAlias;

importlombok.Getter;

importlombok.Setter;

importjava.util.List;

/**

*@program:mq-demo

*@description:图文消息容器对象

*@author:01

*@create:2018-07-0220:29

**/

@Getter

@Setter

publicclassNewsMessageextendsBaseMassage{

@XStreamAlias("ArticleCount")

privateintarticleCount;

@XStreamAlias("Articles")

privateList<NewsItem>articles;

}将图文消息结构都封装成一个个的类后,就是需要组装图文消息以及将组装好的图文消息转换成xml格式的数据,发送给微信服务器了。所以我们需要在MessageUtil类中,新增如下两个方法:/**

*图文消息转换为xml

*

*@paramnewsMessage

*@return

*/

publicstaticStringnewsMessageToXml(NewsMessagenewsMessage){

XStreamxStream=newXStream();

xScessAnnotations(newClass[]{NewsItem.class,NewsMessage.class});

xStream.alias("xml",newsMessage.getClass());

xStream.alias("item",NewsItem.class);

returnxStream.toXML(newsMessage);

}

/**

*组装图文消息

*

*@paramtoUserName

*@paramfromUserName

*@return

*/

publicstaticStringinitNewsMessage(StringtoUserName,StringfromUserName){

List<NewsItem>newsItemList=newArrayList<>();

NewsMessagenewsMessage=newNewsMessage();

NewsItemnewsItem=newNewsItem();

newsItem.setTitle("图文消息");

newsItem.setDescription("这是一个图文消息");

newsItem.setPicUrl("http://zero.mynatapp.cc/code.jpg");

newsItem.setUrl("");

newsItemList.add(newsItem);

newsMessage.setToUserName(fromUserName);

newsMessage.setFromUserName(toUserName);

newsMessage.setCreateTime(System.currentTimeMillis());

newsMessage.setMsgType(MessageTypeEnum.MSG_NEWS.getMsgType());

newsMessage.setArticles(newsItemList);

newsMessage.setArticleCount(newsItemList.size());

returnnewsMessageToXml(newsMessage);

}最后修改WeChatMqController中的text方法,增加一条判断,判断当用户输入数字1时,则回复图文消息。代码如下:@PostMapping("/common")

publicStringtext(@RequestBodyStringxmlStr){

//将xml格式的数据,转换为AllMessage对象

AllMessageallMessage=MessageUtil.xmlToAllMessage(xmlStr);

//是否是文本消息类型

if(allMessage.getMsgType().equals(MessageTypeEnum.MSG_TEXT.getMsgType())){

//用户输入数字1时,回复图文消息

if("1".equals(allMessage.getContent())){

returnMessageUtil.initNewsMessage(allMessage.getToUserName(),allMessage.getFromUserName());

}

//自动回复用户所发送的文本消息

returnMessageUtil.autoReply(allMessage,ContentEnum.CONTENT_PREFIX.getContent()+allMessage.getContent());

}

//是否是事件推送类型

elseif(allMessage.getMsgType().equals(MessageTypeEnum.MSG_EVENT.getMsgType())){

//是否为订阅事件

if(EventType.EVENT_SUBSCRIBE.getEventType().equals(allMessage.getEvent())){

//自动回复欢迎语

returnMessageUtil.autoReply(allMessage,ContentEnum.CONTENT_SUBSCRIBE.getContent());

}

}else{

//暂不支持文本以外的消息回复

returnMessageUtil.autoReply(allMessage,ContentEnum.CONTENT_NONSUPPORT.getContent());

}

returnMessageUtil.autoReply(allMessage,ContentEnum.CONTENT_NONSUPPORT.getContent());

}完成以上代码的编写后,启动SpringBoot,打开微信公众号,测试结果如下:access_token的获取本小节我们来看看如何获取access_token,官方文档地址如下:

/wiki?t=resource/res_main&id=mp1421140183

/wiki?t=resource/res_main&id=mp1421140183access_token是什么?官方的定义如下:

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。调用接口获取access_token需要传递的参数说明如下:获取access_token成功后,接口所返回的参数说明如下:从文档中我们可以看到,调用接口获取access_token时需要传递appid和secret,appid和secret可以在公众号的基本配置页面中获取,如下:然后我们还需要安装提示,设置一下白名单的ip,即你机器的ip,不然是无法调用接口获取access_token的,如下:将appid、secret以及获取access_token的接口url,配置到SpringBoot的配置文件中,如下:wechat:

mpAppid:wx8ed1xxxxxx9513dd

mpAppSecret:0c1b5b7ea5xxxxxxxxx14cb5b61258

accessTokenUrl:/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET在工程中新建一个config包,在该包下新建一个WeXinConfig配置类,用于加载配置文件中所配置的appid和secret:packageorg.zero01.weixin.mqdemo.config;

importlombok.Data;

importperties.ConfigurationProperties;

importorg.springframework.context.annotation.Configuration;

/**

*@program:mq-demo

*@description:微信公众号配置类

*@author:01

*@create:2018-07-0320:50

**/

@Data

@Configuration

@ConfigurationProperties(prefix="wechat")

publicclassWeXinConfig{

privateStringmpAppid;

privateStringmpAppSecret;

privateStringaccessTokenUrl;

}因为我们需要序列化json数据以及发送http请求给微信服务器,所以需要使用到一些工具包,在maven的pom.xml文件中,加入如下依赖:<!--/artifact/org.json/json-->

<dependency>

<groupId>org.json</groupId>

<artifactId>json</artifactId>

<version>20160810</version>

</dependency>

<!--/artifact/org.apache.httpcomponents/httpclient-->

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

<version>4.5.5</version>

</dependency>在util包下新建一个WeiXinUtil工具类,在该类中封装get、post请求方法,以及获取access_token的方法。代码如下:packageorg.zero01.weixin.mqdemo.util;

importorg.apache.http.HttpResponse;

importorg.apache.http.client.methods.HttpGet;

importorg.apache.http.client.methods.HttpPost;

importorg.apache.http.entity.StringEntity;

importorg.apache.http.impl.client.CloseableHttpClient;

importorg.apache.http.impl.client.HttpClientBuilder;

importorg.apache.http.util.EntityUtils;

importorg.json.JSONObject;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Component;

importorg.zero01.weixin.mqdemo.config.WeXinConfig;

importorg.zero01.weixin.mqdemo.vo.AccessToken;

importjava.io.IOException;

/**

*@program:mq-demo

*@description:

*@author:01

*@create:2018-07-0321:04

**/

@Component

publicclassWeiXinUtil{

privatestaticWeXinConfigwxConfig;

publicWeXinConfiggetWeXinConfig(){

returnwxConfig;

}

@Autowired

publicvoidsetWeXinConfig(WeXinConfigwxConfig){

WeiXinUtil.wxConfig=wxConfig;

}

/**

*get请求

*

*@paramurl

*@return

*/

publicstaticJSONObjectdoGet(Stringurl)throwsIOException{

CloseableHttpClientclient=HttpClientBuilder.create().build();

HttpGethttpGet=newHttpGet(url);

HttpResponseresponse=client.execute(httpGet);

Stringresult=EntityUtils.toString(response.getEntity(),"utf-8");

returnnewJSONObject(result);

}

/**

*post请求

*

*@paramurl

*@paramoutStr

*@return

*/

publicstaticJSONObjectdoPost(Stringurl,StringoutStr)throwsIOException{

CloseableHttpClientclient=HttpClientBuilder.create().build();

HttpPosthttpPost=newHttpPost(url);

httpPost.setEntity(newStringEntity(outStr,"utf-8"));

HttpResponseresponse=client.execute(httpPost);

Stringresult=EntityUtils.toString(response.getEntity(),"utf-8");

returnnewJSONObject(result);

}

/**

*获取access_token

*

*@return

*@throwsIOException

*/

publicstaticAccessTokengetAccessToken()throwsIOException{

AccessTokentoken=newAccessToken();

//替换appid和secret

Stringurl=wxConfig.getAccessTokenUrl()

.replace("APPID",wxConfig.getMpAppid())

.replace("APPSECRET",wxConfig.getMpAppSecret());

JSONObjectjsonObject=doGet(url);

token.setToken(jsonObject.getString("access_token"));

token.setExpiresIn(jsonObject.getInt("expires_in"));

returntoken;

}

}完成以上代码的编写后,新建一个测试类,测试一下是否能正常获取到access_token。测试代码如下:packageorg.zero01.weixin.mqdemo.util;

importorg.junit.Test;

importorg.junit.runner.RunWith;

importorg.springframework.boot.test.context.SpringBootTest;

importorg.springframework.test.context.junit4.SpringRunner;

importorg.zero01.weixin.mqdemo.vo.AccessToken;

importjava.io.IOException;

importstaticorg.junit.Assert.*;

@RunWith(SpringRunner.class)

@SpringBootTest

publicclassWeiXinUtilTest{

@Test

publicvoidgetAccessToken()throwsIOException{

AccessTokenaccessToken=WeiXinUtil.getAccessToken();

System.out.println("access_token:"+accessToken.getToken());

System.out.println("有效时间:"+accessToken.getExpiresIn());

}

}运行以上测试用例后,控制台输出如下:access_token:11_AMxhxO9soXndEc6XI-0hG0CWQ_oVQjaiPol6P2eMDLrSYpIrbiNMjHEDFwoOiKwG-ckgwPTHCiWypzK_reZohT7H5UdEYUmdlU_qq-oGQefv9q9A4mEkFV5WyiEFK5q5SsvsLR5QIKcjf1BhLDEfAIAAST

有效时间:7200从测试结果中,可以看到,成功获取到了access_token,并且这个access_token的有效期是7200秒,也就是两个小时,和官方文档描述的一致。一般在实际的项目开发中,我们都会把这个access_token缓存起来,缓存到本地或者nosql数据库中,然后每隔1.5个小时或2个小时的时候,就重新获取一次access_token,刷新缓存。这样做是为了避免在每个逻辑点都去重新获取access_token,因为这样会导致服务的不稳定,而且微信也规定了获取access_token的接口每天只能调用2000次,如果每个逻辑点都去重新获取access_token的话,不仅会导致服务不稳定,还容易把调用次数给花完。如下:图片消息回复本小节我们来看看如何进行图片消息的回复,官方文档地址如下:

/wiki?t=resource/res_main&id=mp1421140543

/wiki?t=resource/res_main&id=mp1421140543回复图片消息所需传递的参数如下:官方的图文消息示例数据结构如下:<xml>

<ToUserName>

<![CDATA[toUser]]>

</ToUserName>

<FromUserName>

<![CDATA[fromUser]]>

</FromUserName>

<CreateTime>12345678</CreateTime>

<MsgType>

<![CDATA[image]]>

</MsgType>

<Image>

<MediaId>

<![CDATA[media_id]]>

</MediaId>

</Image>

</xml>从所需传递的参数列表中可以看到,回复图片消息时需要传递一个MediaId,这是通过素材管理中的接口上传多媒体文件,得到的id。所以在开发回复图片消息的接口前,我们还需要开发一个上传多媒体文件的接口,以此来获得MediaId。关于素材管理接口的官方文档地址如下:

/wiki?t=resource/res_main&id=mp1444738726

/wiki?t=resource/res_main&id=mp1444738726新增临时素材接口调用说明如下:上传素材成功后,返回的参数如下:有一点要说明的是,个人的订阅号是没有素材管理接口的权限的,所以我们需要将之前配置的appid和AppSecret配置为测试号的,不然接口会调用失败,如果是已认证的服务号就可以直接使用。由于需要上传图片素材才能发送图片消息,所以首先需要在WexinUtil中,新增一个upload方法,用于上传临时图片素材并返回素材的media_id。但是在写代码前,需要先将上传临时素材的接口url地址配置到SpringBoot的配置文件中,如下:wechat:

...

uploadUrl:/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE然后在配置类里加上这个配置的字段,如下:...

publicclassWeXinConfig{

...

privateStringuploadUrl;

}upload方法代码如下:/**

*上传临时素材

*

*@paramfilePath需要上传的文件所在路径

*@paramaccessTokenaccess_token

*@paramtype素材类型

*@returnmedia_id

*@throwsIOException

*/

publicstaticStringupload(StringfilePath,StringaccessToken,Stringtype,Stringkey)throwsIOException{

Filefile=newFile(filePath);

if(!(file.exists()||file.isFile())){

thrownewIOException("文件不存在");

}

Stringurl=wxConfig.getUploadUrl()

.replace("ACCESS_TOKEN",accessToken)

.replace("TYPE",type);

URLurlObj=newURL(url);

//打开连接

HttpURLConnectionconnection=(HttpURLConnection)urlObj.openConnection();

//设置属性

connection.setRequestMethod("POST");

connection.setDoInput(true);

connection.setDoOutput(true);

connection.setUseCaches(false);

//设置头信息

connection.setRequestProperty("Connection","Keep-Alive");

connection.setRequestProperty("Charset","UTF-8");

//设置边界

Stringboundary=""+System.currentTimeMillis();

connection.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);

StringBuildersb=newStringBuilder();

sb.append("--").append(boundary).append("\r\n")

.append("Content-Disposition;form-data;name=\"file\";filename=\"")

.append(file.getName())

.append("\"\r\n")

.append("Content-Type:application/octet-stream\r\n\r\n");

byte[]head=sb.toString().getBytes("UTF-8");

//获得输出流

OutputStreamoutput=newDataOutputStream(connection.getOutputStream());

//输出表头

output.write(head);

//文件正文部分

//把文件以流文件的方式,推入到url中

DataInputStreaminput=newDataInputStream(newFileInputStream(file));

intbytes=0;

byte[]bufferOutput=newbyte[1024];

while((bytes=input.read(bufferOutput))!=-1){

output.write(bufferOutput,0,bytes);

}

input.close();

//结尾部分,定义最后数据分割线

byte[]foot=("\r\n--"+boundary+"--\r\n").getBytes("utf-8");

output.write(foot);

output.flush();

output.close();

StringBuilderbuffer=newStringBuilder();

Stringresult=null;

try(BufferedReaderreader=newBufferedReader(newInputStreamReader(connection.getInputStream()))){

Stringline=null;

while((line=reader.readLine())!=null){

buffer.append(line);

}

result=buffer.toString();

}catch(IOExceptione){

e.printStackTrace();

}

JSONObjectjsonObject=newJSONObject(result);

("responsedata:{}",jsonObject);

returnjsonObject.getString(key);

}在测试类中新增一个测试方法,测试代码如下:@Test

publicvoidupload()throwsIOException{

StringfilePath="Z:/v2-9b17df91629f842edd472d7cfcaa9c4b_hd.jpg";

AccessTokenaccessToken=WeiXinUtil.getAccessToken();

StringmediaId=WeiXinUtil.upload(filePath,accessToken.getToken(),"image");

System.out.println(mediaId);

}控制台输出结果如下:mediaId:5_PCrofX1_KIpSfWzJE-tu7AxQjxw6zlQ44oBuUkM_PZ6FiPeDY0a7vcWU2zdap9获取到media_id后,就可以开始开发回复图片消息功能了,首先根据官方给出的数据结构,封装好各个实体类。Image类代码如下:packageorg.zero01.weixin.mqdemo.vo;

importcom.thoughtworks.xstream.annotations.XStreamAlias;

importlombok.Data;

@Data

publicclassImage{

@XStreamAlias("MediaId")

privateStringmediaId;

}ImageMessage类代码如下:packageorg.zero01.weixin.mqdemo.vo;

importcom.thoughtworks.xstream.annotations.XStreamAlias;

importlombok.Data;

@Data

publicclassImageMessageextendsBaseMassage{

@XStreamAlias("Image")

privateImageimage;

}然后在MessageUtil中新增如下两个方法:/**

*将图片消息转换为xml

*

*@paramimageMessage

*@return

*/

publicstaticStringimageMessageToXml(ImageMessageimageMessage){

XStreamxStream=newXStream();

xScessAnnotations(newClass[]{ImageMessage.class,Image.class});

xStream.alias("xml",imageMessage.getClass());

returnxStream.toXML(imageMessage);

}

/**

*组装图片消息对象

*

*@paramtoUserName

*@paramfromUserName

*@return

*/

publicstaticStringinitImageMessage(StringtoUserName,StringfromUserName){

Imageimage=newImage();

image.setMediaId("5_PCrofX1_KIpSfWzJE-tu7AxQjxw6zlQ44oBuUkM_PZ6FiPeDY0a7vcWU2zdap9");

ImageMessageimageMessage=newImageMessage();

imageMessage.setFromUserName(toUserName);

imageMessage.setToUserName(fromUserName);

imageMessage.setMsgType(MessageTypeEnum.MSG_IMAGE.getMsgType());

imageMessage.setCreateTime(System.currentTimeMillis());

imageMessage.setImage(image);

returnimageMessageToXml(imageMessage);

}最后修改WeChatMqController中的text方法,增加一条判断,判断当用户输入数字2时,则回复图片消息。代码如下:...

if("1".equals(allMessage.getContent())){

returnMessageUtil.initNewsMessage(allMessage.getToUserName(),allMessage.getFromUserName());

}elseif("2".equals(allMessage.getContent())){

returnMessageUtil.initImageMessage(allMessage.getToUserName(),allMessage.getFromUserName());

}

...完成以上代码的编写后,重启SpringBoot,打开微信公众号,测试结果如下:音乐消息回复在上一小节中,我们介绍了如何开发回复图片消息的功能,而其他类似的消息回复都是差不多的,这里就不一一去赘述了。本小节我们来看看如何进行音乐消息回复的开发,官方文档地址如下:

/wiki?t=resource/res_main&id=mp1421140543

/wiki?t=resource/res_main&id=mp1421140543回复音乐消息所需传递的参数如下:官方的图文消息示例数据结构如下:<xml>

<ToUserName>

<![CDATA[toUser]]>

</ToUserName>

<FromUserName>

<![CDATA[fromUser]]>

</FromUserName>

<CreateTime>12345678</CreateTime>

<MsgType>

<![CDATA[music]]>

</MsgType>

<Music>

<Title>

<![CDATA[TITLE]]>

</Title>

<Description>

<![CDATA[DESCRIPTION]]>

</Description>

<MusicUrl>

<![CDATA[MUSIC_Url]]>

</MusicUrl>

<HQMusicUrl>

<![CDATA[HQ_MUSIC_Url]]>

</HQMusicUrl>

<ThumbMediaId>

<![CDATA[media_id]]>

</ThumbMediaId>

</Music>

</xml>开发音乐消息回复,我们需要一个音乐文件,找一个mp3文件放在工程的resources/static目录下即可,并确保能够在外网上访问:根据官方给出的数据结构,封装好各个实体类。Music实体类代码如下:packageorg.zero01.weixin.mqdemo.vo;

importcom.thoughtworks.xstream.annotations.XStreamAlias;

importlombok.Data;

@Data

publicclassMusic{

@XStreamAlias("Title")

privateStringtitle;

@XStreamAlias("Description")

privateStringdescription;

@XStreamAlias("MusicUrl")

privateStringmusicUrl;

@XStreamAlias("HQMusicUrl")

privateStringhQMusicUrl;

@XStreamAlias("ThumbMediaId")

privateStringthumbMediaId;

}MusicMessage实体类代码如下:packageorg.zero01.weixin.mqdemo.vo;

importcom.thoughtworks.xstream.annotations.XStreamAlias;

importlombok.Data;

@Data

publicclassMusicMessageextendsBaseMassage{

@XStreamAlias("Music")

privateMusicmusic;

}由于音乐消息需要传递一个ThumbMediaId,也就是缩略图的媒体id。所以我们需要修改之前的测试代码,以此获取thumb_media_id,如下:@Test

publicvoidupload()throwsIOException{

StringfilePath="Z:/v2-9b17df91629f842edd472d7cfcaa9c4b_hd.jpg";

AccessTokenac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论