基于嵌入式Linux系统的图书信息查询数据库的应用设计_第1页
基于嵌入式Linux系统的图书信息查询数据库的应用设计_第2页
基于嵌入式Linux系统的图书信息查询数据库的应用设计_第3页
基于嵌入式Linux系统的图书信息查询数据库的应用设计_第4页
基于嵌入式Linux系统的图书信息查询数据库的应用设计_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、*实践教学*兰州理工大学计算机与通信学院2015年春季学期嵌入式系统开发课程设计题 目:基于嵌入式Linux系统的图书信息查询数据库的应用设计专业班级: xxxx工程12级x班 姓 名: xxxxx 学 号: 122x0xxx 指导教师: xxxxxx 成 绩: 嵌入式系统开发课程设计目录摘要2前言3一、基本原理41.1 开发环境搭建41.2 应用程序的编写5二、系统分析62.1 需求分析62.2 控制台72.3 添加图书信息72.4 删除图书信息82.5 查看图书信息92.5.1索书号查找92.5.2 图书名查找102.6 帮助系统102.7 退出系统11三、详细设计123.1 main.c

2、源码123.2 consoleshell.c源码123.3 SQLite.c源程序143.4 编译源程序223.5 NFS挂载实验目录测试23运行结果25参考文献27总结28摘要随着社会的进步,如今书店图书数量巨大,每天都有大量的图书售出,在如此多的书中查找到自己想要的书采用计算机图书信息查询系统较为快捷,基于嵌入式Linux系统的图书信息查询数据库的应用是在嵌入式数据库Sqlite的基础上,采用C语言编程及Sqlite C接口来控制数据库Sqlite的读取和存储,使用C语言编写的人机交互界面使得普通人能够很轻松的对图书信息查询应用进行操作,使得添加、修改、查找和删除图书信息方便快捷。关键词:

3、图书信息 嵌入式 Linux Sqlite C语言前言目前各大书店存书量巨大,对于在如此大量的图书中查找到顾客所需的图书,普遍采用计算机软件结合数据库的图书信息查询系统来查找图书信息。数据库的目标是实现对数据的存储、检索等功能。传统的数据库产品除提供了基本的查询、添加、删除等功能外,也提供了很多高级特性,如触发器、存储过程、数据备份恢复等。但实际上用到这些高级功能的时候并不多,应用中频繁用到的还是数据库的基本功能。于是,在一些特殊的应用场合,传统的数据库就显得过于臃肿了。在这种情况下,嵌入式数据库开始崭露头角。嵌入式数据库是一种具备了基本数据库特性的数据文件,它与传统数据库的区别是:嵌入式数据

4、库采用程序方式直接驱动,而传统数据库则采用引擎响应方式驱动。嵌入式数据库的体积通常都很小,这使得嵌入式数据库常常应用在移动设备上。由于性能卓越,所以在高性能的应用上也经常见到嵌入式数据库的身影。SQLite是一种采用C语言开发的嵌入式数据库。SQLite的目标是尽量简单,因此它抛弃了传统企业级数据库的种种复杂特性,只实现那些对于数据库而言非常必要的功能。尽管简单性是SQLite追求的首要目标,但是其功能和性能都非常出色。通过C语言函数编写的人机交互界面,人工输入所有图书信息,再进行保存,也可以通过图书信息查询系统快速查找到相关图书的信息,对图书信息的修改和删除也非常的方便。一、基本原理1.1

5、开发环境搭建进行嵌入式系统开发之前需要搭建开发环境,所需要的硬件有UP-CUP210-II型嵌入式实验平台,PC机Pentium 500以上, 硬盘40G以上,内存大于256M,软件部分有Vmware Workstation + Fedora Core 14 + MiniCom/Xshell + ARM-LINUX交叉编译开发环境。准备好硬件后,使用串口线和网线连接UP-CUP210-II型嵌入式实验平台和计算机,并将UP-CUP210-II型嵌入式实验平台接通电源。1、打开虚拟机启动Fedora Core 14,点击【编辑】【虚拟网络编辑器】,在【桥接到:】后选择【Realtek PCIe

