天天看點

報刊訂閱管理系統的設計與實作

報刊訂閱管理系統的設計與實作

課程設計(論文)任務書(文章末尾--源文檔下載下傳)

     軟體      學院  軟體工程 專業 2016 -7   班

一、課程設計(論文)題目 綜合課程設計2 

二、課程設計(論文)工作自 2018 年 1月 1 日起至 2018 年 1月 12 日止。

三、課程設計(論文) 地點:軟體工程實訓中心一部                      

四、課程設計(論文)内容要求:

1.本課程設計的目的

(1)使學生熟練掌握資料庫基本原理;

(2)使學生熟練掌握資料庫的分析和設計能力;

(3)培養學生熟練使用常見的資料庫管理系統;

(4)培養學生使用Java語言進行面向對象設計的能力;

(5)培養學生熟練使用Java語言進行資料庫應用程式設計的能力;

(6)提高學生的科技論文寫作能力。

2.基本要求:

課程設計題目:報刊訂閱管理系統

設計主要内容:設計一個報刊訂閱應用系統,使系統滿足以下功能和需求:

1)一個訂戶可以訂多種報刊;一種報刊可被多個使用者訂閱;訂單隻能訂閱現有報刊目錄

  投遞時,必須根據訂單的情況進行投遞,不得超出訂單的訂閱品種,數量;

2)訂閱管理:訂戶添加,修改,删除;

目錄管理:目錄添加,修改,删除;

訂單管理:完成訂戶訂閱資料的管理(包括添加,修改,删除)

訂單查詢:按訂戶或者訂單号查詢訂單詳細情況;

統計查詢:按報刊目錄統計各類報刊的訂閱數量和金額;

3.課程設計論文編寫要求

(1)要按照書稿的規格列印謄寫課設報告;

(2)報告分為封面、任務書(本文檔)、正文、課程設計體會和參考文獻四部分;

學生簽名:              

2018年1月 1日

課程設計(論文)評審意見

(1)題目分析     (20分):優( )、良( )、中( )、一般( )、差( );

(2)流程分析   (30分):優( )、良( )、中( )、一般( )、差( );

(3)資料定義   (30分):優( )、良( )、中( )、一般( )、差( );

(4)代碼編寫   (10分):優( )、良( )、中( )、一般( )、差( );

(5)創新能力   (10分):優( )、良( )、中( )、一般( )、差( );

(6)格式規範性、設計态度及考勤是否降等級:是( )、否( )

評閱人:         職稱:講師

2018年 1 月 12 日

正 文

一、 資料設計

1.     實體

實體1:部門

屬性1:部門号

屬性2:部門名

實體2:使用者

屬性1:使用者名

屬性2:密碼

屬性3:真實姓名

屬性4:性别

屬性5:部門号

屬性6:聯系電話

屬性7:聯系位址

屬性8:訂閱報刊種類數

實體3:管理者

屬性1:管理者名

屬性2:密碼

實體4:報刊

屬性1:報刊代号

屬性2:報刊名

屬性3:類型

屬性4:出版報社

屬性5:出版周期

屬性6:半年訂閱價

屬性7:全年訂閱價

實體5:訂閱

屬性1:使用者名

屬性2:報刊代号

屬性3:訂閱年限

屬性4:訂閱數量

屬性5:所需金額

報刊訂閱管理系統

結構功能圖:

報刊訂閱管理系統的設計與實作

聯系

本設計中實體之間的聯系如下(E-R圖):

部門

系統E-R圖:

         1

報刊

         n

                    m                 n

各實體E-R 圖:

部門

部門:

使用者:

報刊訂閱管理系統的設計與實作
管理者

管理者:

報刊:

報刊訂閱管理系統的設計與實作

關系表E-R 圖:

報刊訂閱管理系統的設計與實作

二、 資料庫設計

1.     關系模式

本設計中的關系模式如下:

部門(部門号,部門名)關系主鍵:部門号;外鍵:無

使用者(使用者名,密碼,真實姓名,性别,部門号,聯系電話,聯系位址,訂閱報刊種類數)關系主鍵:使用者名;外鍵:部門号

管理者(管理者名,密碼)關系主鍵:管理者名;外鍵:無

報刊(報刊代号,報刊名,類型,出版報社,出版周期,半年訂閱價,全年訂閱價)

