ideashow開發記事

第一步
1.需求分析---討論溝通,分析瞭解ideashow使用客戶的想法及及需求,相關設計理念風格等
2.根據瞭解的情況進行平面設計和相關數據庫設計,詳細每個頁面的主功能,
3.在平面設計的基礎上進行網頁html寫入,寫出對應的靜態頁面
第二步
分析項目
考慮用spring+hibernate+struts框架+mysql數據庫操作
1.整合ssh
SSH的整合分爲兩步:
1)將 Hibernate 整合到 Spring 中.
將SessionFactory作爲Bean配置在Spring容器中.spring容器要求項目啓動就初始化,通過使用 ServletContextListener 接口,監聽application作用域(項目本身)的初始化事件,以Eager的方式第一時間實例化容器;將容器存入 application作用域,供其他組件使用,默認實現單例模式我採用在web.xml中初始化spring容器.
spring applicationContext.xml的配置: 
dataSource數據源
sessionFactory
事務管理器TM
聲明式事務是如何進行的tx:advice
aop配置
2)將 Struts2 和 Spring 整合。
Struts2管理Action類, Spring管理業務組件,業務組件依賴注入到Action類。


2.微信端
確定了整體使用框架後.分析ideashow用戶是從微信接口過來的,然後去了解微信接口:
用戶通過服務號的自定義菜單中子菜單click,view事件訪問網站.通過閱讀微信api,瞭解需要獲取用戶涉及到oauth2網絡協議,綁定服務號實現相關接口對接.


開始開發
1.理清相關數據庫表結構,對應關係,表關聯確定user,idea兩張表爲主表
建對應實體類,通過註解配置hibernate映射關係
2.結合mvc思想,分層處理,邏輯,視圖,DB訪問,業務,附日誌,相關工具類,配置文件,jar包,還有單元測試.


細節:
(使用ssh框架時最好每次訪問jsp視圖時先訪問action資源,通過struts.xml訪問jsp,可以先行對頁面數據進行預處理)
1.數據刪除不是物理刪除,一般是通過ajax處理,在邏輯層設置某一字段爲某值,在查詢是排除這一字段的值範圍
2.一般頁面都是預加載,減輕服務器壓力,當有用戶操作時再根據情況處理,比如加載列表時一般是顯示滿頁面下拉加載更多
3.下拉加載時採用append拼接時應注意:因爲是後加載的不是頁面加載完畢後有的對象,所以jquery對象取不到,判斷也應該用js寫.
4.文本框驗證:非空,去空格非空,換行,關鍵字,html網頁標籤.. disabled避免用戶多次提交
5.一般共有的邏輯會抽出共同函數,封裝寫方法,通過調用利於後期維護和代碼整潔
6.一般常量封裝到一個類中,通過調用可以方便使用,便於以後修改。
7.微信公衆平臺開發中access_token的有效期是7200秒(兩小時),需要保證不過期,ideashow中採用的是啓動一個線程,在線程的run()方法中寫一個死循環,然後使用Thread.sleep()來保證線程到7000s時刷新執行某項任務
8.json中含有雙引號分號回車換行等不能正常解析
9.用戶點贊後臺需要進行判斷是否已點過。同時對相關的積分做處理
10做分享接口時出現的問題:
1)由於jsapi_ticket的有效期是7200秒(兩小時),在有效期內,可以一直使用,只有當jsapi_ticket過期時,才需要再次調用接口獲取jsapi_ticket,本項目是保存到內存中。 
2)只做了分享到朋友圈,用戶點分享到朋友報錯,考慮不周全,沒有作爲用戶去體驗
3)分享出去的應該是動態的,實時的,更能吸引人。
11.文件上傳
1)上傳文件應該放在web-inf-目錄上
2)防止文件覆蓋,產生唯一文件名
3)爲防止一個目錄下太多文件,使用hash算法打散
4)限制文件上傳大小的最大值
5)限制文件上傳類型,判斷後綴是否合法
11.微信獲取用戶暱稱中含有表情符號會出現亂碼,報錯
數據在 Mysql 5.5 之前,UTF-8 支持1-3個字節的編碼,從 Mysql5.5 開始後,可以支持4個字節的 UTF 編碼,但要特殊標記。修改 Mysql 相應存儲字段爲 utf8mb4 。修改語句如下: 
ALTER TABLE table_name
MODIFY COLUMN content varchar(500) CHARACTER
SET utf8mb4 COLLATE utf8mb4_unicode_ci
DEFAULT NULL COMMENT 'content of message';
12.alert(location.href.split('#')[0])顯示頁面完整url
13. MySQL數據庫連接超時(wait_timeout)問題的處理
錯誤原因:org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException
由於MySQL服務在長時間不連接之後斷開了,斷開之後的首次請求會拋出這個異常,打開MySQL的控制檯,運行:show variables like ‘%timeout%’,查看和連接時間有關的MySQL系統變量,
MySQL的系統變量由配置文件控制,當配置文件中不配置時,系統使用默認值,這個28800就是wait_timeout的默認值
14.在一般系統中藥對session的有效期進行處理,默認是180分鐘。session的過期時間計算是從當前session的最後一次請求開始
session失效後需要用到監聽器,即當session因爲各種原因失效後,監聽器就可以監聽到,然後執行監聽器中定義好的程序,就可以了。 
監聽器類爲:HttpSessionListener類,有sessionCreated和sessionDestroyed兩個方法 


