




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、重慶郵電大學項目報告封面 2014-2015年第一學期課程名稱 面向對象程序設計 姓 名 楊守建 年 級 2012級 專 業 計算機科學與技術專業卓越工程師班 2015年 01 月 08 日面向對象程序設計選題報告學號:2012211869 姓名: 楊陽 學院/專業: 計算機卓越工程師 學號:2012211531 姓名: 楊守建 學院/專業: 計算機卓越工程師 學號:2012211685 姓名: 何益 學院/專業: 計算機卓越工程師 學號:2012211585 姓名: 梅香 學院/專業: 計算機卓越工程師 題目個人銀行賬戶管理系統選題依據根據老師上課的要求,通過小組各個成員的努力,完整地編寫一
2、個具備基本功能,并有自己小組的特色個人銀行的管理系統。基于此,我們小組的特色主要是這是一個個人銀行賬戶的管理,因此,沒有辦法設定存錢和取錢的功能,因為這只是一個賬戶,用戶登錄之后可以對銀行賬戶里的銀行卡進行操作,包括轉賬、查詢交易記錄、余額查詢等。這個系統是在專有銀行的基礎上進行操作的,為此,我們將設計一個自己的銀行,并在已有的賬戶上進行操作。開發小組成員及分工姓名職務負責工作楊陽項目經理邏輯運行框架設計、模塊設計、數據庫設計及相關sql語句實現、整理完成文檔、調試楊守建技術骨干開發環境搭建、主功能選擇模塊、子業務模塊、模塊整合何益技術助理開發環境搭建、子業務模塊、模塊整合、調試梅香美工數據庫
3、設計及相關sql語句實現、整理完成文檔、ps界面美化開發思路及總體設計采用面向對象的Java Swing技術和MySql數據庫,編寫實現個人銀行賬戶管理系統的基本功能,包括用戶管理功能、銀行業務功能和管理員管理三個主要方面的功能。一需求分析當我們收集了大量的數據后,應該把它們保存起來進入近一步的處理,進一步的抽取有用的信息。當年人們把數據存放在文件柜中,可現在隨著社會的發展,數據量急劇增長,現在人們就借助計算機和數據庫技術科學的保存大量的數據,以便能更好的利用這些數據資源。 通過銀行管理系統的構造以及賬戶的個人的信息還有卡號管理的相關信息制成表格,輸入到數據庫中,使之能夠進行查詢、修改、刪除并
4、且與個人銀行系統執行相同的操作。二具體功能設計個人銀行賬戶管理系統為用戶提供用戶注冊、用戶登錄、用戶信息修改、余額查詢、轉賬、卡管理 等主要功能。最后還要實現了界面的友好化,使得用戶可以在不同的界面環境下使用本系統。在用戶注冊功能下,用戶可以注冊一個屬于自己的銀行賬號,并在此基礎上進行相關的操作。注冊用戶時,需要填寫一些用戶的基本信息,包括設置賬戶的密碼,規定賬戶的密碼是六位數字,用戶還需要填寫聯系電話,以方便在密碼遺忘的情況下,通過手機號找回密碼。注冊完用戶自己的賬戶之后,用戶進行登錄,然后進入到主界面。首先,用戶可以利用信息修改的功能界面對用戶個人信息進行修改。修改的信息包括用戶昵稱、家庭
5、住址、性別、聯系電話還有用戶登錄的密碼。在進行密碼修改之前,要先輸入原始密碼才能對密碼進行修改。最主要的功能就是基于銀行卡的管理,包括余額查詢、轉賬、交易記錄的查詢都是基于銀行的操作的。首先初次登錄的用戶需要添加一個實際已經存在的銀行卡,一個用戶可以添加多張銀行卡,通過輸入銀行卡號來添加銀行卡,這個銀行卡必須是事先已經存在了的銀行卡,然后跟用戶的賬戶相關聯,就可以進行其他的操作了。在轉賬的功能界面,用戶可以向其他用戶的銀行卡進行轉賬,也可以向自己賬戶里面的其他銀行卡進行轉賬。在選擇了要轉賬的銀行卡號之后,會出現轉入卡號所在用戶賬戶的姓名,已防止出現由于卡號輸錯而錯誤轉賬的情況。另外,在確認轉賬
6、之前,需要再次輸入卡的密碼,以防止不是本人的操作。當用戶的卡號有了轉賬之后就可以查詢交易記錄了。在交易記錄查詢的功能里面,將顯示轉入的明細情況,包括轉入的卡號、轉出的金額、轉出的時間等具體情況,方便用戶能夠更加清楚看到近期來的交易情況。當用戶進行交易之后可以在余額查詢的功能界面里查詢賬戶所有卡的余額,用戶還可以看到對應銀行卡的卡類型,是活期還是死期,還有活期及死期的年限,為用戶提供了極其友好化的查詢管理。最后還是回到銀行卡管理上面,當用戶添加銀行卡之后,還可以對卡進行一些其他的操作。當銀行卡丟失或者是由于個人原因不再使用本卡之后,可以對銀行卡進行掛失處理,如果過一段時間(不超過三個月,超過三個
7、月卡號自動失效)用戶仍然需要用到這張銀行卡,則可以利用找回卡的操作對卡進行激活,這樣就可以再次只用本卡了。不過在掛失和找回之前都需要輸入銀行卡的密碼,以便確保銀行卡的安全。三.程序開發 1).制定日程安排表以及詳細的任務分工 2).嚴格按照進度安排進行任務開展,包括各個功能模塊的具體實現,模塊之間要滿足低耦合和高內聚的要求 3).按照java編程規范編寫代碼 4).按照java文檔注釋規范注釋四.系統功能圖五數據庫設計 5.1 E-R圖5.2 數據安全處理 1.使用驗證碼進行校驗 2.使用正則表達式進行校驗 3.數據庫中對于用戶密碼這類關鍵消息使用hash函數MD5算法進行數據加密, 保證用戶
8、信息安全使用 4. 使用數據庫的事務處理,使得數據的一致性得到保障。 5.定時對數據庫進行備份,以防數據的丟失。 填表日期: 2015.1.8 面向對象程序設計進展報告學號:2012211869 姓名: 楊陽 學院/專業: 計算機卓越工程師 學號:2012211531 姓名: 楊守建 學院/專業: 計算機卓越工程師 學號:2012211685 姓名: 何益 學院/專業: 計算機卓越工程師 學號:2012211585 姓名: 梅香 學院/專業: 計算機卓越工程師 題目個人銀行賬戶管理工作進展具體任務預算時間人員分配前期準備(相關材料收集)6天10月18日-10月24日楊陽、楊守建、何益、梅香開發
9、環境搭建3天10月25日10月28日楊守建、何益邏輯運行框架設計3天10月28日-11月1日楊陽UI設計4天11月1日-11月5日楊陽模塊設計6天11月5日-11月11日楊陽數據庫設計及相關sql語句實現3天11月10日-11月13日楊陽、梅香注冊登錄模塊2天11月13日-11月15日楊守建主功能選擇模塊2天11月15日-11月17日楊守建子業務模塊兩周11月16日-11月27日楊守建、何益模塊整合5天11月27日-12月2日楊陽、楊守建、梅香、何益數據庫連接4天12月3日12月7日楊陽、梅香整理完成文檔3天12月8日-12月11日楊陽、梅香調試3天12月11日-12月14日楊守建、何益、楊陽
10、、梅香提交文檔軟件完成項目1天12月15日楊陽工作難點 = 1 * GB3 子模塊和主界面的連接。包括模塊之間的跳轉,多個子模塊返回到主界面的問題。 = 2 * GB3 數據庫和界面的連接問題。包括數據庫的并發控制、數據的多次讀入。 = 3 * GB3 代碼的整合。包括不同組員之間書寫的代碼的整合、不同系統環境下出現的問題。 = 4 * GB3 界面的美化。包括圖標的設置,背景的修改等問題。 = 5 * GB3 個性化設計。包括界面跳轉時背景圖片隨之跳轉。后期工作完善項目存在問題,包括: = 1 * GB3 界面的美化:圖標的顏色的修改、字體的修改、背景的修改。圖標顏色要凸顯突變上的文字、背景
11、的跳轉應該更加有規律化。 = 2 * GB3 注冊界面的完善。 = 3 * GB3 個人銀行logo的設計。 = 4 * GB3 轉賬時輸入卡號,顯示轉出賬戶的姓,保證轉出賬戶的安全。 = 5 * GB3 查詢交易記錄時,為了更明顯地顯出出轉入和轉出,用圖表的格式表示出金額的轉入和轉出,增加界面的友好功能。對上述不足進行部分的完善,并調試、測試,直到通過。同時,編寫最后的上交文檔。填表日期: 2015.1.8 面向對象程序設計項目報告學號: 2012211531 姓名: 楊守建 學院/專業: 計算機科學與技術 題目個人銀行賬戶管理系統選題背景 為了更好的鞏固和加強書本所學的知識,把所學的東西轉
12、化為實際應用。我們學習了Java應用程序的使用。并應用了Mysql語言。對數據庫的創建、修改、刪除方法有了一定的了解。通過導入表和刪除表、更改表學會了對于表的一些操作。為了建立一個關系數據庫信息管理系統,必須得經過系統調研、需求分析、概念設計、邏輯設計、物理設計、系統調試、維護以及系統評價的一般過程,為畢業設計打下基礎。當我們收集了大量的數據后,應該把它們保存起來進入近一步的處理,進一步的抽取有用的信息。當年人們把數據存放在文件柜中,可現在隨著社會的發展,數據量急劇增長,現在人們就借助計算機和數據庫技術科學的保存大量的數據,以便能更好的利用這些數據資源。 通過銀行管理系統的構造以及賬戶的個人的
13、信息還有卡號管理的相關信息制成表格,輸入到數據庫中,使之能夠進行查詢、修改、刪除并且與個人銀行系統執行相同的操作。需求分析階段就是要研究我們所作的個人銀行管理系統的具體分類和實施過程流圖。概念設計階段要完成數據抽象與局部視圖設計還有視圖的集成。邏輯結構設計階段要把E-R圖轉化為關系模式并且把我們輸入的相關表結合在一起完成一個總關系表。最后就是要運行和實施數據庫。系統說明系統功能:余額查詢、交易記錄、轉賬、卡管理、生活服務、金融服務實現環境:Win7 64位、JRE1.7、JDBC、msql-connector-java-5.1.7-bin.jar開發工具:Eclipse、MySql 5.0系統
14、設計流程圖系統實現典型代碼:一.JDBC數據庫連接:Class.forName(com.mysql.jdbc.Driver); /加載MySql的驅動類 String url = jdbc:mysql:/localhost:3306/c+; String username = root; /數據庫用戶名String password = 71685294yang; /數據庫密碼conn = DriverManager.getConnection(url,username,password); /獲得數據庫的鏈接System.out.println(連接數據庫成功);二.數據庫相關操作 1).用
15、戶相關 /*用戶登陸時,驗證用戶名和密碼的正確性*/public boolean loginCheck(Users user) boolean flag = false;String sql = select * from user where UserName= ? AND UserPassword=?;try PreparedStatement ps = con.prepareStatement(sql);ps.setString(1,user.getuserName() );ps.setString(2,user.getuserPassword();ResultSet ret=ps.ex
16、ecuteQuery(); while(ret.next() flag=true; catch (SQLException e) e.printStackTrace();finally/關閉數據庫的鏈接DBConnection.closeObject(getconnection);DBConnection.closeObject(con);return flag;/*添加用戶*/public boolean addUser(Users user) boolean flag = false; String sql = insert into user(UserName, UserState,Us
17、erSex,UserAddress,UserPassword,UserTelephone) values(?,?,?,?,?,?); try PreparedStatement ps = con.prepareStatement(sql); / System.out.println(ID);ps.setString(1, user.getuserName();ps.setString(2, user.getuserState();ps.setString(3, user.getUserSex();ps.setString(4,user.getuserAddress();ps.setString
18、(5, user.getuserPassword();ps.setString(6,user.getuserTelephone();int count = ps.executeUpdate(); /用一個常量標記,看是否插入數據成功if(count0) /插入數據成功flag = true; catch (SQLException e) e.printStackTrace();finallyDBConnection.closeObject(getconnection);DBConnection.closeObject(con); return flag;/刪除用戶public boolean
19、DeleteUser(int userid) boolean flag = false; String sql = delete from user where userid=?; try PreparedStatement ps = con.prepareStatement(sql);ps.setInt(1, userid);int count = ps.executeUpdate(); /用一個常量標記,看是否插入數據成功if(count0) /插入數據成功flag = true; catch (SQLException e) e.printStackTrace();finallyDBCo
20、nnection.closeObject(getconnection);DBConnection.closeObject(con); return flag;/* 根據用戶名,獲取用戶的信息*/public Users GetOneInformation(String usersName) Users user = new Users();String sql = select * from user where UserName=? ;/生成SQL語句try PreparedStatement ps = con.prepareStatement(sql);ps.setString(1, us
21、ersName);ResultSet ret=ps.executeQuery();while(ret.next()/將查詢的結果賦值給user對象user.setuserId(ret.getInt(1);user.setuserName(ret.getString(2);user.setuserPassword(ret.getString(3);user.setuserSex(ret.getString(4);user.setuserState(ret.getString(5);user.setuserAddress(ret.getString(6);user.setuserTelephone
22、(ret.getString(7); catch (SQLException e) e.printStackTrace();finallyDBConnection.closeObject(getconnection);DBConnection.closeObject(con);return user;/*根據用戶名,檢查用戶是否存在*/public boolean CheckUserId(String userName)boolean flag = false;String sql = select * from user where UserName = ?;try PreparedStat
23、ement ps = con.prepareStatement(sql);ps.setString(1, userName);ResultSet ret=ps.executeQuery();while(ret.next()flag = true; /如果存在該帳號,就返回true catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();finallyDBConnection.closeObject(getconnection);DBConnection.closeObject(con);return
24、 flag;/*根據銀行卡號,獲取用戶信息*/ public Users getUserIFByCardId(int cardId) Users user = new Users(); String sql=(select * from user,card where CardID=? AND user.userid=card.userid); try PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, cardId); ResultSet ret=ps.executeQuery(); while(ret.next()
25、System.out.println(ret.getString(5);user.setuserId(ret.getInt(1);user.setuserName(ret.getString(2);user.setuserPassword(ret.getString(3);user.setuserSex(ret.getString(4);user.setuserState(ret.getString(5);user.setuserAddress(ret.getString(6);user.setuserTelephone(ret.getString(7); catch (SQLExceptio
26、n e) e.printStackTrace();finallyDBConnection.closeObject(getconnection);DBConnection.closeObject(con); return user; /根據用戶名獲取銀行卡號 public String GetCardIDbyUserID(int userid) String cardid = new String20; int i=0; String sql = select cardid from card where Userid= ?;try PreparedStatement ps = con.prep
27、areStatement(sql);ps.setInt(1,userid);ResultSet ret=ps.executeQuery(); while(ret.next() cardidi+=ret.getString(1); catch (SQLException e) e.printStackTrace();finally/關閉數據庫的鏈接DBConnection.closeObject(getconnection);DBConnection.closeObject(con); return cardid; /根據用戶名更改用戶狀態public boolean ChangeUserSta
28、te(String username,String newuserstate) boolean flag = false; String sql = update user set userstate=? where username=? ; try PreparedStatement ps = con.prepareStatement(sql);ps.setString(1, newuserstate);ps.setString(2,username);int count = ps.executeUpdate(); /用一個常量標記,看是否插入數據成功if(count0) /插入數據成功fl
29、ag = true; catch (SQLException e) e.printStackTrace();finally/關閉數據庫的鏈接DBConnection.closeObject(getconnection);DBConnection.closeObject(con); return flag;/更改用戶信息public boolean ChangeUserInfo(int userid ,String username,String userpassword,String usersex,String userphone,String userAddress) boolean fl
30、ag = false; String sql = update user set username=?,UserPassword=?,usersex=?,useraddress=?,usertelephone=? where userid=? ; try PreparedStatement ps = con.prepareStatement(sql);ps.setString(1, username);ps.setString(2,userpassword);ps.setString(3, usersex);ps.setString(4, userAddress);ps.setString(5
31、, userphone);ps.setInt(6,userid);int count = ps.executeUpdate(); /用一個常量標記,看是否插入數據成功if(count0) /插入數據成功flag = true; catch (SQLException e) e.printStackTrace();finally/關閉數據庫的鏈接DBConnection.closeObject(getconnection);DBConnection.closeObject(con); return flag; 2).轉賬相關 /轉賬public boolean TransAtoB(String
32、cardid1,String cardid2,double money) int count1 = 0,count2=0; boolean flag = false; String sql1 = update card set cardmoney=cardmoney+? where cardid=?; try PreparedStatement ps= con.prepareStatement(sql1);ps.setDouble(1, money);ps.setString(2, cardid1);count1 = ps.executeUpdate(); catch (SQLExceptio
33、n e) e.printStackTrace();finally/關閉數據庫的鏈接DBConnection.closeObject(getconnection);DBConnection.closeObject(con); DBConnection getconnection=new DBConnection(); Connection con=getconnection.getConnection(); String sql2 = update card set cardmoney=cardmoney -? where cardid=?; try PreparedStatement ps =
34、 con.prepareStatement(sql2);ps.setDouble(1, money);ps.setString(2, cardid2);count2= ps.executeUpdate(); catch (SQLException e) e.printStackTrace();finally/關閉數據庫的鏈接DBConnection.closeObject(getconnection);DBConnection.closeObject(con); if(count1+count21) flag=true; return flag;3).卡相關、登錄相關、記錄相關(略)二無外延框
35、架 public static JFrame frame1=new JFrame();/用于處理拖動事件,表示鼠標按下時的坐標,相對于JFrameint xOld = 0;int yOld = 0;public static void main(String args) JFrameNoBorder j = new JFrameNoBorder();j.setVisible(true);j.setSize(600,370);frame1=j;public JFrameNoBorder() this.setLayout(null);/處理拖動事件this.addMouseListener(new
36、 MouseAdapter() public void mousePressed(MouseEvent e) xOld = e.getX();yOld = e.getY(););this.addMouseMotionListener(new MouseMotionAdapter() Overridepublic void mouseDragged(MouseEvent e) int xOnScreen = e.getXOnScreen();int yOnScreen = e.getYOnScreen();int xx = xOnScreen - xOld;int yy = yOnScreen
37、- yOld;JFrameNoBorder.this.setLocation(xx, yy););三密碼兩次驗證框 public void actionPerformed(ActionEvent arg0) if(userPassword1.getText().length()=0)JOptionPane.showOptionDialog(null, 請輸入密碼, 錯誤信息,JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE, null, null, null);else if(userPassword1.getText().length(
38、)!=0) &(userPassword2.getText().length()=0) )JOptionPane.showOptionDialog(null, 為了安全請核對密碼, 錯誤信息,JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE, null, null, null);else if(userPassword1.getText().length()!=0) &(userPassword2.getText().length()!=0)if (!userPassword1.getText().equals(userPassword2
39、.getText() /判斷兩次輸入密碼是否一致JOptionPane.showOptionDialog(null, 兩次輸入密碼不一致,請重輸, 錯誤信息,JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE, null, null, null);四驗證碼實現機制String yanzen=new String();String cao=new String7; cao0=0718; cao1=08DE; cao2=1396; cao3=1E2E; cao4=1I9V; cao5=1PKJ; cao6=1Z7K; if(userYan.ge
40、tText().length()=0) /驗證碼為空 JOptionPane.showOptionDialog(null, 請輸入驗證碼, 錯誤信息,JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE, null, null, null); else if(userYan.getText().length()!=0) /驗證碼不為空 if(!userYan.getText().equals(caosign) /驗證碼錯誤 JOptionPane.showOptionDialog(null, 驗證碼錯誤, 錯誤信息,JOptionPane.D
41、EFAULT_OPTION,JOptionPane.ERROR_MESSAGE, null, null, null);五.面板跳轉 UserInforChangePanel ChageUserInfo=new UserInforChangePanel(); MainFrame.frame1.add( ChageUserInfo.ReturnPanel(); mainviewpanl.setVisible(false);六Java socket1).服務器端while (it.hasNext() /遍歷每個事件trySelectionKey key = (SelectionKey)it.next
42、();/有一個新聯接接入事件,服務端事件if (key.readyOps() & SelectionKey.OP_ACCEPT)= SelectionKey.OP_ACCEPT) / 接收這個新連接ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel();/從serverSocketChannel中創建出與客戶端的連接socketChannelSocketChannel sc = serverChanel.accept();sc.configureBlocking( false );/ Add the new c
43、onnection to the selector/ 把新連接注冊到選擇器SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ );it.remove();System.out.println( Got connection from +sc );else/讀客戶端數據的事件,此時有客戶端發數據過來,客戶端事件 if(key.readyOps() & SelectionKey.OP_READ)= SelectionKey.OP_READ)/ 讀取數據SocketChannel sc = (SocketChannel)
44、key.channel();int bytesEchoed = 0;while(bytesEchoed = sc.read(echoBuffer) 0)System.out.println(bytesEchoed:+bytesEchoed);echoBuffer.flip();System.out.println(limet:+echoBuffer.limit();byte content = new byteechoBuffer.limit(); echoBuffer.get(content);String result=new String(content);doPost(result,s
45、c);echoBuffer.clear();it.remove(); 2).客戶端(登錄為例)s=new Socket(127.0.0.1,5555);/寫os=s.getOutputStream(); os.write(name.getBytes();os.write(|);/用戶名與密碼用|分隔os.write(pswd.getBytes();os.flush();/讀內容Thread.sleep(1000);is=s.getInputStream();int len=is.available();System.out.println(len:+len);byte bytes=new bytelen;is.read(bytes);String resut=new String(bytes);System.out.println(resut:+resut);/TODO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國嬰兒用品批發行業發展趨勢分析與未來投資戰略咨詢研究報告
- 2025至2030中國女裝皮具手袋行業產業運行態勢及投資規劃深度研究報告
- 功夫夢觀后感400字(15篇)
- 童話寓言作文生日湯250字(11篇)
- 讀草房子有感1200字(9篇)
- 基礎英語的句子構造技巧與要點解析:六年級英語語法專題課
- 初中幾何基本定理及性質講解教案
- 我和籃球初二作文600字8篇
- 2025年美容師(高級)美容美發行業市場細分市場潛力分析鑒定試卷
- 快樂端午節的作文15篇
- 一年級下冊口算題卡大全(口算練習題50套直接打印版)
- (高清版)JTG 5421-2018 公路瀝青路面養護設計規范
- 2022-2023學年上海市徐匯區高一下學期期末考試數學試題(解析版)
- 安全環保履職述職報告
- 電大財務大數據分析編程作業4
- 2023年零售藥店醫療器械質量管理制度職責操作規程體系文件
- 4M變更管理培訓
- 新中國史智慧樹知到期末考試答案2024年
- MOOC 電磁場與波-華中科技大學 中國大學慕課答案
- MOOC 創新管理-浙江大學 中國大學慕課答案
- 梨的貯藏特性及保鮮技術
評論
0/150
提交評論