江蘇建設(shè)省直報(bào)名網(wǎng)站一個(gè)小型網(wǎng)站開發(fā)成本
鶴壁市浩天電氣有限公司
2026/01/22 09:03:03
江蘇建設(shè)省直報(bào)名網(wǎng)站,一個(gè)小型網(wǎng)站開發(fā)成本,張家口建設(shè)廳網(wǎng)站,邢臺(tái)提供網(wǎng)站設(shè)計(jì)公司哪家專業(yè)文章目錄
系列文章目錄目的前言一、詳細(xì)視頻演示二、項(xiàng)目部分實(shí)現(xiàn)截圖三、技術(shù)棧 后端框架springboot前端框架vue持久層框架MyBaitsPlus系統(tǒng)測(cè)試 四、代碼參考 源碼獲取 目的 摘要#xff1a;本文聚焦于基于Java Spring Boot框架的企業(yè)員工工作考勤系統(tǒng)開發(fā)。傳統(tǒng)考勤方式存…文章目錄系列文章目錄目的前言一、詳細(xì)視頻演示二、項(xiàng)目部分實(shí)現(xiàn)截圖三、技術(shù)棧后端框架springboot前端框架vue持久層框架MyBaitsPlus系統(tǒng)測(cè)試四、代碼參考源碼獲取目的摘要本文聚焦于基于Java Spring Boot框架的企業(yè)員工工作考勤系統(tǒng)開發(fā)。傳統(tǒng)考勤方式存在效率低、數(shù)據(jù)易出錯(cuò)等弊端該系統(tǒng)旨在解決這些問題提升企業(yè)管理效率。關(guān)鍵詞Java Spring Boot考勤系統(tǒng)企業(yè)管理在企業(yè)管理中精準(zhǔn)高效的考勤管理至關(guān)重要。本系統(tǒng)采用Java Spring Boot框架其具備快速開發(fā)、易于維護(hù)等優(yōu)勢(shì)。系統(tǒng)前端運(yùn)用HTML、CSS與JavaScript構(gòu)建簡(jiǎn)潔直觀的界面方便員工操作。后端以Spring Boot為核心整合Spring MVC、Spring Data JPA等技術(shù)實(shí)現(xiàn)業(yè)務(wù)邏輯處理與數(shù)據(jù)持久化。數(shù)據(jù)庫(kù)選用MySQL保障數(shù)據(jù)的安全與穩(wěn)定存儲(chǔ)。系統(tǒng)功能涵蓋員工信息管理、在線打卡、請(qǐng)假審批、考勤統(tǒng)計(jì)等。員工可隨時(shí)在線打卡提交請(qǐng)假申請(qǐng)管理者能實(shí)時(shí)查看考勤數(shù)據(jù)進(jìn)行審批操作。通過該系統(tǒng)企業(yè)實(shí)現(xiàn)了考勤管理的自動(dòng)化與信息化減少了人工干預(yù)提高了考勤數(shù)據(jù)的準(zhǔn)確性與及時(shí)性有效提升了企業(yè)的管理效能與競(jìng)爭(zhēng)力。前言博主介紹?全網(wǎng)粉絲10W,CSDN特邀作者、博客專家、CSDN新星計(jì)劃導(dǎo)師、全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者博客之星、掘金/華為云/阿里云/InfoQ等平臺(tái)優(yōu)質(zhì)作者、專注于Java、小程序技術(shù)領(lǐng)域和畢業(yè)項(xiàng)目實(shí)戰(zhàn)?精彩專欄 推薦訂閱全網(wǎng)最全的Java python 小程序 php uniapp項(xiàng)目列表-CSDN博客文末獲取源碼數(shù)據(jù)庫(kù)感興趣的可以先收藏起來還有大家在畢設(shè)選題項(xiàng)目以及論文編寫等相關(guān)問題都可以給我留言咨詢希望幫助更多的人一、詳細(xì)視頻演示文章底部獲取博主聯(lián)系方式二、項(xiàng)目部分實(shí)現(xiàn)截圖?????三、技術(shù)棧后端框架SpringBootSpring Boot內(nèi)置了Tomcat、Jetty和Undertow等服務(wù)器這意味著你可以直接使用它們而不需要額外的安裝和配置。Spring Boot的一個(gè)主要優(yōu)點(diǎn)是它的自動(dòng)配置功能。它可以根據(jù)你的項(xiàng)目中的依賴關(guān)系自動(dòng)配置應(yīng)用程序。這使得配置應(yīng)用程序變得非常容易因?yàn)槟悴恍枰謩?dòng)配置每個(gè)依賴項(xiàng)。Spring Boot也提供了大量的開箱即用的功能和插件如Spring Data、Spring Security和Spring Cloud等。這些功能使得開發(fā)者可以更快速地構(gòu)建應(yīng)用程序并且可以更容易地?cái)U(kuò)展和集成其他技術(shù)。它是一個(gè)非常流行的框架它的自動(dòng)配置、內(nèi)置服務(wù)器和插件等功能使得開發(fā)者可以更快、更輕松地構(gòu)建高質(zhì)量的應(yīng)用程序。前端框架VueVue.js的核心是虛擬DOM技術(shù)。虛擬DOM是一個(gè)內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)它可以幫助Vue.js實(shí)現(xiàn)高效的DOM操作它采用了響應(yīng)式數(shù)據(jù)綁定、虛擬DOM、組件化等現(xiàn)代化技術(shù)為開發(fā)者提供了一種靈活、高效、易于維護(hù)的開發(fā)模式當(dāng)數(shù)據(jù)發(fā)生變化時(shí)UI也會(huì)自動(dòng)更新這樣就使得開發(fā)者可以更加專注于數(shù)據(jù)處理而不是手動(dòng)更新UI這就是Vue體現(xiàn)出來的簡(jiǎn)潔靈活高效。持久層框架MyBaitsPlusMyBatis-Plus是一款基于MyBatis框架的增強(qiáng)工具旨在簡(jiǎn)化MyBatis的開發(fā)。它是一款開源的Java框架支持多種數(shù)據(jù)庫(kù)包括MySQL、Oracle、SQL Server、PostgreSQL等。MyBatis-Plus提供了豐富的API和注解可以通過簡(jiǎn)單的配置和使用來實(shí)現(xiàn)ORM操作大大減少了手寫SQL的工作量。此外MyBatis-Plus還提供了一套代碼生成器可以自動(dòng)生成實(shí)體類、Mapper接口以及XML映射文件極大地簡(jiǎn)化了開發(fā)流程。MyBatis-Plus還支持分頁(yè)查詢、動(dòng)態(tài)查詢、樂觀鎖、性能分析等實(shí)用功能方便開發(fā)者進(jìn)行高效的數(shù)據(jù)操作。通過MyBatis-Plus開發(fā)者可以快速開發(fā)高質(zhì)量的數(shù)據(jù)訪問層代碼提高開發(fā)效率系統(tǒng)測(cè)試從多個(gè)角度進(jìn)行測(cè)試找到系統(tǒng)中存在的問題是本系統(tǒng)首要的測(cè)試目的通過功能測(cè)試尋找出系統(tǒng)缺陷并改正確保系統(tǒng)沒有缺陷。在測(cè)試過程中證明系統(tǒng)滿足客戶需求發(fā)現(xiàn)問題和不足及時(shí)改正。測(cè)試完成之后得出測(cè)試結(jié)論。系統(tǒng)測(cè)試目的在管理系統(tǒng)的開發(fā)周期中系統(tǒng)測(cè)試是必不可少且考驗(yàn)?zāi)托牡倪^程。其重要性在于它是保證系統(tǒng)質(zhì)量和牢靠性的最后一道關(guān)也是整個(gè)系統(tǒng)開發(fā)過程的最后一次檢查。系統(tǒng)測(cè)試主要是為了避免用戶在使用時(shí)發(fā)生問題增強(qiáng)用戶體驗(yàn)感為了不影響用戶的使用我們需要從多角度、多思路去考慮系統(tǒng)可能遇到的問題通過不同的模擬場(chǎng)景來發(fā)現(xiàn)缺陷并解決問題。在測(cè)試的過程中也可以了解到該系統(tǒng)的質(zhì)量情況系統(tǒng)功能是否健全系統(tǒng)邏輯是否順暢。一個(gè)合格的系統(tǒng)測(cè)試過程完成后將大大提升系統(tǒng)質(zhì)量和使用感。測(cè)試的目標(biāo)是驗(yàn)證系統(tǒng)是否符合需求規(guī)格說明書的定義并找出與需求規(guī)格說明書不符合或與之沖突的內(nèi)容。測(cè)試過程中一定站在用戶的角度考慮問題避免一些不切實(shí)際的場(chǎng)景浪費(fèi)測(cè)試時(shí)間從而可能會(huì)引起問題導(dǎo)致預(yù)期結(jié)果與實(shí)際結(jié)果不符。系統(tǒng)功能測(cè)試對(duì)系統(tǒng)功能模塊進(jìn)行測(cè)試通過點(diǎn)擊、輸入邊界值和必填項(xiàng)非必填項(xiàng)的驗(yàn)證等方法進(jìn)行一系列的黑盒測(cè)試。通過編寫測(cè)試用例根據(jù)測(cè)試用例中的內(nèi)容進(jìn)行測(cè)試最后得出測(cè)試結(jié)論。登錄功能測(cè)試方案當(dāng)需要登入該系統(tǒng)時(shí)通過賬戶密碼等功能點(diǎn)進(jìn)行驗(yàn)證用戶在輸入時(shí)需要輸入與數(shù)據(jù)庫(kù)內(nèi)存儲(chǔ)的數(shù)據(jù)匹配的內(nèi)容當(dāng)其中某項(xiàng)輸入錯(cuò)誤時(shí)系統(tǒng)將提示輸入錯(cuò)誤。此界面對(duì)角色權(quán)限也有相應(yīng)的校驗(yàn)當(dāng)用戶角色的帳號(hào)選擇管理員角色登錄時(shí)也會(huì)報(bào)錯(cuò)。登錄功能測(cè)試用例如下表所示。輸入數(shù)據(jù)預(yù)期結(jié)果實(shí)際結(jié)果結(jié)果分析用戶名guanliyuan 密碼123456 驗(yàn)證碼正確輸入登入系統(tǒng)成功登入系統(tǒng)和估算結(jié)果一樣用戶名guanliyuan 密碼111111 驗(yàn)證碼正確輸入密碼錯(cuò)誤密碼錯(cuò)誤請(qǐng)重新輸入密碼和估算結(jié)果一樣用戶名guanliyuan 密碼123456 驗(yàn)證碼錯(cuò)誤輸入驗(yàn)證碼錯(cuò)誤驗(yàn)證碼信息錯(cuò)誤和估算結(jié)果一樣用戶名空 密碼123456 驗(yàn)證碼正確輸入用戶名必填請(qǐng)輸入用戶名和估算結(jié)果一樣用戶名guanliyuan 密碼空 驗(yàn)證碼正確輸入密碼錯(cuò)誤密碼錯(cuò)誤請(qǐng)重新輸入密碼和估算結(jié)果一樣用戶管理功能測(cè)試方案用戶管理主要有添加、編輯、刪除、查找用戶功能。添加用戶時(shí)必填項(xiàng)不填檢驗(yàn)系統(tǒng)是否有非空檢驗(yàn)添加已有的用戶信息檢驗(yàn)是否提示用戶名已被使用刪除用戶信息系統(tǒng)將檢驗(yàn)是否進(jìn)行此操作更改用戶信息更改用戶信息后頁(yè)面是否可以展示出來。用戶管理測(cè)試用例如下表所示。輸入數(shù)據(jù)預(yù)期結(jié)果實(shí)際結(jié)果結(jié)果分析填入用戶基本信息添加成功在用戶列表中顯示該用戶出現(xiàn)在在列表中和估算結(jié)果一樣修改用戶信息編輯成功修改信息成功被修改用戶信息被修改和估算結(jié)果一樣選中刪除用戶系統(tǒng)詢問是否刪除用戶確認(rèn)后用戶被刪除驗(yàn)證碼信息錯(cuò)誤系統(tǒng)詢問是否刪除用戶確認(rèn)后查找不到用戶信息和估算結(jié)果一樣添加用戶時(shí)不填用戶名提示用戶名不能為空提示用戶名不能為空和估算結(jié)果一樣填入已有用戶名添加失敗提示用戶名重復(fù)添加失敗提示用戶名重復(fù)和估算結(jié)果一樣系統(tǒng)測(cè)試結(jié)論本系統(tǒng)主要使用黑盒測(cè)試通過模擬用戶使用系統(tǒng)實(shí)現(xiàn)各個(gè)功能編寫測(cè)試用例并進(jìn)行測(cè)試。以確保系統(tǒng)流程的正確性。系統(tǒng)測(cè)試必不可少可以使系統(tǒng)更加完善該系統(tǒng)的可使用性也會(huì)更高。測(cè)試該系統(tǒng)主要為了驗(yàn)證系統(tǒng)的功能模塊是否滿足我們最初的設(shè)計(jì)理念驗(yàn)證各個(gè)功能模塊邏輯是否正確此系統(tǒng)不需要過于復(fù)雜的邏輯處理以便于使用者操作。測(cè)試的最終目的也是圍繞著用戶使用展開。測(cè)試過程中所有場(chǎng)景都應(yīng)符合用戶需求不可偏離需求目標(biāo)遇到問題時(shí)要站在用戶的角度進(jìn)行思考。經(jīng)過一系列的測(cè)試過程后得到最終的測(cè)試結(jié)果從測(cè)試結(jié)果可以看出實(shí)現(xiàn)的系統(tǒng)在功能和性能方面滿足設(shè)計(jì)要求。四、代碼參考IgnoreAuth PostMapping(value /login) public R login(String username, String password, String captcha, HttpServletRequest request) { UsersEntity user userService.selectOne(new EntityWrapperUsersEntity().eq(username, username)); if(usernull || !user.getPassword().equals(password)) { return R.error(賬號(hào)或密碼不正確); } String token tokenService.generateToken(user.getId(),username, users, user.getRole()); return R.ok().put(token, token); } Override public String generateToken(Long userid,String username, String tableName, String role) { TokenEntity tokenEntity this.selectOne(new EntityWrapperTokenEntity().eq(userid, userid).eq(role, role)); String token CommonUtil.getRandomString(32); Calendar cal Calendar.getInstance(); cal.setTime(new Date()); cal.add(Calendar.HOUR_OF_DAY, 1); if(tokenEntity!null) { tokenEntity.setToken(token); tokenEntity.setExpiratedtime(cal.getTime()); this.updateById(tokenEntity); } else { this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime())); } return token; } /** * 權(quán)限(Token)驗(yàn)證 */ Component public class AuthorizationInterceptor implements HandlerInterceptor { public static final String LOGIN_TOKEN_KEY Token; Autowired private TokenService tokenService; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //支持跨域請(qǐng)求 response.setHeader(Access-Control-Allow-Methods, POST, GET, OPTIONS, DELETE); response.setHeader(Access-Control-Max-Age, 3600); response.setHeader(Access-Control-Allow-Credentials, true); response.setHeader(Access-Control-Allow-Headers, x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization); response.setHeader(Access-Control-Allow-Origin, request.getHeader(Origin)); // 跨域時(shí)會(huì)首先發(fā)送一個(gè)OPTIONS請(qǐng)求這里我們給OPTIONS請(qǐng)求直接返回正常狀態(tài) if (request.getMethod().equals(RequestMethod.OPTIONS.name())) { response.setStatus(HttpStatus.OK.value()); return false; } IgnoreAuth annotation; if (handler instanceof HandlerMethod) { annotation ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); } else { return true; } //從header中獲取token String token request.getHeader(LOGIN_TOKEN_KEY); /** * 不需要驗(yàn)證權(quán)限的方法直接放過 */ if(annotation!null) { return true; } TokenEntity tokenEntity null; if(StringUtils.isNotBlank(token)) { tokenEntity tokenService.getTokenEntity(token); } if(tokenEntity ! null) { request.getSession().setAttribute(userId, tokenEntity.getUserid()); request.getSession().setAttribute(role, tokenEntity.getRole()); request.getSession().setAttribute(tableName, tokenEntity.getTablename()); request.getSession().setAttribute(username, tokenEntity.getUsername()); return true; } PrintWriter writer null; response.setCharacterEncoding(UTF-8); response.setContentType(application/json; charsetutf-8); try { writer response.getWriter(); writer.print(JSONObject.toJSONString(R.error(401, 請(qǐng)先登錄))); } finally { if(writer ! null){ writer.close(); } } // throw new EIException(請(qǐng)先登錄, 401); return false; } }數(shù)據(jù)庫(kù)參考-- ---------------------------- -- Table structure for token -- ---------------------------- DROP TABLE IF EXISTS token; CREATE TABLE token ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主鍵, userid bigint(20) NOT NULL COMMENT 用戶id, username varchar(100) NOT NULL COMMENT 用戶名, tablename varchar(100) DEFAULT NULL COMMENT 表名, role varchar(100) DEFAULT NULL COMMENT 角色, token varchar(200) NOT NULL COMMENT 密碼, addtime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 新增時(shí)間, expiratedtime timestamp NOT NULL DEFAULT 0000-00-00 00:00:00 COMMENT 過期時(shí)間, PRIMARY KEY (id) USING BTREE ) ENGINEInnoDB AUTO_INCREMENT27 DEFAULT CHARSETutf8 ROW_FORMATCOMPACT COMMENTtoken表; -- ---------------------------- -- Records of token -- ---------------------------- INSERT INTO token VALUES (9, 23, cd01, xuesheng, 學(xué)生, al6svx5qkei1wljry5o1npswhdpqcpcg, 2023-02-23 21:46:45, 2023-03-15 14:01:36); INSERT INTO token VALUES (10, 11, xh01, xuesheng, 學(xué)生, fahmrd9bkhqy04sq0fzrl4h9m86cu6kx, 2023-02-27 18:33:52, 2023-03-17 18:27:42); INSERT INTO token VALUES (11, 17, ch01, xuesheng, 學(xué)生, u5km44scxvzuv5yumdah2lhva0gp4393, 2023-02-27 18:46:19, 2023-02-27 19:48:58); INSERT INTO token VALUES (12, 1, admin, users, 管理員, h1pqzsb9bldh93m92j9m2sljy9bt1wdh, 2023-02-27 19:37:01, 2023-03-17 18:23:02); INSERT INTO token VALUES (13, 21, xiaohao, shezhang, 社長(zhǎng), zdm7j8h1wnfe27pkxyiuzvxxy27ykl2a, 2023-02-27 19:38:07, 2023-03-17 18:25:20); INSERT INTO token VALUES (14, 27, djy01, xuesheng, 學(xué)生, g3teq4335pe21nwuwj2sqkrpqoabqomm, 2023-03-15 12:56:17, 2023-03-15 14:00:16); INSERT INTO token VALUES (15, 29, dajiyue, shezhang, 社長(zhǎng), 0vb1x9xn7riewlp5ddma5ro7lp4u8m9j, 2023-03-15 12:58:08, 2023-03-15 14:03:48);源碼獲取文章下方名片聯(lián)系我即可~大家點(diǎn)贊、收藏、關(guān)注、評(píng)論啦 、查看獲取聯(lián)系方式精彩專欄推薦訂閱全網(wǎng)最全的Java python 小程序 php uniapp項(xiàng)目列表