天天看點

抽獎系統(記一次未完成的教訓)

一、組員職責分工

柯奇豪 : 文本導入、切割文本、資料庫處理、活躍度統計

黃毓明 : 切割文本、文本比對

楊禮亮、丁水源:實作三種不同程度的篩選投票算法

蔣熊、黃志銘:前端界面編寫

林翔宇:接口定義、前後端互動

二、github 的送出日志截圖(鼓勵小粒度送出)

抽獎系統(記一次未完成的教訓)

三、程式運作截圖

程式運作環境:eclipse+mysql

四、GUI界面

  • 主界面截圖,有設定抽獎和檢視抽獎結果兩個選項
    抽獎系統(記一次未完成的教訓)
  • 設定抽獎彈窗
    抽獎系統(記一次未完成的教訓)
  • 抽獎有三個選項:普通抽獎,過濾抽獎和深度抽獎。 下面是深度抽獎的運作結果。
    抽獎系統(記一次未完成的教訓)

五、基礎功能實作

  • 文本處理(文本導入)
public static void setFileContext(String path) throws Exception {
		FileReader fileReader =new FileReader(path);
        @SuppressWarnings("resource")
		BufferedReader bufferedReader =new BufferedReader(fileReader);
        list =new ArrayList<String>();
        String str=null;
        String term="";
        Pattern pattern = Pattern.compile("[0-9]{4}[-][0-9]{1,2}[-][0-9]{1,2}[ ][0-9]{1,2}[:][0-9]{1,2}[:][0-9]{1,2}");
        while((str=bufferedReader.readLine())!=null) {
        	if(str.trim().length()>=0) {
        		term+=str+" ";
        		Matcher matcher = pattern.matcher(str);
        		if(!matcher.find()) {
        			list.add(term + "\n");
        			term="";
        		}
        	}
    		for(String item:Inputtext.list.toArray(new String[Inputtext.list.size()])) {
    				Mysql.matchSort(item);
    		}
        }
//        System.out.println(list);
   }
           
  • 文本處理并溝通資料庫(文本切割,文本比對)
public static Connection getCon() throws ClassNotFoundException, SQLException {
		Class.forName(driver);
        Connection con = DriverManager.getConnection(url,user,password);
		return con;	
	}
	
	public static void matchSort(String str) throws SQLException, ClassNotFoundException {	 
		Connection con = getCon();
        if(!con.isClosed())
            System.out.println("Succeeded connecting to the Database!");
        Statement statement = con.createStatement();
        String insert_SQL = "insert into user(qq, name) values(?, ?)";
        String insert_contentSQL = "insert into postcomment(postTime,postContent,userId) values(?, ?, ?)";
        //插
        PreparedStatement stmt_user = con.prepareStatement(insert_SQL);   //會抛出異常
        PreparedStatement stmt_comment = con.prepareStatement(insert_contentSQL);   //會抛出異常

		String rName = "(?:\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2} )(.{0,16})(?:\\(|<)";
	    String rQNum = "[\\(|<](.{1,30})[\\)|>]";
	    String rTime = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
	    String rTopic = "(?:\\)|>)(.*)";
	    try {
	    	Pattern pattern1 = Pattern.compile(rName);
	    	Pattern pattern2 = Pattern.compile(rQNum);
	    	Pattern pattern3 = Pattern.compile(rTime);
	    	Pattern pattern4 = Pattern.compile(rTopic);
	
	    	Matcher matcher1 = pattern1.matcher(str);
	    	Matcher matcher2 = pattern2.matcher(str);
	    	Matcher matcher3 = pattern3.matcher(str);
	    	Matcher matcher4 = pattern4.matcher(str);
	    
	    	matcher1.find();
	    	matcher2.find();
	    	matcher3.find();
	    	matcher4.find();
	    	
	    	String name = matcher1.group(1);
	    	String num = matcher2.group(1);
	    	String time = matcher3.group();
	    	String content = matcher4.group(1);
	    	
	    	stmt_user.setString(1, name);
	    	stmt_user.setString(2, num);
	    	
	    	stmt_comment.setString(1,time);
	    	stmt_comment.setString(2,content);
	    	stmt_comment.setString(3,num);
	    	
	    	stmt_user.setString(1, name);
	    	stmt_user.setString(2, num);
	    	
	    	stmt_comment.setString(1,time);
	    	stmt_comment.setString(2,content);
	    	stmt_comment.setString(3,num);
		}catch(Exception e){
	    	
	    }
	    con.close();
	}
           
  • 三種不同程度的篩選投票算法

    普通抽獎

private Set<String> namelist=new TreeSet<>();
	private int repeat=1;
	private String list[];
	public void getlist() {}
	public void put_Qname()
	{
		while(repeat!=0)
		{
			repeat--;
			 int l=0;
			 Iterator<String> iter = namelist.iterator();
			 while (iter.hasNext()) {
				 list[l]= iter.next();
			     l++;
				 }
			 Random rand = new Random();
			 int cur=(int)(Math.random()*500);   
			 cur=cur%l;
			 String QName=list[cur];
			 System.out.print(QName);
			 namelist.remove(QName);
		}
	}
           

過濾抽獎

public void put_Qname()
	{
		while(repeat!=0)
		{
			repeat--;
			 int l=0;
			 int f=0;
			 Iterator<String> iter = namelist.iterator();
			 while (iter.hasNext()) {
				 String s=iter.next();
				 for(int i=0;i<frequent[f];i++) {
				 list[l]= s;
			     l++;
				 }
				 f++;
			 }
			 Random rand = new Random();
			 int cur=(int)(Math.random()*500);  
			 cur=cur%l;
			 String QName=list[cur];
			 System.out.print(QName);
			 namelist.remove(QName);
		}
	}
           

