SCM項目手把手開發(fā)文檔_第1頁
SCM項目手把手開發(fā)文檔_第2頁
SCM項目手把手開發(fā)文檔_第3頁
SCM項目手把手開發(fā)文檔_第4頁
SCM項目手把手開發(fā)文檔_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

{管理信息化SCM供應鏈管理}SCM項目手把手開發(fā)文檔1SCM項目手把手開發(fā)文檔作者:劉長炯日期:2008-9-16版本:1.01SCM項目手把手開發(fā)文檔11編寫目的32搭建基本開發(fā)環(huán)境32.1安裝JDK和MyEclipse5.5/6.0/6.532.2下載和安裝Tomcat32.3安裝MySQL5.0/6.0數(shù)據(jù)庫42.4安裝MySQL客戶端管理軟件NavicatLite(可選)42.5安裝和配置郵件服務器(可選)52.6創(chuàng)建數(shù)據(jù)庫和表62.6.1創(chuàng)建數(shù)據(jù)庫62.6.2創(chuàng)建數(shù)據(jù)庫表62.7準備必要的類庫文件63開發(fā)項目73.1創(chuàng)建myscm2Web項目73.2加入必要的JAR類庫83.3導入JSP頁面文件93.4修改加入Struts2過濾器93.5設置Hibernate全局配置文件103.6創(chuàng)建項目包結構113.7開發(fā)通用工具類123.7.15Bean123.7.2.MailSender123.7.3133.8開發(fā)實體類和HBM文件133.9開發(fā)DAO層153.9.1HibernateSessionFactory153.9.2BaseDAO163.9.3OpenSessionInViewFilter163.10開發(fā)用戶模塊173.10.1BaseActionSupport(可選)173.10.2UserAction類摘要設計193.10.3Struts2通配符方式配置203.10.4用戶列表功能203.10.5刪除213.10.6表單AJAX驗證功能213.10.7注冊213.10.8激活233.10.9用戶登錄233.10.10用戶注銷233.10.11修改用戶自己資料243.10.12取回密碼243.10.13修改個人密碼25

3.10.14根據(jù)ID查看用戶信息253.11開發(fā)安全過濾器模塊253.12開發(fā)后臺管理模塊(此模塊建議作為練習)26

3.12.1前臺設計263.12.2用戶管理概要設計27

用戶搜索2添加新用戶2瀏覽所有用戶2刪除用戶283.13站點全局配置及加載28

