火推 java spring mybatis 企業項目合集 01-05

day01

 

企業類型、項目類型、企業IT組成

項目研發流程、人員搭配

發展路線

常使用軟件彙總

BUG、需求變動如何處理

需求變動如何處理:前端

里程碑計劃表、開發計劃表

原需求的變動:

    1:首先判斷需求變動的優先級和緊急度
        若是優先級特別高。比較緊急,這樣就須要優先安排,而且出具開發完成時間
        若是優先級不高,不着急處理,則須要從新變動開發計劃表(通常是將需求變動放到項目週期的最後一階段處理)

        需求變動確定會處理。

    2:判斷當前需求變動是否已經影響了原有業務功能的系統流程

        評估需求變動的週期,和風險。發郵件進行報備,而且申請技術支持。

新增需求的變動:

    1:同上(一、2)
    2:須要評估新增需求的工做量,將工做量進行郵件報備(新簽定需求變動的合同)

BUG如何處理:java

保持心態的淡定、淡定、淡定

1:開發環境

    - 後臺

        開發工具中進行debug模式調試(斷點調試),控制檯日誌
            從下往上看,找第一個case by......

    - 前端
        SVN中down下來的,前端文件是前端人員提交的,後臺只負責更新
            1:先註釋掉錯誤的代碼
            2:告訴前端修改,更新代碼

    - 服務器----數據庫----開發數據庫
    - 網絡-----數據庫-----開發數據庫

2:測試環境

    - 後臺
        logs文件----需求下載日誌文件(問題重現時間段內的日誌),
        根據時間段,日誌文件,從下往上看,找第一個case by

        ca....out
        localhost-....log
        localhost-manger....log
        manger....log

    - 前端

        - 推前端

    - 服務器

        - 推運維
    - 網絡
        - 推網管

3:線上環境(生產環境、正式環境)

    - 後臺

        找運維去下載logs文件(郵件申請)
        日誌文件,須要根據時間段,從上往下看(找第一個接口協議請求或者第一個case  by....)

        報的錯誤代碼:40四、300、30二、500、504

    - 前端
    - 服務器
    - 網絡

線上環境bug,若是提交或者分配解決人:mysql

禪道跟蹤管理系統(PHP-mysql---linux)---開源

    測試人員須要將bug或者問題或者需求變動,提交到禪道系統中,而且選擇分配人(解決人),點擊保存---(系統會發郵件給解決人)

    ID---解決中....
    修改bug狀態---已解決

解決bug個數的報表:linux

張三------10
李四-------4

開發人員,是息息相關的。git

基本工資+年終獎(1個月工資)+(雙薪)---12薪

季度獎金:

    標準:工做量和付出(禪道)
         KPI----工做指標

        通常是一個月一評
            自評:96分
            上級領導評:95分
            部門主管評:89分

            最終分:89分

    等級:

        60如下:辭退
        60-80:800
        80-90:1000
        90以上:1500

如何分析日誌、定位問題

參考上面

如何部署補丁文件、如何上線

補丁:web

修改代碼以前須要注意:

    在修改代碼以前,必須進行SVN/git更新,修改代碼,注意代碼規範

        //start   likang   2018年1月17日11:46:47  ==TODO 
            //public String test1(){..sysou("123")...}
            public String test1(){..sysou("3333")...}
        //end

    出補丁以前,再次進行代碼更新

代碼補丁:
    war包:----表現層代碼
    jar包:----應用層代碼

腳本補丁:

    所有是.sql文件,每一個sql語句最後都必須有一個;結束

    每一個.sql文件,最終結尾,都必須帶有一個commit;

    若是須要更新多個腳本補丁,則必須有一個全部腳本的總文件all.sql


文檔補丁:

    在文件中,必須在前面有一個文檔修改的歷史記錄

補丁說明:redis

解決問題:
解決人:
解決時間:
聯繫方式:
部署說明:

    1:首先中止》。。。。服務器
    2:作好....備份
    3:解壓.....文件,到。。。。地方,
    4:複製....文件,到。。。。。(覆蓋、刪除並複製)
    5:更新,執行....sql文件
    6:清除。。。。緩存
    7:重啓服務器

數據庫、數據庫服務器、框架、架構

數據庫:spring

databasesName

數據庫服務器:sql

mysql\oracle\sqlserver\DB2

框架:mongodb

spring\springMVC\hibernate\mybatis\springBoot

架構:

架構模式:
    C/S
    B/S

    MVC模式----SOP框架架構----MVC---WS標準
        SOPA---HTTP

微服務:
        springBoot、cloud

SOP和微服務有什麼區別?

分佈式、集羣、高併發、負載、緩存、雲端

分佈式:

不一樣的業務,不一樣的模塊,不一樣的功能,分別部署到不一樣的服務器

集羣:

相同的業務,相同的模塊,相同的功能,分別部署到不一樣的服務器

高併發:

同一時刻,N我的,同時訪問同一個功能

負載均衡:

通常取平均值,某一天,網站的訪問人數5W,PV(點擊量)