微信公衆平臺開發記事   
接入測試
(get請求接入) 
發送消息                               轉發(參數signature、timestamp、nonce、echostr)           (將token + timestamp + nonce 按字典序排序,拼接成字符串進行SHA-1加密)
微信客戶端------------------------------------->微信服務器---------------------------------------------------------------->公網服務器(servlet)
  微信加密簽名、時間戳、隨機數、隨機字符串              (url)
                                                                             返回加密後新字符串  (與signature 比較,相同返回 echostr)                                                
                                                微信服務器    <--------------------------------------------------------------  
                                    (返回的echostr 與發過去的echostr比較  
     相同表示接入成功,不同就失敗)  
點擊開發者中心,首先啓用服務器配置。填寫url和token(和java代碼中的一樣)、EncodingAESKey是隨機生成,消息加解密方式選擇明文模式。
這裏的url就是在服務器中中創建應用的地址,我們已經將寫好的java代碼上傳到這個地址。token是微信服務器和自身服務器進行對接驗證是用到的(必須保持一致),消息
加密暫時選擇明文模式,如果選擇加密模式需要編寫加密代碼,以後會再轉到加密或兼容模式,這裏先用明文模式(服務器要打開),
如果現實成功就說明接入完成。
微信服務器與我們的服務器之間是通過xml傳遞數據的,需要實現消息實體與xml之間的互換 
當用戶發消息給公衆賬號時,微信公衆平臺服務器會使用http請求對接入的網址進行消息推送,第三方服務器可通過響應包回覆特定結構,從而達到回覆消息的目的。 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  
微信消息運行流程:
通過dom4j.jar解析xml,將名稱和值封裝到map集合中,從集合中獲取消息參數,封裝到響應消息中---------根據消息類型判斷,對不同的消息請求回覆不同的內容------將響應消息對象轉XML返回給微信服務器
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
圖文消息使用總結
1)一定要給圖文消息的Url屬性賦值。不管是單圖文,還是多圖文,或者是不含圖片的圖文,都有可能會被用戶點擊。如果Url爲空,用戶點擊後將會打開一個空白頁面,這給用戶的體驗是非常差的;

2)只有單圖文的描述纔會顯示,多圖文的描述不會被顯示;

3)圖文消息的標題、描述中可以使用QQ表情和符號表情。合理地運用表情符號,會使得消息更加生動;

4)圖文消息的標題、描述中可以使用換行符。合理地使用換行符,會使得內容結構更加清晰;

5)圖文消息的標題、描述中不支持超文本鏈接(html的<a>標籤)。不只是技術上實現不了,就連邏輯上也說不通,因爲一條圖文消息的任何位置被點擊,都將調用微信內置的瀏覽器打開Url,如果標題、描述裏再放幾個超鏈接,不知道點擊該打開哪個頁面。

6)圖文消息的鏈接、圖片鏈接可以使用外部域名下的資源,如本例中:柳峯的頭像、博文的鏈接,都是指向CSDN網站的資源。

7)使用指定大小的圖片。第一條圖文的圖片大小建議爲640*320,其他圖文的圖片大小建議爲80*80。如果使用的圖片太大,加載慢,而且耗流量;如果使用的圖片太小,顯示後會被拉伸,失真了很難看。

8)每條圖文消息的圖文建議控制在1-4條。這樣在絕大多數終端上一屏能夠顯示完,用戶掃一眼就能大概瞭解消息的主要內容,這樣最有可能促使用戶去點擊並閱讀。
自定義菜單的創建步驟
1、找到AppId和AppSecret。自定義菜單申請成功後,在“高級功能”-“開發模式”-“接口配置信息”的最後兩項就是; 
2、根據AppId和AppSecret,以https get方式獲取訪問特殊接口所必須的憑證access_token;    
3、根據access_token,將json格式的菜單數據通過https post方式提交。   封裝一個通用的請求方法httpRequest(url,method,data)
1)自定義菜單是一個3x5結構的,即菜單最多只能有二級,一級菜單最多只能有3個,每個一級菜單下最多可以有5個二級菜單項;
2)菜單項都有一個key值。當用戶點擊某個菜單項時,微信會將該菜單項的key值以事件推送的方式發送給我們的後臺處理程序。 

事件推送:
目前只開啓自定義菜單接口事件推送
當MegType = event 就表示這是一條事件推送消息;而Event表示事件類型包括訂閱(subscribe)、取消訂閱(unsubscribe)和自定義菜單點擊事件(CLICK) 、(VIEW)訪問網頁  
網頁授權流程:
1、引導用戶進入授權頁面同意授權,獲取code
2、通過code換取網頁授權access_token(與基礎支持中的access_token不同)
3、如果需要,開發者可以刷新網頁授權access_token,避免過期
4、通過網頁授權access_token和openid獲取用戶基本信息(支持UnionID機制)

 "|<[^>]+>(.*)</[^>]+>|U"  此正則用於將一對對 html 標籤挑出來  <[^>]+> 匹配標籤開始  </[^>]+> 匹配標籤結束 最後面的 |U 表示只匹配最近的一個字符串;不重複匹配; 
a.*?b 惰性匹配  a.*b 貪婪匹配  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章