關系外鍵:報刊代号;外鍵:無

訂閱(訂閱号,報刊代号,訂閱年限,訂閱數量,所需金額)

關系主鍵:訂閱号;外鍵:報刊代号

2.     資料表

本設計中建立的資料庫名為:

資料表分别為

表1:部門表

報刊訂閱管理系統的設計與實作

表2:使用者表

報刊訂閱管理系統的設計與實作

表3:管理者表

表4:報刊表

表5;訂閱表

2. 資料庫關系圖為:

三、 資料庫實作

設計中實作資料庫操作的SQL 語句如下:

1)  建立資料表:

1 CREATE TABLE [dbo].[Customer](
 2 
 3                    [Cid] [char](10) COLLATE Chinese_CI_AS NOT NULL,
 4 
 5                    [Cname] [char](20) COLLATE Chinese_CI_AS NULL,
 6 
 7                    [Phone] [char](15) COLLATE Chinese_CI_AS NULL,
 8 
 9                    [Address] [char](50) COLLATE Chinese_CI_AS NOT NULL)
10 
11                 ON [PRIMARY]
12 
13                 GO
14 
15                 CREATE TABLE [dbo].[Login](
16 
17                    [Uname] [char](20) COLLATE Chinese_CI_AS NOT NULL,
18 
19                    [Upassword][char](20) COLLATE Chinese_CI_AS NOT NULL)
20 
21                 ON [PRIMARY]
22 
23                 GO
24 
25                 CREATE TABLE [dbo].[Diretory](
26 
27                    [Did] [char](10) COLLATE Chinese_CI_AS NOT NULL,
28 
29                    [Dname] [char](20) COLLATE Chinese_CI_AS NULL,
30 
31                    [Unitprice][float] NOT NULL,
32 
33                    [Ifo][char](50) COLLATE Chinese_CI_AS NULL)
34 
35                 ON [PRIMARY]
36 
37                 GO
38 
39                 CREATE TABLE [dbo].[Order](
40 
41                    [Ono] [char](10) COLLATE Chinese_CI_AS NOT NULL,
42 
43                    [Cid][char](10) COLLATE Chinese_CI_AS NOT NULL,
44 
45                    [Odate] [datetime] NULL)
46 
47                 ON [PRIMARY]
48 
49                 GO
50 
51                 CREATE TABLE [dbo].[OrderDetail](
52 
53                    [Ono] [char](10) COLLATE Chinese_CI_AS NOT NULL,
54 
55                    [Cid][char](10) COLLATE Chinese_CI_AS NOT NULL,
56 
57                    [Quantity] [int] NOT NULL,
58 
59                    [Qishu][int] NOT NULL,
60 
61                    [Unitprice][float] NOT NULL,
62 
63                    [Total][float] NULL)
64 
65                 ON [PRIMARY]
66 
67                 GO      

2)建立查詢:

1 select *
 2 
 3 from view_1 where 報刊編号 in";
 4 
 5 "(select news_id from 訂閱資訊表 where reader_id=‘023’)
 6 
 7 select *
 8 
 9 from view_1 where 部門 in";
10 
11 "(select 部門号 from 使用者 where 使用者名=’肖總’)      

四、 程式設計

1)              類

設計中定義的Java類如下:

2)  Dbutils類,表示設計連接配接資料庫。

3)  Main類,表示設計中添加面闆,頁面跳轉,是JFrame的子類。

2)              類設計

1、Dbutils類