將這些點擊量,進行均衡分配到不一樣的服務器進行處理

緩存:

通常緩存的是用戶的請求數據,爲了提升用戶的體驗,和訪問速度,下降服務器承載的壓力

雲:

騰訊雲、阿里雲等

小明的故事

層次架構

技術架構

負載架構

如何作技術選型

二維碼工具類

/**
 * 
 * @author likang
 * @date   2017-11-3 下午2:06:54
 */
public class QRCodeEncoderHandler {
    public void encoderQRCode(String content, String imgPath) {
        try {
            Qrcode qrcodeHandler = new Qrcode();
            // 設置二維碼排錯率,可選L(7%)、M(15%)、Q(25%)、H(30%),排錯率越高可存儲的信息越少,但對二維碼清晰度的要求越小
            qrcodeHandler.setQrcodeErrorCorrect('M');
            //編碼模式:Numeric數字 Binary二進制 Kanji漢字 Alphanumeric英文字母
            qrcodeHandler.setQrcodeEncodeMode('B');
            qrcodeHandler.setQrcodeVersion(5);
            byte[] contentBytes = content.getBytes("gb2312");
            BufferedImage bufImg = new BufferedImage(600, 600,BufferedImage.TYPE_INT_RGB);
            Graphics2D gs = bufImg.createGraphics();
            gs.setBackground(Color.WHITE);
            gs.clearRect(0, 0, 600, 600);
            // 設定圖像顏色> BLACK
            gs.setColor(Color.BLACK);
            // 設置偏移量 不設置可能致使解析出錯
            int pixoff = 2;
            // 輸出內容> 二維碼
            if (contentBytes.length > 0 && contentBytes.length < 800) {
                boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
                for (int i = 0; i < codeOut.length; i++) {
                    for (int j = 0; j < codeOut.length; j++) {
                        if (codeOut[j][i]) {
                            gs.fillRect(j * 16 + pixoff, i * 16 + pixoff, 16, 16);
                        }
                    }
                }
            } else { }
            gs.dispose();
            bufImg.flush();
            File imgFile = new File(imgPath);
            // 生成二維碼QRCode圖片
            ImageIO.write(bufImg, "png", imgFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

    }
}

聊簡歷

我的信息:(無需照片)

姓   名:          性    別:
出生年月:         民    族:
學   歷:         專    業:
籍   貫:         現    居:
手   機:         郵    箱:

專業技能:

1:精通java編程和設計模式,如:網絡編程、多線程以及I/O流技術
2:具備良好的編碼規範和設計思想,如工廠模式、代理模式、裝飾模式、適配器模式等
3:熟練常見互聯網框架技術,如:SSM、SSH等
4:熟練互聯網常見前臺框架,如:Bootstrap、easyUI、百度編輯器、Highcharts以及一些js插件等
5:熟悉常見的開源技術而且集成Spring和SpringMVC中,如:Quartz、Ehcache、ActiveMQ等
6:熟練掌握常見的關係型數據庫mysql、oracle等以及非關係型數據庫Redis、mongodb等
7:掌握常見的開發工具Myeclipse、Eclipse等IDE和版本控制器SVN、Git等,並熟練使用maven進行項目構建
8:熟練互聯網常見的負載技術以及配置負載,如Nginx
9:掌握一些web應用服務器,如:Tomcat等,並能準確搭建集羣環境
10:熟練掌握分佈式項目服務,並熟練運用Dubbo進行分佈式項目部署
11:具備良好的項目管理、需求把控等項目管理經驗和風險控制經驗
12:具備第三方登陸、支付、高併發經驗
13:在金融、房地產、支付等業務模塊有很好的經驗。
14:掌握常見的Linux操做命令
15:瞭解Spring Boot框架

項目經驗(建議使用表格):

0-2:6K
2-3:6-10K
3-5:10-20K
5 +:20k+



項目名稱:       XXXXX
項目規模:       (使用人數)(併發人數)
項目環境:linux、myeclipse、mysql57
應用技術:jdk1.七、Tomcat七、SpringMVC、mybatis、Spring、redis、......、Bootstrap(前端)、easyUI(後臺管理系統)、開源技術、第三插件(百度編輯器、富文本插件、視頻插件、jeecms)
項目描述:(3-5行便可)(業務。功能)
負責模塊:(負責業務功能)
我的心得(不寫):

工做經驗:

eg:

2016.7-至今         百度         Java開發工程師
工做職責:
    1:
    2:
    3:

教育經歷:

2017.9-2018.11     北大       本科     計算機管理

我的評價:

工做期間,可以嚴格按照公司的制度規範本身,對工做認真負責,作到工做可以日結,對業務上可以很快的學習起來、入手快 ,能吃苦耐勞,用於承受壓力,敢於創新。紀律性強,工做積極配合;意志堅強,具備較強的無私奉獻精神。

工做中,我將發揚成績,克服不足,以對工做、對事業高度負責的態度,腳踏實地,盡職盡責地作好各項工做,不辜負領導和同志們對個人指望。

HR常問問題:

1:能接受加班嗎?能夠接受加班,可是但願是有效率的加班
2:能接受出差嗎?是短時間出差仍是長期的啊
3:地點能接受嗎?
4:我的3-5年的職業規劃?技術層次、管理層次
5:有帶團隊的能力嗎?能夠有、溝通能力
6:你以爲咱們公司怎麼樣?氛圍、團隊組成
7:你指望在公司能獲取什麼樣的進步或者幫助?技術層次、管理層次

問公司:

1:什麼項目?項目組成員?
2:公司是否有架構師啊?
3:是否有按期的技術培訓?
還有什麼想問題的啊?
1:能夠諮詢待遇和福利問題?沒有其餘問題了

參考資料:

https://mp.weixin.qq.com/s/opv1e1OsTd1Nwf7nsHzg-w

項目-- 1 -- 【CRM客戶管理系統】

調研

產品

需求

UI

開發

技術選型:

開發工具:myeclipse、linux、sqlyog
平臺環境:jdk1.七、tomcat七、mysql5+、centos7
技術應用:SSM、bootstrap、富文本編輯器、websocket、js、jsp

框架搭建:

1:數據庫設計

    1:遵循數據庫設計的數據類型規範,長度、註釋等
    2:通常創建索引的字段遵循兩個規則
        - 外鍵關聯字段增長索引
        - 增長查詢或者搜索的字段增長索引
        - 索引字段一張表,最多設置爲16個索引
    3:主鍵通常使用表名後綴+ID的方式設置,如:userId
    4:表主鍵長度通常設置爲20或者32,類型爲Bigint
    5:表主鍵能夠選擇自增模式,非空

    6:表字段設計規範
        - 日期字段--timestamp
        - 金額字段---fload
        - 富文本字段--text
        - 狀態字段----int  長度爲1,而且註釋上0123分別表明什麼
        - 字符串字段---varchar2
        - 布爾值--boolean




2:框架搭建

    - 在sqlyog客戶端中,執行crm.sql文件
    - 將CRM工程導入到本地工做空間
    - 工程中引用tomcat的全部jar包
    - 修改resource文件夾下jdbc的屬性值,修改成本身的數據庫鏈接信息

SQL:

hj_user  用戶表   userid
hj_role   角色表   roleid
hj_dept    部門表   deptid
hj_menu   菜單表  menuid
hj_role_menu  角色-菜單關係表

-- 1:查詢全部用戶對應的角色和部門信息

    select u.userid,u.username,u.roleid,r.rolename,u.deptid,d.deptname
    from hj_user u
    left join hj_role r on r.roleid = u.roleid
    left join hj_dept d on d.deptid = u.deptid;

-- 2:  查詢角色ID爲37的對應的全部菜單信息   ////角色id,角色名稱,菜單id,菜單名稱

    select r.roleid,r.rolename,rm.menuid,m.menuname
    from hj_role r 
    left join hj_role_menu rm on rm.roleid = r.roleid
    left join hj_menu m on m.menuid = rm.menuid
    where  r.roleid = 37;

-- 3:查詢用戶ID爲2的用戶,所擁有的菜單權限  /////用戶id,用戶名稱,角色ID,部門ID,菜單ID,菜單名稱

    select u.userid,u.username,u.roleid,u.deptid,rm.menuid,m.menuname
    from hj_user u
    left join hj_role_menu rm on rm.roleid = u.roleid
    left join hj_menu m on m.menuid = rm.menuid
    where u.userid = 2

框架說明:

web.xml:

    spring\springMVC\後綴攔截.do\404\500
    session有效期(分鐘),若是沒有配置,則去尋找tomcat中session配置
    歡迎頁、首頁、日誌信息

登陸

跳轉登陸頁面

1:完善web.xml信息,增長日誌和監聽
2:將攔截器中的註釋放開

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
  <display-name>CRM_13</display-name>   

   <!-- spring配置信息 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


   <!-- springMVC配置信息 -->
    <servlet>
        <servlet-name>crm_13</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:context-dispatcher.xml</param-value>
        </init-param>
        <!-- 啓用即加載 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

   <!-- 攔截後綴,後臺使用do進行攔截,前端通常使用htm攔截或者jhtm攔截 -->
   <servlet-mapping>
        <servlet-name>crm_13</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

   <!-- 40四、500 -->
   <error-page>
        <error-code>404</error-code><!-- 請求協議返回的錯誤代碼 -->
        <location>/404.do</location><!-- 接口地址 -->
   </error-page>
   <error-page>
        <error-code>500</error-code>
        <location>/500.do</location>
   </error-page>

   <!-- session有效期 -->
   <session-config>
        <session-timeout>120</session-timeout><!-- 默認爲分鐘 -->
   </session-config>

   <!-- 首頁 -->
    <welcome-file-list>
        <welcome-file>/index.do</welcome-file><!-- 接口地址 -->
    </welcome-file-list>

   <!-- 編碼 -->
   <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <!-- Log4j配置 -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:/log4j.xml</param-value>
    </context-param>
    <!-- 加載log4j配置文件 -->
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>


</web-app>

實現步驟:

1:在src下的system.controller包下增長UserLoginController.java
2:將工程部署到tomcat中,並啓動
3:直接輸入訪問工程名便可

UserLoginController.java

/**
 * 登陸功能
 * 
 * @author likang
 * @date 2018-1-18 下午2:06:14
 */
@Controller
public class UserLoginController {

    /**
     * 跳轉登陸頁面
     * @param model
     * @return
     */
    @RequestMapping(value = "/login.do", method = RequestMethod.GET)
    public String toLogin(Model model) {
        // 判斷用戶是否登陸,若是登陸,則跳轉主頁面,若是沒有登陸,則跳轉登陸頁面
        if (UserContext.getLoginUser() != null) {// 已經登陸
            return "redirect:/main.do";
        }
        return JumpViewConstants.SYSTEM_LOGIN;// 登陸頁面
    }

    /**
     * 主頁面的跳轉
     * @return
     */
    @RequestMapping(value = "/main.do", method = RequestMethod.GET)
    public String main() {
        // 判斷用戶是否登陸,若是登陸,則跳轉主頁面,若是沒有登陸,則跳轉登陸頁面
        if (UserContext.getLoginUser() != null) {// 已經登陸
            return JumpViewConstants.SYSTEM_INDEX;
        }
        return JumpViewConstants.SYSTEM_LOGIN;// 登陸頁面
    }
}

頁面展現:

登陸功能

開發步驟:

1:判斷接收參數是否爲空
2:判斷用戶名是否存在
3:判斷密碼是否匹配
4:若是都沒問題,則須要設置session對象值
5:登陸成功或者提示錯誤信息
6:解決禁用客戶端cookie問題

主要代碼:

UserLoginController.java:

/**
 * 登陸功能
 * @author likang
 * @date 2018-1-18 下午2:06:14
 */
@Controller
public class UserLoginController {

    //auth---auth2
    //出現這種關鍵詞,則表明請求是安全的,數據是安全的
    public static final String COOKIE_KEY = "auth_key";//登陸時cookie的key 
    public static final String COOKIE_KEY_SEPARATE = "_#_";//登陸時的cookie的分隔符

    @Autowired
    private IUserService userService;

    /**
     * 跳轉登陸頁面
     * @param model
     * @return
     */
    @RequestMapping(value = "/login.do", method = RequestMethod.GET)
    public String toLogin(Model model) {
        // 判斷用戶是否登陸,若是登陸,則跳轉主頁面,若是沒有登陸,則跳轉登陸頁面
        if (UserContext.getLoginUser() != null) {// 已經登陸
            return "redirect:/main.do";
        }
        return JumpViewConstants.SYSTEM_LOGIN;// 登陸頁面
    }

    /**
     * 主頁面的跳轉
     * @return
     */
    @RequestMapping(value = "/main.do", method = RequestMethod.GET)
    public String main() {
        // 判斷用戶是否登陸,若是登陸,則跳轉主頁面,若是沒有登陸,則跳轉登陸頁面
        if (UserContext.getLoginUser() != null) {// 已經登陸
            //TODO  根據用戶ID,查詢用戶全部的菜單信息
            //Long userId = UserContext.getLoginUser().getUserid();

            return JumpViewConstants.SYSTEM_INDEX;
        }
        return JumpViewConstants.SYSTEM_LOGIN;// 登陸頁面
    }

    /**
     * 用戶登陸功能
     * @param model
     * @param email  郵箱名稱
     * @param password 密碼
     * @param sign
     * @param request
     * @return
     */
    @RequestMapping(value = "/login.do",method = RequestMethod.POST)
    public  String login(Model model,String email,String password,String sign,HttpServletRequest request,HttpServletResponse response){
        if (StringUtils.isNotBlank(email) && StringUtils.isNotBlank(password)) {
            email = email+ContextUtil.getInitConfig("email_suffix");
            //首先判斷用戶名是否存在
            User user = userService.queryUserByEmail(email);
            if (user != null) {//用戶名存在
                //須要匹配密碼是否正確
                boolean iseash = userService.isEashPasswordAndEmail(email, password);
                if (iseash) {//true,則密碼匹配成功
                    //設置session
                    UserContext.setLoginUser(user);
                    //解決用戶關閉客戶端cookie對象的設置
                    //須要在服務器中保存用戶的cookie對象數據,每次請求或者獲取數據,從服務器獲取便可
                    Cookie cookie = new Cookie(COOKIE_KEY, URLEncoder.encode(email)+COOKIE_KEY_SEPARATE+MD5Tools.encode(password));
                    cookie.setMaxAge(0);//0:開啓就一直存在
                                        //-1:關閉即失效
                    cookie.setPath(request.getContextPath());
                    response.addCookie(cookie);
                    request.getSession(true).setAttribute("loginName", user.getUsername());
                    request.getSession(true).setAttribute("ischange", user.getIschange());

                    //跳轉主頁面
                    return "redirect:/main.do";
                }else{//密碼不匹配
                    model.addAttribute("msg", ReturnConstants.PASSWORD_ERROR);
                    return JumpViewConstants.SYSTEM_LOGIN;// 登陸頁面
                }
            }else{
                //若是不存在,則提示返回1
                model.addAttribute("msg", ReturnConstants.USER_NOT_EXIST);
                return JumpViewConstants.SYSTEM_LOGIN;// 登陸頁面
            }
        }
        return ReturnConstants.PARAM_NULL;//接收參數爲空
    }
}

IUserService.java:

/**
 * 用戶管理接口
 * @author likang
 * @date   2018-1-18 下午3:30:43
 */
public interface IUserService {

    /**
     * 根據郵箱名查詢用戶是否存在
     * @param email
     * @return
     */
    public User queryUserByEmail(String email);

    /**
     * 查詢密碼和郵箱是否匹配
     * @param email 郵箱
     * @param password 密碼
     * @return
     */
    public boolean isEashPasswordAndEmail(String email,String password);
}

UserServiceImpl.java:

@Service
@Transactional(rollbackFor=Exception.class)
public class UserServiceImpl implements IUserService{

    @Autowired
    IDataAccess<User> userDao;

    public User queryUserByEmail(String email) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("email", email);
        //第一個參數表明sql語句的ID,第二個參數表明傳入參數值,第三個表明分頁
        List<User> list = userDao.queryByStatment("queryUserByEmail", params, null);
        if (list != null && list.size() > 0) {
            return list.get(0);
        }
        return null;
    }

    public boolean isEashPasswordAndEmail(String email, String password) {
        if (StringUtils.isNotBlank(email) || StringUtils.isNotBlank(password)) {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("email", email);
            params.put("password", MD5Tools.encode(password));
            List<User> list = userDao.queryByStatment("isEashPasswordAndEmail", params, null);
            if (list != null && list.size() > 0) {
                return true;
            }
        }
        return false;
    }
}

mybatis-config.xml:

<mappers>
    <mapper resource="commonsqlmappings/CommonMapper.xml" />
    <mapper resource="mybatis/UserMapper.xml"/>
</mappers>

UserMapper.xml:

<mapper namespace="com.hjcrm.entity">