深度抽獎

public void put_Qname()
	{
		while(repeat!=0)
		{
			repeat--;
			 int l=0;
			 int f=0;
			 Iterator<String> iter = namelist.iterator();
			 while (iter.hasNext()) {
				 String s=iter.next();
				 for(int i=0;i<frequent[f];i++) {
				 list[l]= s;
			     l++;
				 }
				 f++;
			 }
			 Random rand = new Random();
			 int cur=(int)(Math.random()*500);  
			 cur=cur%l;
			 for(int i=0;i<l;i++)
			 {
				 if(i==0 && list[i]==list[i+1])
				 {
					 list[i]=list[cur];
				 }
				 else if(list[i]==list[i+1] && list[i]!=list[i-1])
				 {
					 list[i]=list[cur];
				 }
			 }
			 rand = new Random();
			 cur=(int)(Math.random()*500);   
			 cur=cur%l;
			 String QName=list[cur];
			 System.out.print(QName);
			 namelist.remove(QName);
		}
	}
           

六、遇到的困難及解決方法

  • 組員1 黃毓明

    困難:

    1.前後端資料互動,如何将前端需要計算的資料送到後端,如何将後端計算好的資料送到前端

    2.一些寫代碼時的異常情況處理

    解決辦法:

    1.前後端資料互動正在學習

    2.異常情況的話主要還是靠平時的積累,還是要多敲代碼啊!

  • 組員2 楊禮亮

    1.對Java語言不熟,和c語言上的文法雖然相似,但是在一天内寫出程式不太現實。

    2不知道怎麼從資料庫中傳回資料到代碼,是以一直無法得到能參與抽獎人的名單以及相關出現次數。

    3沒有與負責上一層編碼的同學對接好,對于隊友設計的相關的結構體内部變量不清晰。

    4在讨論中花費了很多時間,一開始對代碼無從下手,浪費大量時間

    1對Java不熟隻能上網搜相關的函數使用

    2資料傳回目前還沒弄好,因為完全不懂怎麼調用

    3将得到資料的代碼先設成一個函數,先編寫抽獎算法

  • 組員3 林翔宇
  1. java語言掌握不夠,寫代碼的時候磕磕碰碰
  2. 不知道怎麼進行前後端的資料互動

    現在在繼續學習java,了解前後端資料互動

  • 組員4 丁水源

    1.java不熟悉,是以遇到了一些文法上的困難。

    2.一開始組長配置設定給我的任務不熟悉,溝通上出現了一定的偏差。

    3.對項目的架構了解不透徹,發生架構了解上的偏差。

    4.由于是第一次團體的現場程式設計,可能在全局和局部以及時間等的把握上出現了些許的mistakes。

    1.通過之前學習的知識,再結合上網際網路,以及小夥伴的幫助,還是比較順利地熟悉了java語言。

    2.通過群組長的多次交流以及和其他組員的交流,比較順利地明白了自己的任務。

    3.通過網際網路以及群組員們交流,能夠收獲一些對此項目架構的感悟和了解。

    4.吸取這次的教訓,希望在接下來的實踐裡,乃至今後的工作、生活裡能夠更進一步,減少發生這次的錯誤,力争避免。加油鴨~~

  • 組員5 柯奇豪

    雖然有一個明确的思路,但是沒考慮到每個人的個人情況,導緻項目後期沒辦法進展,自己的能力不夠

    本次的作業沒能夠做好,但是接下來希望在有限的時間裡盡可能的去學習,帶領團隊有所成果

  • 組員6 蔣雄

    做前端過程中首先遇到的是頁面圖檔格式不對,疊加圖檔過程中出現錯誤,

    通過查了一些開源代碼解決了。後來主要的是前後端互動問題,現在還在學習

  • 組員7 黃志銘

    困難:

    1.用html寫網頁界面,在寫到跳轉視窗的時候,由于不太熟悉Notepad,是以耗費比較多的時間找跳轉小視窗

    2.最後的前端與後端的互動最終未能實作,沒有提前考慮到這個資料處理問題

    3.用Notepad與後端調用存在問題,下次使用得考慮其他編譯器,VS之類的。

    解決:

    1.前端與後端的互動看了很多篇部落格,現在可以大緻了解操作

    2.前端的編譯器沒有選好,得改用VS或者微信小程式的編譯器

七、馬後炮

如果一開始盡快确定大緻分工,不糾結于細節問題,那麼應該會做比現在好一些吧。

八、評估每位組員的貢獻比例

以下部分計入個人得分:

抽獎系統(記一次未完成的教訓)

附:PSP表格

PSP Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃
· Estimate · 估計這個任務需要多少時間 10
Development 開發
· Analysis · 需求分析 (包括學習新技術) 30 40
· Design Spec · 生成設計文檔
· Design Review · 設計複審 20
· Coding Standard · 代碼規範 (為目前的開發制定合适的規範)
· Design · 具體設計
· Coding · 具體編碼 120 250
· Code Review · 代碼複審
· Test · 測試(自我測試,修改代碼,送出修改)
Reporting 報告
· Test Repor · 測試報告 60 80
· Size Measurement · 計算工作量
· Postmortem & Process Improvement Plan · 事後總結, 并提出過程改進計劃
|       | 	合計  |310 |520
           

學習進度表

第N周 新增代碼(行) 累計代碼(行) 本周學習耗時(小時) 累計學習耗時(小時) 重要成長
11 N 革命還未成功,同志還需努力,之前學習的一點知識已經不夠用了