加載2修改283.14安全中心303.14.1頁面設計303.14.2添加新角色303.14.3瀏覽所有角色303.14.4添加資源訪問許可303.14.5瀏覽所有資源訪問許可304供應商和商品模塊304.1商店首頁面304.2供應商模塊324.2.1類設計324.2.2注冊供應商用戶324.2.3添加供應商(TODO供應商審批,隸屬于交易員模塊)324.2.4查看我的供應商列表324.2.5查看所有供應商列表334.2.6查看分成總額334.3商品模塊334.3.1類設計334.3.2頁面設計344.3.3添加商品354.3.4瀏覽商品信息354.3.5瀏覽我的商品列表354.3.6瀏覽商品列表354.3.7修改商品信息354.3.8商品搜索355購物車模塊355.1頁面設計356程序開發(fā)調(diào)試交流366.1NoresultdefinedforactionXXXandresultsuccess(input)的真正錯誤原因366.2排除法376.2.1排除瀏覽器及瀏覽器版本的因素376.2.2排除多余屬性的干擾376.2.3JDK運行版本和開發(fā)工具編譯器版本是否匹配?386.2.4重新發(fā)布Web應用或者復制新的JAR/Class文件了嘛?396.2.5Hibernate的包加完整了嘛?396.2.6別的類似項目是否能正常運行?406.2.7perties是我們的好朋友406.2.8人不如新,衣不如舊416.2.9把能正確運行的項目的jar包集中起來,分門別類放置416.3關聯(lián)程序源碼426.4JDK6和Struts2沖突的問題真實原因及解決辦法426.5使用UTF-8或者GBK編碼的MySQL實例486.6另外一個HibernateSessionFactory事務的異常506.7MySQL安裝版停止運行506.8MyEclipse不會自動刪除項目里面已經(jīng)去掉的JAR506.9MySQL導出完整的建表語句516.10Struts2不要加所有的JAR文件,否則項目會報錯511編寫目的時參考。開發(fā)時遵循的原則為盡量簡單并提高代碼復用,減少重復的代碼。2搭建基本開發(fā)環(huán)境2.1安裝JDK和MyEclipse5.5/6.0/6.5本項目需要JDK1.5(不要使用JDK1.6,因為發(fā)現(xiàn)可能會導致BUG發(fā)生而無法載入Struts2MyEclipse5.5或者更高版本開發(fā),用其他工具例如EclipseJavaEE版本也可,主要用到JSP編輯器及Web項目發(fā)布功能。2.2下載和安裝Tomcat安裝好Tomcat6.0(或者5.5及更高版本)注意:由于Struts2和Tomcat5.0有沖突,因此不能用Tomcat5.Tomcat是一款開源免費的JSP服務器,可以在.org/下載并安裝。建議下載壓縮包版本(文件名是apache-tomcat-6.x.WindowsServiceInstaller的EXEc:\apache-tomcat-6.0.14,和JDK的安裝一樣,為了避免日后產(chǎn)生問題錯誤,解壓縮的路徑不要帶有空格,如c:\ProgramFiles。2.3安裝MySQL5.0/6.0數(shù)據(jù)庫可以訪問MySQL官方網(wǎng)站下載原版安裝程序和JDBC驅動,請訪問:6.0.#win32,下載安裝包(如文件mysql-essential-6.0.5-alpha-win32.msi)雙擊進行安裝,在最后一個屏幕點擊啟動ConfiguretheMySQLServernow啟動實例配置工具即可,如下圖所示。配置過程請參考視頻mysql_server_。此向導也可以通過選擇菜單開始>所有程序>MySQL>MySQLServer6.0>MySQLServerInstanceConfigWizard來打開。2.4安裝MySQL客戶端管理軟件NavicatLite(可選)MySQL管理工具,導航貓免費版(NavicatLite),可獲得不低于SQLServer的易用度,例如可視化建表,修改表結構,創(chuàng)建外鍵,修改數(shù)據(jù),執(zhí)行查詢等功能,此軟件的中文版可以在下載*非商業(yè)-免費精簡版。2.5安裝和配置郵件服務器(可選)我們使用的本機測試郵件服務器為ForwardMailServer,啟動后的郵箱登錄頁面是。在開始菜單中可啟動郵件服務器配置工具,然后添加一個itcast的域名,之后再點擊左側導航中的本地郵箱,添加必要的測試用郵箱地址。2.6創(chuàng)建數(shù)據(jù)庫和表2.6.1創(chuàng)建數(shù)據(jù)庫使用任意軟件連接至MySQL服務器,然后創(chuàng)建數(shù)據(jù)庫myscm。2.6.2創(chuàng)建數(shù)據(jù)庫表執(zhí)行文件來創(chuàng)建應用程序運行所需的表和基本數(shù)據(jù)。2.7準備必要的類庫文件系統(tǒng)基于Struts2+Hibernate+MySQLJava和Web層類庫:Struts2*Hibernate3MySQLJDBC驅動JavaMail+JAF(Java激活框架JavaActivationFramework,Java對象變成字符串形式來傳播)*JSTL類庫(可從apache-tomcat-6.0.14\webapps\examples\WEB-INF\lib下找到)Commons-(以及Commons-IO)注:加*的包可使用MyEclipse自帶的類庫。Web框架(跨瀏覽器)FckEditor可視化編輯HTMLXLoadTree動態(tài)加載XML生成JavaScript樹組件jQueryAJAX框架-查詢DOM對象,簡潔,現(xiàn)成控件較少ExtJS比較全面的AJAX框架樹,菜單,表格編輯器(Grid)學習比較困難-->顯示公告(頁面內(nèi)彈出窗口)1.導入CSS和EXT的JS2.寫3.寫入功能代碼EasyValidation表單驗證框架3開發(fā)項目3.1創(chuàng)建myscm2Web項目選擇菜單File>New>WebProject,輸入項目名myscm2,選擇J2EE1.4。注意:不要選擇JavaEE5,因為會導致JavaMail類庫沖突。3.2加入必要的JAR類庫將必須的JAR包復制到WEB-INF/lib下。Hibernate的類庫可以通過點擊菜單MyEclipse>AddHibernateCapabilities..來添Hibernate全局配置文件。struts2-blank-.war->5個基本的Struts2JARstruts2-showcase-.war->和IOJSTL從tomcat下找webapps\examples\WEB-INF\libMYSQL驅動Hibernate的包3.3導入JSP頁面文件為了節(jié)約時間,JSP文件我們將不再一一從頭開發(fā)。將項目所需的頁面和相關資源從myscm項目中復制到本項目的WebRoot帶了CVS版本控制信息,可在項目上選擇上下文菜單Team>Disconnect...來解決此問題。CVS版本控制,后面會介紹。3.4修改加入Struts2過濾器<!--Struts2過濾器--><filter><filter-name>struts2</filter-name><filter-class>.struts2.</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>3.5設置Hibernate全局配置文件創(chuàng)建文件src\.xml,修改文件中的數(shù)據(jù)庫連接信息:<?xmlversion='1.0'encoding='UTF-8'?><!DOCTYPEhibernate-configurationPUBLIC"-/HibernateConfigurationDTD3.0//EN"""><hibernate-configuration><session-factory><propertyname="dialect">.</property><propertyname="">jdbc:mysql://localhost:3306/beanscm?useUnicode=true&characterEncoding=GBK</property><propertyname="">root</property><propertyname="">1234</property><propertyname="_class">.</property><propertyname="show_sql">true</property><mappingresource="cnscm.xml"/><mappingresource="cnscm.xml"/><mappingresource="cnscm.xml"/><mappingresource="cnscm.xml"/></session-factory></hibernate-configuration>請將代碼中紅色內(nèi)容修改為您自己的數(shù)據(jù)庫連接IP,用戶名和密碼。自動建表,INDEX不推薦。手工建表。3.6創(chuàng)建項目包結構建議的包命名的規(guī)則是:公司域名.模塊名.子模塊名3.7開發(fā)通用工具類這些類和具體的業(yè)務無關,因此我們要單獨開發(fā)以下的幾個類。3.7.15BeanMD5摘要計算難點:獲取MD5算法和轉16進制字符串顯示。3.7.2.MailSender郵件發(fā)送難點:(.TO,InternetAddress.parse(getTo()));if(isHtmlFormat()){(getBody(),"text/;charset=GBK");}else{(getBody());}發(fā)附件-->發(fā)一個動態(tài)的保單JPG過程:創(chuàng)建連接屬性對象Propertiesprops=newProperties();(".protocol","smtp");//協(xié)議,必須設置后邊的屬性是可選的//(".host","localhost");//服務器地址(".port","25");//SMTP服務器端口("","true");//是否為調(diào)試模式創(chuàng)建Session對象(props)創(chuàng)建MimeMessage對象newMimeMessage(session)設置郵件相關信息使用Transport對象發(fā)送消息();connect();send();用來解決Tomcat表單提交亂碼問題(GET方法提交亂碼)難點:HttpServletRequestWrapper和字符串編碼轉換加入到并編寫一個JSP頁面進行測試。3.8開發(fā)實體類和HBM文件實體類和HBM文件可用MyEclipse生成,具體方法參考本人所著的免費電子書《MyEclipse6Java開發(fā)中文教程》的7.4.5使用反向工程快速生成JavaPOJO類,映射文件和DAO一節(jié)。當然作為學習者來說,推薦嘗試自己來手寫HBM文件和Entity類,但是實際開發(fā)時一般都是用工具生成。難點(一對多和多對一):.xml<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-/HibernateMappingDTD3.0//EN"""><hibernate-mapping><classname="..Role"table="scm_role"catalog="myscm"><idname="id"type=".Integer"><columnname="ID"/><generatorclass="native"></generator></id><propertyname="roleName"type=".String"><columnname="role_name"length="200"/></property><setname="scmResources"inverse="true"><key><columnname="role_id"/></key><one-to-manyclass="..Resource"/></set></class></hibernate-mapping>.xml<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhibernate-mappingPUBLIC"-/HibernateMappingDTD3.0//EN"""><hibernate-mapping><classname="..Resource"table="scm_resource"catalog="myscm"><idname="id"type=".Integer"><columnname="ID"/><generatorclass="native"></generator></id><many-to-onename="scmRole"class="..Role"fetch="select"><!—抓取策略,join,lazy--><columnname="role_id"/></many-to-one><propertyname="uri"type=".String"><columnname="uri"length="200"/></property><propertyname="addDate"type=".Date"><columnname="add_date"length="19"not-null="true"/></property><propertyname="note"type=".String"><columnname="note"length="200"/></property>

</class></hibernate-mapping>您應該了解下列內(nèi)容:實體類都有什么限制?為什么?JavaBean:無參數(shù)的構造器。要有getter和setter,屬性應為private。實體類extendsJavaBean:必須實現(xiàn).SerializablefinalID屬性和至少一個屬性,推薦實現(xiàn)hashCode()和equals()方法。把HBM文件加入到.xml中。3.9開發(fā)DAO層3.9.1HibernateSessionFactory跨線程的對Session進行統(tǒng)一打開和關閉,可配合Filter實現(xiàn)同一次訪問實現(xiàn)自動管理Session和事務.DAO:load()->openSession()讀取數(shù)據(jù)->closeSession()-->JSP-->ThreadLocal+Filter解決Spring提供了方案OpenSessionInViewFilterlazy=false//不推薦fetch=”join”//不推薦(entity);query有個關鍵字fetch,fromUserfetch...???1.創(chuàng)建SessionFactory2.創(chuàng)建staticThreadLocal<Session>變量3.編寫獲取Session和關閉Session的方法4.編寫事務處理的方法:開始,提交,回滾3.9.2BaseDAO小延伸:Hibernate中分頁相關的對象和方法是哪些?一萬條記錄,從第200條開始讀到第20條.publicQuerysetFirstResult(intfirstResult);設置開始讀取的行數(shù)publicQuerysetMaxResults(intmaxResults);設置最多讀取的記錄數(shù)Queryq=s.createQuery(“fromUser”);returnq.setFirstResult(200).setMaxResults(20).list();200=每頁顯示20條*當前頁10,每頁顯示幾條練習:寫一個支持分頁的查詢方法ListpagedQuery(Stringhql,intcurrentPage,intpageSize,Object...params)SQL:列別名selectsum(login_count)as'登錄總次數(shù)'fromscm_user3.9.3OpenSessionInViewFilter實現(xiàn)的功能:執(zhí)行后續(xù)的Filter和Servlet/JSP時,首先打開事務,然后提交事務,如果出現(xiàn)異常則回滾事務,還解決了JSP頁面lazy載入數(shù)據(jù)時發(fā)現(xiàn)session被關閉的問題.注意:此Filter必須加在所有的Filter之前,包括Struts2Filter,否則可能出現(xiàn)無法正常提交事務的問題(已經(jīng)有人遇到過此問題導致無法正常注冊).try{1.打開session并開始事務2.向后執(zhí)行ServletChain,包括后續(xù)DAO和Action等(request,response);3.提交事務}catch(Exceptione){4.回滾事務5.顯示出錯信息}finally{6.關閉session}注冊到.3.10開發(fā)用戶模塊3.10.1BaseActionSupport(可選)此類提供一些通用的功能,包括獲取Request對象,獲取參數(shù),獲取屬性,DAO等,這個類完全是可選的.屬性列表:baseDAO基本的DAO對象;title,標題;message屬性;resetMessages()-->重置title標題和message需要注意的方法:mergeParamsAsURI()/***將所有URL參數(shù)合并成一個URL字符串(page參數(shù)除外),提供分頁時顯示.?page=3¶1=11¶2=bb==>?page=3¶1=11¶2=bb&page=3+1下一頁*@return字符串,如:para1=11¶2=bb*/publicStringmergeParamsAsURI(){Map<String,String[]>params=getRequest().getParameterMap();for(Stringvalue:values){.println("value="+value);(.(key,"UTF-8")+"=");(.(value,"UTF-8")+"&");}//刪除末尾多余的&字符if(().endsWith("&")){(()-1);}/***獲取當前會話的登錄用戶信息*@returnUser*/publicUsergetSessionLoginedUser(){UsercurrentUser=(User)getSession("loginedUser");returncurrentUser;}3.10.2UserAction類摘要設計文件上傳相關的屬性:,Stringphoto;photo是表單域的名字.1.JDK版本2.JAR包沖突XML解析器Hibernate前臺:<formmethod="post"enctype="multipart/form-data">頭像:<inputtype="file"id=”photo”name="photo"class="validate-"onchange=”=;”><br>如何預覽頭像?!(IE瀏覽器比較容易實現(xiàn),其他的沒保證,安全IE6可以,IE7和其他瀏覽器可以通過降低安全級來實現(xiàn))<imgid=”uploadPreview”src=”空圖->logo”>=;3.10.3Struts2通配符方式配置采用此配置可以大大減少代碼量,Struts1中沒有對等的內(nèi)容.<actionname=”*”class=”UserAction”method=”{1}”><resultname=”message”>/</result><resultname=”listUser”></result>的寫法可以從Struts2完整包struts2-blank-.wardelete>list<resulttype=”dispatcher”></result>重定向到另一個Action<resulttype=”redirectAction”>list(Action的name)</result>Result重定向到另一個地址<resulttype=”redirect”>/</result>3.10.4用戶列表功能user/>()>list(){1.查詢記錄得到數(shù)據(jù)集合results2.setAttribute(‘屬性名’,results)3.return結果名}<c:forEachitems=‘屬性名’var=’user’>${}刪除user/?id=${}修改user/?id=${}</c:forEach>3.10.5刪除user/?id=3>()>/1.findById()->Useruser;2.(user);3.10.6表單AJAX驗證功能前臺寫法:用戶名:<inputname=""class="requiredvalidate-ajax-user/"><br>后臺寫法:StringajaxValidate1.用戶名敏感詞禁止注冊BadWordsFilter2.用戶名唯一3.Email唯一4.圖片驗證碼合法Action配置:<resultname=’ajaxResponse’>/ajax_</result>/ajax_${message}3.10.7注冊/+/+EasyValidation>reg()>/(可用Servlet代替)生成驗證碼1.設置頁面內(nèi)容類型為圖片2.清空以前緩沖區(qū)3.創(chuàng)建彩色緩沖圖4.獲取圖形(畫筆)對象5.填充白色的背景6.隨機產(chǎn)生155條干擾線,使圖象中的認證碼不易被其它程序探測到(可選)7.繪制顏色為紅色8.生成隨機數(shù)字驗證碼并存入session,然后輸出到圖片中9.設定字體10.繪制驗證碼到圖片上11.關閉對象,釋放內(nèi)存,刷新到圖形對象12.使用ImageIO把內(nèi)存的圖片編碼到輸出流,參數(shù)依次為:圖片對象,格式(png,jpg),輸出流難點(可復制粘貼):<%!ColorgetRandColor(intfc,intbc){//給定范圍獲得隨機顏色Randomrandom=newRandom();if(fc>255)fc=255;if(bc>255)bc=255;intr=fc+(bc-fc);intg=fc+(bc-fc);intb=fc+(bc-fc);returnnewColor(r,g,b);}%>//隨機產(chǎn)生155條干擾線,使圖象中的認證碼不易被其它程序探測到g.setColor(getRandColor(160,200));for(inti=0;i<155;i++){intx=(100);inty=(20);intxl=(12);intyl=(12);g.drawLine(x,y,x+xl,y+yl);}reg()–注冊方法1.檢查session驗證碼和表單參數(shù)中是否一致2.檢查輸入的驗證碼3.用戶名敏感詞禁止注冊4.密碼MD5保存5.保存注冊日期6.設置激活狀態(tài)為false7.生成一個激活碼activeCode并存入數(shù)據(jù)庫UUID8.重命名文件并保存上傳的圖片到/upload9.獲取/upload真實路徑10.重命名為uuid.擴展名11.()快速復制文件12.更新頭像的存儲路徑到實體類13.發(fā)送激活郵件StringactiveURL="myscm2?code="+activeCode;Stringmessage="<><body>您注冊了新用戶,激活碼是:"+activeCode+",可點擊此地址激活賬戶:"+"<ahref='"+activeURL+"'>"+activeURL+"</a>"+"</body></>";返回注冊結果頁面3.10.8激活activation()>從表單參數(shù)讀取激活碼根據(jù)UUID激活碼找到當前用戶fromUserwheretempcode=?檢查激活狀態(tài),如果已經(jīng)激活,就提示他無需重復激活更新激活標志位(active)到數(shù)據(jù)庫返回成功激活/失敗信息3.10.9用戶登錄>login()>1.對密碼進行MD5摘要計算2.是否存在給定用戶(根據(jù)用戶名查找)檢查是否激活!3.如果用戶存在,比較用戶名,密碼和用戶類型4.登錄成功用戶信息存入Session-->loginedUser更新登錄次數(shù)5.顯示登錄結果6.根據(jù)用戶類型轉向不同的功能頁面1.管理員轉向2.其他用戶轉向/3.10.10用戶注銷清空session或者invalidatesession3.10.11修改用戶自己資料user/>update()>如果是后臺管理,需要根據(jù)ID查出用戶的信息修改的步驟:1.從Action查出用戶的信息editUI()1.findById()->Useruser;2.setAttribute(‘user’,user)3.返回到2.顯示修改表單頁面user/<formaction=‘user/’>-->根據(jù)ID修改用戶(后臺),修改自己的就不需要<inputtype=”hidden”name=””value=”${}”>...只修改了一部分字段3.提交到Action來更新數(shù)據(jù)update(){1.數(shù)據(jù)庫找findById()->Useruser;老記錄(根據(jù)ID改才需要)2.先設置user部分字段的新信息,再update()如果頭像不為空,需要先刪掉老頭像,再保存新頭像并更新到數(shù)據(jù)庫3.轉向message/}4.顯示修改結果(成功/失敗)3.10.12取回密碼>()+發(fā)郵件給用戶>Email有效性檢查根據(jù)Email找到用戶信息生成一個隨機的密碼并MD5摘要后更新到數(shù)據(jù)庫發(fā)送取回密碼通知郵件+提示用戶去檢查郵箱3.10.13修改個人密碼user/>()>檢查舊密碼不能為空,新舊密碼必須一致,長度限制1.確保用戶登錄2.取出已登錄用戶信息3.檢查用戶輸入的舊密碼(MD5)是否正確4.新密碼MD5存入數(shù)據(jù)庫5.更新下session里面的loginedUser對象6.提示更新成功+用戶通知郵件(TODO)3.10.14根據(jù)ID查看用戶信息findById()>user/fromUserwhereid=?用戶信息存入request的attribute:setUser(u);轉向前臺頁面用EL顯示3.11開發(fā)安全過濾器模塊自底而上的控制方式/目錄/文件名ROLE,/目錄/文件名ROLE,/目錄/*四個路徑變量,四個HQL,四個boolean值分別對應HQL的執(zhí)行結果,有記錄就是true四個路徑變量1.請求上下文路徑contextPath/myscm22.請求路徑requestPathadmin/3.資源相對路徑resourceUri=(())-->4.目錄通配符路徑folderUri->*取到RoleID四個HQL資源訪問檢查的順序是(以訪問為例):1.檢查是否存在允許訪問的角色à條件1;àtrueselectcount(*)fromresourcewhereuri=''2.檢查是否存在允許訪問*的角色à條件2;àtrueselectcount(*)fromresourcewhereuri='*'3.如果條件1和條件2都不存在,則允許任何角色訪問此URL;4.如果條件1或條件2之一存在,那么只有允許的角色才可訪問此URL,進入5;5.檢查是否存在允許當前角色訪問的記錄,是則運行訪問,否則進入下一步;selectcount(*)fromresourcewhereuri=''androleId=-16.檢查是否存在允許當前角色訪問*的記錄,是則允許訪問,否則禁止用戶訪問并顯示出錯信息.selectcount(*)fromresourcewhereuri='*'androleId=-13.12開發(fā)后臺管理模塊(此模塊建議作為練習)3.12.1前臺設計技術細節(jié):XLoadTree實現(xiàn)樹狀組件text標簽src指向另一個xml樹定義action超鏈接地址icon目錄/節(jié)點展開前的圖片openIcon目錄展開后的圖片target超鏈接的目標框架(文檔中沒有)可視化HTML編輯器:FckEditor<metahttp-equiv="Content-Type"content="text/;charset=utf-8"/><scripttype="text/javascript"src="fckeditor/"></script><scripttype="text/javascript">=function(){varsBasePath="fckeditor/";//指向fckeditor的存放目錄varoFCKeditor=newFCKeditor('要替換的文本區(qū)表單域的名字');='500px';//高度,可以用100%//='400px';//寬度=sBasePath;//設置基礎路徑['SkinPath']='.office2003/';//換膚,查看fckeditor\editor\skins下的皮膚目錄名//='Default';//切換工具條配置,默認為完全,Basic是簡潔模式,可以用來發(fā)評論時['FullPage']=true;//指定編輯的HTML代碼是否包括<>完整標記,可用來做內(nèi)容管理時發(fā)布完整HTML頁面();//替換文本區(qū)為可視化網(wǎng)頁編輯器}</script>3.12.2用戶管理概要設計備注:為了復用一些方法,此類應繼承自UserAction.用戶搜索admin/user_>()>admin/user_添加新用戶admin/user_>()>/瀏覽所有用戶()>admin/user_此模塊已實現(xiàn),但應用戶列表頁面應稍作修改,不顯示刪除管理員的鏈接,可復用父類UserAction中的方法刪除用戶?id=[編號]>deleteUser()不能刪除管理員自己3.13站點全局配置及加載加載可用Listener;或者load-on-startup為0的servlet實現(xiàn);Filter的init()方法來啟動時載入.1.讀取第一條AppConfig實體類2.信息存入application:("appConfig",appConfig)3.分析敏感詞列表并存入BadWordsFilter對象((“\r\n”))最后注冊到頁面的頭文件中:${}-${title}修改頁面設計:直接提交到JSP進行更新即可.admin/app_>appconfig_1.更新數(shù)據(jù)庫2.更新Application中的對象(可直接調(diào)用Listener中的現(xiàn)成方法)3.重新解析并設置敏感詞列表4.轉向修改頁面3.14安全中心3.14.1頁面設計3.14.2添加新角色3.14.3瀏覽所有角色3.14.4添加資源訪問許可3.14.5瀏覽所有資源訪問許可4供應商和商品模塊4.1實體關系SCM_USER用戶表,N個Vendor,OrderVendor供應商表,N個ProductProduct商品表SCM_Order訂單表,N個OrderItemSCM_Order_Item訂單項表,N個ProductApp_Config全局設置表SCM_Role角色表,對應N個ResourceSCM_Resource資源訪問權限表4.2功能分析4.3商店首頁面用到的技術:跨瀏覽器純CSS菜單4.4供應商模塊4.4.1類設計此類基本類同于UserAction.4.4.2建表,編寫實體和HBM文件并注冊到.xmlVendor,Product,Order,OrderItemHBM文件沒改catalog.4.4.3添加Struts2Action配置4.4.4注冊供應商用戶注冊時選擇供應商用戶即可,參見用戶模塊.4.4.5添加供應商(TODO供應商審批,隸屬于交易員模塊)輸入供應商信息vendor/>()>頁面設計:4.4.6查看我的供應商列表myList()>vendor/1.fromVendorwhere=當前登錄用戶的ID2.查詢結果放入setAttribute(“vendors”,result);3.轉向”list”4.4.7查看所有供應商列表list()>vendor/限制條件:只顯示審批過的供應商列表1.fromVendorwhereaudited=true2.查詢結果放入setAttribute(“vendors”,result);3.頁面用<c:forEach4.4.8查看供應商詳細信息vendor/?id=[編號]>findById()>vendor/1.findById(,ID)->Vendorv2.查詢結果放入setVendor(v)3.轉向”findById”4.4.9修改供應商信息限制:可以修改,但是修改后自動變成未審批狀態(tài),最后修改日期我的供應商列表vendor/?id=${}>editUI()>vendor/>update()>日志表:功能,操作對象,日期,操作人,操作結果管理員日志表editUI()類似于findById()-->result不一樣1.數(shù)據(jù)有效驗證2.無權修改不屬于自己的供應商信息update()1.DAO的update()2.TODO如果有頭像,刪除老的,再存入新的頭像!!設置狀態(tài)為未審批!!3.return“message”修改成功4.4.10根據(jù)名字查找供應商列表頁面:快速通道下方?vend_name=microsoft>findListByName()>vendor/需求:模糊查找"fromVendorwherenamelike'%"+name+"%'"單個字符是select*fromscm_userwherenamelike'__a%'第三個字符是a的記錄如果記錄名有單引號,查詢語句:select*fromscm_userwherenamelike'a''dmin'Stringname=(“’”,“’’”);1.去參數(shù)2.過濾單引號3.生成HQL并查詢4.查詢結果放入request5.轉向list4.4.11查看分成總額viewDenductSum()>"selectsum(o.deduct)fromOrderItemo..id="+userId此模塊要在商品模塊完成后再做4.4.12修改分成合并到修改商品信息功能即可同交易員功能模塊的商品打折分成調(diào)整,留作練習.不同點:修改之后商品應進入未審批狀態(tài).4.5商品模塊商品模塊主要包括:1.添加2.修改-->修改定價,打折和分成;修改商品基本信息3.刪除4.模糊查找5.精確查找6.查看商品的詳細信息7.列出所有商品4.5.1類設計Vendor可以用交易員可以用4.5.2頁面設計4.5.3添加商品toadd()>product/>add()>message三級級聯(lián)菜單省市縣1.JS把值事先都讀出來,然后onchange來觸發(fā)選擇2.AJAX異步加載(推薦)需要預先讀出我的Vendor列表信息,顯示添加頁面,添加完成顯示添加結果toadd()1.生成查詢語句,得到我的供應商列表select*fromVendorvwherev.=${}setAttribute(“vendors”,result)2.轉向add顯示一個供應商下拉列表add()1.保存()2.狀態(tài)設置為未審批轉向添加結果頁面2008-09-2110:54:14,937ERROR[.]-Table''doesn'texist表格沒創(chuàng)建業(yè)務邏輯:后面這些就屬于.思考:照片-->商品相冊表1商品對應0~*圖片一對多1.縮略圖2.詳細圖-->三視圖正面,側面,背面商品描述信息:多個屬性1.屬性表編號屬性名屬性度量單位1顏色2重量KG3長度CM2.商品信息表編號商品編號屬性編號屬性取值111red2123313100網(wǎng)頁顯示:筆記本顏色:red重量:3KG長度:100CM4.5.4瀏覽單個商品信息product/?id=商品編號>findById()>product/4.5.5瀏覽我提交的商品列表顯示所有的商品,不論審批與否product/>myList()>product/fromProductwhere.=${}4.5.6瀏覽所有商品列表(給購物者)product/>list()>product/list()要點:不能列出未審批的商品fromProductwhereaudited=truereturn“l(fā)ist”4.5.7修改商品信息修改:一定是當前用戶提交的商品<c:iftest=”${.==”>修改鏈接</c:if>商品列表頁面>?id=商品編號>toedit()>>update()>message4.5.8高級商品搜索模糊查詢商品,并根據(jù)是否有庫存進行查找?keyword=aaa>findByName()>product/[X]inc_Name名字包含__光盤__name[X]inc_Amount庫存包含_Y/N__amout[X]inc_Catalog分類包含_操作系統(tǒng)_catalog一旦選中條件,后面值不能為空<inputtype=checkboxvalue=”inName”>(“inName”)沒選中這個值是多少?“”還是null?1)復合查詢提交到后臺,然后寫一串if-else來判斷Stringhql=“fromProduct”;Stringcondition=””;if(inc_Name!=null){condition+=“namelike‘%”+getParameter(“name”)+“%’and“;}if(inc_Amount!=null){condition+=“namelike‘%”+getParameter(“inc_Amount”)+“%’and“;}if(inc_Catalog!=null){condition+=“cataloglike‘%”+getParameter(“catalog”)+“%’and“;}//把語句最后的and去掉condition=(0,(“and”));if(condition不是空){hql+=“where”+condition;}fromProductwherenamelike‘%abc%’if(有庫存選項){+“andamount>0”;}2.用JavaScript在前臺把查詢條件拼出來成一條condition現(xiàn)成框架4.5.9查看庫存頁面流程:在左側輸入模糊的商品名,然后查看其庫存,在新頁面彈出查詢結果.>findByNameShowAmount()>product/list_findByNameShowAmount(){findByName();return“l(fā)istAmout”;}前后都可以MVC切換View層即可實現(xiàn),C保持不變<actionname=”findByNameShowAmount”class=”ProductAction”method=”findByName”><resultname=”list”>list_</result></action><actionname=”*”...//顯示Excel格式的商品列表-->方便打印,做報表HTML顯示為Excel:4.5.10銷量排行TOP10product/>listOrderByTotalSold()>listMVC重用V層,切換CHQL:fromProductwhereaudited=trueorderbytotalSolddesclist()每個字段都要排序列表的每個列名加排序鏈接:<ahref=”?column=name&order=desc”>商品名</a>上或者下兩個圖4.5.11商品列表輸出為Excel格式()>listExcel切換視圖層contentType=”application/-excel”頁面必須顯示一個Table,Excel會自動作為單元格顯示JXL生成/解析ApachePOI4.5.12按供應商瀏覽商品product/>()>product/list_by_<actionname=”listByVendor”class=”VendorAction”method=”list”><resultname=”list”>list_by_</result></action>顯示供應商列表<ahref=”?id=供應商ID”>微軟</a>>ProductAction.findByVendor()>listfromProductwhereaudited=trueand=ID參數(shù)點擊單個供應商>顯示該供應商提交的所有商品5購物車模塊5.1頁面設計5.2類設計屬性說明://Map<商品主鍵,訂單項>privateMap<Long,OrderItem>items=newHashMap<Long,OrderItem>();privatedoublecost;//購物車物品總價功能說明:方法名說明addItem()添加訂單項empty()清空購物車getCost()物品總價格getItem()根據(jù)商品編號獲取訂單項getItemCount()商品件數(shù)(不是商品總個數(shù))getItems()獲得購物車項目的Map列表getOrderItems()獲得購物車中的所有訂單項(物品列表)isEmpty()購物車是否為空modifyItemNumber()更改商品數(shù)目removeItemByProductId()根據(jù)編號刪除商品setItems(Map<Long,OrderItem>)設置新的列表5.3CartAction5.3.1獲取Cart對象的方法,來從session取出購物車CartgetCart(){Cartc=getSession(“cart”);//已有購物車對象,直接返回if(c!=null){returnc;}else{//沒有,初始化新的放入session,并返回c=newCart();setSession(“cart”,c);returnc;}}5.3.2購物車物品列表cart/<c:forEachitems="${}"var="item">顯示購物車訂單項列表用到了()5.3.3清空購物車()>list5.3.4添加訂單項cart/?product_id=商品編號>()>list//如果沒有訂單項,就創(chuàng)建新的if(cart.根據(jù)商品編號獲取訂單項getOrderItem(product_id)==null){找到商品創(chuàng)建新訂單項并設置件數(shù)}else{如果有,就更新訂單項的商品件數(shù)+1}return“l(fā)ist”;返回添加結果和當前商品有幾件AJAXreturn“ajax_response”;${message}//使用AJAX方式從后臺更新商品購買數(shù)量functionajaxAddItem(product_id){//異步執(zhí)行更改購買數(shù)量操作("cart/?product_id="+product_id+"×tamp="+newDate().getTime(),function(data){alert(data);});}5.3.5jQuery異步加載(“url”,function(返回的HTML代碼){});-->functiondisplayTime(){("",function(data){alert("當前服務器時間是:"+data);});}jQuery("#頁面元素ID").load("URL地址");<!--jquery,注意加載順序--><scriptsrc="..jquery-1.2.6."></script><scripttype=”text/javascript”>varjQuery=$;</script><script>functiondisplayTime(){("",function(data){alert("當前服務器時間是:"+data);});jQuery("#time").load("");}</script></head><body><inputtype="button"onclick="displayTime()"value="查看時間">顯示時間:<divid="time"></div></body></>5.3.6購物車移出商品?product_id=商品編號>()>重定向到cart/防止用戶重復通過GET方式刪除購物車訂單項5.3.7定時刷新購物車件數(shù)(所有頁面和)1.分一個頁面元素cartItemCount-->inc_<spanid=”cartItemCount”>${}</span>件2.JavaScript定時setInterval(“表達式”或者function(),定時毫秒數(shù))-->周期性的定時setTimeout(“表達式”或者function(),超時毫秒數(shù))-->過一定時間后,只執(zhí)行一次表達式jQuery("#頁面元素ID").load("URL地址");前臺代碼://緩慢定時更新購物車物品數(shù)functionajaxSlowUpdateCartItemCount(){//確保存在頁面元素塊if($("cartItemCount")){(function(){jQuery("#cartItemCount").load("cart/?timestamp="+newDate().getTime());},10000);}}調(diào)用此方法ajaxSlowUpdateCartItemCount()-->inc_后臺:()setMessage(getCart().getItemCount());return“ajax_response”;5.3.8修改購物車訂單項物品數(shù)表單:<formclass='required-validate'action="cart/"><inputtype="hidden"name="product_id"value="${.id}"><inputname="amount"value="${}"size="5"oldValue="${}"maxCount="${.amount}"class="requiredint-range-0-${.amount}"><inputtype="submit"value="修改"></form>?product_id=商品編號&amout=物品數(shù)>updateProductAmout()>重定向到cart///獲取訂單項OrderItemitem=getCart().getOrderItem(getParameterLong("product_id"));if(item==null){return"list_redirect";}//設置新的物品數(shù)(getParameterInt("amount"));//如果物品數(shù)不合理,就清空此訂單項if(()<=0){getCart().removeItemByProductId(getParameterLong("product_id"));}5.3.9***重點創(chuàng)建訂單項createOrder()>1.創(chuàng)建訂單商品賣出去了,更新下庫存和已銷售數(shù)字//為了防止總數(shù)字為nullif(getSessionLoginedUser().getBuyCount()==null){getSessionLoginedUser().setBuyCount(0);}//關聯(lián)Item和Order不關聯(lián),將導致OrderItem出現(xiàn)壞數(shù)據(jù)(order);//設置訂單的狀態(tài)為未支付(0);如果不寫,status數(shù)據(jù)庫存為null,導致數(shù)據(jù)庫查詢條件失敗.2.清空購物車3.轉向message6訂單模塊6.1我的訂單order/[?payed=true]>()>order/參數(shù):payed=true/false是否已支付1.拼出我的訂單列表的HQLStringhql="fromOrderowhereo.="+;2.加入是否支付參數(shù)條件+"ando.status";if(payed){hql+=">0";}else{hql+="=0";}3.數(shù)據(jù)放入視圖層setAttribute(“orders”,執(zhí)行HQL得到List<Order>);return“l(fā)ist”;order/<c:forEachvar=”order”items=”orders”>加入一個鏈接,顯示給定訂單的訂單項詳情?id=訂單ID</c:forEach>6.2查看訂單詳情?id=訂單ID>()>viewOrder1.根據(jù)ID取到訂單longorderId=getParameterLong("id");Orderorder=(Order)getBaseDAO().findById(,orderId);2.檢查此訂單是否為當前用戶所有!保護用戶隱私().()不是,給用戶一個警告,然后轉向3.將order信息帶回前臺setAttribute("order",order);關聯(lián),不需要單獨寫HQL查詢OrderItem前臺:order/<c:forEachitems=””var=”item”></c:forEach>6.3購物總數(shù)和支出金額從用戶信息獲取即可.order/${}${}6.4未支付/已支付訂單列表(顯示支付鏈接)功能同本模塊第一個,只是加入了payed參數(shù).已支付order/?payed=true未支付order/?payed=false7交易員模塊7.1供應商審核1.顯示未審核的供應商列表operator/?audited=false>OperatorAction.findVendorListByAudited()>operator/vendor_2.點擊列表上的審核鏈接operator/?id=供應商的編號//1.根據(jù)ID拿到Vendor//2.設置審批狀態(tài)和審核人編號//3.更新//4.轉向findVendorListByAuditedAction3.再回到列表頁面redirectAction到findVendorListByAudited7.2商品審核operator/?audited=falseoperator/product_基本步驟同供應商審核.7.3商品打折和分成調(diào)整調(diào)整后應該給供應商用戶發(fā)送通知郵件.1.顯示商品列表operator/operator/讀取商品列表>operator/product_fromProduct不需要限制是否為審批2.從商品列表跳向修改表單頁operator/根據(jù)ID找到Product單個product屬性放入request轉向修改頁面:operator/product_只能修改打折和分成信息3.更新打折和分成信息并發(fā)送郵件通知vendoroperator/>8安全配置給各個資源加入相關的安全URL限制,防止非法修改和訪問.例如供應商不能訪問操作員下面的功能.1.過濾器2.頁面不要顯示多余的功能鏈接擴展:如果要用數(shù)據(jù)庫來動態(tài)配置功能菜單,表的設計:菜單表編號標題roleIdMenuSet<MenuItem>items;introleId;子菜單項表:編號菜單ID標題URLfromMenu<c:forEachitems=”menus”var=”menu”><c:iftest="${==}">${}<c:forEachitems=””var=”item”><ahref=”${}”>${}</a></c:forEach></c:if></c:forEach>CMSContentManagementSystem內(nèi)容管理系統(tǒng)9支付1.做一個支付請求確認頁面1.1選何種支付(財付通,支付寶,網(wǎng)銀)order/?id=訂單號>order/1.2列出有幾件商品,準備提交支付請求的表單提交到?id=訂單號>order/根據(jù)ID查出訂單信息即可對應tenpay_2.做一個支付通知處理頁面對應notify_3.做一個支付結果客戶通知頁面對應tenpay_10程序開發(fā)調(diào)試交流10.1日期解析和格式化SimpleDateFormat我有個字符串:2008年9月25日11點25分30秒星期四讓你轉成日期:或者從Date對象轉成如上的日期字符串.SimpleDateFormat能夠解析和格式化字符串/****/packagetest;import.ParseException;import.Calendar;/***日期格式化和解析.*@authorBeanSoft**/publicclassSimpleDateFormatTest{publicstaticvoidmain(String[]args){//2008年9月25日11點25分30秒星期四.SimpleDateFormatdf=new.SimpleDateFormat("yyyy年MM月dd日HH點mm分ss秒EEE");.println((new.Date()));StringbirthDay="19802";.SimpleDateFormatdf1=new.SimpleDateFormat("yyyydd");try{.Dated=df1.parse(birthDay);intweek=d.getDay();.println((d));}catch(ParseExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}Calendarcalendar=();(new.Date());(,1000);//向前算.add(,-2)過了一千天(,100);//一百小時之后.println((()));}}10.2SQL日期精度問題.Date-->時分秒年月日都有SQL三類表示時間的字段類型:date,只存年月日,時分秒自動丟棄,變成0time,只存時分秒,不存年月日datetime,時分秒年月日毫秒timestampXXX一更新自動,取值自動修改為當前時間Hibernate實體:DateregDate;SQL:regDatedatenotnull;存入日期,但是取出來發(fā)現(xiàn)時分秒全是0.10.3Hibernate對基本類型的處理如果數(shù)據(jù)庫存的INT類型的字段值是NULL,()Integer>null()+1-->nullpointerEntityintcount;不能把NULL轉成int.查詢就會報錯.如果實體的整數(shù)屬性值是null,插入數(shù)據(jù)庫后存的值也是null.會影響SQL條件的判斷準確與否.10.4Hibernate一對多保存時發(fā)現(xiàn)一的一方未關聯(lián)上OrderSet<OrderItems>items;OrderItemOrderorder;Orderorder=newOrder();OrderItemitem=newOrderItem();將item和order關聯(lián)起來:(order);save(order);10.5嘗試對字符串做forEach循環(huán)出錯(EL)Causedby:.PropertyNotFoundException:Property'product'notfoundontype.String<c:forEachitems=""var="item"><tr><td><ahref="product/?id=${.id}".()==><c:forEachitems="${}"10.6IE8Beta丟失問題<ahref=”action”target=”_blank”>再新窗口打開頁面后,Session就丟了.去掉target即可,保持為同一頁面.新窗口到底是不是保存會話,HTML沒有規(guī)定.以實際運行時為準.10.7各種有效的contentType從哪里找?$tomcat_home10.8IE6下面看不到CSS菜單臨時解決辦法:換IE7或者Firefox/Opera.IE6.原系統(tǒng)已經(jīng)帶有解決辦法,似乎是IE6CSS解析的BUG.CSS菜單IE6問題解決:導入并在IE6下調(diào)用代碼:<!--[iflteIE6]><scripttype="text/javascript">addWindowEvent("onload",parseStylesheets);</script><![endif]--><!—[iflteIE6]>表示什么意思呢?這是一個CSS條件判斷語句,lte表示lowerthanorequal<=,小于等于IE6.參見資料:CSS-Conditional.常用來做不同瀏覽器IE下的頁面適配.測試可以使用免費軟件IETester來完成,此軟件可以仿真各個版本的IE瀏覽器內(nèi)核,這也是實際開發(fā)經(jīng)常要進行的工作.此問題的解決方法為:排除法,先刪除不相干的內(nèi)容,然后將頁面剩余部分的元素和腳本一一刪除.10.9NoresultdefinedforactionXXXandresultsuccess(input)的真正錯誤原因return的resultname無法在配置文件中找到.解決辦法在文件中加入即可.10.10排除法在瀏覽器點提交(POST),總是不能轉向action里面的reg方法,但是在地址欄敲入地址,這時候可以執(zhí)行reg().10.10.1排除瀏覽器及瀏覽器版本的因素換用不同的瀏覽器,重置瀏覽器設置,發(fā)現(xiàn)問題依然存在,但有一個小進步,發(fā)現(xiàn)Opera瀏覽器正常提交且顯示了錯誤信息;10.10.2排除多余屬性的干擾另一個例子:某同學發(fā)現(xiàn)fromUser查詢總報錯,可嘗試將.xml中的屬性先除了ID全部刪掉,然后一一加上,看何時出錯再做修改.10.10.3JDK運行版本和開發(fā)工具編譯器版本是否匹配?在項目上點擊鼠標右鍵菜單選擇Properties.J2EE1.4項目創(chuàng)建時有可能將項目編譯基本給設置成了1.4.開發(fā)和運行時候的JDK版本以及編譯版本必須一致.JDK6>1.6,1.5,1.4三種輸出CompilerVersionJDK6支持JDK5只支持1.51.4JDK1.41.4EclispeJDK1.5/1.6CompilerVersion1.4沒法用EclipseJDK1.5編譯級別是6,導致JVM不認識..UnsupportedClassVersionError:Badversionnumberin.classfile1.先看兩個JDK(Eclispe項目JDK和Tomcat的JDK)版本是不是一致2.再看編譯級別是不是和TomcatJDK版本一致10.10.4重新發(fā)布Web應用或者復制新的JAR/Class文件了嘛?典型錯誤信息:.NoClassDefFoundError10.10.5Hibernate的包加完整了嘛?.ServletException:Filterexecutionthrewanexception$$M$9fe7f479.doFilter(:39)$$A$9fe7f479.doFilter(<generated>).doFilter(<generated>)rootcause.NoClassDefFoundError$$M$282703a.doFilter(:59)$$A$282703a.doFilter(<generated>).doFilter(<generated>)$$M$9fe7f479.doFilter(:39)$$A$9fe7f479.doFilter(<generated>).doFilter(<generated>)10.10.6別的類似項目是否能正常運行?如果能,則說明是本項目JAR包或者配置文件有問題.10.10.7perties是我們的好朋友日志的控制文件,Strus1/2,Spring,Hibernate都用LOG4J做日志.log4j.rootLogger=WARN,stdoutlog4j.=.log4j.ConsoleAppenderlog4j..layout=.log4j.PatternLayoutlog4j..=%d%p[%c]-%m%nSLF4J:Failedtoloadclass"4j.".SLF4J:Seeforfurtherdetails.2008-9-1823:54:17..StandardWrapperValveinvoke嚴重:()forservletjspthrewexception.NoClassDefFoundErrorat.doFilter(:59)at..(:235)at..(:206)at.doFilter(:39)at..(:235)at..(:206)at..(:233)at..(:175)at..(:128)at..(:102)at..(:109)at..(:263)at.11.Http11(Http11:852)at.11.Http11AprProtocol$Http11(Http11:584)at..$(:1508)at.(:595)10.10.8人不如新,衣不如舊Java中的類庫,老版本的比新版本的穩(wěn)定可靠.JDK也是如此,實際運行不要下載最新版和beta版的軟件包.Hibernate3.3加入JAR包后出現(xiàn)問題很多.參見上一小節(jié),因此用Hibernate3.2保險一些.10.10.9把能正確

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論