    <!-- 查詢用戶是否存在 -->
    <select id="queryUserByEmail" parameterType="java.util.Map" resultType="com.hjcrm.system.entity.User">
         select u.userid,u.username,u.roleid,u.deptid,u.email,u.ischange
         from hj_user u  
        <if test="email != null and email !=''">
            where u.email = #{email}
        </if>
    </select>

    <!-- 查詢郵箱和密碼是否匹配 -->
    <select id="isEashPasswordAndEmail" parameterType="java.util.Map" resultType="com.hjcrm.system.entity.User">
         select u.userid,u.username,u.roleid,u.deptid,u.email
         from hj_user u   where 1=1
        <if test="email != null and email !=''">
             and u.email = #{email}
        </if>
        <if test="password != null and password !=''">
             and u.password=#{password}
        </if>
    </select>
</mapper>

頁面展現:

主頁左側菜單功能

開發步驟:

1:在/main.do接口中,增長查詢菜單的信息接口
2:將查詢的數據,存放於model中,變量名爲menus
3:在IUserService.java中增長根據角色ID,查詢菜單權限的方法
4:實現接口方法,循環獲取一級菜單和二級菜單並列表展現
5:在UserMapper.xml中,增長查詢sql語句
6:代碼以下

主要代碼:

UserLoginController.java:

/**
 * 主頁面的跳轉
 * @return
 */
@RequestMapping(value = "/main.do", method = RequestMethod.GET)
public String main(Model model) {
    // 判斷用戶是否登陸,若是登陸,則跳轉主頁面,若是沒有登陸,則跳轉登陸頁面
    if (UserContext.getLoginUser() != null) {// 已經登陸
        //TODO  根據角色ID,查詢用戶全部的菜單信息
        Long roleid = UserContext.getLoginUser().getRoleid();
        List<Menu> list = userService.queryAllMenuByRoleId(roleid);
        model.addAttribute("menus", list);
        return JumpViewConstants.SYSTEM_INDEX;
    }
    return JumpViewConstants.SYSTEM_LOGIN;// 登陸頁面
}

IUserService.java:

/**
 * 根據角色ID,查詢全部的角色菜單信息
 * @param roleid
 * @return
 */
public List<Menu> queryAllMenuByRoleId(Long roleid);

UserServiceImpl.java:

@Autowired
IDataAccess<Menu> menuDao;

public List<Menu> queryAllMenuByRoleId(Long roleid) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("roleid", roleid);
    params.put("queryparent", "true");//是一個特殊標誌,標誌sql語句是查詢一級菜單仍是查詢二級菜單,
                                    //若是不爲空,則表明只查詢一級菜單,若是爲空,則表明只查詢二級菜單
    //1:只查詢一級菜單
    List<Menu> list = menuDao.queryByStatment("queryAllMenuByRoleId", params, null);
    //2:循環一級菜單,查詢一級菜單全部的二級菜單
    for (int i = 0; i < list.size(); i++) {
        Long menuId = list.get(i).getMenuid();//一級菜單的ID,----將此ID,當作下一條sql的父ID
        params.clear();
        params.put("menuparaid", menuId);
        params.put("roleid", roleid);
        params.put("queryparent", null);
        List<Menu> list1 = menuDao.queryByStatment("queryAllMenuByRoleId", params, null);
        list.get(i).setChildren(list1);
    }
    return list;
}