1 public class Dbutils { 
  2 
  3    private static String driver;
  4 
  5    private static String url;
  6 
  7    private static String user;
  8 
  9    private static String pwd;
 10 
 11    private static  ResourceBundle  rb=ResourceBundle.getBundle("com.jdbc.utils.jdbc");
 12 
 13    static 
 14 
 15    { 
 16 
 17    driver=rb.getString("driver");
 18 
 19    url=rb.getString("url");
 20 
 21    user=rb.getString("user");
 22 
 23    pwd=rb.getString("pwd");
 24 
 25    try { 
 26 
 27 Class.forName(driver); 
 28 
 29 } catch (ClassNotFoundException e) {
 30 
 31 // TODO
 32 
 33 自動生成的catch塊
 34 
 35 e.printStackTrace();
 36 
 37 }
 38 
 39    }
 40 
 41    private Dbutils()
 42 
 43    public static Connection getConnection() 
 44 
 45  
 46 
 47    { 
 48 
 49    Connection conn=null;
 50 
 51    try {
 52 
 53 conn=DriverManager.getConnection(url,user,pwd);
 54 
 55 } catch (SQLException e) { 
 56 
 57 // TODO
 58 
 59 自動生成的catch塊
 60 
 61 e.printStackTrace();
 62 
 63 }
 64 
 65  return conn;  
 66 
 67    } 
 68 
 69    public static void
 70 
 71  
 72 
 73 close(Connection
 74 
 75  
 76 
 77 conn,Statement
 78 
 79  
 80 
 81 stmt,ResultSet
 82 
 83  
 84 
 85 rs)
 86 
 87  
 88 
 89   {
 90 
 91 try {
 92 
 93  
 94 
 95  if(conn!=null)conn.close();
 96 
 97  
 98 
 99  if(stmt!=null)stmt.close();
100 
101  
102 
103  if(rs!=null)rs.close();
104 
105  
106 
107 } catch (SQLException e) { 
108 
109  
110 
111 // TODO
112 
113  
114 
115 自動生成的catch塊
116 
117  
118 
119 e.printStackTrace();
120 
121  
122 
123 }
124 
125  
126 
127    }
128 
129 public static void main(String [] args) { 
130 
131    System.out.println(getConnection());
132 
133 }}      

 2、Main類

