需求變動如何處理:前端
里程碑計劃表、開發計劃表 原需求的變動: 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
略
略
略
技術選型:
開發工具: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); } }
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環境
使用POI技術
導入:
1:須要將excel寫入到服務器 2:從服務器中讀取Excel 3:將讀取到的內容,保存到數據庫
導出:
1:將須要導出的數據,導出到服務器excel中 2:讀取服務器中excel文件 3:將excel文件從服務器下載到本地
代碼:
參考工程文件
使用tomcat7自帶的websocket技術,實現消息的長鏈接模式傳輸 1:組裝發送的消息對象 2:將消息對象放入到線程池中,避免高併發業務下,所引發的消息發送混亂或者丟失 3:將消息線程池放到線程池中,集中管理,併發送已經在鏈接中的線程
代碼:
參考工程文件