UserMapper.xml:

<!-- 根據角色ID,查詢角色全部菜單權限 -->
<select id="queryAllMenuByRoleId" parameterType="java.util.Map" resultType="com.hjcrm.system.entity.Menu">
     select r.roleid,r.rolename,rm.menuid,m.menuname
    from hj_role r 
    left join hj_role_menu rm on rm.roleid = r.roleid
    left join hj_menu m on m.menuid = rm.menuid
    <if test="roleid != null and roleid != '' and queryparent !=null">
        where  r.roleid = #{roleid} and m.menuparaid is null
    </if>
    <if test="menuparaid != null and menuparaid != '' and queryparent ==null">
        where  m.menuparaid = #{menuparaid} and  r.roleid = #{roleid}
    </if>
</select>

頁面展現

退出功能

開發步驟:

1:增長退出接口
2:清除瀏覽器和服務器cookie信息
3:重定向到main.do

主要代碼:

UserLoginController.java:

/**
 * 退出功能
 * @param request
 * @param response
 * @return
 */
@RequestMapping(value="/logout.do",method=RequestMethod.GET)
public String logout(HttpServletRequest request,HttpServletResponse response){
    UserContext.clearLoginUser();//清除session中的用戶信息
    //清除服務器cookie
    Cookie cookieJSes = new Cookie("JSESSIONID",null);
    cookieJSes.setMaxAge(0);
    cookieJSes.setPath(request.getContextPath());
    response.addCookie(cookieJSes);

    //清除客戶端瀏覽器cookie
    Cookie cookie = new Cookie(COOKIE_KEY, null);
    cookie.setMaxAge(0);//當即失效
    cookie.setPath("/");
    response.addCookie(cookie);
    return "redirect:/main.do";
}