1 class Main extends JFrame implements ActionListener{
  2 
  3 JRadioButton manager,users;
  4 
  5 JLabel label,label1,label2;
  6 
  7 JTextField userName;
  8 
  9 JPasswordField password;
 10 
 11 JButton login,register,exit;
 12 
 13 JPanel p1,p2,p3;
 14 
 15 public Main(){
 16 
 17 init(); 
 18 
 19 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 20 
 21     setVisible(true);  } 
 22 
 23 void init(){
 24 
 25 setLayout(new FlowLayout());
 26 
 27 setSize(390,260);
 28 
 29 p1=new JPanel();
 30 
 31 p2=new JPanel();
 32 
 33 p3=new JPanel();
 34 
 35 label=new JLabel("歡迎使用報刊管理系統");
 36 
 37 Font font=new Font("隸書",Font.PLAIN,30);
 38 
 39 label.setFont(font);
 40 
 41 p1.add(label);
 42 
 43     ButtonGroup group=new ButtonGroup();
 44 
 45     manager=new JRadioButton("管理者");
 46 
 47     users=new JRadioButton("使用者");
 48 
 49     group.add(manager);
 50 
 51     group.add(users);
 52 
 53     p2.add(manager);
 54 
 55     p2.add(users);
 56 
 57     label1=new JLabel("使用者名");
 58 
 59     p3.add(label1); 
 60 
 61     userName=new JTextField(10);
 62 
 63     p3.add(userName);
 64 
 65     label2=new JLabel("密碼");
 66 
 67     p3.add(label2); 
 68 
 69     password=new JPasswordField(10);
 70 
 71     p3.add(password);
 72 
 73     add(p1,BorderLayout.CENTER); 
 74 
 75     add(p2,BorderLayout.CENTER);
 76 
 77     add(p3,BorderLayout.CENTER);
 78 
 79 login=new JButton("登入");
 80 
 81     register=new JButton("注冊");
 82 
 83     exit=new JButton("退出");
 84 
 85     add(login);
 86 
 87     add(register);
 88 
 89     add(exit);
 90 
 91     userName.addActionListener(this);
 92 
 93     login.addActionListener(this);
 94 
 95     register.addActionListener(this);
 96 
 97     exit.addActionListener(this);
 98 
 99 }
100 
101 public static void main(String[] args)
102 
103    {     
104 
105     Main f=new Main(); 
106 
107     f.setTitle("報刊訂閱管理系統");
108 
109 } 
110 
111 public void actionPerformed(ActionEvent e) {
112 
113 // TODO
114 
115 自動生成的方法存根
116 
117 if(e.getSource()==register)  //注冊(登入、退出類似)
118 
119 { 
120 
121 new UsersRegister();//過渡到新的視窗
122 
123 Menu;
124 
125 this.dispose();//釋放目前視窗
126 
127 } }      

五、 Java源代碼

1 package com.jdbc.utils;
  2 import java.sql.Connection;
  3 
  4 import java.sql.DriverManager;
  5 
  6 import java.sql.ResultSet;
  7 
  8 import java.sql.SQLException;
  9 
 10 import java.sql.Statement; 
 11 
 12 import java.util.ResourceBundle;
 13 
 14 InformationDaoImpl.java//添加報刊資訊
 15 
 16  
 17 
 18 public static void main(String[] args) //錄入報刊資訊(錄入使用者資訊和對使用者,報刊,訂單的增删改查與之類似
 19 
 20    {     
 21 
 22     LoggingdataNewspaper f=new LoggingdataNewspaper();
 23 
 24     f.setTitle("報刊資訊");
 25 
 26 } 
 27 
 28 public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根
 29 
 30 if(e.getSource()==button5) // 退出
 31 
 32 { 
 33 
 34 new ManagerHome();//過渡到新的視窗Menu;
 35 
 36 this.dispose();//釋放目前視窗
 37 
 38 } 
 39 
 40 if(e.getSource()==button1) // 添加
 41 
 42 { 
 43 
 44 //定義一個空的newspaper對象
 45 
 46 newspaper news=new newspaper();
 47 
 48 //将資料封裝到news中
 49 
 50 news.setNewsNo(text1.getText().trim());
 51 
 52 news.setNewsName(text2.getText().trim());
 53 
 54 news.setPublish(text3.getText().trim());
 55 
 56 news.setPubPeriod(text4.getText().trim());
 57 
 58 news.setContent(text5.getText().trim()); 
 59 
 60 news.setPrice(Float.parseFloat(text6.getText().trim()));
 61 
 62 System.out.println(news);
 63 
 64 //定義一個控制對象
 65 
 66 InformationDaoImpl ifd=new InformationDaoImpl();
 67 
 68 //執行添加使用者操作
 69 
 70 ifd.addNews(news);
 71 
 72 } 
 73 
 74 if(e.getSource()==button2) // 删除
 75 
 76 { 
 77 
 78 //定義一個空的newspaper對象
 79 
 80 newspaper delnews=new newspaper();
 81 
 82 //将資料封裝到delnews中
 83 
 84 delnews.setNewsNo(text1.getText().trim());
 85 
 86 delnews.setNewsName(text2.getText().trim());
 87 
 88 System.out.println(delnews);
 89 
 90 //定義一個控制對象
 91 
 92 InformationDaoImpl ifd=new InformationDaoImpl();
 93 
 94 //執行添加使用者操作
 95 
 96 ifd.deleteNews(delnews);
 97 
 98 } 
 99 
100 if(e.getSource()==button3) // 查詢
101 
102 {  //定義一個空的newspaper對象
103 
104 newspaper n=new newspaper(); //将資料封裝在n中
105 
106 String news=text1.getText().trim(); //定義一個控制對象
107 
108 InformationDaoImpl ifd=new InformationDaoImpl();
109 
110 n=ifd.FindNewsByNewspaper(news);
111 
112 System.out.println(n); 
113 
114 text2.setText(n.getNewsName());
115 
116 text3.setText(n.getPublish());
117 
118 text4.setText(n.getPubPeriod());
119 
120 text5.setText(n.getContent()); 
121 
122 text6.setText(String.valueOf(n.getPrice()));
123 
124 } 
125 
126 if(e.getSource()==button4) // 修改
127 
128 {  //定義一個空的users對象
129 
130 newspaper news=new newspaper(); //将資料封裝到u當中
131 
132 news.setNewsNo(text1.getText().trim());
133 
134 news.setNewsName(text2.getText().trim());
135 
136 news.setPublish(text3.getText().trim());
137 
138 news.setPubPeriod(text4.getText().trim());
139 
140 news.setContent(text5.getText().trim()); 
141 
142 news.setPrice(Float.parseFloat(text6.getText().trim())); //定義一個控制對象
143 
144 InformationDaoImpl ifd=new InformationDaoImpl(); //執行修改使用者資訊操作
145 
146 ifd.updateNewspaper(news);
147 
148 System.out.println(news);
149 
150 }
151 
152 }
153 
154 public void addNews(newspaper n){ //定義一個空的連接配接對象
155 
156 Connection conn=null; //定義一個準備sql語句
157 
158 PreparedStatement ps=null; //自定義将要執行的sql語句
159 
160 String sql="insert into
161 
162 newspaper(newsNo,newsName,publish,pubPeriod,content,price)
163 
164 values(?,?,?,?,?,?)";  //通過Dbutils得到資料庫的連接配接
165 
166 conn=Dbutils.getConnection();
167 
168 System.out.println(conn);
169 
170 try {  //将sql語句傳給ps(接收sql語句的容器)
171 
172 ps=conn.prepareStatement(sql); //将news的各個屬性值添加到?處
173 
174 ps.setString(1, n.getNewsNo());
175 
176 ps.setString(2, n.getNewsName());
177 
178 ps.setString(3, n.getPublish());
179 
180 ps.setString(4, n.getPubPeriod());
181 
182 ps.setString(5, n.getContent());
183 
184 ps.setFloat(6, n.getPrice());  //執行sql語句(相當于在資料庫中執行sql語句)
185 
186 ps.executeUpdate();
187 
188 } catch (SQLException e) { 
189 
190 e.printStackTrace();
191 
192 } 
193 
194 finally{  //釋放連接配接,同時釋放資源
195 
196 Dbutils.close(conn, ps, null);
197 
198 }
199 
200 }//通過報刊号和報刊名删除報刊
201 
202 public void deleteNews(newspaper dn) { // TODO 自動生成的方法存根
203 
204 Connection conn=null; 
205 
206 PreparedStatement ps=null;
207 
208 conn=Dbutils.getConnection();
209 
210 String sql="delete from newspaper
211 
212 where
213 
214 newsNo=?
215 
216 and
217 
218 newsName=?";
219 
220 try { 
221 
222 ps=conn.prepareStatement(sql);
223 
224 ps.setString(1, dn.getNewsNo());
225 
226 ps.setString(2, dn.getNewsName());
227 
228 ps.executeUpdate();
229 
230 } catch (SQLException e) {  // TODO 自動生成的catch 塊
231 
232 e.printStackTrace();
233 
234 }finally
235 
236 { 
237 
238 Dbutils.close(conn, ps, null);
239 
240 }
241 
242 } //通過報刊代号查找報刊
243 
244 public newspaper FindNewsByNewspaper(String ne) {
245 
246 newspaper news= new newspaper();
247 
248 Connection conn=null; 
249 
250 PreparedStatement ps=null;
251 
252 ResultSet rs=null; 
253 
254 conn=Dbutils.getConnection(); 
255 
256 String sql="select * from newspaper where newsNo=?";
257 
258 try { 
259 
260 ps=conn.prepareStatement(sql);
261 
262 ps.setString(1, ne);
263 
264 rs=ps.executeQuery();
265 
266 if(rs.next())
267 
268 { 
269 
270 news.setNewsNo(rs.getString("newsNo"));
271 
272 news.setNewsName(rs.getString("newsName"));
273 
274 news.setPublish(rs.getString("publish")); 
275 
276 news.setPubPeriod(rs.getString("pubPeriod"));
277 
278 news.setContent(rs.getString("content"));
279 
280 news.setPrice(rs.getFloat("price"));
281 
282 } 
283 
284 } catch (SQLException e) {  // TODO 自動生成的 catch 塊
285 
286 e.printStackTrace();
287 
288 }finally
289 
290 { 
291 
292 Dbutils.close(conn, ps, rs);
293 
294 } 
295 
296 return news; //更新報刊資訊
297 
298 public void updateNewspaper(newspaper news) { // TODO Auto-generated method stub
299 
300 //定義一個空的連接配接對象
301 
302 Connection conn=null;//定義一個準備sql語句
303 
304 PreparedStatement ps=null; //自定義将要執行的sql語句
305 
306 String sql="update newspaper
307 
308 set
309 
310 publish=?
311 
312 ,pubPeriod=?,
313 
314 content=?, price=? where newsNo=? and newsName=? "; //通過Dbutil得到資料庫的連接配接
315 
316 conn=Dbutils.getConnection();
317 
318 System.out.println(conn);
319 
320 try {  //将sql語句傳給ps(接收sql語句的容器)
321 
322 ps=conn.prepareStatement(sql); //将user的各個屬性值添加到?處
323 
324 ps.setString(1, news.getPublish());
325 
326 ps.setString(2, news.getPubPeriod());
327 
328 ps.setString(3, news.getContent());
329 
330 ps.setFloat(4, news.getPrice());
331 
332 ps.setString(5,news.getNewsNo());
333 
334 ps.setString(6, news.getNewsName()); //執行update SQL語句
335 
336 ps.executeUpdate();
337 
338 } catch (SQLException e) {  // TODO 自動生成的 catch 塊
339 
340 e.printStackTrace();
341 
342 } 
343 
344 finally{  //釋放連接配接,同時釋放資源
345 
346 Dbutils.close(conn, ps, null);
347 
348 }
349 
350 }       

六、 實驗結果

點選管理者,輸入管理者使用者名(admin)和密碼(admin),點選“登入”,進入

報刊訂閱管理系統的設計與實作

圖1-1 報刊訂閱管理系統登入界面

報刊訂閱管理系統的設計與實作

點選“錄入報刊資訊”按鈕,進入錄入報刊資訊界面

圖2-2管理者主界面

              圖3-3 報刊管理

              圖 5-5訂閱管理

七、      實驗小結

1.     資料庫設計小結

   SQL資料庫的使用,讓我對資料庫概念及邏輯和實體結構設計有了更清晰的了解,這裡我所選課題的概念結構設計即詳細的E-R圖,邏輯結構設計就是将E-R圖轉換為資料庫的邏輯結構,并進行優化,而實體結構設計即標明實施環境,确定系統資料庫的存儲結構和存取方法等。還有就是資料實施維護,用DBMS建立資料庫結構,加載資料,實作各種查詢,連結應用程式,設計庫中觸發器,存儲過程等對象,并能對資料庫做簡單的資料維護。

2.     Java應用小結

   通過這次的課程設計,讓我從之前學Java時的懵懵懂懂到現在了解了不少,學會了不少文法的連接配接,怎麼在整個系統中使用到這部分,并且表達出來等等,都需要好好學習并熟悉裡面的每個知識點和文法,及使用方法等等,面向對象的設計

3.     需完善之處

由于是初次綜合使用SQL和Java來做東西,并且時間有限,不足之處不可避免。本系統的功能還不夠強大,較真正的管理系統還有很多不足, 安全功能也有不足,比如使用者真實姓名沒有糾錯,應該把所有的部門的職工全都輸入到表中,當注冊的時候,輸入真實姓名,如果相關部門沒有此人,則不允許注冊,此功能尚未實作,将在以後的時間繼續完善。

課程設計體會

這次課程設計的主要目的是掌握資料庫應用系統分析設計的基本方法,基本掌握SQL和Java的使用,進一步提高分析解決問題的綜合能力。通過這次課程設計,我基本掌握了以上要求。但隻有2周的課程設計時間,時間比較倉促,是以開發的系統不是很完善,有一些功能未實作,但是報刊訂閱的基本功能均已實作。以前對資料庫還有Java的很多知識認識都不深刻,做過這次課程設計之後,我對這些都有個基本的系統了解,比如:對表内一些字段的限制,關系等的運用以及比較熟練。

但是由于第一次真正的全系統運用,是以運用的不是很熟練。剛開始的時候,對于SQL和Java的文法,用法等一系列知識都不熟悉,經過對這個系統的開發,在開發過程中遇到但也解決了很多問題,是以說我們要迎難而上,不斷地去學習,自己才有所成長,有所發展。

參考文獻

1.資料庫系統概論(第5版)王珊 薩師煊編著 高等教育出版社 2014年9月

2.Java語言程式設計(第2版)丁振凡 編著 清華大學出版社2014年9月

3.李剛.Java程式員之旅--Java資料庫技術詳解[J].化學工業出版社.2011.4

4.姜中華、劉小春.Java 資料庫應用程式設計[J].機械工業出版社.2008.4

5.軟體開發技術聯盟.Java Web開發實踐[J].清華大學出版社.2013.9

Leszek A.Maciaszek.需求分析與系統設計[J]中信出版社.2003

6.網際網路資源

掃碼公衆号回複--“報刊”擷取原檔案

報刊訂閱管理系統的設計與實作