6、GBE Family Controller】这一项。然后点击【系统】【管理】【网络】【设备】【硬件设备】,在【硬件设备】中选择【eth2()】这一项,再点击【探测】,最后点击【确定】退出,在重新打开查看eth2是否处于活跃状态。处于活跃状态是正常状态,若不是就重复以上步骤知道eth2处于活跃状态。2、在电脑上安装“超级终端”,安装成功后点击【文件】【新建连接】,进入属性界面后把端口选为COM1,波特率选为115200,数据位选为8,校验位选为None,停止位选为1,流控选为None,点击【确定】退出。打开UP-CUP210-II实验板电源,待超级终端上显示完毕后输入命令“ifconfig”查看

7、IP地址,输入命令“ifconfig eth0 192.168.160.150”对刚刚查到的IP地址修改为192.168.160.150。再输入“ifconfig”检查IP地址是否修改成功。使用命令“ping 192.168.160.150”查看实验平台与计算机是否能够通信。3、进入虚拟机终端,输入命令“su root”切换到root用户,输入密码“123456”,然后输入命令“setup”弹出对话框,选择【防火墙配置】后选择不启用防火墙。然后进入【系统服务】,选择不启用ip6tables和iptables,启用network和nfs。退出对话框后输入命令“service network re

8、start”重启网络,每行末都显示确定后输入命令【service nfs restart】重启网络文件系统。待每行末都显示确定后输入命令“vi /etc/exports”弹出文件编辑器,把第一行改为“/UP-CUP210-II192.168.160.*(rw,async,no_root_squash)”,保存并退出。4、在超级终端中输入命令“mountnfs 192.168.160.130:/UP-CUP210-II /mnt/nfs”挂载。挂载成功后使用命令“cd”和“ls”进入文件夹“05_sqlite”中,输入命令“./SQLite_test”执行程序。程序的运行结果会显示到超级终端。1

9、.2 应用程序的编写进入实验目录,输入命令“cd /UP-CUP210-II/SRC/exp/basic/05_sqlite/”,再输入“ls”查看文件夹“05_sqlite”中的所有文件和文件夹,在文件夹“05_sqlite”中存在三个C文件,分别为SQLite.c、consoleshell.c、main.c。为了方便快速的编写程序,只需将以上三个C文件进行修改即可,修改好后仔细检查并保存退出。因修改后的代码没用经过编译,在超级终端执行的文件还是原来的文件,所以要在虚拟机终端中输入命令“make clean”清除中间代码,重新编译。然后再输入命令“make”编译。编译成功后进入超级终端执行修

10、改后的程序,修改后的程序执行结果显示到超级终端。根据这个原理我们可以对程序进行反复修改,反复在超级终端上测设,最终达到理想的结果。二、系统分析2.1 需求分析如今遍布全国大大小小的书店数量巨大,每天都有大量的书籍交易,在一些知名的书店每日销售量惊人,如果书店把图书信息记录到纸质表格中,当遇到大量顾客购书时需要人工查找到图书信息,显然浪费了大量时间,效率低下,严重影响销售额。所以要提高查询图书信息的效率就必须的采用运行速度高的计算机系统。当顾客买书时一般都是提供书籍名称,店员通过图书信息查询数据库的应用系统输入书籍名称就能很快的查出书籍的索书号和价格,书店的书都是分区分类摆放的,而且是大区里又分

11、出了很多个小区,每个大区都由不同的数字表示,每个大区里面的小区也是由不同的数字表示,每种图书也由数字表示,这种形式就是树状结构,可以通过一级一级的查找到相应图书,由每种图书的代表数字和上一级区的数字组合就形成了索书号,索书号形如学号,例如兰州理工大学学生学号“12250135”,“12”代表2012级的所有学生,“25”代表通信工程的所有学生,“01”代表通信工程一班,“35”就代表某个学生自己。通过学号从前往后就能知道某学生所属的班级。索书号也是如此,通过索书号也能查到图书在书店的具体位置。所以索书号是图书信息查询数据库的应用系统中必不可少的一个信息项。当人们购买图书是还会考虑到图书的价格,

