廣西應急廣播項目經驗總結(一)

 

1.返回原頁面的方式:

 

2.使用@RequestMapping中的大多數情況下填寫的value是路徑,然後若方法上沒有加@ResponseBody,則返回的是值會解析爲請求路徑,加上@ResponseBody則可以獲得json數據。

 

3.公司常用一些東西:

=>項目右鍵->find brugs

=>postman

=>rap

 

4.Spring中的@Transactional(rollbackFor = Exception.class)事務處理,當你的方法中拋出異常時,它會將

事務回滾,數據庫中的數據將不會改變,也就是回到進入此方法前的狀態。

 

5.儘量不要使用前臺分頁,可能會造成在分頁顯示之後,數據庫數據修改但表格並未動,造成拋出異常的情況。基本上都需要使用後臺分頁。這裏使用Mybatis的後臺分頁。

controller層:

 

serviceImpl層:

 

6.除了是返回頁面外,返回數據儘量不要出現直接返回數據,而是使用寫好的某個業務Result類的對象去返回到頁面,這樣做的好處是代碼適應性強,可適應App類應用。

下面這個代碼返回的是一個list,這種方式是不太規範的。

 而是應寫成如下的這種形式:

 BroadcastResult類詳細信息如下,這樣做的目的是爲了返回其他一些狀態信息:

package cn.wtu.broadcast.parent.pojo;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.List;