頁面展現:

用戶管理模塊

跳轉用戶管理頁面

開發步驟:

1:新建一個用戶管理模塊的controller類
2:從數據庫hj_menu中或者點擊菜單纔看控制器瀏覽器404,均可以獲取接口地址
3:在controller中增長跳轉方法

主要代碼:

UserController.java:

/**
 * 跳轉用戶管理接口
 * @return
 */
@RequestMapping(value = "/system/userMang.do",method = RequestMethod.GET)
public String main(){
    if (UserContext.getLoginUser() != null) {
        return JumpViewConstants.SYSTEM_USER_MANAGE;//用戶管理頁面
    }
    return JumpViewConstants.SYSTEM_LOGIN;//登陸頁面
}

查詢全部用戶信息列表(支持分頁)

開發步驟:

1:經過瀏覽器獲取查詢信息的接口地址
2:在controller中增長查詢的接口方法
3:在IUserService中,增長查詢用戶信息的接口方法,支持分頁
4:實現該方法
5:在UserMapper.xml中增長查詢的sql語句

注意:controller中查詢方法爲@responseBody,返回json數據,須要繼承BaseController.java,使用其轉換json的公用方法

主要代碼:

UserController.java:

/**
 * 用戶管理模塊控制器
 * @author likang
 * @date   2018-1-19 上午11:27:27
 */