12、如果价格合适才会去购买。所以图书价格也是图书信息查询数据库的应用系统中必不可少的一个信息项,图书信息查询数据库的应用系统需要根据图书名称查找图书信息,所以图书名称更是图书信息查询数据库的应用系统中必须的一个信息项。总体来说图书信息查询数据库的应用系统的数据库中要包括索书号、图书名称和图书价格这三类信息,为了方便人工操作需要有一个简单的人机交互界面控制台,交互界面菜单应包括添加、删除、查看、帮助和退出功能。控制台添加图书信息根据索书号查找图书查看所有图书信息删除图书信息帮助退出根据图书名查找图书图2.1 软件结构图2.2 控制台控制台是计算机与人之间交互的一个平台,里面含有若干选项,通过点击这些

13、选项就能进入到相应的功能项下,控制台是图书信息查询数据库的应用系统中重要的组成部分。包含“查看所有图书信息”、“根据图书名查找图书”、“根据索书号查找图书”、“添加图书信息”、“删除图书信息”、“帮助”和“退出”这几个选项。由于选项信息太长,才用输入简短指令的方法选取选项最为方便快捷。所以这里以“1”、“2”、“3”、“4”、“5”、“*”和“0”分别作为这几个选项的命令。2.3 添加图书信息开始结束输入图书价格输入结束输入索书号输入图书名输入结束输入结束YNNYYN图2.2 添加图书信息程序流程图刚刚建立的图书信息查询数据库的应用系统数据库为空,第一步通过人工输入图书信息,输入顺序是先索书号

14、,然后是图书名,最后是图书价格,每一项输入结束后会自动进入下一项输入,当三项都输入完毕后自动进入控制台。当输入回车键输入结束。2.4 删除图书信息当书店里的某些图书下架了,这些图书信息在图书信息查询数据库的应用系统的数据库中也没有用处了,所以得删除这些被下架的图书信息。删除图书信息时要根据图书名查找到图书,若图书不存在则回到控制台,若图书存在则询问是否要删除,经过用户确认后方可删除相应图书信息。开始结束输入图书名图书是否存在是否删除图书是否输入完毕NYNYNYY图2.3 删除图书信息程序流程图2.5 查看图书信息查看图书信息分为三种:查看所有图书信息、根据图书名查找图书信息、根据索书号查找图书

15、信息。查看所有图书信息时输入“1”命令则显示数据库中所有的图书信息,实现较为简单。2.5.1索书号查找开始结束输入索书号是否输入完毕查询数据库图书是否存在显示图书信息NYNY图2.4 索书号查找程序流程图根据索书号查找图书时,首先要输入索书号,若索书号输入完毕,则进行数据库查询,若相关图书不存在则返回控制台,若存在则显示相关图书信息。2.5.2 图书名查找开始结束输入图书名是否输入完毕查询数据库图书是否存在显示图书信息NYNY图2.5 图书名查找程序流程图根据图书名查找图书时,首先要输入图书名,若图书名输入完毕,则进行数据库查询,若相关图书不存在则返回控制台,若存在则显示相关图书信息。2.6

16、帮助系统帮助系统是任何一个计算机系统所必须的一部分,主要作用是引导和帮助用户了解系统的功能和操作方法。图书信息查询数据库的应用系统的帮助系统主要用来向用户说明“1”、“2”、“3”、“4”、“5”、“*”和“0”这几个命令的作用,了解了各个命令的作用后用户才能熟练的操作图书信息查询数据库的应用系统。2.7 退出系统在每一个计算机系统中都要有退出选项,如果在不使用应用程序时不退出程序容易浪费系统资源。再运行其他程序时,系统负荷增大,导致运行速度变慢。功耗增大,耗电量也增大。在嵌入式设计中如果不设计退出选项,就无法输入其他选项,所以退出系统程序是必不可少的。三、详细设计3.1 main.c源码#i

17、nclude "consoleshell.h"#include "linuxpatch.h"int main(int argc, char *argv) consoleshell(); return 0;3.2 consoleshell.c源码consoleshell.c源文件主要是建立用户终端显示控制台菜单,并根据用户的输入字符,调用相应的接口函数。#include "consoleshell.h"char shell_s="nshell> "void get_line(char *cmd);/*控制台*/

