

메뉴를 추가하려면 DB에서 COM_MENU, COM_ROLE_MENU, COM_SVC_MENU 테이블을 수정해야 한다.

url 설정




메뉴 테이블 수정 후에는 반드시 톰캣 재시작 해야한다 (이클립스에서만 해도 가능)









package com.seculayer.web.dashboard;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.configuration.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.seculayer.web.common.ComCode;
import com.seculayer.web.common.Constants;
import com.seculayer.web.common.util.MapUtil;
import com.seculayer.web.dashboard.dao.NewBoardDAO;
import com.seculayer.web.framework.entity.GridResultEntity;
import com.seculayer.web.framework.entity.JsonResultEntity;
import com.seculayer.web.framework.entity.ResultEntityFactory;
import com.seculayer.web.framework.util.TemplateAndPage;
@Controller
@RequestMapping(value = "/dashboard/")
public class NewBoardController {
@Autowired private SqlSession sqlSession;
@Autowired private NewBoardService svc;
@Autowired private ComCode comCode;
@Autowired private Configuration config;
@Autowired private ResultEntityFactory reFac;
static Logger logger = Logger.getLogger(NewBoardController.class);
final static String Template = "/common/tpl/default_template";
final static String PopupTemplate = "/common/tpl/popup_template";
final static String PartialTemplate = "/common/tpl/partial_template";
final static String VIEW_MAPPING_PATH = "/dashboard/board/";
@RequestMapping(value = "nboard_list.html")
public ModelAndView listPage(HttpSession session, @RequestParam Map<String, Object> map) {
ModelAndView mv = TemplateAndPage.getTemplateAndPage(map, VIEW_MAPPING_PATH, "nboard_list");
mv.addObject("groupCds", MapUtil.sortValue(comCode.getCodeMap(svc.GROUP_CODE)));
return mv;
}
@RequestMapping(value = "nboard_form.html")
public ModelAndView formPage(HttpSession session, @RequestParam Map<String, Object> map) {
ModelAndView mv = TemplateAndPage.getTemplateAndPage(map, TemplateAndPage.PARTIAL_TEMPLATE, VIEW_MAPPING_PATH, "nboard_form");
mv.addObject("page_title", "게시글");
mv.addObject("user_id", session.getAttribute(Constants.USER_ID));
mv.addObject("groupCds", MapUtil.sortValue(comCode.getCodeMap(svc.GROUP_CODE)));
mv.addObject("loginMenuIds", comCode.getCodeMap("BB0001"));
mv.addObject("userIpRestrictYn", config.getBoolean("user_ip_restrict") ? "Y" : "N");
mv.addObject("multipleManagerRoleYn", config.getBoolean("multiple_manager_role") ? "Y" : "N");
mv.addObject("groupComCode", svc.GROUP_CODE);
return mv;
}
@RequestMapping(value = "nboard_list.json")
public @ResponseBody GridResultEntity getList(HttpSession session, @RequestParam Map<String,Object> map) {
NewBoardDAO dao = sqlSession.getMapper(NewBoardDAO.class);
int listCount = dao.selectNewBoardListCount(map);
List<Map<String, Object>> list = Collections.emptyList();
if (listCount > 0) {
list = dao.selectNewBoardList(map);
}
return new GridResultEntity(listCount, list);
}
@RequestMapping(value = "nboard.json")
public @ResponseBody JsonResultEntity get(@RequestBody Map<String, Object> map) {
return reFac.getJsonResultEntity(svc.select(map));
}
@RequestMapping(value = "nboard_insert.do")
public @ResponseBody JsonResultEntity insert(HttpSession session, @RequestBody Map<String, Object> map) {
svc.insert(map);
return reFac.getJsonResultEntityFromResultCd("SUC.COM.0001");
}
@RequestMapping(value = "nboard_update.do")
public @ResponseBody JsonResultEntity update(HttpSession session, @RequestBody Map<String, Object> map) {
svc.update(map);
return reFac.getJsonResultEntityFromResultCd("SUC.COM.0002");
}
@RequestMapping(value = "nboard_delete.do")
public @ResponseBody JsonResultEntity delete(HttpSession session, @RequestBody Map<String, Object> map) {
svc.delete(map);
return reFac.getJsonResultEntityFromResultCd("SUC.COM.0003");
}
}
package com.seculayer.web.dashboard;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.apache.commons.configuration.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import com.seculayer.web.common.ComCode;
import com.seculayer.web.dashboard.dao.NewBoardDAO;
@Service
public class NewBoardService
{
@Autowired SqlSession sqlSession;
@Autowired Configuration config;
@Autowired ComCode comCode;
static String GROUP_CODE = "BB0001";
static Logger logger = Logger.getLogger(NewBoardService.class);
Map<String,Object> select(Map<String,Object> param) {
NewBoardDAO dao = sqlSession.getMapper(NewBoardDAO.class);
Map<String, Object> data = dao.selectNewBoard(param);
return data;
}
@Transactional(rollbackFor=Exception.class)
public int insert(Map<String, Object> param) {
NewBoardDAO dao = sqlSession.getMapper(NewBoardDAO.class);
int cnt = dao.insertNewBoard(param);
return cnt;
}
@Transactional(rollbackFor=Exception.class)
public int update(Map<String, Object> param) {
NewBoardDAO dao = sqlSession.getMapper(NewBoardDAO.class);
// 감사정보 (수정전 게시글정보)
Map<String,Object> old = dao.selectNewBoard(param);
int cnt = dao.updateNewBoard(param);
return cnt;
}
int delete(Map<String, Object> param) {
NewBoardDAO dao = sqlSession.getMapper(NewBoardDAO.class);
// 감사정보 (삭제전 게시글정보)
Map<String,Object> old = dao.selectNewBoard(param);
int cnt = dao.deleteNewBoard(param);
return cnt;
}
}
package com.seculayer.web.dashboard.dao;
import java.util.List;
import java.util.Map;
public interface NewBoardDAO {
//------------------------------------------------------------
// Dash Board
//------------------------------------------------------------
public int selectNewBoardListCount(Map<String, Object> map);
public List<Map<String, Object>> selectNewBoardList(Map<String, Object> map);
public Map<String, Object> selectNewBoard(Map<String, Object> param);
public Map<String, Object> selectBoard(Map<String, Object> param);
public int updateNewBoard(Map<String, Object> param);
public int deleteNewBoard(Map<String, Object> param);
public int insertNewBoard(Map<String, Object> param);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.seculayer.web.dashboard.dao.NewBoardDAO">
<!-- ########## Board START ########## -->
<select id="selectNewBoardListCount" resultType="int">
SELECT
COUNT(*)
FROM BOARD
<where>
<if test="login_user_ids != null and login_user_ids.size > 0 ">
AND user_id IN (
<foreach item="login_id" collection="login_user_ids" separator=",">
#{login_id}
</foreach>
)
</if>
<if test="s_user_id != null and s_user_id != ''">
AND user_id LIKE CONCAT('%',#{s_user_id},'%')
</if>
<if test="s_b_subject != null and s_b_subject != ''">
AND b_subject LIKE CONCAT('%',#{s_b_subject},'%')
</if>
<if test="s_b_cont != null and s_b_cont != ''">
AND b_cont LIKE CONCAT('%',#{s_b_cont},'%')
</if>
<if test="s_group_cd != null and s_group_cd != ''">
AND b_type = #{s_group_cd}
</if>
</where>
</select>
<select id="selectNewBoardList" resultType="map">
SELECT
b_seq,
CASE b_type WHEN 1 THEN '공지' ELSE '질문' END AS b_type,
b_subject,
b_cont,
user_id,
DATE_FORMAT(STR_TO_DATE(reg_dt, '%Y%m%d%H%i%s'), '%Y-%m-%d %H:%i:%s') as reg_dt
FROM
BOARD
<where>
<if test="login_user_ids != null and login_user_ids.size > 0 ">
AND user_id IN (
<foreach item="login_id" collection="login_user_ids" separator=",">
#{login_id}
</foreach>
)
</if>
<if test="s_user_id != null and s_user_id != ''">
AND user_id LIKE CONCAT('%',#{s_user_id},'%')
</if>
<if test="s_b_subject != null and s_b_subject != ''">
AND b_subject LIKE CONCAT('%',#{s_b_subject},'%')
</if>
<if test="s_b_cont != null and s_b_cont != ''">
AND b_cont LIKE CONCAT('%',#{s_b_cont},'%')
</if>
<if test="s_group_cd != null and s_group_cd != ''">
AND b_type = #{s_group_cd}
</if>
</where>
</select>
<select id="selectNewBoard" resultType="map">
SELECT
b_seq,
b_type,
b_subject,
b_cont,
user_id,
DATE_FORMAT(STR_TO_DATE(reg_dt, '%Y%m%d%H%i%s'), '%Y-%m-%d %H:%i:%s') as reg_dt
FROM
BOARD
WHERE
b_seq = #{b_seq}
</select>
<update id="updateNewBoard" parameterType="map">
UPDATE
BOARD SET
b_subject = #{b_subject},
b_cont = #{b_cont}
WHERE
b_seq = #{b_seq}
</update>
<delete id="deleteNewBoard" parameterType="map">
DELETE FROM
BOARD
WHERE
b_seq = #{b_seq}
</delete>
<insert id="insertNewBoard" parameterType="map">
INSERT INTO BOARD (
user_id,
b_type,
b_subject,
b_cont,
reg_dt
)
VALUES (
#{user_id},
#{b_type},
#{b_subject},
#{b_cont},
DATE_FORMAT(NOW(),'%Y%m%d%H%i%S')
)
</insert>
</mapper>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<div class="section-search-cols">
<h3><spring:message code="LBL.COM.0007"/></h3>
<form id="searchBoardList">
<input type="hidden" name="slKey" value="<c:out value="${_slKey}"/>">
<span class="form-label">작성자(아이디)</span>
<div class="forms-group">
<input type="text" name="s_user_id" value="<c:out value="${param.s_user_id}" />" class="form-input">
</div>
<span class="form-label">제목</span>
<div class="forms-group">
<input type="text" name="s_b_subject" value="<c:out value="${param.s_b_subject}" />" class="form-input">
</div>
<span class="form-label">내용</span>
<div class="forms-group">
<input type="text" name="s_b_cont" value="<c:out value="${param.s_b_cont}" />" class="form-input">
</div>
<span class="form-label">말머리</span>
<div class="forms-group">
<select name="s_group_cd" class="form-select">
<option value=""><spring:message code="SEL.COM.0002"/></option>
<c:forEach var="map" items="${groupCds}" >
<option value="${map.key}" ${map.key == param.s_group_cd?"selected":""}><c:out value="${map.value}" /></option>
</c:forEach>
</select>
</div>
<button type="button" class="form-submit"><spring:message code="BTN.COM.0007"/></button>
</form>
</div><!-- / .section-search-cols -->
<div class="section-content">
<!-- grid -->
<div class="grid-group">
<div id="gridBoardList"></div>
</div>
<div class="grid-bottom">
<div class="put-right">
<button type="button" class="btn-basic btn-add"><spring:message code="BTN.COM.0017"/></button>
</div>
</div>
<!-- / grid -->
</div><!-- / .section-content -->
<script src="<c:url value="/resources/app/dashboard/board/nboard_list.js" />"></script>
'use strict';
_SL.nmspc("board").list = function() {
var
mCfg = {
urlList : gCONTEXT_PATH + 'dashboard/nboard_list.json',
urlForm : gCONTEXT_PATH + 'dashboard/nboard_form.html',
formId : '#searchBoardList',
gridId : '#gridBoardList'
},
m$ = {
form : $(mCfg.formId),
grid : $(mCfg.gridId)
},
ctrlCookie = new slui.cookies(),
init = function() {
ctrlCookie.init(mCfg.gridId);
var $btnAdd = m$.grid.parent().siblings('.grid-bottom').find('.btn-add');
m$.form.find('[name=s_group_cd]').chosen({search_contains : true, width:'100%'});
// 초기 화면 구성
drawGrid(m$.grid);
// 이벤트 설정
m$.form.find('.form-submit').off().on('click',function(){
m$.grid.jqxGrid('gotopage', 0);
refresh();
});
//Keypress
m$.form.find(".form-input").keypress(function(e) {
if (e.keyCode == 13) {
m$.grid.jqxGrid('gotopage', 0);
refresh();
}
});
$btnAdd.off().on('click',function(){
viewDetail(mCfg.urlForm);
});
},
drawGrid = function($grid){
var gridSource = {
datatype: "json",
datafields: [
{ name: "b_seq", type: "string"},
{ name: "user_id", type: "string"},
{ name: "b_type", type: "string"},
{ name: "b_subject", type:"string"},
{ name: "b_cont", type:"string"},
{ name: "reg_dt", type: "string"}
],
root: 'rows',
beforeprocessing: function(data){
if (data != null){
gridSource.totalrecords = data.totalRows;
}
},
cache: false,
url: mCfg.urlList
},
dataadapter = new $.jqx.dataAdapter(gridSource, {
beforeLoadComplete: function(rows) {
for (var i in rows) {
rows[i].reg_dt = _SL.formatLcDate(rows[i].reg_dt, 'yyyyMMddHHmmss', _SL.formatDate.getLcPattern("ymdhms"));
}
return rows;
},
formatData : function(data) {
var params = {}, param, flds = $(mCfg.formId).serializeArray();
for(param in flds) {
params[flds[param].name] = flds[param].value;
};
$.extend(data, params);
return data;
},
loadError: function(xhr, status, error){
alert(error);
}
});
$grid.jqxGrid({
keyboardnavigation: false,
enablebrowserselection: true,
source: dataadapter,
width: '100%',
pagesize: ctrlCookie.getValue(),
virtualmode: true,
rendergridrows: function(obj){
return obj.data;
},
columns: [
{
text: 'No', columntype: 'number', width:40, cellsalign:'center',
cellsrenderer: function (row, column, value, defaulthtml) {
return $(defaulthtml).text(value + 1)[0].outerHTML;
}
},
{ text: "말머리", datafield: 'b_type', width:'10%'},
{ text: "제목", datafield: 'b_subject', width:'20%',
cellsrenderer: function(row, column, value, defaulthtml, columnproperties, rowdata){
return $(defaulthtml).html('<button type="button" style="position: absolute; left: 27px;" class="btn-link">' + value + '</button>')[0].outerHTML;
}
},
{ text: "내용", datafield: 'b_cont', width:'40%'},
{ text: "작성자(아이디)", datafield: 'user_id', width:'10%'},
{ text: "작성일", datafield: 'reg_dt', cellsalign:'center'}
]
});
$grid.on("cellclick", function (event){
if(event.args.datafield === 'b_subject'){
var bseq = event.args.row.bounddata.b_seq;
viewDetail(mCfg.urlForm +'?b_seq='+bseq);
}
});
ctrlCookie.changeEvent();
},
refresh = function() {
m$.grid.jqxGrid("updatebounddata");
},
viewDetail = function(url){
var modal = new ModalPopup(url, {
height: 650,
onClose : function(){
refresh();
}
});
};
return {
init : init
};
}();
$(function(){
slapp.board.list.init();
});
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<script>
gSessionUserId = "${sessionScope.USER_ID}";
gMultipleManagerRoleYn = "${multipleManagerRoleYn}";
gUserIpRestrictYn = "${userIpRestrictYn}";
</script>
<style>
.user-imgupload-text {
top:45%;
position:relative;
left:15%;
color:#E2E2E2;
}
</style>
<div class="section-content no-search-cols">
<form name="formBoardDetail" id="formBoardDetail">
<input type="hidden" name="slKey" value="<c:out value="${_slKey}" />">
<input type="hidden" name="b_seq" value="${param.b_seq}">
<table class="table-group">
<tr>
<th scope="row"><span class="mark-required">말머리 </span></th>
<td colspan="2">
<div class="ranges-group"><div class="range-3">
<div class="form-select-outer">
<select name="b_type" class="form-select">
<option value=""><spring:message code="SEL.COM.0002"/></option>
<option value="1" ${b_type == 1 ? "selected":""}>공지</option>
<option value="2" ${b_type == 2 ? "selected":""}>질문</option>
</select>
</div>
</div></div>
<%-- <a class="btn_sml" href="javascript:_SL.popupCodeList('${groupComCode}');"><span>등록</span></a> --%>
</td>
</tr>
<tr>
<th scope="row"><span>작성자(아이디)</span></th>
<td>
<div class="ranges-group"><div class="range-10">
<input type="text" name="user_id" value="${user_id}" class="form-input form-text" readonly="readonly">
</div></div>
</td>
</tr>
<tr class="regdt">
<th scope="row"><span>작성일</span></th>
<td>
<div class="ranges-group"><div class="range-10">
<input type="text" name="reg_dt" class="form-input form-text" readonly="readonly">
</div></div>
</td>
</tr>
<tr>
<th scope="row">제목</th>
<td colspan="2">
<div class="ranges-group"><div class="range-6">
<input type="text" name="b_subject" class="form-input" maxlength="100" data-valid="minLen=1,maxLen=254">
</div></div>
</td>
</tr>
<tr>
<th scope="row">내용</th>
<td colspan="2">
<div class="ranges-group"><div class="range-6">
<textarea name="b_cont" class="form-input" maxlength="1000" style="margin: 0px; width: 447px; height: 406px; resize: none;" data-valid="minLen=1,maxLen=16777215"></textarea>
</div></div>
</td>
</tr>
</table>
<div class="table-bottom">
<button type="button" class="btn-basic btn-save" data-after-close="true"><spring:message code="BTN.COM.0005"/></button>
<button type="button" class="btn-basic btn-delete" data-after-close="true"><spring:message code="BTN.COM.0003"/></button>
<button type="button" class="btn-basic btn-cancel" data-layer-close="true"><spring:message code="BTN.COM.0014"/></button>
</div>
</form>
</div>
<script type="text/javascript" src="<c:url value="/resources/js/jq_plugin/jquery.form.js" />" charset="utf-8"></script>
<script type="text/javascript" src = "<c:url value="/resources/js/jq_plugin/jquery.MultiFile.js" />"></script>
<script src="<c:url value="/resources/app/dashboard/board/nboard_form.js" />"></script>
//# sourceURL=nboard_form.js
'use strict';
_SL.nmspc("board").form = function(){
var
// Config 정의
mCfg = {
formId : '#formBoardDetail',
urlSelect : gCONTEXT_PATH + "dashboard/nboard.json",
urlDelete : gCONTEXT_PATH + "dashboard/nboard_delete.do",
add : {
action : gCONTEXT_PATH + "dashboard/nboard_insert.do",
message : _SL.getMessage("CNF.COM.0006"),
},
update : {
action : gCONTEXT_PATH + "dashboard/nboard_update.do",
message : _SL.getMessage("CNF.COM.0002"),
}
},
// JQuery 객체 변수
m$ = {
form : $(mCfg.formId),
b_seq : $(mCfg.formId + ' [name=b_seq]'),
userId : $(mCfg.formId + ' [name=user_id]'),
slKeyId : $(mCfg.formId + ' [name=slKey]')
},
// 현재 상태 변수
mState = {
isNew : m$.b_seq.val() == "" ? true : false,
mode : m$.b_seq.val() == "" ? mCfg.add : mCfg.update
},
init = function(){
// 이벤트 Binding
bindEvent();
// DOM 설정 Start
if(mState.isNew) {
m$.form.find(".btn-delete").hide();
m$.form.find(".regdt").hide();
}
else {
m$.form.find(".btn-delete").show();
m$.userId.addClass("form-text").attr("readonly", "readonly");
}
// 데이타 조회
if(!mState.isNew) select();
m$.form.find(".form-input").keypress(function(e) {
if (e.keyCode == 13) {
onSave();
}
});
},
bindEvent = function() {
// SAVE
m$.form.find('.btn-save').on('click', onSave);
// DELETE
m$.form.find('.btn-delete').on("click", onDelete);
},
select = function() {
var
bseq = m$.b_seq.val(),
rqData = {'b_seq': bseq},
callback = function(data){
_SL.setDataToForm(data, m$.form);
slui.attach.setTransformSelect(mCfg.formId);
};
$('body').requestData(mCfg.urlSelect, rqData, {callback : callback});
},
onSave = function(){
var afterClose = $(this).data('after-close') == true ? true : false;
if (!_SL.validate()) return;
var submit = function(){
$('body').requestData(mState.mode.action, _SL.serializeMap(m$.form), {
displayLoader : true,
callback : function(rsData, rsCd, rsMsg){
_alert(rsMsg, {
onAgree : function(){
onClose(true);
}
});
}
});
}
if(mState.isNew) {
submit();
}
else {
_confirm(mState.mode.message,{
onAgree : function(){
submit();
}
});
}
},
onDelete = function(){
var afterClose = $(this).data('after-close') == true ? true : false;
_confirm(_SL.getMessage("CNF.COM.0003"),{
onAgree : function(){
var bseq = m$.b_seq.val();
//삭제되는 b_seq 값 전송
$('body').requestData(mCfg.urlDelete, {b_seq: bseq, slKey:m$.slKeyId.val()},
{callback: function(rsData, rsCd, rsMsg){
_alert(rsMsg, {
onAgree : function() {
onClose(afterClose);
}
});
}}
);
}
});
},
onClose = function(afterClose){
if(afterClose){
m$.form.find("[data-layer-close=true]").click();
}
};
return {
init: init
};
}();
$(function(){
slapp.board.form.init();
});