@Controller
public class UserController extends BaseController{

    @Autowired
    private IUserService userService;

    /**
     * 跳轉用戶管理接口
     * @return
     */
    @RequestMapping(value = "/system/userMang.do",method = RequestMethod.GET)
    public String main(){
        if (UserContext.getLoginUser() != null) {
            return JumpViewConstants.SYSTEM_USER_MANAGE;//用戶管理頁面
        }
        return JumpViewConstants.SYSTEM_LOGIN;//登陸頁面
    }

    /**
     * 查詢用戶列表信息
     * @param request
     * @param currentPage 第幾頁
     * @param pageSize 每頁請求個數
     * @return
     */
    @RequestMapping(value = "/system/userlist.do",method = RequestMethod.GET)
    public @ResponseBody String queryAllUsers(HttpServletRequest request,Integer currentPage,Integer pageSize){
        List<User> list = userService.queryAllUsers(processPageBean(pageSize, currentPage));
        return jsonToPage(list);
    }
}

IUserService.java:

/**
 * 查詢全部用戶信息,支持分頁
 * @param pageBean
 * @return
 */
public List<User> queryAllUsers(PageBean pageBean);

UserServiceImpl.java:

public List<User> queryAllUsers(PageBean pageBean) {
    List<User> list = userDao.queryByStatment("queryAllUsers", null, pageBean);
    return list;
}