18、void * consoleshell() int count=0; int i; char cmd256=0,; int rc = sqliteDB_open(); char name40,id40; int price = 0;/demo中只做整型的,浮点型的转换可以参考网上实现 printf("n<DB control shell>"); printf("n 1 查看所有图书信息"); printf("n 2 根据书名查找图书"); printf("n 3 根据书号查找图书"); printf(&

19、quot;n 4 删除图书信息"); printf("n 5 添加图书信息"); printf("n * 帮助"); printf("n 0 退出"); while(1) printf(shell_s); fflush(stdout); get_line(cmd); if(strncmp("1",cmd,1)=0) sqliteDB_opt_select_all(); else if(strncmp("2",cmd,1)=0) printf("n输入图书名 ");

20、printf("n图书名:"); scanf("%s",name); fflush(stdin);/刷新缓冲区 if(!sqliteDB_exist(name) continue; sqliteDB_opt_select(name); else if(strncmp("3",cmd,1)=0) printf("n输入索书号 "); printf("n索书号:"); scanf("%s",id); fflush(stdin);/刷新缓冲区 sqliteDB_opt_select

21、_by_id(id); else if(strncmp("4",cmd,1)=0) printf("n请输入将要删除的图书名"); printf("n图书名:"); scanf("%s",name); fflush(stdin);/刷新缓冲区 if(!sqliteDB_exist(name) continue; sqliteDB_opt_select(name); /删除之前应再次询问是否删除,不可回滚 sqliteDB_opt_delete(name); else if(strncmp("5"

22、,cmd,1)=0) printf("n请输入将要添加的图书信息!n索书号:"); printf("n输入图书索书号 "); printf("n索书号:"); scanf("%s",id); printf("n图书名:"); scanf("%s",name); fflush(stdin);/刷新缓冲区 printf("n价格:"); scanf("%d",&price); fflush(stdin);/刷新缓冲区 sqliteD

23、B_opt_add(name,id,price); else if(strncmp("*",cmd,2)=0) printf("n<DB control shell>"); printf("n 1 查看所有图书信息"); printf("n 2 根据书名查找图书"); printf("n 3 根据书号查找图书"); printf("n 4 删除图书信息"); printf("n 5 添加图书信息"); printf("n * 帮助&q

24、uot;); printf("n 0 退出"); else if(strncmp("0",cmd,1)=0) sqliteDB_close();/关闭数据库连接 break;/ else if(cmd0 != "0") else if(strncmp("0",cmd,1)!=0) system(cmd); void get_line(char *cmd) int i=0; while(1) cmdi=getchar(); if(cmdi=10) cmdi=0; break; fflush(stdout); i+;

25、3.3 SQLite.c源程序该源码文件主要是对SQLite数据的C/C+接口封装,提供consoleshell.c中程序调用。#include "SQLite.h"/* auther lyj_uptech* date 2007-3-21* /本程序提供了对数据库进行操作的基本接口,对于更复杂的操作,用户可以根据具体情况* 进行修改,程序的更新,以及其他需求请联系本人或者技术支持* * 例如关于主键的唯一性。用户可以适当添加功能;* 对于可以访问所有table的动态sql语句可以参考其中的程序实现;*/sqlite3 *db;/全局的数据连接/用户第一次打开数据库时应创建对

26、应的table并添加适当的数据记录static int callback(void *NotUsed, int argc, char *argv, char *azColName);/* *建立与数据库的连接* */int sqliteDB_open() int rc;/操作标志 printf("ncreat database:test.dbnncreat table:table merchandise(contents:id name price)nnand add two recordsn"); rc = sqlite3_open("test.db"

27、, &db); if( rc ) fprintf(stderr, "不能打开数据库: %sn", sqlite3_errmsg(db); sqlite3_close(db); exit(1); printf("n打开成功!"); if(!sqliteDB_create_table() printf("n数据表存在");/* if(!sqliteDB_insert_records() printf("n进入数据表失败"); else sqliteDB_opt_select_all();*/ return 1;

28、/* 关闭与数据库的连接 */int sqliteDB_close() if(db != 0) sqlite3_close(db);/* 添加一条记录到已知或未知数据库表*/int sqliteDB_opt_add(char *name,char *id,int price) int rc; char *zErrMsg = 0; char *sql=0;/动态生成的SQL语句 char tem_sql256="insert into merchandise values('"/ by sprife for mem out char tem_sql05 = "

29、;','" char tem_sql15 = "'," char tem_sql25 = ");" char tem_price20; sprintf(tem_price, " %d" , price);/将int数据转换为字符串 sql = strcat(tem_sql,name); sql = strcat(sql,tem_sql0); sql = strcat(sql,id); sql = strcat(sql,tem_sql1); sql = strcat(sql,tem_price); sq

30、l = strcat(sql,tem_sql2);/ printf("n#");/ printf("n%s",sql);/ printf("n#"); rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);/ printf("n rc = %d",rc); if( rc!=SQLITE_OK ) fprintf(stderr, "SQL error: %sn", zErrMsg); sqlite3_free(zErrMsg); /* 删除表中

31、的一条记录* param name*/int sqliteDB_opt_delete(char *name) int rc; char n4; char *zErrMsg = 0; char *sql=0;/动态生成的SQL语句 char tem_sql256="delete from merchandise where name = '"/ char tem_sql03 = "'" char tem_sql13 = "" /删除之前查询该条记录,如存在则显示该记录,并询问是否真的要删除 /如不存在则推出本次操作 sq

32、l = strcat(tem_sql,name); sql = strcat(sql,tem_sql0); sql = strcat(sql,tem_sql1);/ printf("n#");/ printf("n%s",sql);/ printf("n#"); rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);/ printf("n rc = %d",rc); if( rc!=SQLITE_OK ) fprintf(stderr, "SQL er

33、ror: %sn", zErrMsg); sqlite3_free(zErrMsg); /* 删除表中的一条记录* param id*/int sqliteDB_opt_delete_by_id(char *id) int rc; char n4; char *zErrMsg = 0; char *sql=0;/动态生成的SQL语句 char tem_sql256="delete from merchandise where id = '"/ char tem_sql03 = "'" char tem_sql13 = "

34、;" /删除之前查询该条记录,如存在则显示该记录,并询问是否真的要删除 /如不存在则推出本次操作 sql = strcat(tem_sql,id); sql = strcat(sql,tem_sql0); sql = strcat(sql,tem_sql1);/ printf("n#");/ printf("n%s",sql);/ printf("n#"); rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);/ printf("n rc = %d"

35、,rc); if( rc!=SQLITE_OK ) fprintf(stderr, "SQL error: %sn", zErrMsg); sqlite3_free(zErrMsg); /*/* 修改数据库表中的记录内容* /暂不提供修改函数2007-3-21*/int sqliteDB_opt_modify();/* 用预编译的sql语句减少sql语句的分析时间* * 只举例 查询语句* 2007-3-22* 查询语句*/int sqliteDB_opt_select_all() sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; c

36、har *name,*id; int price=0; int nret=sqlite3_prepare(db,"SELECT * FROM merchandise;",strlen("SELECT * FROM merchandise;"),&stmt,(const char*)(&zErrMsg); if(nret!=SQLITE_OK) return false; printf("nt图书名tt索书号tt价格n"); printf("t-n"); while(1) nret=sqlite3_s

37、tep(stmt); if(nret!=SQLITE_ROW) break; name=sqlite3_column_text(stmt,0); id=sqlite3_column_text(stmt,1); price=sqlite3_column_int(stmt,2); printf("t%stt%stt%dn",name,id,price); sqlite3_finalize(stmt); printf("n"); return true;/* 查询符合查询条件的记录* param name*/int sqliteDB_opt_select(ch

38、ar *name) sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; char *_name,*_id; int price=0; int nret=0; int rc; char *sql=0;/动态生成的SQL语句 char tem_sql256="select * from merchandise where name = '"/ char tem_sql03 = "'" char tem_sql13 = "" sql = strcat(tem_sql,name); sql

39、 = strcat(sql,tem_sql0); sql = strcat(sql,tem_sql1);/ printf("n#");/ printf("n%s",sql);/ printf("n#"); nret=sqlite3_prepare(db,sql,strlen(sql),&stmt,(const char*)(&zErrMsg); if(nret!=SQLITE_OK) return false; printf("nt图书名tt索书号tt价格n"); printf("t-n&

40、quot;); while(1) nret=sqlite3_step(stmt); if(nret!=SQLITE_ROW) break; _name=sqlite3_column_text(stmt,0); _id=sqlite3_column_text(stmt,1); price=sqlite3_column_int(stmt,2); printf("t%stt%stt%dn",_name,_id,price); sqlite3_finalize(stmt); printf("n"); return true;/* 查询符合查询条件的记录* par

41、am id*/int sqliteDB_opt_select_by_id(char *id) sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; char *_name,*_id; int price=0; int nret=0; int rc; char *sql=0;/动态生成的SQL语句 char tem_sql256="select * from merchandise where id = '"/ char tem_sql03 = "'" char tem_sql13 = "&qu

42、ot; sql = strcat(tem_sql,id); sql = strcat(sql,tem_sql0); sql = strcat(sql,tem_sql1);/ printf("n#");/ printf("n%s",sql);/ printf("n#"); nret=sqlite3_prepare(db,sql,strlen(sql),&stmt,(const char*)(&zErrMsg); if(nret!=SQLITE_OK) return false; printf("nt图书名tt索

43、书号tt价格n"); printf("t-n"); while(1) nret=sqlite3_step(stmt); if(nret!=SQLITE_ROW) break; _name=sqlite3_column_text(stmt,0); _id=sqlite3_column_text(stmt,1); price=sqlite3_column_int(stmt,2); printf("t%stt%stt%dn",_name,_id,price); sqlite3_finalize(stmt); printf("n")

44、; return true;/*内部调用函数*/static int callback(void *NotUsed, int argc, char *argv, char *azColName) int i; for(i=0; i<argc; i+) printf("%s = %sn", azColNamei, argvi ? argvi : "NULL"); printf("n"); return 0;/*内部调用函数*功能判断所查询的记录是否存在* 依据:图书名*/int sqliteDB_exist(char *name)

45、 sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; char *_name; int price=0; int nret=0; int rc; char *sql=0;/动态生成的SQL语句 char tem_sql256="select * from merchandise where name = '"/ char tem_sql03 = "'" char tem_sql13 = "" sql = strcat(tem_sql,name); sql = strcat(sql,

46、tem_sql0); sql = strcat(sql,tem_sql1); nret=sqlite3_prepare(db,sql,strlen(sql),&stmt,(const char*)(&zErrMsg); printf("sql: %s",sql); if(nret!=SQLITE_OK) return false; nret=sqlite3_step(stmt); if(nret!=SQLITE_ROW) printf("n 图书不存在!"); return false; sqlite3_finalize(stmt); r

47、eturn true;/*在用户还没有创建table时可用该函数创建一个table*/int sqliteDB_create_table() char* zErrMsg=NULL; char sql256="CREATE TABLE merchandise(name varchar(40),id varchar(40),price smallint);" int nret=sqlite3_exec(db,sql,NULL,NULL,&zErrMsg); if(nret!=SQLITE_OK) printf("%sn",sqlite3_errmsg

48、(db); return false; else return true;/*初始化数据库table时预插入两条数据*/int sqliteDB_insert_records() char* zErrMsg=NULL; char sql1256="INSERT INTO merchandise VALUES('ibm','277325073',483);" char sql2256="INSERT INTO merchandise VALUES('sun','433443',400);" i

49、nt nret=sqlite3_exec(db,sql1,NULL,NULL,&zErrMsg); nret=sqlite3_exec(db,sql2,NULL,NULL,&zErrMsg); if(nret!=SQLITE_OK) printf("%sn",sqlite3_errmsg(db); return false; else return true;3.4 编译源程序 1、进入实验目录:rootlocalhost /# cd /UP-CUP210-II/SRC/exp/basic/05_sqlite/rootlocalhost 05_sqlite# lsMakefile SQLite.c SQLite.o consoleshell.h linuxpatch.h main.o sqliteRules.mak SQLite.h consoleshell.c consoleshell.o main.c readme.txtrootlocalhost 05_sqlite# 2、清除中间代码,重新编译rootlocalhost 05_sqlite# make cleanrm -f ./SQLite_test ./sqlite

温馨提示

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

评论

0/150

提交评论