public class BroadcastResult implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    // 定義jackson對象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    // 響應業務狀態
    private Integer status;

    // 響應消息
    private String msg;

    // 響應中的數據
    private Object data;

    public BroadcastResult() {

    }

    public BroadcastResult(Integer status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public BroadcastResult(Object data) {
        this.status = 200;
        this.msg = "操作成功";
        this.data = data;
    }

    public static BroadcastResult build(Integer status, String msg, Object data) {
        return new BroadcastResult(status, msg, data);
    }

    public static BroadcastResult ok(Object data) {
        return new BroadcastResult(data);
    }

    public static BroadcastResult ok() {
        return new BroadcastResult(null);
    }

    public static BroadcastResult fail() {
        return new BroadcastResult(400, "操作失敗", null);
    }

    public static BroadcastResult fail(String msg) {
        return new BroadcastResult(400, msg, null);
    }

    public static BroadcastResult build(Integer status, String msg) {
        return new BroadcastResult(status, msg, null);
    }

    /**
     * 將json結果集轉化爲BroadcastResult對象
     *
     * @param jsonData json數據
     * @param clazz    BroadcastResult中的object類型
     * @return
     */
    public static BroadcastResult formatToPojo(String jsonData, Class<?> clazz) {
        try {
            if (clazz == null) {
                return MAPPER.readValue(jsonData, BroadcastResult.class);
            }
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (clazz != null) {
                if (data.isObject()) {
                    obj = MAPPER.readValue(data.traverse(), clazz);
                } else if (data.isTextual()) {
                    obj = MAPPER.readValue(data.asText(), clazz);
                }
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 沒有object對象的轉化
     *
     * @param json
     * @return
     */
    public static BroadcastResult format(String json) {
        try {
            return MAPPER.readValue(json, BroadcastResult.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Object是集合轉化
     *
     * @param jsonData json數據
     * @param clazz    集合中的類型
     * @return
     */
    public static BroadcastResult formatToList(String jsonData, Class<?> clazz) {
        try {
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (data.isArray() && data.size() > 0) {
                obj = MAPPER.readValue(data.traverse(),
                        MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

}

7.項目開發中上傳svn需要忽視的文件

 

8.前臺代碼提交

$.ajax({
	      url : "${ctx}/broadcast/daily/addDailyBroadcast",
	      type : 'post',
	      success :function(data){
	        	layer.msg(data.msg,{icon: 1});
	          	$("#tab_daily").bootstrapTable('refresh');
	          	$("input[name='fVolumeControl']").val("").focus();
	       }
	   }); 
/* $(".addDailyBroadCast").ajaxSubmit({
		   type: 'post', // 提交方式 get/post
	       url: '${ctx}/broadcast/daily/addDailyBroadcast', // 需要提交的 url
		   success:function(data){
				  layer.msg(data.msg,{icon: 1});
	          	  $("#tab_daily").bootstrapTable('refresh');
	          	  $("input[name='fVolumeControl']").val("").focus();
	 }
}); */

 

9.寫mapper.xml擴展文件的排序sql語言時,所有關聯的表名稱被替代,則之後只能使用那個替代名稱,否則會一直報錯,找不到該表。剛開始還犯了一個低級錯誤,把GROUP BY放在ORDER BY的後面了。

 

10.模糊查詢+把f_broadcast_type=0的放在最前面---mysql

<select id="querywaitingBroadCast" parameterType="java.util.Map"
		resultMap="BaseResultMap">
		SELECT
		b.*,
		t_d.f_dictionary_content as f_real_messageLevel
		
		
		FROM b_broadcast_data b
		LEFT JOIN t_dictionary t_d
		ON b.f_message_level=t_d.f_id
		WHERE b.f_delete_flag='0' AND b.f_state=#{code}
		<if test="searchText!=null">
			AND CONCAT(b.f_id, b.f_volume_control,b.f_create_time
			,b.f_broadcast_area) LIKE '%' #{searchText} '%'
		</if>
		ORDER BY  case when b.f_broadcast_type='0' then 0 else 1 end , b.f_message_level,b.f_sort
</select>

11.bootstrap中列屬性onCheck和onUncheck的使用

$('#tab_daily').bootstrapTable({
					
		method: 'get',
	    sortable: true,
	    dataType: "json",
	    search: true, //是否顯示錶格搜索
	    columns: columns,
		classes:'table-no-bordered',
		url: "${ctx}/broadcast/daily/selectDailyBroadcast",
					
		toolbar : '#toolbarComputer', // 工具按鈕用哪個容器
		sortable : true, // 是否啓用排序
		sortOrder : "desc", // 排序方式			
		pagination : true, // 是否顯示分頁(*)
		pageNumber : 1, // 初始化加載第一頁,默認第一頁
		pageSize : 5, // 每頁的記錄行數(*)
		pageList : [5, 10, 20], // 可供選擇的每頁的行數(*)
		showRefresh : true, // 是否顯示刷新按鈕
		clickToSelect : true, // 是否啓用點擊選中行
		uniqueId : "index", // 每一行的唯一標識,一般爲主鍵列表
		sidePagination:'server',
		queryParamsType: "",
		queryParams: function (params) {//自定義參數,這裏的參數是傳給後臺的,我這是是分頁用的
		return {//這裏的params是table提供的
			pageNumber: params.pageNumber,//從數據庫第幾條記錄開始
			pageSize: params.pageSize,//找多少條
			searchText:params.searchText, //查詢內容
			sortOrder:params.sortOrder, //排序方式
			sortName:params.sortName, //排序名稱
		};
		}, 				 
		responseHandler:function (result) {
			daily_data=result.data.list;
					   
			if(result.status === 200){
				 //layer.close(ii);
		    }
			return{
			      total: result.data.total, 
			      rows: result.data.list
			}; 			            
	       },
	    onCheck:function(row){
	    	if(!(row.fState==1)){
	    		$("#modifyBroadcastBtn").addClass("disabled");
	    		$("#modifyBroadcastBtn").css("opacity",".4");
	    	} else{
	    		checkBtn();
	    	}  
	    },
	    onUncheck:function(row){
	    		checkBtnUnClick();
	    }
				
	});
      function checkBtn(){
			var checked= $('#tab_daily').bootstrapTable('getSelections');
			if(checked.length>1){
				 $("#modifyBroadcastBtn").addClass("disabled");
				$("#modifyBroadcastBtn").css("opacity",".4")
			} 
				
	}	
	function  checkBtnUnClick(){
			var checked= $('#tab_daily').bootstrapTable('getSelections');
			if(checked.length==0){
				$("#modifyBroadcastBtn").removeClass("disabled");
				$("#modifyBroadcastBtn").css("opacity","1")
			} else if(checked.length==1){
				if(checked[0].fState==1){
					$("#modifyBroadcastBtn").removeClass("disabled");
					$("#modifyBroadcastBtn").css("opacity","1")
				}	
			} 
				
	}

12.路徑的問題

<%@include file="common/css.jsp" %>
<%@include file="../common/css.jsp" %>

../一般是回到上一級目錄,./一般很難出現在真實項目中,在項目中也不存在下面這種,一般開頭不帶/。

<%@include file="/common/css.jsp" %>

13.關於mapper.xml文件的問題

雖然可以在數據庫字段和VO開啓駝峯式的對應,但是還是自己使用AS取個別名對應就好。這裏注意不是resultMap,應該時resultType。

 

14.當使用模態框彈出時,然後點擊該模態框上的按鈕,打開一個layui的界面,可能會聚焦不了,無法填寫東西。

這是因爲在模態框中的tabindex樣式的影響,去掉模態框中的 tabindex="-1"就可以聚焦了。如下圖

 

15.模態框移動:

加上一句話就可以,$(".modal-dialog").draggable();,加載js初始化加載的任意一個地方就行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章