UserMapper.xml:

<!-- 查詢全部用戶信息 -->
<select id="queryAllUsers" parameterType="java.util.Map" resultType="com.hjcrm.system.entity.User">
     select u.userid,u.username,u.roleid,u.deptid,u.email,u.ischange
     from hj_user u  
</select>

增長用戶信息

開發步驟:

1:獲取增長、修改用戶的接口地址(控制檯、瀏覽器均可以獲取)
2:增長查詢全部部門信息的接口
3:增長根據部門ID,查詢部門下的角色信息接口
4:根據接收參數是否有userid來判斷是增長仍是修改
5:增長、修改、刪除,無需寫sql語句

主要代碼:

UserController.java:

/**
 * 增長或者修改用戶信息
 * @param request
 * @param user
 * @return
 */
@RequestMapping(value = "/system/saveOrUpdate.do",method = RequestMethod.POST)
public @ResponseBody String addOrUpdateUser(HttpServletRequest request , User user){
    if (user != null) {
        userService.saveOrUpdate(user);
        return ReturnConstants.SUCCESS;//處理成功
    }
    return ReturnConstants.PARAM_NULL;//接收參數爲空
}

IUserService.java:

/**
 * 增長或者修改用戶信息
 * @param user
 */
public void saveOrUpdate(User user);

UserServiceImpl.java:

public void saveOrUpdate(User user) {
        if (user != null) {
            if (user.getUserid() != null) {//修改
                user.setUpdate_id(UserContext.getLoginUser().getUserid());
                user.setUpdate_time(new Timestamp(System.currentTimeMillis()));
                userDao.update(user);
            }else{//增長
                user.setCreate_id(UserContext.getLoginUser().getUserid());
                user.setCreate_time(new Timestamp(System.currentTimeMillis()));
                userDao.insert(user);
            }
        }
    }

DeptController.java:

/**
 * 部門模塊信息控制器
 * @author likang
 * @date   2018-1-20 上午8:53:20
 */
@Controller
public class DeptController extends BaseController{

    @Autowired
    private IDeptService deptService;

    /**
     * 查詢全部部門信息
     * @param request
     * @return
     */
    @RequestMapping(value = "/dept/queryDept.do",method = RequestMethod.GET)
    public @ResponseBody String queryAllDept(HttpServletRequest request){
        List<Dept> list = deptService.queryAllDept();
        return jsonToPage(list);
    }
}

IDeptService.java:

/**
 * 部門信息接口
 * @author likang
 * @date   2018-1-20 上午8:54:27
 */
public interface IDeptService {

    /**
     * 查詢全部部門信息
     * @return
     */
    public List<Dept> queryAllDept();
}

DeptServiceImpl.java:

@Service
@Transactional(rollbackFor=Exception.class)
public class DeptServiceImpl  implements IDeptService{

    @Autowired
    IDataAccess<Dept> deptDao;

    public List<Dept> queryAllDept() {
        List<Dept> list = deptDao.queryByStatment("queryAllDept", null, null);
        return list;
    }
}

DeptMapper.xml:

<?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.hjcrm.entity">
    <!-- 查詢全部部門信息 -->
    <select id="queryAllDept" parameterType="java.util.Map" resultType="com.hjcrm.system.entity.Dept">
         select * from hj_dept
    </select>
</mapper>

RoleController.java:

/**
 * 角色管理模塊控制器
 * @author likang
 * @date   2018-1-20 上午9:02:44
 */
@Controller
public class RoleController extends BaseController{

    @Autowired
    private IRoleService roleService;

    /**
     * 根據部門ID,查詢角色對應信息
     * @param request
     * @param deptid 部門ID
     * @return
     */
    @RequestMapping(value = "/role/queryRoleByDeptid.do",method = RequestMethod.GET)
    public @ResponseBody String queryRoleByDeptId(HttpServletRequest request,Long deptid){
        List<Role> list = roleService.queryRoleByDeptId(deptid);
        return jsonToPage(list);
    }
}

IRoleService.java:

/**
 * 角色管理接口
 * @author likang
 * @date   2018-1-20 上午9:06:04
 */
public interface IRoleService {
    /**
     * 根據部門id,查詢對應的角色信息
     * @param deptid
     * @return
     */
    public List<Role> queryRoleByDeptId(Long deptid);
}

RoleServiceImpl.java:

@Service
@Transactional(rollbackFor=Exception.class)
public class RoleServiceImpl implements IRoleService{

    @Autowired
    IDataAccess<Role> roleDao;
    public List<Role> queryRoleByDeptId(Long deptid) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("deptid", deptid);
        List<Role> list = roleDao.queryByStatment("queryRoleByDeptId", params, null);
        return list;
    }
}

RoleMapper.xml:

<?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.hjcrm.entity">

    <!-- 根據部門ID,查詢角色信息 -->
    <select id="queryRoleByDeptId" parameterType="java.util.Map" resultType="com.hjcrm.system.entity.Role">
         select * from hj_role r where r.deptid = #{deptid}
    </select>
</mapper>

