前言
寫在前面的話,致每一位讀者!
任何事物的誕生總有她的必然性和偶然性,就如牛頓當年坐在樹下被水果砸中頭後發明了萬有引力,是坐下樹下的偶然,也是歷史推進的必然。
JFDF也不例外,做爲一個遊走在職場數十年的老兵程序員,出於對程序事業的尊敬也出於對程序員職業的熱愛,讓我總想在個人當打之年留下點什麼。
回顧過去,縱使開始這個項目的理由有上千種,但因爲本人天生慵懶也致使了項目的胎死腹中。然而因爲吃雞外掛的泛濫,讓咱們這些循規蹈矩的首批玩家徹底沒有一點生存空間,要麼碰見閃電俠見光死,要麼就是喝一梭子彈立馬變郵包(ps:本人吃雞帳號"包發虎",歡迎組隊吃雞!!!)。沒有了精神食糧的我決定痛定思痛,開始作一些有意義的事情,以尋找靈魂的依偎(逼格就是這樣出來的,哈哈!!!)。
其實對我來講作這樣的工做不是第一次,確定也不會是最後一次,但每次腦海中的想法總會有千絲萬縷的差別。依稀記得第一次動手作研發框架,總想憑藉這本身的能力力挽狂瀾,爲這個世界的改變能作點貢獻,但事實老是那麼的無情。當我捲起袖子管,徒手寫了無數的代碼、設計模式、工具類等等之後,卻發現我引覺得豪的優秀做品缺無人問津,Every body仍是按照本身的習慣該幹嗎就幹嗎,世界仍是保持着原樣,地球仍是那樣的在自轉着。總結了那麼多的歷史經驗,我準備在儘可能不改變的你們開發習慣的前提下,來完成本開源項目。簡單說我不是什麼發明家,我只是代碼的搬運工。html
JFDF介紹
JFDF的全稱是JAVA Fast Development Framework,即JAVA快速開發框架。前端
JFDF快速構建應用系統: JFDF能夠幫助你們快速投入到web項目的開發當中,從而避免了許多程序開發初期階段沒必要要的麻煩,諸如各類開源技術的整合、開發規範、項目結構、訪問權限控制、用戶角色管理、系統菜單管理、必要數據的初始化等等。相信每個獨立研發過產品的攻城獅來講,都經歷過以上的這些工做,繁瑣、枯燥、乏味,天天伴隨着的是數不清的調試和問題以及有兼容性錯誤,長此以往讓咱們不得不懷疑人生,經常認爲本身已然成爲了一個問題青年。總之,JFDF創建的初衷是想可以幫助你迅速構建起你的業務系統,讓每一位開發人員的視角聚焦在業務功能上,從而避免沒必要要的麻煩。
JFDF是一套嚴格的開發規範: 曾幾什麼時候的我,初出茅廬涉世未深。我顯然不是什麼明星學霸也不是嘴裏喊着金鑰匙出生的明日之星,犯過全部程序猿所犯過的全部錯誤,也經歷過每一位新人程序猿的驚慌失措。有時爲了緬懷過去,會不經意間翻開曾經年少時作過的項目,看着一坨坨的代碼片斷,滿目瘡痍,不忍直視。可能系統沒有崩潰是上天對個人眷顧,可是讓我再去拾起它繼續後面的工做那絕對是打死我一百個不肯意。然而,本着本身的一份執着,在歷史的某個時間點上,開始對本身過去犯過的過錯進行總結,簡單說好的項目必需要有嚴格的管理規範,逼格高一點的說法就是,「要讓你的代碼會說話」,可能這也就是所謂的Code as data。固然,歸根結底好的開發規範能幫助咱們提高咱們的項目質量、確保項目總體的可維護性,等等等等(此處省略一萬字...)。這也是我作這個開源項目的另外一個初衷。
JFDF能幫咱們提高工做效率: 記得曾經的面試常常會遇到這麼一些問題:你之前的團隊有多少人?你最多負責過幾我的的團隊?你能管理幾十人的團隊嗎?等等等等。。這些問題讓我不得不懷疑,咱們日以繼夜,年復一年不斷的努力工做、努力學習,咱們所積累的知識和學識僅僅是爲了面對這麼一個以量取勝的數字遊戲嗎?顯然不是。我覺問題的根本仍是咱們應該怎麼樣來提升咱們的工做效率。而後聚焦到程序員這個職業上就是,咱們怎麼樣提升咱們的研發效率。不知從什麼時候開始,咱們國內養成了這樣一種習慣,即所謂的先後分離,暫且無論是真分仍是假分,反正就是先後分離。固然,概念的本質是美好的,但我相信每一位實際操做過的攻城獅確定遇到了各類對接的煩惱,輕則謾罵撕逼、重則拳腳相加,讓程序猿這麼一個老實本分的職業披上了一層危險色彩。固然,回到如何提高研發效率這個課題上來講的話,這是一門科學、一門學科,會有各類各樣的權威解釋,然而,做爲我片面的認爲,全棧就是提高產品研發效率的一種方式。正所謂你說服不了別人,可是你能夠輕易的說服你本身。當你一我的面對全棧的全部問題,也沒有了其餘讓你說服的人,那順其天然的你只能說服你本身了。然而,JFDF正是這樣一套全棧框架。(ps:關於全棧提高效率的話題,這裏再次強調,只是表明我的片面的理解)。
JFDF將來的暢想: 今天是2018年1月份,在我用了一個多月的閒暇時間的努力後,JFDF的1.0.0版本終於能夠見天日了。固然,對於這樣一個初生的「嬰兒」來講目前的功能還很薄弱,可是正是這樣一個初生的「嬰兒」,她將來的發展潛力也是無限的。她就比如是平行時空中的一個奇點,會迎來屬於她本身的大爆炸,從而孕育出宇宙和生命。將來我但願有更多的業務應用基於JFDF來構建,同時在構建的過程當中不斷的反饋不斷完善,也爲了咱們的開源事業盡本身的一份微薄之力。
做者
甜心的超級奶爸 13482477@qq.com (我是一名程序猿,我爲程序猿代言!!!)
JFDF當前的主要功能
系統必要數據的初始化: JFDF內置了一個XML的配置文件,首次運行系統時,只需寫入配置便可完成全部的數據初始化工做。
系統登陸:java
系統首頁:mysql
用戶管理:
角色管理:
菜單管理:
資源管理:
必要的依賴
做爲一名Spring社區的一名死忠粉,JFDF的核心技術也主要都是圍繞着以Spring技術來構建的。jquery
前端技術
依賴管理 Bower
核心技術 jquery 3.2.1 爲了上手方便,前端核心技術採用jquery直接操做DOM樹的方式,簡單粗暴,堪稱暴力美學。固然後續我會逐步退出Angular、Vue、React的版本。
Bootstrap 3.3.7
頁面樣式 Admin-lte 3.2.1
樹 zTree 3.5.29
表單驗證 formvalidation.io 0.0.3
數據表格 bootstrap-table 1.11.1
過分效果 jquery-loading 1.2.0
提示框 sweetalert 2.0.7
圖形報表 flotjs morrisjs
後端技術
JDK版本 JDK版本必須>=1.8,多是做爲處女座的程序員的天性使然,我對於程序代碼的要求仍是有潔癖的,能簡潔的儘可能簡潔,能少寫一行的毫不會寫第二行。因此過多的依賴了JDK1.8裏面的新特性。
依賴管理 Apache Maven 3.5.0
數據庫 MSQL 5.7.17,反正我是在這個版本下開發的,其它版本你們可作嘗試。
啓動方式 Spring Boot
持久化層 Spring JPA
系統權限 Spring Security
模板引擎 Freemark 爲了避免依賴與容器,保證項目的獨立啓動,且因爲Volicty的中止維護以及Thymeleaf的不友好,因此選擇了Freemarker
接口文檔 Springfox & Swagger2
數據校驗 Spring Validation
Json序列化 Jackson Json
數據庫鏈接池 Tomcat Jdbc
還有許多就不一一列舉了。。。
JFDF目錄結構
JDFD採用標準的Maven構建,目錄結構也是標準的Maven項目結構。
猶豫內容比較多,這裏我羅列了一些項目主要文件的目錄結構,經供參考。git
JFDF/ /**系統更目錄**/
├──assembly/
| └──bin.xml /**打包配置文件**/
├──screen/ /**系統截圖**/
├──src/
| ├──main/ /**源代碼目錄**/
| | ├──java/ /**java源代碼**/
| | | ├──com.jhonelee.jfdf.Application.java /**項目啓動文件**/
| | | └──com.jhonelee.jfdf.conf.** /**Java config**/
| | └──resource/
| | ├──public/ /**靜態資源目錄**/
| | ├──templates/ /**freemark模板文件**/
| | ├──application.preperties /**spring boot配置文件**/
| | ├──messages.preperties /**本地化文件**/
| | └──resource.xml /**系統初始化文件**/
| └──test/ /**單元測試代碼目錄**/
├──target/ /**編譯後的可執行文件**/
├──.gitingore /**git的ingore文件**/
├──pom.xml /**maven配置文件**/
└──README.md
JFDF配置說明
數據庫配置
因爲JFDF的數據持久化層採用了Spring JPA(關於JPA的使用,請自行翻閱相關資料,這裏不作贅述。),那麼咱們能夠很方便的在系統初始化的時候,根據咱們定義的業務實體類自行建立數據庫表、關聯表、主鍵、外檢、索引等。這種方便的操做徹底符合我這種懶人的習慣。程序員
默認數據庫配置web
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jfdf?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.tomcat.max-active=100
spring.datasource.tomcat.initial-size=4
spring.datasource.tomcat.max-idle=10
spring.datasource.tomcat.min-idle=10
spring.datasource.tomcat.jdbc-interceptors=ConnectionState;StatementFinalizer;StatementDecoratorInterceptor;ResetAbandonedTimer;SlowQueryReport(threshold=500);SlowQueryReportJmx(notifyPool=false)
spring.datasource.tomcat.validation-query=select CURRENT_USER
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.default-auto-commit=false
能夠在application.properties中修改。面試
初始化配置文件
resource.xml JFDF提供了一個系統必要數據的初始化文件,包括系統訪問資源初始化和系統菜單的初始化。JFDF在首次啓動時會讀解析resource.xml,將相關配置數據載入到系統中。內容以下:spring
<resource name="JFDF" code="JFDF" type="SYSTEM" iconType="ICON" iconPath="fa-sitemap">
<resource name="首頁" code="index" type="MENU" url="/index/page" httpMethod="GET" iconType="ICON" iconPath="fa-dashboard">
<resource name="首頁頁面" code="index_page" type="RESOURCE" url="/index/page" httpMethod="GET" />
</resource>
<resource name="系統管理" code="system_management" type="MENU" httpMethod="GET" iconType="ICON" iconPath="fa-cog">
<resource name="用戶管理" code="user_management" type="MENU" url="/user/page" httpMethod="GET" iconType="ICON" iconPath="fa-user">
<resource name="用戶頁面" code="user_page" type="RESOURCE" url="/user/page" httpMethod="GET" />
<resource name="用戶新增" code="user_create" type="RESOURCE" url="/user" httpMethod="POST" />
<resource name="用戶詳情" code="user_read" type="RESOURCE" url="/user/{id}" httpMethod="GET" />
<resource name="用戶編輯" code="user_update" type="RESOURCE" url="/user/{id}" httpMethod="PUT" />
<resource name="用戶刪除" code="user_delete" type="RESOURCE" url="/user/{id}" httpMethod="DELETE" />
<resource name="用戶查詢" code="user_find" type="RESOURCE" url="/users" httpMethod="GET" />
<resource name="用戶校驗" code="user_validation" type="RESOURCE" url="/user/validation" httpMethod="GET" />
<resource name="用戶角色查詢校驗" code="user_roles_find" type="RESOURCE" url="/roles" httpMethod="GET" />
</resource>
<resource name="角色管理" code="role_management" type="MENU" url="/role/page" httpMethod="GET" iconType="ICON" iconPath="fa-group">
<resource name="角色頁面" code="role_page" type="RESOURCE" url="/role/page" httpMethod="GET" />
<resource name="角色新增" code="role_create" type="RESOURCE" url="/role" httpMethod="POST" />
<resource name="角色詳情" code="role_read" type="RESOURCE" url="/role/{id}" httpMethod="GET" />
<resource name="角色編輯" code="role_update" type="RESOURCE" url="/role/{id}" httpMethod="PUT" />
<resource name="角色刪除" code="role_delete" type="RESOURCE" url="/role/{id}" httpMethod="DELETE" />
<resource name="角色查詢" code="role_find" type="RESOURCE" url="/roles" httpMethod="GET" />
<resource name="角色校驗" code="role_validation" type="RESOURCE" url="/role/validation" httpMethod="GET" />
<resource name="角色資源數加載" code="role_menu_load" type="RESOURCE" url="/role/menu/children" httpMethod="GET" />
<resource name="角色受權" code="role_menu_load" type="RESOURCE" url="/role/{roleId}/resource" httpMethod="PUT" />
</resource>
<resource name="菜單管理" code="menu_management" type="MENU" url="/menu/page" httpMethod="GET" iconType="ICON" iconPath="fa-bars">
<resource name="菜單頁面" code="menu_page" type="RESOURCE" url="/menu/page" httpMethod="GET" />
<resource name="菜單加載" code="menu_child_load" type="RESOURCE" url="/menu/children" httpMethod="GET" />
<resource name="菜單新增" code="menu_create" type="RESOURCE" url="/menu" httpMethod="POST" />
<resource name="菜單詳情" code="menu_read" type="RESOURCE" url="/menu/{id}" httpMethod="GET" />
<resource name="菜單編輯" code="menu_update" type="RESOURCE" url="/menu/{id}" httpMethod="PUT" />
<resource name="菜單刪除" code="menu_delete" type="RESOURCE" url="/menu/{id}" httpMethod="DELETE" />
<resource name="菜單查詢" code="menu_find" type="RESOURCE" url="/menus" httpMethod="GET" />
<resource name="已選中資源查詢" code="menu_find" type="RESOURCE" url="/menu/{menuId}/selectedMenus" httpMethod="GET" />
<resource name="資源更新" code="menu_resource_update" type="RESOURCE" url="/menu/{menuId}/selectedMenus" httpMethod="PUT" />
</resource>
<resource name="資源管理" code="resource_management" type="MENU" url="/resource/page" httpMethod="GET" iconType="ICON" iconPath="fa-tree">
<resource name="資源頁面" code="resource_page" type="RESOURCE" url="/resource/page" httpMethod="GET" />
<resource name="資源校驗" code="resource_validation" type="RESOURCE" url="/resource/validation" httpMethod="GET" />
<resource name="資源新增" code="resource_create" type="RESOURCE" url="/resource" httpMethod="POST" />
<resource name="資源詳情" code="resource_read" type="RESOURCE" url="/resource/{id}" httpMethod="GET" />
<resource name="資源編輯" code="resource_update" type="RESOURCE" url="/resource/{id}" httpMethod="PUT" />
<resource name="資源刪除" code="resource_delete" type="RESOURCE" url="/resource/{id}" httpMethod="DELETE" />
<resource name="資源查詢" code="resource_find" type="RESOURCE" url="/resources" httpMethod="GET" />
</resource>
<resource name="權限管理" code="authority_management" type="MENU" url="/authority/page" httpMethod="GET" iconType="ICON" iconPath="fa-user-secret">
<resource name="權限頁面" code="authority_page" type="RESOURCE" url="/authority/page" httpMethod="GET" />
<resource name="權限查詢" code="authority_find" type="RESOURCE" url="/authorities" httpMethod="GET" />
</resource>
</resource>
</resource>
注意這裏的type屬性,type=SYSTEM|MENU|RESOURCE,SYSTEM表明系統,MENU表明導航菜單,RESOURCE表明訪問資源即系統功能。固然有人可能會問這裏爲何會引入SYSTEM的概念,我是爲了後面OATH2的開發作準備。
默認的系統管理員帳號
系統初始化成功後會提供一個默認的管理員
用戶名:admin
密碼:password
該帳號擁有系統中的最高權限,能夠訪問全部功能。另外,如需更多其它帳號,請使用系統功能進行添加。
JFDF開發手冊
JFDF的半先後分離模式
要說JFDF的開發模式,其實在我開始這個項目以前就一直在考慮,是採用先後分離呢,仍是採用mvc,是採用MVC呢,仍是採用先後分離,我真的想了好久好久,想的腳進腦之,腦殼爆炸貌似也沒有一個很好的結果,索性不想了,先魯碼再說。若是硬是要給JDFD的開發模式定個性的話,我只能說是半先後分離模式。那什麼是半先後分離模式呢,就比如咱們平常生活中的汽車,你們都知道汽車有自動擋汽車和手動擋汽車,固然也有介於它們之間的手自一體的模式,其承載了部分手動擋的特性和自動擋的特性而造成了本身特有的模式,JFDF的半先後分離模式也是這麼一種狀況。
JFDF的頁面跳轉路由採用Srping MVC和Freemarker來實現,直觀一點來講的話,也就是導航菜單中的每個導航項即對應一個單頁面的應用(熟悉Angular的同窗應該很是熟悉什麼叫單頁面應用),這個過程採用的是Spring MVC。
當咱們進入功能頁面以後能,全部的增刪改查操做都在這一個頁面完成,沒有任何頁面刷新操做,這樣就是咱們的先後分離模式。
總的來講結合起來的話就是半先後分離模式(一個笑臉)。
JFDF功能接口
說完了頁面跳轉,接着咱們來講收系統接口。JFDF全部的數據接口都是採用標準的RESTFul接口來構建,介紹的時候咱們就提到過,好的項目必需要有好的標準,因此全部的系統接口開發必須RESTFul,必須RESTFul,必須RESTFul,重要的事情說三遍(關於什麼是RESTFul接口,本身翻閱文檔),別問我爲何那麼霸道,我有我後面的考慮,暫且保密。
接口文檔訪問地址
http://localhost:8080/swagger.html
RESTFul接口樣例
查詢接口
請求: HTTPMETHOD=GET
http://localhost:8080/[EntityName]?page=[pageNumber]&size=[sizeNumber]&[param1]=[value1]....
響應:
{
"content": {
...'json data'
},
"first": true,
"last": true,
"number": 0,
"numberOfElements": 0,
"size": 0,
"sort": {},
"totalElements": 0,
"totalPages": 0
}
功能開發N步走!
這裏咱們以用戶管理功能爲例,請注意代碼用的命名規範。
功能配置
添加功能地址在資源管理中,添加你所須要的功能訪問地址
添加到系統菜單把新增的資源添加到菜單中
功能受權爲新功能受權
建立業務實體
package com.jhonelee.jfdf.user.entity
@Entity
@Table(name = "sys_user")
public class User implements Serializable {
private static final long serialVersionUID = 6210408035778291012L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String email;
private String mobile;
private String nickname;
private Boolean active = Boolean.TRUE;
}
建立Repository
package com.jhonelee.jfdf.user.repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
建立Service
package com.jhonelee.jfdf.user.service;
@Service
public class UserService {
}
建立Dto
package com.jhonelee.jfdf.user.dto;
public class UserDto {
private Long id;
private String username;
private String password;
private String email;
private String mobile;
private String nickname;
private Boolean active;
}
這裏可能你們會有疑問,咱們能夠省去Dto,直接使用以前定義的Entity,怎麼說呢,能夠也不能夠。可是這時會有一個嚴重的問題,當使用了複雜類型的Entity後,系統啓動會報錯,陷入死循環。對於這個問題的細節,我後續會單獨開博文來分析,這裏只須要記住,數據傳輸要用Dto。
建立校驗器
package com.jhonelee.jfdf.user.validator;
@Component
public class UserDtoValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return UserDto.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidatorUtils.validateEmpty(errors, target, "username", "email", "mobile", "nickname");
ValidatorUtils.validateUnique(errors, target, User.class, "id", "username");
}
}
經過校驗器,咱們能夠把業務校驗邏輯從Controller中剝離出來。
建立Controller
package com.jhonelee.jfdf.user.controller;
@Controller
public class UserController {
}
建立頁面文件
頁面文件存放路徑
JFDF/
└──main/
└──resource/
└──templates/
└──user/
└──user.ftl
建立js文件
js文件存放路徑
JFDF/
└──main/
└──resource/
└──public/
└──js/
└──user/
└──user.js
#¥%……#¥%……#¥%……
好了,開發一個功能,差很少要建立這些文件,也確實不容易,後續我會開發一些代碼生成功能供你們使用,具體你們能夠去看代碼。
版本
當前版本 RELEASE.1.0.0
開發計劃
這裏我會大體羅列一些我後面要作的事情,可是具體的時間我不太想排,你們也別給我太多的壓力,畢竟我是一對雙胞胎女兒的老爸。但我相信個人工做效率,我會經我最大的能力爲JFDF添磚加瓦。
爲JFDF添加流程管理的能力 爲JFDF添加規則引擎 爲JFDF添加代碼生成器 爲JFDF添加表單配置功能 爲JFDF添加可視化的頁面佈局 爲JFDF添加可視化報表配置能力 將JFDF做爲微服務的中央管理平臺 將JFDF做爲大數據的管理平臺 最後 霹靂啪啦寫了那麼多,我也是很久沒寫那麼多字了。反正就這麼一個東西,但願你們會喜歡,但願你們用的好、用的爽,但願用了JFDF後工做順利,心情愉悅,天天晚上,準時下班,回家吃飯。 --------------------- 做者:甜心的超級奶爸 來源:CSDN 原文:https://blog.csdn.net/l13482477/article/details/78991710 版權聲明:本文爲博主原創文章,轉載請附上博文連接!