mybatis-config.xml:

<mapper resource="mybatis/DeptMapper.xml"/>
    <mapper resource="mybatis/RoleMapper.xml"/>

刪除用戶信息(支持批量)

開發步驟:

1:獲取刪除用戶信息的接口地址
2:在控制器層增長刪除方法
3:推薦使用批量刪除的api

主要代碼:

UserController.java:

/**
 * 刪除用戶信息,支持批量刪除
 * @param request
 * @param ids 批量用戶主鍵ID,(用逗號隔開)
 * @return
 */
@RequestMapping(value = "/system/deleteUser.do",method = RequestMethod.POST)
public @ResponseBody String deleteUsers(HttpServletRequest request , String ids){
    if (StringUtils.isNotBlank(ids)) {
        userService.deleteUserByIds(ids);
        return ReturnConstants.SUCCESS;
    }
    return ReturnConstants.PARAM_NULL;//接收參數爲空
}

IUserService.java:

/**
 * 刪除用戶信息,支持批量刪除
 * @param ids id用逗號隔開
 */
public void deleteUserByIds(String ids);

UserServiceImpl.java:

public void deleteUserByIds(String ids) {
    if (StringUtils.isNotBlank(ids)) {
        userDao.deleteByIds(User.class, ids);
//          for (String id : ids.split(",")) {
//              User user = new User();
//              user.setUserid(Long.valueOf(id));
//              userDao.delete(user);
//          }
//          userDao.deleteByStatment("deleteUserByIds", ids);
    }
}

頁面展現

定時任務-Quartz+spring集成

1:導包

2:增長定時任務的配置文件

參考模塊信息

3:在spring的配置文件中,引用quartz的配置文件信息

<import resource="applicationContext-quartz.xml"/>

菜單管理模塊

跳轉、增長、查詢功能

刪除功能

角色管理模塊

跳轉、增長、查詢、刪除功能

權限分配功能

部門管理模塊

參考工程文件

課程管理模塊

參考工程文件

科目管理模塊

參考工程文件

消息管理模塊

跳轉、增長、查詢功能

發佈、撤回功能

資源管理模塊--運營部

資源管理模塊-銷售部

學員管理模塊-銷售部

學員管理模塊-行政部

緩存

註解使用:

@Cacheable(value="baseCache",key="'queryAllDept'")
    //存放緩存到緩存塊中(baseCache),key值支持el表達式,字符,數字
    //key值通常有三種方式,1:使用方法名當作key值 2:使用el表達式從參數屬性中獲取值#user.userid 3:使用字符串當作key
@CacheEvict(value="",key = "",beforeInvocation=false,allEntries = false)
    //  清除緩存
    //beforeInvocation爲false,則表明是在執行代碼以前進行清除,若是爲true表明是在執行完代碼以後進行刪除
    //allEntries=true,則表明清除全部的緩存塊,若是allEntries=false,則只會清除key值對應的緩存數據
@CachePut() //更新緩存

步驟:

導入緩存包
1:增長eacache.xml屬性文件,指明緩存區域塊
2:增長和spring進行整合的配置文件
3:在spring的配置文件中,引用整合配置文件

    <import resource="applicationContext-ehcache.xml"/>

eacache.xml:

參考工程文件

applicationContext-ehcache.xml:

 

 

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xmlns:context="http://www.springframework.org/schema/context"    
    xmlns:oxm="http://www.springframework.org/schema/oxm"    
    xmlns:mvc="http://www.springframework.org/schema/mvc"    
    xmlns:cache="http://www.springframework.org/schema/cache"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xsi:schemaLocation="http://www.springframework.org/schema/mvc   
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd    
        http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd    
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-3.2.xsd  
        http://www.springframework.org/schema/cache   
        http://www.springframework.org/schema/cache/spring-cache.xsd">   

    <!--  緩存  屬性-->  
    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    
        <property name="configLocation"  value="classpath:ehcache.xml"/>   
    </bean>   

    <!-- 支持緩存註解 -->  
    <cache:annotation-driven cache-manager="cacheManager" />  

    <!-- 默認是cacheManager -->  
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">    
        <property name="cacheManager"  ref="cacheManagerFactory"/>    
    </bean>    
</beans>

 

Linux如何搭建Java環境

 

Excel導入、導出

使用POI技術

導入:

1:須要將excel寫入到服務器
2:從服務器中讀取Excel
3:將讀取到的內容,保存到數據庫

導出:

1:將須要導出的數據,導出到服務器excel中
2:讀取服務器中excel文件
3:將excel文件從服務器下載到本地

代碼:

參考工程文件

使用websocket技術,實現消息的傳輸

使用tomcat7自帶的websocket技術,實現消息的長鏈接模式傳輸

1:組裝發送的消息對象
2:將消息對象放入到線程池中,避免高併發業務下,所引發的消息發送混亂或者丟失
3:將消息線程池放到線程池中,集中管理,併發送已經在鏈接中的線程

代碼:

參考工程文件

CRM總結

相關文章
相關標籤/搜索