diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8368a --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +target/ +!.mvn/wrapper/maven-wrapper.jar + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### JRebel ### +rebel.xml + +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml diff --git a/bin/clean.bat b/bin/clean.bat new file mode 100644 index 0000000..24c0974 --- /dev/null +++ b/bin/clean.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [信息] 清理工程target生成路径。 +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean + +pause \ No newline at end of file diff --git a/bin/package.bat b/bin/package.bat new file mode 100644 index 0000000..c693ec0 --- /dev/null +++ b/bin/package.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [信息] 打包Web工程,生成war/jar包文件。 +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean package -Dmaven.test.skip=true + +pause \ No newline at end of file diff --git a/bin/run.bat b/bin/run.bat new file mode 100644 index 0000000..41efbd0 --- /dev/null +++ b/bin/run.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [信息] 使用Jar命令运行Web工程。 +echo. + +cd %~dp0 +cd ../ruoyi-admin/target + +set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -jar %JAVA_OPTS% ruoyi-admin.jar + +cd bin +pause \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c835ce0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,243 @@ + + + 4.0.0 + + cn.com.vapeshop + vapeshop + 3.8.3 + + RuoYi-Vue-MongoDB + 鑻ヤ緷绠$悊绯荤粺mongo鐗 + + + 3.8.3 + UTF-8 + UTF-8 + 1.8 + 3.1.1 + 1.21 + 3.0.0 + 2.3.2 + 1.0.0 + 2.0.8 + 6.1.6 + 2.11.0 + 1.4 + 3.2.2 + 4.1.2 + 2.3 + 0.9.1 + 4.6.1 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.5.14 + pom + import + + + + + cn.com.vapeshop + easy-mongodb-boot-starter + ${easy-mongo.version} + + + + eu.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + com.github.oshi + oshi-core + ${oshi.version} + + + + + io.springfox + springfox-boot-starter + ${swagger.version} + + + io.swagger + swagger-models + + + + + + + commons-io + commons-io + ${commons.io.version} + + + + + commons-fileupload + commons-fileupload + ${commons.fileupload.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + commons-collections + commons-collections + ${commons.collections.version} + + + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson.version} + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + + com.github.penggle + kaptcha + ${kaptcha.version} + + + + + cn.com.vapeshop + vapeshop-quartz + ${vapeshop.version} + + + + + cn.com.vapeshop + vapeshop-generator + ${vapeshop.version} + + + + + cn.com.vapeshop + vapeshop-framework + ${vapeshop.version} + + + + + cn.com.vapeshop + vapeshop-system + ${vapeshop.version} + + + + + cn.com.vapeshop + vapeshop-common + ${vapeshop.version} + + + org.mongodb + mongodb-driver-sync + ${mongodb-driver.version} + + + org.mongodb + bson + ${mongodb-driver.version} + + + org.mongodb + mongodb-driver-core + ${mongodb-driver.version} + + + + + + vapeshop-admin + vapeshop-framework + vapeshop-system + vapeshop-generator + vapeshop-common + + pom + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + false + + + + + \ No newline at end of file diff --git a/sql/sys_config.json b/sql/sys_config.json new file mode 100644 index 0000000..761e325 --- /dev/null +++ b/sql/sys_config.json @@ -0,0 +1,64 @@ +{ + "RECORDS": [ + { + "config_id": 1, + "config_name": "涓绘鏋堕〉-榛樿鐨偆鏍峰紡鍚嶇О", + "config_key": "sys.index.skinName", + "config_value": "skin-blue", + "config_type": "Y", + "create_by": "admin", + "create_time": "14/7/2022 17:50:26", + "update_by": "", + "update_time": null, + "remark": "钃濊壊 skin-blue銆佺豢鑹 skin-green銆佺传鑹 skin-purple銆佺孩鑹 skin-red銆侀粍鑹 skin-yellow" + }, + { + "config_id": 2, + "config_name": "鐢ㄦ埛绠$悊-璐﹀彿鍒濆瀵嗙爜", + "config_key": "sys.user.initPassword", + "config_value": "123456", + "config_type": "Y", + "create_by": "admin", + "create_time": "14/7/2022 17:50:26", + "update_by": "", + "update_time": null, + "remark": "鍒濆鍖栧瘑鐮 123456" + }, + { + "config_id": 3, + "config_name": "涓绘鏋堕〉-渚ц竟鏍忎富棰", + "config_key": "sys.index.sideTheme", + "config_value": "theme-dark", + "config_type": "Y", + "create_by": "admin", + "create_time": "14/7/2022 17:50:26", + "update_by": "", + "update_time": null, + "remark": "娣辫壊涓婚theme-dark锛屾祬鑹蹭富棰榯heme-light" + }, + { + "config_id": 4, + "config_name": "璐﹀彿鑷姪-楠岃瘉鐮佸紑鍏", + "config_key": "sys.account.captchaOnOff", + "config_value": "true", + "config_type": "Y", + "create_by": "admin", + "create_time": "14/7/2022 17:50:26", + "update_by": "", + "update_time": null, + "remark": "鏄惁寮鍚獙璇佺爜鍔熻兘锛坱rue寮鍚紝false鍏抽棴锛" + }, + { + "config_id": 5, + "config_name": "璐﹀彿鑷姪-鏄惁寮鍚敤鎴锋敞鍐屽姛鑳", + "config_key": "sys.account.registerUser", + "config_value": "false", + "config_type": "Y", + "create_by": "admin", + "create_time": "14/7/2022 17:50:26", + "update_by": "", + "update_time": null, + "remark": "鏄惁寮鍚敞鍐岀敤鎴峰姛鑳斤紙true寮鍚紝false鍏抽棴锛" + } + ] +} \ No newline at end of file diff --git a/sql/sys_dept.json b/sql/sys_dept.json new file mode 100644 index 0000000..392cc00 --- /dev/null +++ b/sql/sys_dept.json @@ -0,0 +1,164 @@ +{ + "RECORDS": [ + { + "dept_id": 100, + "parent_id": 0, + "ancestors": "0", + "dept_name": "鑻ヤ緷绉戞妧", + "order_num": 0, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 101, + "parent_id": 100, + "ancestors": "0,100", + "dept_name": "娣卞湷鎬诲叕鍙", + "order_num": 1, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 102, + "parent_id": 100, + "ancestors": "0,100", + "dept_name": "闀挎矙鍒嗗叕鍙", + "order_num": 2, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 103, + "parent_id": 101, + "ancestors": "0,100,101", + "dept_name": "鐮斿彂閮ㄩ棬", + "order_num": 1, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 104, + "parent_id": 101, + "ancestors": "0,100,101", + "dept_name": "甯傚満閮ㄩ棬", + "order_num": 2, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 105, + "parent_id": 101, + "ancestors": "0,100,101", + "dept_name": "娴嬭瘯閮ㄩ棬", + "order_num": 3, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 106, + "parent_id": 101, + "ancestors": "0,100,101", + "dept_name": "璐㈠姟閮ㄩ棬", + "order_num": 4, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 107, + "parent_id": 101, + "ancestors": "0,100,101", + "dept_name": "杩愮淮閮ㄩ棬", + "order_num": 5, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 108, + "parent_id": 102, + "ancestors": "0,100,102", + "dept_name": "甯傚満閮ㄩ棬", + "order_num": 1, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + }, + { + "dept_id": 109, + "parent_id": 102, + "ancestors": "0,100,102", + "dept_name": "璐㈠姟閮ㄩ棬", + "order_num": 2, + "leader": "鑻ヤ緷", + "phone": "15888888888", + "email": "ry@qq.com", + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:06", + "update_by": "", + "update_time": null + } + ] +} \ No newline at end of file diff --git a/sql/sys_dict_data.json b/sql/sys_dict_data.json new file mode 100644 index 0000000..cb26d1e --- /dev/null +++ b/sql/sys_dict_data.json @@ -0,0 +1,452 @@ +{ + "RECORDS": [ + { + "dict_code": 1, + "dict_sort": 1, + "dict_label": "鐢", + "dict_value": "0", + "dict_type": "sys_user_sex", + "css_class": "", + "list_class": "", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鎬у埆鐢" + }, + { + "dict_code": 2, + "dict_sort": 2, + "dict_label": "濂", + "dict_value": "1", + "dict_type": "sys_user_sex", + "css_class": "", + "list_class": "", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鎬у埆濂" + }, + { + "dict_code": 3, + "dict_sort": 3, + "dict_label": "鏈煡", + "dict_value": "2", + "dict_type": "sys_user_sex", + "css_class": "", + "list_class": "", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鎬у埆鏈煡" + }, + { + "dict_code": 4, + "dict_sort": 1, + "dict_label": "鏄剧ず", + "dict_value": "0", + "dict_type": "sys_show_hide", + "css_class": "", + "list_class": "primary", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鏄剧ず鑿滃崟" + }, + { + "dict_code": 5, + "dict_sort": 2, + "dict_label": "闅愯棌", + "dict_value": "1", + "dict_type": "sys_show_hide", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "闅愯棌鑿滃崟" + }, + { + "dict_code": 6, + "dict_sort": 1, + "dict_label": "姝e父", + "dict_value": "0", + "dict_type": "sys_normal_disable", + "css_class": "", + "list_class": "primary", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "姝e父鐘舵" + }, + { + "dict_code": 7, + "dict_sort": 2, + "dict_label": "鍋滅敤", + "dict_value": "1", + "dict_type": "sys_normal_disable", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鍋滅敤鐘舵" + }, + { + "dict_code": 8, + "dict_sort": 1, + "dict_label": "姝e父", + "dict_value": "0", + "dict_type": "sys_job_status", + "css_class": "", + "list_class": "primary", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "姝e父鐘舵" + }, + { + "dict_code": 9, + "dict_sort": 2, + "dict_label": "鏆傚仠", + "dict_value": "1", + "dict_type": "sys_job_status", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鍋滅敤鐘舵" + }, + { + "dict_code": 10, + "dict_sort": 1, + "dict_label": "榛樿", + "dict_value": "DEFAULT", + "dict_type": "sys_job_group", + "css_class": "", + "list_class": "", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "榛樿鍒嗙粍" + }, + { + "dict_code": 11, + "dict_sort": 2, + "dict_label": "绯荤粺", + "dict_value": "SYSTEM", + "dict_type": "sys_job_group", + "css_class": "", + "list_class": "", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "绯荤粺鍒嗙粍" + }, + { + "dict_code": 12, + "dict_sort": 1, + "dict_label": "鏄", + "dict_value": "Y", + "dict_type": "sys_yes_no", + "css_class": "", + "list_class": "primary", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "绯荤粺榛樿鏄" + }, + { + "dict_code": 13, + "dict_sort": 2, + "dict_label": "鍚", + "dict_value": "N", + "dict_type": "sys_yes_no", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "绯荤粺榛樿鍚" + }, + { + "dict_code": 14, + "dict_sort": 1, + "dict_label": "閫氱煡", + "dict_value": "1", + "dict_type": "sys_notice_type", + "css_class": "", + "list_class": "warning", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "閫氱煡" + }, + { + "dict_code": 15, + "dict_sort": 2, + "dict_label": "鍏憡", + "dict_value": "2", + "dict_type": "sys_notice_type", + "css_class": "", + "list_class": "success", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鍏憡" + }, + { + "dict_code": 16, + "dict_sort": 1, + "dict_label": "姝e父", + "dict_value": "0", + "dict_type": "sys_notice_status", + "css_class": "", + "list_class": "primary", + "is_default": "Y", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "姝e父鐘舵" + }, + { + "dict_code": 17, + "dict_sort": 2, + "dict_label": "鍏抽棴", + "dict_value": "1", + "dict_type": "sys_notice_status", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鍏抽棴鐘舵" + }, + { + "dict_code": 18, + "dict_sort": 1, + "dict_label": "鏂板", + "dict_value": "1", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "info", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鏂板鎿嶄綔" + }, + { + "dict_code": 19, + "dict_sort": 2, + "dict_label": "淇敼", + "dict_value": "2", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "info", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "淇敼鎿嶄綔" + }, + { + "dict_code": 20, + "dict_sort": 3, + "dict_label": "鍒犻櫎", + "dict_value": "3", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鍒犻櫎鎿嶄綔" + }, + { + "dict_code": 21, + "dict_sort": 4, + "dict_label": "鎺堟潈", + "dict_value": "4", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "primary", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鎺堟潈鎿嶄綔" + }, + { + "dict_code": 22, + "dict_sort": 5, + "dict_label": "瀵煎嚭", + "dict_value": "5", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "warning", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "瀵煎嚭鎿嶄綔" + }, + { + "dict_code": 23, + "dict_sort": 6, + "dict_label": "瀵煎叆", + "dict_value": "6", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "warning", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "瀵煎叆鎿嶄綔" + }, + { + "dict_code": 24, + "dict_sort": 7, + "dict_label": "寮洪", + "dict_value": "7", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "寮洪鎿嶄綔" + }, + { + "dict_code": 25, + "dict_sort": 8, + "dict_label": "鐢熸垚浠g爜", + "dict_value": "8", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "warning", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鐢熸垚鎿嶄綔" + }, + { + "dict_code": 26, + "dict_sort": 9, + "dict_label": "娓呯┖鏁版嵁", + "dict_value": "9", + "dict_type": "sys_oper_type", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "娓呯┖鎿嶄綔" + }, + { + "dict_code": 27, + "dict_sort": 1, + "dict_label": "鎴愬姛", + "dict_value": "0", + "dict_type": "sys_common_status", + "css_class": "", + "list_class": "primary", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "姝e父鐘舵" + }, + { + "dict_code": 28, + "dict_sort": 2, + "dict_label": "澶辫触", + "dict_value": "1", + "dict_type": "sys_common_status", + "css_class": "", + "list_class": "danger", + "is_default": "N", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:24", + "update_by": "", + "update_time": null, + "remark": "鍋滅敤鐘舵" + } + ] +} \ No newline at end of file diff --git a/sql/sys_dict_type.json b/sql/sys_dict_type.json new file mode 100644 index 0000000..b42e723 --- /dev/null +++ b/sql/sys_dict_type.json @@ -0,0 +1,114 @@ +{ + "RECORDS": [ + { + "dict_id": 1, + "dict_name": "鐢ㄦ埛鎬у埆", + "dict_type": "sys_user_sex", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "鐢ㄦ埛鎬у埆鍒楄〃" + }, + { + "dict_id": 2, + "dict_name": "鑿滃崟鐘舵", + "dict_type": "sys_show_hide", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "鑿滃崟鐘舵佸垪琛" + }, + { + "dict_id": 3, + "dict_name": "绯荤粺寮鍏", + "dict_type": "sys_normal_disable", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "绯荤粺寮鍏冲垪琛" + }, + { + "dict_id": 4, + "dict_name": "浠诲姟鐘舵", + "dict_type": "sys_job_status", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "浠诲姟鐘舵佸垪琛" + }, + { + "dict_id": 5, + "dict_name": "浠诲姟鍒嗙粍", + "dict_type": "sys_job_group", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "浠诲姟鍒嗙粍鍒楄〃" + }, + { + "dict_id": 6, + "dict_name": "绯荤粺鏄惁", + "dict_type": "sys_yes_no", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "绯荤粺鏄惁鍒楄〃" + }, + { + "dict_id": 7, + "dict_name": "閫氱煡绫诲瀷", + "dict_type": "sys_notice_type", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "閫氱煡绫诲瀷鍒楄〃" + }, + { + "dict_id": 8, + "dict_name": "閫氱煡鐘舵", + "dict_type": "sys_notice_status", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "閫氱煡鐘舵佸垪琛" + }, + { + "dict_id": 9, + "dict_name": "鎿嶄綔绫诲瀷", + "dict_type": "sys_oper_type", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "鎿嶄綔绫诲瀷鍒楄〃" + }, + { + "dict_id": 10, + "dict_name": "绯荤粺鐘舵", + "dict_type": "sys_common_status", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:23", + "update_by": "", + "update_time": null, + "remark": "鐧诲綍鐘舵佸垪琛" + } + ] +} \ No newline at end of file diff --git a/sql/sys_job.json b/sql/sys_job.json new file mode 100644 index 0000000..b1b24c9 --- /dev/null +++ b/sql/sys_job.json @@ -0,0 +1,49 @@ +{ + "RECORDS": [ + { + "job_id": 1, + "job_name": "绯荤粺榛樿锛堟棤鍙傦級", + "job_group": "DEFAULT", + "invoke_target": "ryTask.ryNoParams", + "cron_expression": "0/10 * * * * ?", + "misfire_policy": "3", + "concurrent": "1", + "status": "1", + "create_by": "admin", + "create_time": "14/7/2022 17:50:30", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "job_id": 2, + "job_name": "绯荤粺榛樿锛堟湁鍙傦級", + "job_group": "DEFAULT", + "invoke_target": "ryTask.ryParams('ry')", + "cron_expression": "0/15 * * * * ?", + "misfire_policy": "3", + "concurrent": "1", + "status": "1", + "create_by": "admin", + "create_time": "14/7/2022 17:50:30", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "job_id": 3, + "job_name": "绯荤粺榛樿锛堝鍙傦級", + "job_group": "DEFAULT", + "invoke_target": "ryTask.ryMultipleParams('ry', true, 2000L, 316.50D, 100)", + "cron_expression": "0/20 * * * * ?", + "misfire_policy": "3", + "concurrent": "1", + "status": "1", + "create_by": "admin", + "create_time": "14/7/2022 17:50:30", + "update_by": "", + "update_time": null, + "remark": "" + } + ] +} \ No newline at end of file diff --git a/sql/sys_menu.json b/sql/sys_menu.json new file mode 100644 index 0000000..3296c7c --- /dev/null +++ b/sql/sys_menu.json @@ -0,0 +1,1768 @@ +{ + "RECORDS": [ + { + "menu_id": 1, + "menu_name": "绯荤粺绠$悊", + "parent_id": 0, + "order_num": 1, + "path": "system", + "component": null, + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "M", + "visible": "0", + "status": "0", + "perms": "", + "icon": "system", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "绯荤粺绠$悊鐩綍" + }, + { + "menu_id": 2, + "menu_name": "绯荤粺鐩戞帶", + "parent_id": 0, + "order_num": 2, + "path": "monitor", + "component": null, + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "M", + "visible": "0", + "status": "0", + "perms": "", + "icon": "monitor", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "绯荤粺鐩戞帶鐩綍" + }, + { + "menu_id": 3, + "menu_name": "绯荤粺宸ュ叿", + "parent_id": 0, + "order_num": 3, + "path": "tool", + "component": null, + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "M", + "visible": "0", + "status": "0", + "perms": "", + "icon": "tool", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "绯荤粺宸ュ叿鐩綍" + }, + { + "menu_id": 4, + "menu_name": "鑻ヤ緷瀹樼綉", + "parent_id": 0, + "order_num": 4, + "path": "http://ruoyi.vip", + "component": null, + "query": "", + "is_frame": 0, + "is_cache": 0, + "menu_type": "M", + "visible": "0", + "status": "0", + "perms": "", + "icon": "guide", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鑻ヤ緷瀹樼綉鍦板潃" + }, + { + "menu_id": 100, + "menu_name": "鐢ㄦ埛绠$悊", + "parent_id": 1, + "order_num": 1, + "path": "user", + "component": "system/user/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:user:list", + "icon": "user", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鐢ㄦ埛绠$悊鑿滃崟" + }, + { + "menu_id": 101, + "menu_name": "瑙掕壊绠$悊", + "parent_id": 1, + "order_num": 2, + "path": "role", + "component": "system/role/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:role:list", + "icon": "peoples", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "瑙掕壊绠$悊鑿滃崟" + }, + { + "menu_id": 102, + "menu_name": "鑿滃崟绠$悊", + "parent_id": 1, + "order_num": 3, + "path": "menu", + "component": "system/menu/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:menu:list", + "icon": "tree-table", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鑿滃崟绠$悊鑿滃崟" + }, + { + "menu_id": 103, + "menu_name": "閮ㄩ棬绠$悊", + "parent_id": 1, + "order_num": 4, + "path": "dept", + "component": "system/dept/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:dept:list", + "icon": "tree", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "閮ㄩ棬绠$悊鑿滃崟" + }, + { + "menu_id": 104, + "menu_name": "宀椾綅绠$悊", + "parent_id": 1, + "order_num": 5, + "path": "post", + "component": "system/post/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:post:list", + "icon": "post", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "宀椾綅绠$悊鑿滃崟" + }, + { + "menu_id": 105, + "menu_name": "瀛楀吀绠$悊", + "parent_id": 1, + "order_num": 6, + "path": "dict", + "component": "system/dict/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:dict:list", + "icon": "dict", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "瀛楀吀绠$悊鑿滃崟" + }, + { + "menu_id": 106, + "menu_name": "鍙傛暟璁剧疆", + "parent_id": 1, + "order_num": 7, + "path": "config", + "component": "system/config/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:config:list", + "icon": "edit", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鍙傛暟璁剧疆鑿滃崟" + }, + { + "menu_id": 107, + "menu_name": "閫氱煡鍏憡", + "parent_id": 1, + "order_num": 8, + "path": "notice", + "component": "system/notice/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "system:notice:list", + "icon": "message", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "閫氱煡鍏憡鑿滃崟" + }, + { + "menu_id": 108, + "menu_name": "鏃ュ織绠$悊", + "parent_id": 1, + "order_num": 9, + "path": "log", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "M", + "visible": "0", + "status": "0", + "perms": "", + "icon": "log", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鏃ュ織绠$悊鑿滃崟" + }, + { + "menu_id": 109, + "menu_name": "鍦ㄧ嚎鐢ㄦ埛", + "parent_id": 2, + "order_num": 1, + "path": "online", + "component": "monitor/online/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:online:list", + "icon": "online", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鍦ㄧ嚎鐢ㄦ埛鑿滃崟" + }, + { + "menu_id": 110, + "menu_name": "瀹氭椂浠诲姟", + "parent_id": 2, + "order_num": 2, + "path": "job", + "component": "monitor/job/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:job:list", + "icon": "job", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "瀹氭椂浠诲姟鑿滃崟" + }, + { + "menu_id": 111, + "menu_name": "鏁版嵁鐩戞帶", + "parent_id": 2, + "order_num": 3, + "path": "druid", + "component": "monitor/druid/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:druid:list", + "icon": "druid", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鏁版嵁鐩戞帶鑿滃崟" + }, + { + "menu_id": 112, + "menu_name": "鏈嶅姟鐩戞帶", + "parent_id": 2, + "order_num": 4, + "path": "server", + "component": "monitor/server/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:server:list", + "icon": "server", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鏈嶅姟鐩戞帶鑿滃崟" + }, + { + "menu_id": 113, + "menu_name": "缂撳瓨鐩戞帶", + "parent_id": 2, + "order_num": 5, + "path": "cache", + "component": "monitor/cache/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:cache:list", + "icon": "redis", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "缂撳瓨鐩戞帶鑿滃崟" + }, + { + "menu_id": 114, + "menu_name": "缂撳瓨鍒楄〃", + "parent_id": 2, + "order_num": 6, + "path": "cacheList", + "component": "monitor/cache/list", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:cache:list", + "icon": "redis-list", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "缂撳瓨鍒楄〃鑿滃崟" + }, + { + "menu_id": 115, + "menu_name": "琛ㄥ崟鏋勫缓", + "parent_id": 3, + "order_num": 1, + "path": "build", + "component": "tool/build/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "tool:build:list", + "icon": "build", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "琛ㄥ崟鏋勫缓鑿滃崟" + }, + { + "menu_id": 116, + "menu_name": "浠g爜鐢熸垚", + "parent_id": 3, + "order_num": 2, + "path": "gen", + "component": "tool/gen/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "tool:gen:list", + "icon": "code", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "浠g爜鐢熸垚鑿滃崟" + }, + { + "menu_id": 117, + "menu_name": "绯荤粺鎺ュ彛", + "parent_id": 3, + "order_num": 3, + "path": "swagger", + "component": "tool/swagger/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "tool:swagger:list", + "icon": "swagger", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "绯荤粺鎺ュ彛鑿滃崟" + }, + { + "menu_id": 500, + "menu_name": "鎿嶄綔鏃ュ織", + "parent_id": 108, + "order_num": 1, + "path": "operlog", + "component": "monitor/operlog/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:operlog:list", + "icon": "form", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鎿嶄綔鏃ュ織鑿滃崟" + }, + { + "menu_id": 501, + "menu_name": "鐧诲綍鏃ュ織", + "parent_id": 108, + "order_num": 2, + "path": "logininfor", + "component": "monitor/logininfor/index", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "C", + "visible": "0", + "status": "0", + "perms": "monitor:logininfor:list", + "icon": "logininfor", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "鐧诲綍鏃ュ織鑿滃崟" + }, + { + "menu_id": 1000, + "menu_name": "鐢ㄦ埛鏌ヨ", + "parent_id": 100, + "order_num": 1, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:user:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1001, + "menu_name": "鐢ㄦ埛鏂板", + "parent_id": 100, + "order_num": 2, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:user:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1002, + "menu_name": "鐢ㄦ埛淇敼", + "parent_id": 100, + "order_num": 3, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:user:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1003, + "menu_name": "鐢ㄦ埛鍒犻櫎", + "parent_id": 100, + "order_num": 4, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:user:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1004, + "menu_name": "鐢ㄦ埛瀵煎嚭", + "parent_id": 100, + "order_num": 5, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:user:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1005, + "menu_name": "鐢ㄦ埛瀵煎叆", + "parent_id": 100, + "order_num": 6, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:user:import", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1006, + "menu_name": "閲嶇疆瀵嗙爜", + "parent_id": 100, + "order_num": 7, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:user:resetPwd", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1007, + "menu_name": "瑙掕壊鏌ヨ", + "parent_id": 101, + "order_num": 1, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:role:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1008, + "menu_name": "瑙掕壊鏂板", + "parent_id": 101, + "order_num": 2, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:role:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1009, + "menu_name": "瑙掕壊淇敼", + "parent_id": 101, + "order_num": 3, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:role:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1010, + "menu_name": "瑙掕壊鍒犻櫎", + "parent_id": 101, + "order_num": 4, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:role:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1011, + "menu_name": "瑙掕壊瀵煎嚭", + "parent_id": 101, + "order_num": 5, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:role:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1012, + "menu_name": "鑿滃崟鏌ヨ", + "parent_id": 102, + "order_num": 1, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:menu:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1013, + "menu_name": "鑿滃崟鏂板", + "parent_id": 102, + "order_num": 2, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:menu:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1014, + "menu_name": "鑿滃崟淇敼", + "parent_id": 102, + "order_num": 3, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:menu:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1015, + "menu_name": "鑿滃崟鍒犻櫎", + "parent_id": 102, + "order_num": 4, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:menu:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1016, + "menu_name": "閮ㄩ棬鏌ヨ", + "parent_id": 103, + "order_num": 1, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dept:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1017, + "menu_name": "閮ㄩ棬鏂板", + "parent_id": 103, + "order_num": 2, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dept:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1018, + "menu_name": "閮ㄩ棬淇敼", + "parent_id": 103, + "order_num": 3, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dept:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1019, + "menu_name": "閮ㄩ棬鍒犻櫎", + "parent_id": 103, + "order_num": 4, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dept:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1020, + "menu_name": "宀椾綅鏌ヨ", + "parent_id": 104, + "order_num": 1, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:post:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1021, + "menu_name": "宀椾綅鏂板", + "parent_id": 104, + "order_num": 2, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:post:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1022, + "menu_name": "宀椾綅淇敼", + "parent_id": 104, + "order_num": 3, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:post:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1023, + "menu_name": "宀椾綅鍒犻櫎", + "parent_id": 104, + "order_num": 4, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:post:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1024, + "menu_name": "宀椾綅瀵煎嚭", + "parent_id": 104, + "order_num": 5, + "path": "", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:post:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1025, + "menu_name": "瀛楀吀鏌ヨ", + "parent_id": 105, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dict:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1026, + "menu_name": "瀛楀吀鏂板", + "parent_id": 105, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dict:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1027, + "menu_name": "瀛楀吀淇敼", + "parent_id": 105, + "order_num": 3, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dict:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1028, + "menu_name": "瀛楀吀鍒犻櫎", + "parent_id": 105, + "order_num": 4, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dict:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1029, + "menu_name": "瀛楀吀瀵煎嚭", + "parent_id": 105, + "order_num": 5, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:dict:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1030, + "menu_name": "鍙傛暟鏌ヨ", + "parent_id": 106, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:config:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1031, + "menu_name": "鍙傛暟鏂板", + "parent_id": 106, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:config:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1032, + "menu_name": "鍙傛暟淇敼", + "parent_id": 106, + "order_num": 3, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:config:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1033, + "menu_name": "鍙傛暟鍒犻櫎", + "parent_id": 106, + "order_num": 4, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:config:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1034, + "menu_name": "鍙傛暟瀵煎嚭", + "parent_id": 106, + "order_num": 5, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:config:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1035, + "menu_name": "鍏憡鏌ヨ", + "parent_id": 107, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:notice:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1036, + "menu_name": "鍏憡鏂板", + "parent_id": 107, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:notice:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1037, + "menu_name": "鍏憡淇敼", + "parent_id": 107, + "order_num": 3, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:notice:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1038, + "menu_name": "鍏憡鍒犻櫎", + "parent_id": 107, + "order_num": 4, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "system:notice:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1039, + "menu_name": "鎿嶄綔鏌ヨ", + "parent_id": 500, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:operlog:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1040, + "menu_name": "鎿嶄綔鍒犻櫎", + "parent_id": 500, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:operlog:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1041, + "menu_name": "鏃ュ織瀵煎嚭", + "parent_id": 500, + "order_num": 4, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:operlog:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1042, + "menu_name": "鐧诲綍鏌ヨ", + "parent_id": 501, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:logininfor:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1043, + "menu_name": "鐧诲綍鍒犻櫎", + "parent_id": 501, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:logininfor:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1044, + "menu_name": "鏃ュ織瀵煎嚭", + "parent_id": 501, + "order_num": 3, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:logininfor:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1045, + "menu_name": "鍦ㄧ嚎鏌ヨ", + "parent_id": 109, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:online:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1046, + "menu_name": "鎵归噺寮洪", + "parent_id": 109, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:online:batchLogout", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1047, + "menu_name": "鍗曟潯寮洪", + "parent_id": 109, + "order_num": 3, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:online:forceLogout", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1048, + "menu_name": "浠诲姟鏌ヨ", + "parent_id": 110, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:job:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1049, + "menu_name": "浠诲姟鏂板", + "parent_id": 110, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:job:add", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1050, + "menu_name": "浠诲姟淇敼", + "parent_id": 110, + "order_num": 3, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:job:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1051, + "menu_name": "浠诲姟鍒犻櫎", + "parent_id": 110, + "order_num": 4, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:job:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1052, + "menu_name": "鐘舵佷慨鏀", + "parent_id": 110, + "order_num": 5, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:job:changeStatus", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1053, + "menu_name": "浠诲姟瀵煎嚭", + "parent_id": 110, + "order_num": 7, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "monitor:job:export", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1054, + "menu_name": "鐢熸垚鏌ヨ", + "parent_id": 115, + "order_num": 1, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "tool:gen:query", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1055, + "menu_name": "鐢熸垚淇敼", + "parent_id": 115, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "tool:gen:edit", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1056, + "menu_name": "鐢熸垚鍒犻櫎", + "parent_id": 115, + "order_num": 3, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "tool:gen:remove", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1057, + "menu_name": "瀵煎叆浠g爜", + "parent_id": 115, + "order_num": 2, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "tool:gen:import", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1058, + "menu_name": "棰勮浠g爜", + "parent_id": 115, + "order_num": 4, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "tool:gen:preview", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "menu_id": 1059, + "menu_name": "鐢熸垚浠g爜", + "parent_id": 115, + "order_num": 5, + "path": "#", + "component": "", + "query": "", + "is_frame": 1, + "is_cache": 0, + "menu_type": "F", + "visible": "0", + "status": "0", + "perms": "tool:gen:code", + "icon": "#", + "create_by": "admin", + "create_time": "14/7/2022 17:50:12", + "update_by": "", + "update_time": null, + "remark": "" + } + ] +} \ No newline at end of file diff --git a/sql/sys_notice.json b/sql/sys_notice.json new file mode 100644 index 0000000..f34103a --- /dev/null +++ b/sql/sys_notice.json @@ -0,0 +1,28 @@ +{ + "RECORDS": [ + { + "notice_id": 1, + "notice_title": "娓╅Θ鎻愰啋锛2018-07-01 鑻ヤ緷鏂扮増鏈彂甯冨暒", + "notice_type": "2", + "notice_content": "5paw54mI5pys5YaF5a65", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:33", + "update_by": "", + "update_time": null, + "remark": "绠$悊鍛" + }, + { + "notice_id": 2, + "notice_title": "缁存姢閫氱煡锛2018-07-01 鑻ヤ緷绯荤粺鍑屾櫒缁存姢", + "notice_type": "1", + "notice_content": "57u05oqk5YaF5a65", + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:33", + "update_by": "", + "update_time": null, + "remark": "绠$悊鍛" + } + ] +} \ No newline at end of file diff --git a/sql/sys_post.json b/sql/sys_post.json new file mode 100644 index 0000000..0ff8115 --- /dev/null +++ b/sql/sys_post.json @@ -0,0 +1,52 @@ +{ + "RECORDS": [ + { + "post_id": 1, + "post_code": "ceo", + "post_name": "钁d簨闀", + "post_sort": 1, + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:09", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "post_id": 2, + "post_code": "se", + "post_name": "椤圭洰缁忕悊", + "post_sort": 2, + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:09", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "post_id": 3, + "post_code": "hr", + "post_name": "浜哄姏璧勬簮", + "post_sort": 3, + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:09", + "update_by": "", + "update_time": null, + "remark": "" + }, + { + "post_id": 4, + "post_code": "user", + "post_name": "鏅氬憳宸", + "post_sort": 4, + "status": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:09", + "update_by": "", + "update_time": null, + "remark": "" + } + ] +} \ No newline at end of file diff --git a/sql/sys_role.json b/sql/sys_role.json new file mode 100644 index 0000000..f247707 --- /dev/null +++ b/sql/sys_role.json @@ -0,0 +1,36 @@ +{ + "RECORDS": [ + { + "role_id": 1, + "role_name": "瓒呯骇绠$悊鍛", + "role_key": "admin", + "role_sort": 1, + "data_scope": "1", + "menu_check_strictly": 1, + "dept_check_strictly": 1, + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:11", + "update_by": "", + "update_time": null, + "remark": "瓒呯骇绠$悊鍛" + }, + { + "role_id": 2, + "role_name": "鏅氳鑹", + "role_key": "common", + "role_sort": 2, + "data_scope": "2", + "menu_check_strictly": 1, + "dept_check_strictly": 1, + "status": "0", + "del_flag": "0", + "create_by": "admin", + "create_time": "14/7/2022 17:50:11", + "update_by": "", + "update_time": null, + "remark": "鏅氳鑹" + } + ] +} \ No newline at end of file diff --git a/sql/sys_role_dept.json b/sql/sys_role_dept.json new file mode 100644 index 0000000..e8fb587 --- /dev/null +++ b/sql/sys_role_dept.json @@ -0,0 +1,16 @@ +{ + "RECORDS": [ + { + "role_id": 2, + "dept_id": 100 + }, + { + "role_id": 2, + "dept_id": 101 + }, + { + "role_id": 2, + "dept_id": 105 + } + ] +} \ No newline at end of file diff --git a/sql/sys_role_menu.json b/sql/sys_role_menu.json new file mode 100644 index 0000000..9d39be2 --- /dev/null +++ b/sql/sys_role_menu.json @@ -0,0 +1,340 @@ +{ + "RECORDS": [ + { + "role_id": 2, + "menu_id": 1 + }, + { + "role_id": 2, + "menu_id": 2 + }, + { + "role_id": 2, + "menu_id": 3 + }, + { + "role_id": 2, + "menu_id": 4 + }, + { + "role_id": 2, + "menu_id": 100 + }, + { + "role_id": 2, + "menu_id": 101 + }, + { + "role_id": 2, + "menu_id": 102 + }, + { + "role_id": 2, + "menu_id": 103 + }, + { + "role_id": 2, + "menu_id": 104 + }, + { + "role_id": 2, + "menu_id": 105 + }, + { + "role_id": 2, + "menu_id": 106 + }, + { + "role_id": 2, + "menu_id": 107 + }, + { + "role_id": 2, + "menu_id": 108 + }, + { + "role_id": 2, + "menu_id": 109 + }, + { + "role_id": 2, + "menu_id": 110 + }, + { + "role_id": 2, + "menu_id": 111 + }, + { + "role_id": 2, + "menu_id": 112 + }, + { + "role_id": 2, + "menu_id": 113 + }, + { + "role_id": 2, + "menu_id": 114 + }, + { + "role_id": 2, + "menu_id": 115 + }, + { + "role_id": 2, + "menu_id": 116 + }, + { + "role_id": 2, + "menu_id": 117 + }, + { + "role_id": 2, + "menu_id": 500 + }, + { + "role_id": 2, + "menu_id": 501 + }, + { + "role_id": 2, + "menu_id": 1000 + }, + { + "role_id": 2, + "menu_id": 1001 + }, + { + "role_id": 2, + "menu_id": 1002 + }, + { + "role_id": 2, + "menu_id": 1003 + }, + { + "role_id": 2, + "menu_id": 1004 + }, + { + "role_id": 2, + "menu_id": 1005 + }, + { + "role_id": 2, + "menu_id": 1006 + }, + { + "role_id": 2, + "menu_id": 1007 + }, + { + "role_id": 2, + "menu_id": 1008 + }, + { + "role_id": 2, + "menu_id": 1009 + }, + { + "role_id": 2, + "menu_id": 1010 + }, + { + "role_id": 2, + "menu_id": 1011 + }, + { + "role_id": 2, + "menu_id": 1012 + }, + { + "role_id": 2, + "menu_id": 1013 + }, + { + "role_id": 2, + "menu_id": 1014 + }, + { + "role_id": 2, + "menu_id": 1015 + }, + { + "role_id": 2, + "menu_id": 1016 + }, + { + "role_id": 2, + "menu_id": 1017 + }, + { + "role_id": 2, + "menu_id": 1018 + }, + { + "role_id": 2, + "menu_id": 1019 + }, + { + "role_id": 2, + "menu_id": 1020 + }, + { + "role_id": 2, + "menu_id": 1021 + }, + { + "role_id": 2, + "menu_id": 1022 + }, + { + "role_id": 2, + "menu_id": 1023 + }, + { + "role_id": 2, + "menu_id": 1024 + }, + { + "role_id": 2, + "menu_id": 1025 + }, + { + "role_id": 2, + "menu_id": 1026 + }, + { + "role_id": 2, + "menu_id": 1027 + }, + { + "role_id": 2, + "menu_id": 1028 + }, + { + "role_id": 2, + "menu_id": 1029 + }, + { + "role_id": 2, + "menu_id": 1030 + }, + { + "role_id": 2, + "menu_id": 1031 + }, + { + "role_id": 2, + "menu_id": 1032 + }, + { + "role_id": 2, + "menu_id": 1033 + }, + { + "role_id": 2, + "menu_id": 1034 + }, + { + "role_id": 2, + "menu_id": 1035 + }, + { + "role_id": 2, + "menu_id": 1036 + }, + { + "role_id": 2, + "menu_id": 1037 + }, + { + "role_id": 2, + "menu_id": 1038 + }, + { + "role_id": 2, + "menu_id": 1039 + }, + { + "role_id": 2, + "menu_id": 1040 + }, + { + "role_id": 2, + "menu_id": 1041 + }, + { + "role_id": 2, + "menu_id": 1042 + }, + { + "role_id": 2, + "menu_id": 1043 + }, + { + "role_id": 2, + "menu_id": 1044 + }, + { + "role_id": 2, + "menu_id": 1045 + }, + { + "role_id": 2, + "menu_id": 1046 + }, + { + "role_id": 2, + "menu_id": 1047 + }, + { + "role_id": 2, + "menu_id": 1048 + }, + { + "role_id": 2, + "menu_id": 1049 + }, + { + "role_id": 2, + "menu_id": 1050 + }, + { + "role_id": 2, + "menu_id": 1051 + }, + { + "role_id": 2, + "menu_id": 1052 + }, + { + "role_id": 2, + "menu_id": 1053 + }, + { + "role_id": 2, + "menu_id": 1054 + }, + { + "role_id": 2, + "menu_id": 1055 + }, + { + "role_id": 2, + "menu_id": 1056 + }, + { + "role_id": 2, + "menu_id": 1057 + }, + { + "role_id": 2, + "menu_id": 1058 + }, + { + "role_id": 2, + "menu_id": 1059 + } + ] +} \ No newline at end of file diff --git a/sql/sys_user.json b/sql/sys_user.json new file mode 100644 index 0000000..6451987 --- /dev/null +++ b/sql/sys_user.json @@ -0,0 +1,46 @@ +{ + "RECORDS": [ + { + "user_id": 1, + "dept_id": 103, + "user_name": "admin", + "nick_name": "鑻ヤ緷", + "user_type": "00", + "email": "ry@163.com", + "phonenumber": "15888888888", + "sex": "1", + "avatar": "", + "password": "$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2", + "status": "0", + "del_flag": "0", + "login_ip": "127.0.0.1", + "login_date": "14/7/2022 17:50:07", + "create_by": "admin", + "create_time": "14/7/2022 17:50:07", + "update_by": "", + "update_time": null, + "remark": "绠$悊鍛" + }, + { + "user_id": 2, + "dept_id": 105, + "user_name": "ry", + "nick_name": "鑻ヤ緷", + "user_type": "00", + "email": "ry@qq.com", + "phonenumber": "15666666666", + "sex": "1", + "avatar": "", + "password": "$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2", + "status": "0", + "del_flag": "0", + "login_ip": "127.0.0.1", + "login_date": "14/7/2022 17:50:07", + "create_by": "admin", + "create_time": "14/7/2022 17:50:07", + "update_by": "", + "update_time": null, + "remark": "娴嬭瘯鍛" + } + ] +} \ No newline at end of file diff --git a/sql/sys_user_post.json b/sql/sys_user_post.json new file mode 100644 index 0000000..fd558f3 --- /dev/null +++ b/sql/sys_user_post.json @@ -0,0 +1,12 @@ +{ + "RECORDS": [ + { + "user_id": 1, + "post_id": 1 + }, + { + "user_id": 2, + "post_id": 2 + } + ] +} \ No newline at end of file diff --git a/sql/sys_user_role.json b/sql/sys_user_role.json new file mode 100644 index 0000000..e3676e7 --- /dev/null +++ b/sql/sys_user_role.json @@ -0,0 +1,12 @@ +{ + "RECORDS": [ + { + "user_id": 1, + "role_id": 1 + }, + { + "user_id": 2, + "role_id": 2 + } + ] +} \ No newline at end of file diff --git a/vapeshop-admin/pom.xml b/vapeshop-admin/pom.xml new file mode 100644 index 0000000..e9ee439 --- /dev/null +++ b/vapeshop-admin/pom.xml @@ -0,0 +1,98 @@ + + + + vapeshop + cn.com.vapeshop + 3.8.3 + + 4.0.0 + jar + vapeshop-admin + + + web鏈嶅姟鍏ュ彛 + + + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + io.springfox + springfox-boot-starter + + + + + io.swagger + swagger-models + 1.6.2 + + + + + org.mongodb + mongodb-driver-sync + + + org.mongodb + bson + + + org.mongodb + mongodb-driver-core + + + + + cn.com.vapeshop + vapeshop-framework + + + + + cn.com.vapeshop + vapeshop-generator + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.1.RELEASE + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 + + false + ${project.artifactId} + + + + ${project.artifactId} + + + \ No newline at end of file diff --git a/vapeshop-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/vapeshop-admin/src/main/java/com/ruoyi/RuoYiApplication.java new file mode 100644 index 0000000..32eb6f1 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -0,0 +1,30 @@ +package com.ruoyi; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 鍚姩绋嬪簭 + * + * @author ruoyi + */ +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +public class RuoYiApplication +{ + public static void main(String[] args) + { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(RuoYiApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 鑻ヤ緷鍚姩鎴愬姛 醿(麓凇`醿)锞 \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java b/vapeshop-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java new file mode 100644 index 0000000..6de67dc --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java @@ -0,0 +1,18 @@ +package com.ruoyi; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web瀹瑰櫒涓繘琛岄儴缃 + * + * @author ruoyi + */ +public class RuoYiServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(RuoYiApplication.class); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java new file mode 100644 index 0000000..462be8d --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -0,0 +1,87 @@ +package com.ruoyi.web.controller.common; + +import com.google.code.kaptcha.Producer; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.service.ISysConfigService; +import com.ruoyi.common.utils.sign.Base64; +import com.ruoyi.common.utils.uuid.IdUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +/** + * 楠岃瘉鐮佹搷浣滃鐞 + * + * @author ruoyi + */ +@RestController +public class CaptchaController { + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService configService; + + /** + * 鐢熸垚楠岃瘉鐮 + */ + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException { + AjaxResult ajax = AjaxResult.success(); + boolean captchaOnOff = this.configService.selectCaptchaOnOff(); + ajax.put("captchaOnOff", captchaOnOff); + if (!captchaOnOff) { + return ajax; + } + + // 淇濆瓨楠岃瘉鐮佷俊鎭 + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 鐢熸垚楠岃瘉鐮 + String captchaType = RuoYiConfig.getCaptchaType(); + if ("math".equals(captchaType)) { + String capText = this.captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = this.captchaProducerMath.createImage(capStr); + } else if ("char".equals(captchaType)) { + capStr = code = this.captchaProducer.createText(); + image = this.captchaProducer.createImage(capStr); + } + + this.redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 杞崲娴佷俊鎭啓鍑 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try { + ImageIO.write(image, "jpg", os); + } catch (IOException e) { + return AjaxResult.error(e.getMessage()); + } + + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java new file mode 100644 index 0000000..cec5006 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -0,0 +1,163 @@ +package com.ruoyi.web.controller.common; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.framework.config.ServerConfig; + +/** + * 閫氱敤璇锋眰澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/common") +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + private static final String FILE_DELIMETER = ","; + + /** + * 閫氱敤涓嬭浇璇锋眰 + * + * @param fileName 鏂囦欢鍚嶇О + * @param delete 鏄惁鍒犻櫎 + */ + @GetMapping("/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.checkAllowDownload(fileName)) + { + throw new Exception(StringUtils.format("鏂囦欢鍚嶇О({})闈炴硶锛屼笉鍏佽涓嬭浇銆 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("涓嬭浇鏂囦欢澶辫触", e); + } + } + + /** + * 閫氱敤涓婁紶璇锋眰锛堝崟涓級 + */ + @PostMapping("/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception + { + try + { + // 涓婁紶鏂囦欢璺緞 + String filePath = RuoYiConfig.getUploadPath(); + // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + ajax.put("originalFilename", file.getOriginalFilename()); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 閫氱敤涓婁紶璇锋眰锛堝涓級 + */ + @PostMapping("/uploads") + public AjaxResult uploadFiles(List files) throws Exception + { + try + { + // 涓婁紶鏂囦欢璺緞 + String filePath = RuoYiConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + for (MultipartFile file : files) + { + // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 鏈湴璧勬簮閫氱敤涓嬭浇 + */ + @GetMapping("/download/resource") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + if (!FileUtils.checkAllowDownload(resource)) + { + throw new Exception(StringUtils.format("璧勬簮鏂囦欢({})闈炴硶锛屼笉鍏佽涓嬭浇銆 ", resource)); + } + // 鏈湴璧勬簮璺緞 + String localPath = RuoYiConfig.getProfile(); + // 鏁版嵁搴撹祫婧愬湴鍧 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 涓嬭浇鍚嶇О + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } + catch (Exception e) + { + log.error("涓嬭浇鏂囦欢澶辫触", e); + } + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java new file mode 100644 index 0000000..7e65c32 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -0,0 +1,110 @@ +package com.ruoyi.web.controller.monitor; + +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysCache; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 缂撳瓨鐩戞帶 + * Author: 86631561@163.coom + * Date: 2022/7/20 17:03:17 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/20 17:03:17 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@RestController +@RequestMapping("/monitor/cache") +public class CacheController { + @Autowired + private RedisTemplate redisTemplate; + + private final static List caches = new ArrayList(); + + { + caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "鐢ㄦ埛淇℃伅")); + caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "閰嶇疆淇℃伅")); + caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "鏁版嵁瀛楀吀")); + caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "楠岃瘉鐮")); + caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "闃查噸鎻愪氦")); + caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "闄愭祦澶勭悊")); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception { + Properties info = (Properties) this.redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) this.redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = this.redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getNames") + public AjaxResult cache() { + return AjaxResult.success(caches); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getKeys/{cacheName}") + public AjaxResult getCacheKeys(@PathVariable String cacheName) { + Set cacheKyes = this.redisTemplate.keys(cacheName + "*"); + return AjaxResult.success(cacheKyes); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getValue/{cacheName}/{cacheKey}") + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) { + String cacheValue = this.redisTemplate.opsForValue().get(cacheKey); + SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); + return AjaxResult.success(sysCache); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheName/{cacheName}") + public AjaxResult clearCacheName(@PathVariable String cacheName) { + Collection cacheKeys = this.redisTemplate.keys(cacheName + "*"); + this.redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheKey/{cacheKey}") + public AjaxResult clearCacheKey(@PathVariable String cacheKey) { + this.redisTemplate.delete(cacheKey); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheAll") + public AjaxResult clearCacheAll() { + Collection cacheKeys = this.redisTemplate.keys("*"); + this.redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java new file mode 100644 index 0000000..d135018 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java @@ -0,0 +1,32 @@ +package com.ruoyi.web.controller.monitor; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.framework.web.domain.Server; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鏈嶅姟鍣ㄧ洃鎺 + * Author: 86631561@163.coom + * Date: 2022/7/20 17:03:29 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/20 17:03:29 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@RestController +@RequestMapping("/monitor/server") +public class ServerController { + @PreAuthorize("@ss.hasPermi('monitor:server:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception { + Server server = new Server(); + server.copyTo(); + return AjaxResult.success(server); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..f596c5a --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -0,0 +1,70 @@ +package com.ruoyi.web.controller.monitor; + +import com.easy.mongodb.core.biz.PageInfo; +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysLogininfor; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysLogininforService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 绯荤粺璁块棶璁板綍 + * Author: 86631561@163.coom + * Date: 2022/7/20 17:03:46 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/20 17:03:46 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController { + @Autowired + private ISysLogininforService logininforService; + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor, Integer pageNum, Integer pageSize) { + startPage(); +// List list = this.logininforService.selectLogininforList(logininfor); + PageInfo pageInfo = this.logininforService.page(Wraps.lbQ(logininfor), pageNum, pageSize); + return getDataTable(pageInfo); + } + + @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysLogininfor logininfor) { + List list = this.logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + util.exportExcel(response, list, "鐧诲綍鏃ュ織"); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable String[] infoIds) { + return toAjax(this.logininforService.deleteLogininforByIds(infoIds)); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() { + this.logininforService.cleanLogininfor(); + return AjaxResult.success(); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..88357bd --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -0,0 +1,70 @@ +package com.ruoyi.web.controller.monitor; + +import com.easy.mongodb.core.biz.PageInfo; +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysOperLog; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysOperLogService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鎿嶄綔鏃ュ織璁板綍 + * Author: 86631561@163.coom + * Date: 2022/7/20 17:04:00 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/20 17:04:00 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController { + @Autowired + private ISysOperLogService operLogService; + + @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog, Integer pageNum, Integer pageSize) { + startPage(); + PageInfo pageInfo = this.operLogService.page(Wraps.lbQ(operLog), pageNum, pageSize); +// List list = this.operLogService.selectOperLogList(operLog); + return getDataTable(pageInfo); + } + + @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysOperLog operLog) { + List list = this.operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + util.exportExcel(response, list, "鎿嶄綔鏃ュ織"); + } + + @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.DELETE) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable String[] operIds) { + return toAjax(this.operLogService.deleteOperLogByIds(operIds)); + } + + @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.CLEAN) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() { + this.operLogService.cleanOperLog(); + return AjaxResult.success(); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..a7b66d2 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,75 @@ +package com.ruoyi.web.controller.monitor; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUserOnline; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.service.ISysUserOnlineService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * 鍦ㄧ嚎鐢ㄦ埛鐩戞帶 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController { + @Autowired + private ISysUserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) { + Collection keys = this.redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) { + LoginUser user = this.redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { + userOnlineList.add(this.userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + } else if (StringUtils.isNotEmpty(ipaddr)) { + if (StringUtils.equals(ipaddr, user.getIpaddr())) { + userOnlineList.add(this.userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + } else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) { + if (StringUtils.equals(userName, user.getUsername())) { + userOnlineList.add(this.userOnlineService.selectOnlineByUserName(userName, user)); + } + } else { + userOnlineList.add(this.userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 寮洪鐢ㄦ埛 + */ + @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @Log(title = "鍦ㄧ嚎鐢ㄦ埛", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) { + this.redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); + return AjaxResult.success(); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java new file mode 100644 index 0000000..e1c7911 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -0,0 +1,117 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysConfig; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysConfigService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鍙傛暟閰嶇疆 淇℃伅鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController { + @Autowired + private ISysConfigService configService; + + /** + * 鑾峰彇鍙傛暟閰嶇疆鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(SysConfig config) { + startPage(); + List list = this.configService.selectConfigList(config); + return getDataTable(list); + } + + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:config:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysConfig config) { + List list = this.configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "鍙傛暟鏁版嵁"); + } + + /** + * 鏍规嵁鍙傛暟缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable String configId) { + return AjaxResult.success(this.configService.selectConfigById(configId)); + } + + /** + * 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊 + */ + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) { + return AjaxResult.success(this.configService.selectConfigByKey(configKey)); + } + + /** + * 鏂板鍙傛暟閰嶇疆 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) { + if (UserConstants.NOT_UNIQUE.equals(this.configService.checkConfigKeyUnique(config))) { + return AjaxResult.error("鏂板鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪"); + } + config.setCreateBy(getUsername()); + return toAjax(this.configService.insertConfig(config)); + } + + /** + * 淇敼鍙傛暟閰嶇疆 + */ + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysConfig config) { + if (UserConstants.NOT_UNIQUE.equals(this.configService.checkConfigKeyUnique(config))) { + return AjaxResult.error("淇敼鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪"); + } + config.setUpdateBy(getUsername()); + return toAjax(this.configService.updateConfig(config)); + } + + /** + * 鍒犻櫎鍙傛暟閰嶇疆 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable String[] configIds) { + this.configService.deleteConfigByIds(configIds); + return success(); + } + + /** + * 鍒锋柊鍙傛暟缂撳瓨 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() { + this.configService.resetConfigCache(); + return AjaxResult.success(); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java new file mode 100644 index 0000000..cc7f263 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -0,0 +1,140 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.service.ISysDeptService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Iterator; +import java.util.List; + +/** + * 閮ㄩ棬淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController { + @Autowired + private ISysDeptService deptService; + + /** + * 鑾峰彇閮ㄩ棬鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDept dept) { + List depts = this.deptService.selectDeptList(dept); + return AjaxResult.success(depts); + } + + /** + * 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級 + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) String deptId) { + List depts = this.deptService.selectDeptList(new SysDept()); + Iterator it = depts.iterator(); + while (it.hasNext()) { + SysDept d = (SysDept) it.next(); + if (deptId.equals(d.getId()) + || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) { + it.remove(); + } + } + return AjaxResult.success(depts); + } + + /** + * 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable String deptId) { + this.deptService.checkDeptDataScope(deptId); + return AjaxResult.success(this.deptService.selectDeptById(deptId)); + } + + /** + * 鑾峰彇閮ㄩ棬涓嬫媺鏍戝垪琛 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysDept dept) { + List depts = this.deptService.selectDeptList(dept); + return AjaxResult.success(this.deptService.buildDeptTreeSelect(depts)); + } + + /** + * 鍔犺浇瀵瑰簲瑙掕壊閮ㄩ棬鍒楄〃鏍 + */ + @GetMapping(value = "/roleDeptTreeselect/{roleId}") + public AjaxResult roleDeptTreeselect(@PathVariable("roleId") String roleId) { + List depts = this.deptService.selectDeptList(new SysDept()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", this.deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", this.deptService.buildDeptTreeSelect(depts)); + return ajax; + } + + /** + * 鏂板閮ㄩ棬 + */ + @PreAuthorize("@ss.hasPermi('system:dept:add')") + @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) { + if (UserConstants.NOT_UNIQUE.equals(this.deptService.checkDeptNameUnique(dept))) { + return AjaxResult.error("鏂板閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪"); + } + dept.setCreateBy(getUsername()); + return toAjax(this.deptService.insertDept(dept)); + } + + /** + * 淇敼閮ㄩ棬 + */ + @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) { + String deptId = dept.getId(); + this.deptService.checkDeptDataScope(deptId); + if (UserConstants.NOT_UNIQUE.equals(this.deptService.checkDeptNameUnique(dept))) { + return AjaxResult.error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪"); + } else if (dept.getParentId().equals(deptId)) { + return AjaxResult.error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛屼笂绾ч儴闂ㄤ笉鑳芥槸鑷繁"); + } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && this.deptService.selectNormalChildrenDeptById(deptId) > 0) { + return AjaxResult.error("璇ラ儴闂ㄥ寘鍚湭鍋滅敤鐨勫瓙閮ㄩ棬锛"); + } + dept.setUpdateBy(getUsername()); + return toAjax(this.deptService.updateDept(dept)); + } + + /** + * 鍒犻櫎閮ㄩ棬 + */ + @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable String deptId) { + if (this.deptService.hasChildByDeptId(deptId)) { + return AjaxResult.error("瀛樺湪涓嬬骇閮ㄩ棬,涓嶅厑璁稿垹闄"); + } + if (this.deptService.checkDeptExistUser(deptId)) { + return AjaxResult.error("閮ㄩ棬瀛樺湪鐢ㄦ埛,涓嶅厑璁稿垹闄"); + } + this.deptService.checkDeptDataScope(deptId); + return toAjax(this.deptService.deleteDeptById(deptId)); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java new file mode 100644 index 0000000..aff58a4 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -0,0 +1,106 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysDictDataService; +import com.ruoyi.common.core.service.ISysDictTypeService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * 鏁版嵁瀛楀吀淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController { + @Autowired + private ISysDictDataService dictDataService; + + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictData dictData) { + startPage(); + List list = this.dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) { + List list = this.dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, list, "瀛楀吀鏁版嵁"); + } + + /** + * 鏌ヨ瀛楀吀鏁版嵁璇︾粏 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable String dictCode) { + return AjaxResult.success(this.dictDataService.selectDictDataById(dictCode)); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) { + List data = this.dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) { + data = new ArrayList(); + } + return AjaxResult.success(data); + } + + /** + * 鏂板瀛楀吀绫诲瀷 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictData dict) { + dict.setCreateBy(getUsername()); + return toAjax(this.dictDataService.insertDictData(dict)); + } + + /** + * 淇敼淇濆瓨瀛楀吀绫诲瀷 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictData dict) { + dict.setUpdateBy(getUsername()); + return toAjax(this.dictDataService.updateDictData(dict)); + } + + /** + * 鍒犻櫎瀛楀吀绫诲瀷 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable String[] dictCodes) { + this.dictDataService.deleteDictDataByIds(dictCodes); + return success(); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..5af1258 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -0,0 +1,115 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysDictType; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysDictTypeService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鏁版嵁瀛楀吀淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController { + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictType dictType) { + startPage(); + List list = this.dictTypeService.selectDictTypeList(dictType); + return getDataTable(list); + } + + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictType dictType) { + List list = this.dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "瀛楀吀绫诲瀷"); + } + + /** + * 鏌ヨ瀛楀吀绫诲瀷璇︾粏 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable String dictId) { + return AjaxResult.success(this.dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 鏂板瀛楀吀绫诲瀷 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) { + if (UserConstants.NOT_UNIQUE.equals(this.dictTypeService.checkDictTypeUnique(dict))) { + return AjaxResult.error("鏂板瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪"); + } + dict.setCreateBy(getUsername()); + return toAjax(this.dictTypeService.insertDictType(dict)); + } + + /** + * 淇敼瀛楀吀绫诲瀷 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictType dict) { + if (UserConstants.NOT_UNIQUE.equals(this.dictTypeService.checkDictTypeUnique(dict))) { + return AjaxResult.error("淇敼瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪"); + } + dict.setUpdateBy(getUsername()); + return toAjax(this.dictTypeService.updateDictType(dict)); + } + + /** + * 鍒犻櫎瀛楀吀绫诲瀷 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable String[] dictIds) { + this.dictTypeService.deleteDictTypeByIds(dictIds); + return success(); + } + + /** + * 鍒锋柊瀛楀吀缂撳瓨 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() { + this.dictTypeService.resetDictCache(); + return AjaxResult.success(); + } + + /** + * 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() { + List dictTypes = this.dictTypeService.selectDictTypeAll(); + return AjaxResult.success(dictTypes); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java new file mode 100644 index 0000000..698ff91 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -0,0 +1,83 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.core.service.ISysMenuService; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.framework.web.service.SysLoginService; +import com.ruoyi.framework.web.service.SysPermissionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Set; + +/** + * 鐧诲綍楠岃瘉 + * + * @author ruoyi + */ +@RestController +public class SysLoginController { + @Autowired + private SysLoginService loginService; + + @Autowired + private ISysMenuService menuService; + + @Autowired + private SysPermissionService permissionService; + + /** + * 鐧诲綍鏂规硶 + * + * @param loginBody 鐧诲綍淇℃伅 + * @return 缁撴灉 + */ + @PostMapping("/login") + public AjaxResult login(@RequestBody LoginBody loginBody) { + AjaxResult ajax = AjaxResult.success(); + // 鐢熸垚浠ょ墝 + String token = this.loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + /** + * 鑾峰彇鐢ㄦ埛淇℃伅 + * + * @return 鐢ㄦ埛淇℃伅 + */ + @GetMapping("getInfo") + public AjaxResult getInfo() { + SysUser user = SecurityUtils.getLoginUser().getUser(); + // 瑙掕壊闆嗗悎 + Set roles = this.permissionService.getRolePermission(user); + // 鏉冮檺闆嗗悎 + Set permissions = this.permissionService.getMenuPermission(user); + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + return ajax; + } + + /** + * 鑾峰彇璺敱淇℃伅 + * + * @return 璺敱淇℃伅 + */ + @GetMapping("getRouters") + public AjaxResult getRouters() { + String id = SecurityUtils.getUserId(); + List menus = this.menuService.selectMenuTreeByUserId(id); + return AjaxResult.success(this.menuService.buildMenus(menus)); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java new file mode 100644 index 0000000..b4a734b --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -0,0 +1,118 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.core.service.ISysMenuService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 鑿滃崟淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController { + @Autowired + private ISysMenuService menuService; + + /** + * 鑾峰彇鑿滃崟鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) { + List menus = this.menuService.selectMenuList(menu, getUserId()); + return AjaxResult.success(menus); + } + + /** + * 鏍规嵁鑿滃崟缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable String menuId) { + return AjaxResult.success(this.menuService.selectMenuById(menuId)); + } + + /** + * 鑾峰彇鑿滃崟涓嬫媺鏍戝垪琛 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) { + List menus = this.menuService.selectMenuList(menu, getUserId()); + return AjaxResult.success(this.menuService.buildMenuTreeSelect(menus)); + } + + /** + * 鍔犺浇瀵瑰簲瑙掕壊鑿滃崟鍒楄〃鏍 + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") String roleId) { + List menus = this.menuService.selectMenuList(getUserId()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", this.menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", this.menuService.buildMenuTreeSelect(menus)); + return ajax; + } + + /** + * 鏂板鑿滃崟 + */ + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) { + if (UserConstants.NOT_UNIQUE.equals(this.menuService.checkMenuNameUnique(menu))) { + return AjaxResult.error("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return AjaxResult.error("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧蹇呴』浠ttp(s)://寮澶"); + } + menu.setCreateBy(getUsername()); + return toAjax(this.menuService.insertMenu(menu)); + } + + /** + * 淇敼鑿滃崟 + */ + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) { + if (UserConstants.NOT_UNIQUE.equals(this.menuService.checkMenuNameUnique(menu))) { + return AjaxResult.error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return AjaxResult.error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧蹇呴』浠ttp(s)://寮澶"); + } else if (menu.getId().equals(menu.getParentId())) { + return AjaxResult.error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屼笂绾ц彍鍗曚笉鑳介夋嫨鑷繁"); + } + menu.setUpdateBy(getUsername()); + return toAjax(this.menuService.updateMenu(menu)); + } + + /** + * 鍒犻櫎鑿滃崟 + */ + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") String menuId) { + if (this.menuService.hasChildByMenuId(menuId)) { + return AjaxResult.error("瀛樺湪瀛愯彍鍗,涓嶅厑璁稿垹闄"); + } + if (this.menuService.checkMenuExistRole(menuId)) { + return AjaxResult.error("鑿滃崟宸插垎閰,涓嶅厑璁稿垹闄"); + } + return toAjax(this.menuService.deleteMenuById(menuId)); + } +} \ No newline at end of file diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java new file mode 100644 index 0000000..36a30e3 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -0,0 +1,79 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysNotice; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysNoticeService; +import com.ruoyi.common.enums.BusinessType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 鍏憡 淇℃伅鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController { + @Autowired + private ISysNoticeService noticeService; + + /** + * 鑾峰彇閫氱煡鍏憡鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('system:notice:list')") + @GetMapping("/list") + public TableDataInfo list(SysNotice notice) { + startPage(); + List list = this.noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 鏍规嵁閫氱煡鍏憡缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('system:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable String noticeId) { + return AjaxResult.success(this.noticeService.selectNoticeById(noticeId)); + } + + /** + * 鏂板閫氱煡鍏憡 + */ + @PreAuthorize("@ss.hasPermi('system:notice:add')") + @Log(title = "閫氱煡鍏憡", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysNotice notice) { + notice.setCreateBy(getUsername()); + return toAjax(this.noticeService.insertNotice(notice)); + } + + /** + * 淇敼閫氱煡鍏憡 + */ + @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @Log(title = "閫氱煡鍏憡", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysNotice notice) { + notice.setUpdateBy(getUsername()); + return toAjax(this.noticeService.updateNotice(notice)); + } + + /** + * 鍒犻櫎閫氱煡鍏憡 + */ + @PreAuthorize("@ss.hasPermi('system:notice:remove')") + @Log(title = "閫氱煡鍏憡", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable String[] noticeIds) { + return toAjax(this.noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java new file mode 100644 index 0000000..d360c6e --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -0,0 +1,110 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysPost; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysPostService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 宀椾綅淇℃伅鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController { + @Autowired + private ISysPostService postService; + + /** + * 鑾峰彇宀椾綅鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('system:post:list')") + @GetMapping("/list") + public TableDataInfo list(SysPost post) { + startPage(); + List list = this.postService.selectPostList(post); + return getDataTable(list); + } + + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:post:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysPost post) { + List list = this.postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "宀椾綅鏁版嵁"); + } + + /** + * 鏍规嵁宀椾綅缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable String postId) { + return AjaxResult.success(this.postService.selectPostById(postId)); + } + + /** + * 鏂板宀椾綅 + */ + @PreAuthorize("@ss.hasPermi('system:post:add')") + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) { + if (UserConstants.NOT_UNIQUE.equals(this.postService.checkPostNameUnique(post))) { + return AjaxResult.error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪"); + } else if (UserConstants.NOT_UNIQUE.equals(this.postService.checkPostCodeUnique(post))) { + return AjaxResult.error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪"); + } + post.setCreateBy(getUsername()); + return toAjax(this.postService.insertPost(post)); + } + + /** + * 淇敼宀椾綅 + */ + @PreAuthorize("@ss.hasPermi('system:post:edit')") + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysPost post) { + if (UserConstants.NOT_UNIQUE.equals(this.postService.checkPostNameUnique(post))) { + return AjaxResult.error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪"); + } else if (UserConstants.NOT_UNIQUE.equals(this.postService.checkPostCodeUnique(post))) { + return AjaxResult.error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪"); + } + post.setUpdateBy(getUsername()); + return toAjax(this.postService.updatePost(post)); + } + + /** + * 鍒犻櫎宀椾綅 + */ + @PreAuthorize("@ss.hasPermi('system:post:remove')") + @Log(title = "宀椾綅绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable String[] postIds) { + return toAjax(this.postService.deletePostByIds(postIds)); + } + + /** + * 鑾峰彇宀椾綅閫夋嫨妗嗗垪琛 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() { + List posts = this.postService.selectPostAll(); + return AjaxResult.success(posts); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java new file mode 100644 index 0000000..70c8eb3 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -0,0 +1,123 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.service.ISysUserService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.MimeTypeUtils; +import com.ruoyi.framework.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * 涓汉淇℃伅 涓氬姟澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController { + @Autowired + private ISysUserService userService; + + @Autowired + private TokenService tokenService; + + /** + * 涓汉淇℃伅 + */ + @GetMapping + public AjaxResult profile() { + LoginUser loginUser = getLoginUser(); + SysUser user = loginUser.getUser(); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", this.userService.selectUserRoleGroup(loginUser.getUsername())); + ajax.put("postGroup", this.userService.selectUserPostGroup(loginUser.getUsername())); + return ajax; + } + + /** + * 淇敼鐢ㄦ埛 + */ + @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) { + LoginUser loginUser = getLoginUser(); + SysUser sysUser = loginUser.getUser(); + user.setUserName(sysUser.getUserName()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(this.userService.checkPhoneUnique(user))) { + return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪"); + } + if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(this.userService.checkEmailUnique(user))) { + return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪"); + } + user.setId(sysUser.getId()); + user.setPassword(null); + if (this.userService.updateUserProfile(user) > 0) { + // 鏇存柊缂撳瓨鐢ㄦ埛淇℃伅 + sysUser.setNickName(user.getNickName()); + sysUser.setPhonenumber(user.getPhonenumber()); + sysUser.setEmail(user.getEmail()); + sysUser.setSex(user.getSex()); + this.tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("淇敼涓汉淇℃伅寮傚父锛岃鑱旂郴绠$悊鍛"); + } + + /** + * 閲嶇疆瀵嗙爜 + */ + @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) { + LoginUser loginUser = getLoginUser(); + String userName = loginUser.getUsername(); + String password = loginUser.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) { + return AjaxResult.error("淇敼瀵嗙爜澶辫触锛屾棫瀵嗙爜閿欒"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) { + return AjaxResult.error("鏂板瘑鐮佷笉鑳戒笌鏃у瘑鐮佺浉鍚"); + } + if (this.userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) { + // 鏇存柊缂撳瓨鐢ㄦ埛瀵嗙爜 + loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + this.tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("淇敼瀵嗙爜寮傚父锛岃鑱旂郴绠$悊鍛"); + } + + /** + * 澶村儚涓婁紶 + */ + @Log(title = "鐢ㄦ埛澶村儚", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception { + if (!file.isEmpty()) { + LoginUser loginUser = getLoginUser(); + String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); + if (this.userService.updateUserAvatar(loginUser.getUsername(), avatar)) { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + // 鏇存柊缂撳瓨鐢ㄦ埛澶村儚 + loginUser.getUser().setAvatar(avatar); + this.tokenService.setLoginUser(loginUser); + return ajax; + } + } + return AjaxResult.error("涓婁紶鍥剧墖寮傚父锛岃鑱旂郴绠$悊鍛"); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java new file mode 100644 index 0000000..f275254 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -0,0 +1,35 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.common.core.service.ISysConfigService; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.service.SysRegisterService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * 娉ㄥ唽楠岃瘉 + * + * @author ruoyi + */ +@RestController +public class SysRegisterController extends BaseController { + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) { + if (!("true".equals(this.configService.selectConfigByKey("sys.account.registerUser")))) { + return error("褰撳墠绯荤粺娌℃湁寮鍚敞鍐屽姛鑳斤紒"); + } + String msg = this.registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java new file mode 100644 index 0000000..ca10718 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -0,0 +1,216 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.entity.SysUserRole; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysRoleService; +import com.ruoyi.common.core.service.ISysUserService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.framework.web.service.SysPermissionService; +import com.ruoyi.framework.web.service.TokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 瑙掕壊淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController { + @Autowired + private ISysRoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private ISysUserService userService; + + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/list") + public TableDataInfo list(SysRole role) { + startPage(); + List list = this.roleService.selectRoleList(role); + return getDataTable(list); + } + + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:role:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysRole role) { + List list = this.roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(SysRole.class); + util.exportExcel(response, list, "瑙掕壊鏁版嵁"); + } + + /** + * 鏍规嵁瑙掕壊缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable String roleId) { + this.roleService.checkRoleDataScope(roleId); + return AjaxResult.success(this.roleService.selectRoleById(roleId)); + } + + /** + * 鏂板瑙掕壊 + */ + @PreAuthorize("@ss.hasPermi('system:role:add')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) { + if (UserConstants.NOT_UNIQUE.equals(this.roleService.checkRoleNameUnique(role))) { + return AjaxResult.error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪"); + } else if (UserConstants.NOT_UNIQUE.equals(this.roleService.checkRoleKeyUnique(role))) { + return AjaxResult.error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪"); + } + role.setCreateBy(getUsername()); + return toAjax(this.roleService.insertRole(role)); + + } + + /** + * 淇敼淇濆瓨瑙掕壊 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRole role) { + this.roleService.checkRoleAllowed(role); + this.roleService.checkRoleDataScope(role.getId()); + if (UserConstants.NOT_UNIQUE.equals(this.roleService.checkRoleNameUnique(role))) { + return AjaxResult.error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪"); + } else if (UserConstants.NOT_UNIQUE.equals(this.roleService.checkRoleKeyUnique(role))) { + return AjaxResult.error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪"); + } + role.setUpdateBy(getUsername()); + + if (this.roleService.updateRole(role) > 0) { + // 鏇存柊缂撳瓨鐢ㄦ埛鏉冮檺 + LoginUser loginUser = getLoginUser(); + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) { + loginUser.setPermissions(this.permissionService.getMenuPermission(loginUser.getUser())); + loginUser.setUser(this.userService.selectUserByUserName(loginUser.getUser().getUserName())); + this.tokenService.setLoginUser(loginUser); + } + return AjaxResult.success(); + } + return AjaxResult.error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑱旂郴绠$悊鍛"); + } + + /** + * 淇敼淇濆瓨鏁版嵁鏉冮檺 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody SysRole role) { + this.roleService.checkRoleAllowed(role); + this.roleService.checkRoleDataScope(role.getId()); + return toAjax(this.roleService.authDataScope(role)); + } + + /** + * 鐘舵佷慨鏀 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRole role) { + this.roleService.checkRoleAllowed(role); + this.roleService.checkRoleDataScope(role.getId()); + role.setUpdateBy(getUsername()); + return toAjax(this.roleService.updateRoleStatus(role)); + } + + /** + * 鍒犻櫎瑙掕壊 + */ + @PreAuthorize("@ss.hasPermi('system:role:remove')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable String[] roleIds) { + return toAjax(this.roleService.deleteRoleByIds(roleIds)); + } + + /** + * 鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping("/optionselect") + public AjaxResult optionselect() { + return AjaxResult.success(this.roleService.selectRoleAll()); + } + + /** + * 鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUser user) { + startPage(); + List list = this.userService.selectAllocatedList(user); + return getDataTable(list); + } + + /** + * 鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUser user) { + startPage(); + List list = this.userService.selectUnallocatedList(user); + return getDataTable(list); + } + + /** + * 鍙栨秷鎺堟潈鐢ㄦ埛 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) { + return toAjax(this.roleService.deleteAuthUser(userRole)); + } + + /** + * 鎵归噺鍙栨秷鎺堟潈鐢ㄦ埛 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public AjaxResult cancelAuthUserAll(String roleId, String[] userIds) { + return toAjax(this.roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 鎵归噺閫夋嫨鐢ㄦ埛鎺堟潈 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public AjaxResult selectAuthUserAll(String roleId, String[] userIds) { + this.roleService.checkRoleDataScope(roleId); + return toAjax(this.roleService.insertAuthUsers(roleId, userIds)); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java new file mode 100644 index 0000000..55b5ab6 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -0,0 +1,208 @@ +package com.ruoyi.web.controller.system; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.service.ISysPostService; +import com.ruoyi.common.core.service.ISysRoleService; +import com.ruoyi.common.core.service.ISysUserService; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 鐢ㄦ埛淇℃伅 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController { + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysPostService postService; + + /** + * 鑾峰彇鐢ㄦ埛鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(SysUser user) { + startPage(); + List list = this.userService.selectUserList(user); + return getDataTable(list); + } + + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:user:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUser user) { + List list = this.userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(SysUser.class); + util.exportExcel(response, list, "鐢ㄦ埛鏁版嵁"); + } + + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil(SysUser.class); + List userList = util.importExcel(file.getInputStream()); + String operName = getUsername(); + String message = this.userService.importUser(userList, updateSupport, operName); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil(SysUser.class); + util.importTemplateExcel(response, "鐢ㄦ埛鏁版嵁"); + } + + /** + * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = {"/", "/{userId}"}) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) String userId) { + this.userService.checkUserDataScope(SecurityUtils.getUserId()); + AjaxResult ajax = AjaxResult.success(); + if (StringUtils.isNotNull(userId)) { + SysUser sysUser = this.userService.selectUserById(userId); + List roles = this.roleService.selectRoleAll(); + ajax.put("roles", sysUser.isAdmin() ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("posts", this.postService.selectPostAll()); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", this.postService.selectPostListByUserId(userId)); + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getId).collect(Collectors.toList())); + } + return ajax; + } + + /** + * 鏂板鐢ㄦ埛 + */ + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) { + if (UserConstants.NOT_UNIQUE.equals(this.userService.checkUserNameUnique(user.getUserName()))) { + return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(this.userService.checkPhoneUnique(user))) { + return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪"); + } else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(this.userService.checkEmailUnique(user))) { + return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪"); + } + user.setCreateBy(getUsername()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return toAjax(this.userService.insertUser(user)); + } + + /** + * 淇敼鐢ㄦ埛 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUser user) { + this.userService.checkUserAllowed(user); + this.userService.checkUserDataScope(user.getId()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(this.userService.checkPhoneUnique(user))) { + return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪"); + } else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(this.userService.checkEmailUnique(user))) { + return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪"); + } + user.setUpdateBy(getUsername()); + return toAjax(this.userService.updateUser(user)); + } + + /** + * 鍒犻櫎鐢ㄦ埛 + */ + @PreAuthorize("@ss.hasPermi('system:user:remove')") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable String[] userIds) { + if (ArrayUtils.contains(userIds, getUserId())) { + return error("褰撳墠鐢ㄦ埛涓嶈兘鍒犻櫎"); + } + return toAjax(this.userService.deleteUserByIds(userIds)); + } + + /** + * 閲嶇疆瀵嗙爜 + */ + @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody SysUser user) { + this.userService.checkUserAllowed(user); + this.userService.checkUserDataScope(user.getId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setUpdateBy(getUsername()); + return toAjax(this.userService.resetPwd(user)); + } + + /** + * 鐘舵佷慨鏀 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysUser user) { + this.userService.checkUserAllowed(user); + this.userService.checkUserDataScope(user.getId()); + user.setUpdateBy(getUsername()); + return toAjax(this.userService.updateUserStatus(user)); + } + + /** + * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇鎺堟潈瑙掕壊 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping("/authRole/{userId}") + public AjaxResult authRole(@PathVariable("userId") String userId) { + AjaxResult ajax = AjaxResult.success(); + SysUser user = this.userService.selectUserById(userId); + List roles = this.roleService.selectRolesByUserId(userId); + ajax.put("user", user); + ajax.put("roles", user.isAdmin() ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + return ajax; + } + + /** + * 鐢ㄦ埛鎺堟潈瑙掕壊 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public AjaxResult insertAuthRole(String userId, String[] roleIds) { + this.userService.checkUserDataScope(userId); + this.userService.insertUserAuth(userId, roleIds); + return success(); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java new file mode 100644 index 0000000..f66ca24 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java @@ -0,0 +1,24 @@ +package com.ruoyi.web.controller.tool; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.ruoyi.common.core.controller.BaseController; + +/** + * swagger 鎺ュ彛 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/tool/swagger") +public class SwaggerController extends BaseController +{ + @PreAuthorize("@ss.hasPermi('tool:swagger:view')") + @GetMapping() + public String index() + { + return redirect("/swagger-ui.html"); + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java new file mode 100644 index 0000000..39d6ef7 --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java @@ -0,0 +1,147 @@ +package com.ruoyi.web.controller.tool; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.*; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * swagger 鐢ㄦ埛娴嬭瘯鏂规硶 + * + * @author ruoyi + */ +@Api("鐢ㄦ埛淇℃伅绠$悊") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController { + private final static Map users = new LinkedHashMap(); + + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("鑾峰彇鐢ㄦ埛鍒楄〃") + @GetMapping("/list") + public R> userList() { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("鑾峰彇鐢ㄦ埛璇︾粏") + @ApiImplicitParam(name = "userId", value = "鐢ㄦ埛ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) { + if (!users.isEmpty() && users.containsKey(userId)) { + return R.ok(users.get(userId)); + } else { + return R.fail("鐢ㄦ埛涓嶅瓨鍦"); + } + } + + @ApiOperation("鏂板鐢ㄦ埛") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "鐢ㄦ埛id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "鐢ㄦ埛鍚嶇О", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "鐢ㄦ埛瀵嗙爜", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "鐢ㄦ埛鎵嬫満", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getId())) { + return R.fail("鐢ㄦ埛ID涓嶈兘涓虹┖"); + } + users.put(user.getId(), user); + return R.ok(); + } + + @ApiOperation("鏇存柊鐢ㄦ埛") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getId())) { + return R.fail("鐢ㄦ埛ID涓嶈兘涓虹┖"); + } + if (users.isEmpty() || !users.containsKey(user.getId())) { + return R.fail("鐢ㄦ埛涓嶅瓨鍦"); + } + users.remove(user.getId()); + users.put(user.getId(), user); + return R.ok(); + } + + @ApiOperation("鍒犻櫎鐢ㄦ埛淇℃伅") + @ApiImplicitParam(name = "userId", value = "鐢ㄦ埛ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) { + if (!users.isEmpty() && users.containsKey(userId)) { + users.remove(userId); + return R.ok(); + } else { + return R.fail("鐢ㄦ埛涓嶅瓨鍦"); + } + } +} + +@ApiModel(value = "UserEntity", description = "鐢ㄦ埛瀹炰綋") +class UserEntity { + @ApiModelProperty("鐢ㄦ埛ID") + private Integer userId; + + @ApiModelProperty("鐢ㄦ埛鍚嶇О") + private String username; + + @ApiModelProperty("鐢ㄦ埛瀵嗙爜") + private String password; + + @ApiModelProperty("鐢ㄦ埛鎵嬫満") + private String mobile; + + public UserEntity() { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getId() { + return this.userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getUsername() { + return this.username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMobile() { + return this.mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } +} diff --git a/vapeshop-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/vapeshop-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..ae1c3ec --- /dev/null +++ b/vapeshop-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -0,0 +1,125 @@ +package com.ruoyi.web.core.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.config.RuoYiConfig; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2鐨勬帴鍙i厤缃 + * + * @author ruoyi + */ +@Configuration +public class SwaggerConfig +{ + /** 绯荤粺鍩虹閰嶇疆 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** 鏄惁寮鍚痵wagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** 璁剧疆璇锋眰鐨勭粺涓鍓嶇紑 */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 鍒涘缓API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 鏄惁鍚敤Swagger + .enable(enabled) + // 鐢ㄦ潵鍒涘缓璇PI鐨勫熀鏈俊鎭紝灞曠ず鍦ㄦ枃妗g殑椤甸潰涓紙鑷畾涔夊睍绀虹殑淇℃伅锛 + .apiInfo(apiInfo()) + // 璁剧疆鍝簺鎺ュ彛鏆撮湶缁橲wagger灞曠ず + .select() + // 鎵弿鎵鏈夋湁娉ㄨВ鐨刟pi锛岀敤杩欑鏂瑰紡鏇寸伒娲 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 鎵弿鎸囧畾鍖呬腑鐨剆wagger娉ㄨВ + // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) + // 鎵弿鎵鏈 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 璁剧疆瀹夊叏妯″紡锛宻wagger鍙互璁剧疆璁块棶token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 瀹夊叏妯″紡锛岃繖閲屾寚瀹歵oken閫氳繃Authorization澶磋姹傚ご浼犻 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 瀹夊叏涓婁笅鏂 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 榛樿鐨勫畨鍏ㄤ笂寮曠敤 + */ + private List defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 娣诲姞鎽樿淇℃伅 + */ + private ApiInfo apiInfo() + { + // 鐢ˋpiInfoBuilder杩涜瀹氬埗 + return new ApiInfoBuilder() + // 璁剧疆鏍囬 + .title("鏍囬锛氳嫢渚濈鐞嗙郴缁焈鎺ュ彛鏂囨。") + // 鎻忚堪 + .description("鎻忚堪锛氱敤浜庣鐞嗛泦鍥㈡棗涓嬪叕鍙哥殑浜哄憳淇℃伅,鍏蜂綋鍖呮嫭XXX,XXX妯″潡...") + // 浣滆呬俊鎭 + .contact(new Contact(ruoyiConfig.getName(), null, null)) + // 鐗堟湰 + .version("鐗堟湰鍙:" + ruoyiConfig.getVersion()) + .build(); + } +} diff --git a/vapeshop-admin/src/main/resources/META-INF/spring-devtools.properties b/vapeshop-admin/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..2b23f85 --- /dev/null +++ b/vapeshop-admin/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson.*.jar \ No newline at end of file diff --git a/vapeshop-admin/src/main/resources/application-dev.yml b/vapeshop-admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4bb8e78 --- /dev/null +++ b/vapeshop-admin/src/main/resources/application-dev.yml @@ -0,0 +1,48 @@ +# 鏁版嵁婧愰厤缃 +easy-mongodb: + enable: true + address: + - es.angledoudou.top:27017 + - es.angledoudou.top:27018 + - es.angledoudou.top:27019 + replicaSet: mongos + database: rouyi-vue + username: doudou-admin + password: admin.1qazXSW.password + authDB: admin + minConnectionsPerHost: 0 + maxConnectionsPerHost: 100 + threadsAllowedToBlockForConnectionMultiplier: 5 + serverSelectionTimeout: 30000 + maxWaitTime: 12000 + maxConnectionIdleTime: 0 + maxConnectionLifeTime: 0 + connectTimeout: 10000 + socketTimeout: 0 + socketKeepAlive: false + sslEnabled: false + sslInvalidHostNameAllowed: false + alwaysUseMBeans: false + heartbeatConnectTimeout: 20000 + heartbeatSocketTimeout: 20000 + minHeartbeatFrequency: 500 + heartbeatFrequency: 10000 + localThreshold: 15 + schema: http + keep-alive-millis: 18000 + global-config: + process-index-mode: smoothly + async-process-index-blocking: true + print-dsl: false + db-config: + database: test + map-underscore-to-camel-case: true + # table-prefix: dev_ + id-type: customize + field-strategy: not_empty + refresh-policy: immediate + enable-track-total-hits: true + enable-must2-filter: false +logging: + level: + org.mongodb.driver.protocol.command: debug \ No newline at end of file diff --git a/vapeshop-admin/src/main/resources/application-druid.yml b/vapeshop-admin/src/main/resources/application-druid.yml new file mode 100644 index 0000000..2499b6a --- /dev/null +++ b/vapeshop-admin/src/main/resources/application-druid.yml @@ -0,0 +1,57 @@ +# 鏁版嵁婧愰厤缃 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 涓诲簱鏁版嵁婧 + master: + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: password + # 浠庡簱鏁版嵁婧 + slave: + # 浠庢暟鎹簮寮鍏/榛樿鍏抽棴 + enabled: false + url: + username: + password: + # 鍒濆杩炴帴鏁 + initialSize: 5 + # 鏈灏忚繛鎺ユ睜鏁伴噺 + minIdle: 10 + # 鏈澶ц繛鎺ユ睜鏁伴噺 + maxActive: 20 + # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂 + maxWait: 60000 + # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣 + timeBetweenEvictionRunsMillis: 60000 + # 閰嶇疆涓涓繛鎺ュ湪姹犱腑鏈灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣 + minEvictableIdleTimeMillis: 300000 + # 閰嶇疆涓涓繛鎺ュ湪姹犱腑鏈澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣 + maxEvictableIdleTimeMillis: 900000 + # 閰嶇疆妫娴嬭繛鎺ユ槸鍚︽湁鏁 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂 + allow: + url-pattern: /druid/* + # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮 + login-username: ruoyi + login-password: 123456 + filter: + stat: + enabled: true + # 鎱QL璁板綍 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true \ No newline at end of file diff --git a/vapeshop-admin/src/main/resources/application.yml b/vapeshop-admin/src/main/resources/application.yml new file mode 100644 index 0000000..bd05692 --- /dev/null +++ b/vapeshop-admin/src/main/resources/application.yml @@ -0,0 +1,123 @@ +# 椤圭洰鐩稿叧閰嶇疆 +ruoyi: + # 鍚嶇О + name: RuoYi + # 鐗堟湰 + version: 3.8.3 + # 鐗堟潈骞翠唤 + copyrightYear: 2022 + # 瀹炰緥婕旂ず寮鍏 + demoEnabled: true + # 鏂囦欢璺緞 绀轰緥锛 Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛 + profile: D:/ruoyi/uploadPath + # 鑾峰彇ip鍦板潃寮鍏 + addressEnabled: false + # 楠岃瘉鐮佺被鍨 math 鏁扮粍璁$畻 char 瀛楃楠岃瘉 + captchaType: math + +# 寮鍙戠幆澧冮厤缃 +server: + # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080 + port: 8080 + servlet: + # 搴旂敤鐨勮闂矾寰 + context-path: / + tomcat: + # tomcat鐨刄RI缂栫爜 + uri-encoding: UTF-8 + # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓100 + accept-count: 1000 + threads: + # tomcat鏈澶х嚎绋嬫暟锛岄粯璁や负200 + max: 800 + # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊10 + min-spare: 100 + +# 鏃ュ織閰嶇疆 +logging: + level: + com.ruoyi: debug + org.springframework: warn + +# Spring閰嶇疆 +spring: + # 璧勬簮淇℃伅 + messages: + # 鍥介檯鍖栬祫婧愭枃浠惰矾寰 + basename: i18n/messages + profiles: + active: dev + # 鏂囦欢涓婁紶 + servlet: + multipart: + # 鍗曚釜鏂囦欢澶у皬 + max-file-size: 10MB + # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬 + max-request-size: 20MB + # 鏈嶅姟妯″潡 + devtools: + restart: + # 鐑儴缃插紑鍏 + enabled: true + # redis 閰嶇疆 + redis: + # 鍦板潃 + host: angledoudou.top + # 绔彛锛岄粯璁や负6379 + port: 26379 + # 鏁版嵁搴撶储寮 + database: 0 + # 瀵嗙爜 + password: vapeshop.1qazXSW@.project + # 杩炴帴瓒呮椂鏃堕棿 + timeout: 10s + lettuce: + pool: + # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺 + min-idle: 0 + # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺 + max-idle: 8 + # 杩炴帴姹犵殑鏈澶ф暟鎹簱杩炴帴鏁 + max-active: 8 + # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷艰〃绀烘病鏈夐檺鍒讹級 + max-wait: -1ms + +# token閰嶇疆 +token: + # 浠ょ墝鑷畾涔夋爣璇 + header: Authorization + # 浠ょ墝瀵嗛挜 + secret: abcdefghijklmnopqrstuvwxyz + # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛 + expireTime: 30 + +# MyBatis閰嶇疆 +mybatis: + # 鎼滅储鎸囧畾鍖呭埆鍚 + typeAliasesPackage: com.ruoyi.**.domain + # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵鏈夌殑mapper.xml鏄犲皠鏂囦欢 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper鍒嗛〉鎻掍欢 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger閰嶇疆 +swagger: + # 鏄惁寮鍚痵wagger + enabled: true + # 璇锋眰鍓嶇紑 + pathMapping: /dev-api + +# 闃叉XSS鏀诲嚮 +xss: + # 杩囨护寮鍏 + enabled: true + # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛 + excludes: /system/notice + # 鍖归厤閾炬帴 + urlPatterns: /system/*,/monitor/*,/tool/* diff --git a/vapeshop-admin/src/main/resources/banner.txt b/vapeshop-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..0931cb8 --- /dev/null +++ b/vapeshop-admin/src/main/resources/banner.txt @@ -0,0 +1,24 @@ +Application Version: ${ruoyi.version} +Spring Boot Version: ${spring-boot.version} +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 浣涚淇濅綉 姘镐笉瀹曟満 姘告棤BUG // +//////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/vapeshop-admin/src/main/resources/i18n/messages.properties b/vapeshop-admin/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..71cf52d --- /dev/null +++ b/vapeshop-admin/src/main/resources/i18n/messages.properties @@ -0,0 +1,37 @@ +#閿欒娑堟伅 +not.null=* 蹇呴』濉啓 +user.jcaptcha.error=楠岃瘉鐮侀敊璇 +user.jcaptcha.expire=楠岃瘉鐮佸凡澶辨晥 +user.not.exists=鐢ㄦ埛涓嶅瓨鍦/瀵嗙爜閿欒 +user.password.not.match=鐢ㄦ埛涓嶅瓨鍦/瀵嗙爜閿欒 +user.password.retry.limit.count=瀵嗙爜杈撳叆閿欒{0}娆 +user.password.retry.limit.exceed=瀵嗙爜杈撳叆閿欒{0}娆★紝甯愭埛閿佸畾10鍒嗛挓 +user.password.delete=瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿宸茶鍒犻櫎 +user.blocked=鐢ㄦ埛宸插皝绂侊紝璇疯仈绯荤鐞嗗憳 +role.blocked=瑙掕壊宸插皝绂侊紝璇疯仈绯荤鐞嗗憳 +user.logout.success=閫鍑烘垚鍔 + +length.not.valid=闀垮害蹇呴』鍦▄min}鍒皗max}涓瓧绗︿箣闂 + +user.username.not.valid=* 2鍒20涓眽瀛椼佸瓧姣嶃佹暟瀛楁垨涓嬪垝绾跨粍鎴愶紝涓斿繀椤讳互闈炴暟瀛楀紑澶 +user.password.not.valid=* 5-50涓瓧绗 + +user.email.not.valid=閭鏍煎紡閿欒 +user.mobile.phone.number.not.valid=鎵嬫満鍙锋牸寮忛敊璇 +user.login.success=鐧诲綍鎴愬姛 +user.register.success=娉ㄥ唽鎴愬姛 +user.notfound=璇烽噸鏂扮櫥褰 +user.forcelogout=绠$悊鍛樺己鍒堕鍑猴紝璇烽噸鏂扮櫥褰 +user.unknown.error=鏈煡閿欒锛岃閲嶆柊鐧诲綍 + +##鏂囦欢涓婁紶娑堟伅 +upload.exceed.maxSize=涓婁紶鐨勬枃浠跺ぇ灏忚秴鍑洪檺鍒剁殑鏂囦欢澶у皬锛
鍏佽鐨勬枃浠舵渶澶уぇ灏忔槸锛歿0}MB锛 +upload.filename.exceed.length=涓婁紶鐨勬枃浠跺悕鏈闀縶0}涓瓧绗 + +##鏉冮檺 +no.permission=鎮ㄦ病鏈夋暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄 [{0}] +no.create.permission=鎮ㄦ病鏈夊垱寤烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄 [{0}] +no.update.permission=鎮ㄦ病鏈変慨鏀规暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄 [{0}] +no.delete.permission=鎮ㄦ病鏈夊垹闄ゆ暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄 [{0}] +no.export.permission=鎮ㄦ病鏈夊鍑烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄 [{0}] +no.view.permission=鎮ㄦ病鏈夋煡鐪嬫暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄 [{0}] diff --git a/vapeshop-admin/src/main/resources/logback.xml b/vapeshop-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..902a8f3 --- /dev/null +++ b/vapeshop-admin/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vapeshop-admin/src/main/resources/mybatis/mybatis-config.xml b/vapeshop-admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..ac47c03 --- /dev/null +++ b/vapeshop-admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/vapeshop-common/pom.xml b/vapeshop-common/pom.xml new file mode 100644 index 0000000..d71e5a4 --- /dev/null +++ b/vapeshop-common/pom.xml @@ -0,0 +1,129 @@ + + + + vapeshop + cn.com.vapeshop + 3.8.3 + + 4.0.0 + + vapeshop-common + + + common閫氱敤宸ュ叿 + + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.alibaba.fastjson2 + fastjson2 + + + + + commons-io + commons-io + + + + + commons-fileupload + commons-fileupload + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + io.jsonwebtoken + jjwt + + + + + javax.xml.bind + jaxb-api + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + eu.bitwalker + UserAgentUtils + + + + + javax.servlet + javax.servlet-api + + + cn.com.vapeshop + easy-mongodb-core + 1.0.0 + compile + + + + \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java new file mode 100644 index 0000000..1d6d4f4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 鍖垮悕璁块棶涓嶉壌鏉冩敞瑙 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Anonymous +{ +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/DataScope.java new file mode 100644 index 0000000..176878e --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/DataScope.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 鏁版嵁鏉冮檺杩囨护娉ㄨВ + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope +{ + /** + * 閮ㄩ棬琛ㄧ殑鍒悕 + */ + public String deptAlias() default ""; + + /** + * 鐢ㄦ埛琛ㄧ殑鍒悕 + */ + public String userAlias() default ""; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/DataSource.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/DataSource.java new file mode 100644 index 0000000..79cd191 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/DataSource.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.enums.DataSourceType; + +/** + * 鑷畾涔夊鏁版嵁婧愬垏鎹㈡敞瑙 + * + * 浼樺厛绾э細鍏堟柟娉曪紝鍚庣被锛屽鏋滄柟娉曡鐩栦簡绫讳笂鐨勬暟鎹簮绫诲瀷锛屼互鏂规硶鐨勪负鍑嗭紝鍚﹀垯浠ョ被涓婄殑涓哄噯 + * + * @author ruoyi + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource +{ + /** + * 鍒囨崲鏁版嵁婧愬悕绉 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Excel.java new file mode 100644 index 0000000..6626986 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -0,0 +1,183 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; + +/** + * 鑷畾涔夊鍑篍xcel鏁版嵁娉ㄨВ + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 瀵煎嚭鏃跺湪excel涓帓搴 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 瀵煎嚭鍒癊xcel涓殑鍚嶅瓧. + */ + public String name() default ""; + + /** + * 鏃ユ湡鏍煎紡, 濡: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 濡傛灉鏄瓧鍏哥被鍨嬶紝璇疯缃瓧鍏哥殑type鍊 (濡: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 璇诲彇鍐呭杞〃杈惧紡 (濡: 0=鐢,1=濂,2=鏈煡) + */ + public String readConverterExp() default ""; + + /** + * 鍒嗛殧绗︼紝璇诲彇瀛楃涓茬粍鍐呭 + */ + public String separator() default ","; + + /** + * BigDecimal 绮惧害 榛樿:-1(榛樿涓嶅紑鍚疊igDecimal鏍煎紡鍖) + */ + public int scale() default -1; + + /** + * BigDecimal 鑸嶅叆瑙勫垯 榛樿:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 瀵煎嚭鏃跺湪excel涓瘡涓垪鐨勯珮搴 鍗曚綅涓哄瓧绗 + */ + public double height() default 14; + + /** + * 瀵煎嚭鏃跺湪excel涓瘡涓垪鐨勫 鍗曚綅涓哄瓧绗 + */ + public double width() default 16; + + /** + * 鏂囧瓧鍚庣紑,濡% 90 鍙樻垚90% + */ + public String suffix() default ""; + + /** + * 褰撳间负绌烘椂,瀛楁鐨勯粯璁ゅ + */ + public String defaultValue() default ""; + + /** + * 鎻愮ず淇℃伅 + */ + public String prompt() default ""; + + /** + * 璁剧疆鍙兘閫夋嫨涓嶈兘杈撳叆鐨勫垪鍐呭. + */ + public String[] combo() default {}; + + /** + * 鏄惁瀵煎嚭鏁版嵁,搴斿闇姹:鏈夋椂鎴戜滑闇瑕佸鍑轰竴浠芥ā鏉,杩欐槸鏍囬闇瑕佷絾鍐呭闇瑕佺敤鎴锋墜宸ュ~鍐. + */ + public boolean isExport() default true; + + /** + * 鍙︿竴涓被涓殑灞炴у悕绉,鏀寔澶氱骇鑾峰彇,浠ュ皬鏁扮偣闅斿紑 + */ + public String targetAttr() default ""; + + /** + * 鏄惁鑷姩缁熻鏁版嵁,鍦ㄦ渶鍚庤拷鍔犱竴琛岀粺璁℃暟鎹诲拰 + */ + public boolean isStatistics() default false; + + /** + * 瀵煎嚭绫诲瀷锛0鏁板瓧 1瀛楃涓诧級 + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 瀵煎嚭瀛椾綋棰滆壊 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 瀵煎嚭瀛楁瀵归綈鏂瑰紡 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 鑷畾涔夋暟鎹鐞嗗櫒 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 鑷畾涔夋暟鎹鐞嗗櫒鍙傛暟 + */ + public String[] args() default {}; + + public enum Align + { + AUTO(0), LEFT(1), CENTER(2), RIGHT(3); + private final int value; + + Align(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + /** + * 瀛楁绫诲瀷锛0锛氬鍑哄鍏ワ紱1锛氫粎瀵煎嚭锛2锛氫粎瀵煎叆锛 + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Excels.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Excels.java new file mode 100644 index 0000000..1f1cc81 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel娉ㄨВ闆 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + public Excel[] value(); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Log.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Log.java new file mode 100644 index 0000000..ca02c6c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/Log.java @@ -0,0 +1,46 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.enums.OperatorType; + +/** + * 鑷畾涔夋搷浣滄棩蹇楄褰曟敞瑙 + * + * @author ruoyi + * + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log +{ + /** + * 妯″潡 + */ + public String title() default ""; + + /** + * 鍔熻兘 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 鎿嶄綔浜虹被鍒 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 鏄惁淇濆瓨璇锋眰鐨勫弬鏁 + */ + public boolean isSaveRequestData() default true; + + /** + * 鏄惁淇濆瓨鍝嶅簲鐨勫弬鏁 + */ + public boolean isSaveResponseData() default true; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java new file mode 100644 index 0000000..0f024c7 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java @@ -0,0 +1,40 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.enums.LimitType; + +/** + * 闄愭祦娉ㄨВ + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter +{ + /** + * 闄愭祦key + */ + public String key() default CacheConstants.RATE_LIMIT_KEY; + + /** + * 闄愭祦鏃堕棿,鍗曚綅绉 + */ + public int time() default 60; + + /** + * 闄愭祦娆℃暟 + */ + public int count() default 100; + + /** + * 闄愭祦绫诲瀷 + */ + public LimitType limitType() default LimitType.DEFAULT; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java new file mode 100644 index 0000000..b769748 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java @@ -0,0 +1,31 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 鑷畾涔夋敞瑙i槻姝㈣〃鍗曢噸澶嶆彁浜 + * + * @author ruoyi + * + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit +{ + /** + * 闂撮殧鏃堕棿(ms)锛屽皬浜庢鏃堕棿瑙嗕负閲嶅鎻愪氦 + */ + public int interval() default 5000; + + /** + * 鎻愮ず娑堟伅 + */ + public String message() default "涓嶅厑璁搁噸澶嶆彁浜わ紝璇风◢鍊欏啀璇"; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/vapeshop-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java new file mode 100644 index 0000000..00f70f6 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java @@ -0,0 +1,135 @@ +package com.ruoyi.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 璇诲彇椤圭洰鐩稿叧閰嶇疆 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "ruoyi") +public class RuoYiConfig +{ + /** 椤圭洰鍚嶇О */ + private String name; + + /** 鐗堟湰 */ + private String version; + + /** 鐗堟潈骞翠唤 */ + private String copyrightYear; + + /** 瀹炰緥婕旂ず寮鍏 */ + private boolean demoEnabled; + + /** 涓婁紶璺緞 */ + private static String profile; + + /** 鑾峰彇鍦板潃寮鍏 */ + private static boolean addressEnabled; + + /** 楠岃瘉鐮佺被鍨 */ + private static String captchaType; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + this.copyrightYear = copyrightYear; + } + + public boolean isDemoEnabled() + { + return demoEnabled; + } + + public void setDemoEnabled(boolean demoEnabled) + { + this.demoEnabled = demoEnabled; + } + + public static String getProfile() + { + return profile; + } + + public void setProfile(String profile) + { + RuoYiConfig.profile = profile; + } + + public static boolean isAddressEnabled() + { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) + { + RuoYiConfig.addressEnabled = addressEnabled; + } + + public static String getCaptchaType() { + return captchaType; + } + + public void setCaptchaType(String captchaType) { + RuoYiConfig.captchaType = captchaType; + } + + /** + * 鑾峰彇瀵煎叆涓婁紶璺緞 + */ + public static String getImportPath() + { + return getProfile() + "/import"; + } + + /** + * 鑾峰彇澶村儚涓婁紶璺緞 + */ + public static String getAvatarPath() + { + return getProfile() + "/avatar"; + } + + /** + * 鑾峰彇涓嬭浇璺緞 + */ + public static String getDownloadPath() + { + return getProfile() + "/download/"; + } + + /** + * 鑾峰彇涓婁紶璺緞 + */ + public static String getUploadPath() + { + return getProfile() + "/upload"; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/vapeshop-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java new file mode 100644 index 0000000..7345fe4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.constant; + +/** + * 缂撳瓨鐨刱ey 甯搁噺 + * + * @author ruoyi + */ +public class CacheConstants +{ + /** + * 鐧诲綍鐢ㄦ埛 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 楠岃瘉鐮 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 鍙傛暟绠$悊 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 瀛楀吀绠$悊 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 闃查噸鎻愪氦 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 闄愭祦 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/constant/Constants.java b/vapeshop-common/src/main/java/com/ruoyi/common/constant/Constants.java new file mode 100644 index 0000000..bb549d0 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -0,0 +1,137 @@ +package com.ruoyi.common.constant; + +import io.jsonwebtoken.Claims; + +/** + * 閫氱敤甯搁噺淇℃伅 + * + * @author ruoyi + */ +public class Constants +{ + /** + * UTF-8 瀛楃闆 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 瀛楃闆 + */ + public static final String GBK = "GBK"; + + /** + * http璇锋眰 + */ + public static final String HTTP = "http://"; + + /** + * https璇锋眰 + */ + public static final String HTTPS = "https://"; + + /** + * 閫氱敤鎴愬姛鏍囪瘑 + */ + public static final String SUCCESS = "0"; + + /** + * 閫氱敤澶辫触鏍囪瘑 + */ + public static final String FAIL = "1"; + + /** + * 鐧诲綍鎴愬姛 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 娉ㄩ攢 + */ + public static final String LOGOUT = "Logout"; + + /** + * 娉ㄥ唽 + */ + public static final String REGISTER = "Register"; + + /** + * 鐧诲綍澶辫触 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 楠岃瘉鐮佹湁鏁堟湡锛堝垎閽燂級 + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 浠ょ墝 + */ + public static final String TOKEN = "token"; + + /** + * 浠ょ墝鍓嶇紑 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 浠ょ墝鍓嶇紑 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 鐢ㄦ埛ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 鐢ㄦ埛鍚嶇О + */ + public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 鐢ㄦ埛澶村儚 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 鍒涘缓鏃堕棿 + */ + public static final String JWT_CREATED = "created"; + + /** + * 鐢ㄦ埛鏉冮檺 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 璧勬簮鏄犲皠璺緞 鍓嶇紑 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 杩滅▼鏂规硶璋冪敤 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 杩滅▼鏂规硶璋冪敤 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 杩滅▼鏂规硶璋冪敤 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 瀹氭椂浠诲姟鐧藉悕鍗曢厤缃紙浠呭厑璁歌闂殑鍖呭悕锛屽鍏朵粬闇瑕佸彲浠ヨ嚜琛屾坊鍔狅級 + */ + public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" }; + + /** + * 瀹氭椂浠诲姟杩濊鐨勫瓧绗 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.ruoyi.common.utils.file" }; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/vapeshop-common/src/main/java/com/ruoyi/common/constant/GenConstants.java new file mode 100644 index 0000000..7d899d4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -0,0 +1,117 @@ +package com.ruoyi.common.constant; + +/** + * 浠g爜鐢熸垚閫氱敤甯搁噺 + * + * @author ruoyi + */ +public class GenConstants +{ + /** 鍗曡〃锛堝鍒犳敼鏌ワ級 */ + public static final String TPL_CRUD = "crud"; + + /** 鏍戣〃锛堝鍒犳敼鏌ワ級 */ + public static final String TPL_TREE = "tree"; + + /** 涓诲瓙琛紙澧炲垹鏀规煡锛 */ + public static final String TPL_SUB = "sub"; + + /** 鏍戠紪鐮佸瓧娈 */ + public static final String TREE_CODE = "treeCode"; + + /** 鏍戠埗缂栫爜瀛楁 */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** 鏍戝悕绉板瓧娈 */ + public static final String TREE_NAME = "treeName"; + + /** 涓婄骇鑿滃崟ID瀛楁 */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** 涓婄骇鑿滃崟鍚嶇О瀛楁 */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** 鏁版嵁搴撳瓧绗︿覆绫诲瀷 */ + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 鏁版嵁搴撴枃鏈被鍨 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + + /** 鏁版嵁搴撴椂闂寸被鍨 */ + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + + /** 鏁版嵁搴撴暟瀛楃被鍨 */ + public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal" }; + + /** 椤甸潰涓嶉渶瑕佺紪杈戝瓧娈 */ + public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + + /** 椤甸潰涓嶉渶瑕佹樉绀虹殑鍒楄〃瀛楁 */ + public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time" }; + + /** 椤甸潰涓嶉渶瑕佹煡璇㈠瓧娈 */ + public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark" }; + + /** Entity鍩虹被瀛楁 */ + public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; + + /** Tree鍩虹被瀛楁 */ + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; + + /** 鏂囨湰妗 */ + public static final String HTML_INPUT = "input"; + + /** 鏂囨湰鍩 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 涓嬫媺妗 */ + public static final String HTML_SELECT = "select"; + + /** 鍗曢夋 */ + public static final String HTML_RADIO = "radio"; + + /** 澶嶉夋 */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** 鏃ユ湡鎺т欢 */ + public static final String HTML_DATETIME = "datetime"; + + /** 鍥剧墖涓婁紶鎺т欢 */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** 鏂囦欢涓婁紶鎺т欢 */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** 瀵屾枃鏈帶浠 */ + public static final String HTML_EDITOR = "editor"; + + /** 瀛楃涓茬被鍨 */ + public static final String TYPE_STRING = "String"; + + /** 鏁村瀷 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 闀挎暣鍨 */ + public static final String TYPE_LONG = "Long"; + + /** 娴偣鍨 */ + public static final String TYPE_DOUBLE = "Double"; + + /** 楂樼簿搴﹁绠楃被鍨 */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** 鏃堕棿绫诲瀷 */ + public static final String TYPE_DATE = "Date"; + + /** 妯$硦鏌ヨ */ + public static final String QUERY_LIKE = "LIKE"; + + /** 鐩哥瓑鏌ヨ */ + public static final String QUERY_EQ = "EQ"; + + /** 闇瑕 */ + public static final String REQUIRE = "1"; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java b/vapeshop-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java new file mode 100644 index 0000000..d60afee --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java @@ -0,0 +1,89 @@ +package com.ruoyi.common.constant; + +/** + * 杩斿洖鐘舵佺爜 + * + * @author ruoyi + */ +public class HttpStatus +{ + /** + * 鎿嶄綔鎴愬姛 + */ + public static final int SUCCESS = 200; + + /** + * 瀵硅薄鍒涘缓鎴愬姛 + */ + public static final int CREATED = 201; + + /** + * 璇锋眰宸茬粡琚帴鍙 + */ + public static final int ACCEPTED = 202; + + /** + * 鎿嶄綔宸茬粡鎵ц鎴愬姛锛屼絾鏄病鏈夎繑鍥炴暟鎹 + */ + public static final int NO_CONTENT = 204; + + /** + * 璧勬簮宸茶绉婚櫎 + */ + public static final int MOVED_PERM = 301; + + /** + * 閲嶅畾鍚 + */ + public static final int SEE_OTHER = 303; + + /** + * 璧勬簮娌℃湁琚慨鏀 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 鍙傛暟鍒楄〃閿欒锛堢己灏戯紝鏍煎紡涓嶅尮閰嶏級 + */ + public static final int BAD_REQUEST = 400; + + /** + * 鏈巿鏉 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 璁块棶鍙楅檺锛屾巿鏉冭繃鏈 + */ + public static final int FORBIDDEN = 403; + + /** + * 璧勬簮锛屾湇鍔℃湭鎵惧埌 + */ + public static final int NOT_FOUND = 404; + + /** + * 涓嶅厑璁哥殑http鏂规硶 + */ + public static final int BAD_METHOD = 405; + + /** + * 璧勬簮鍐茬獊锛屾垨鑰呰祫婧愯閿 + */ + public static final int CONFLICT = 409; + + /** + * 涓嶆敮鎸佺殑鏁版嵁锛屽獟浣撶被鍨 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 绯荤粺鍐呴儴閿欒 + */ + public static final int ERROR = 500; + + /** + * 鎺ュ彛鏈疄鐜 + */ + public static final int NOT_IMPLEMENTED = 501; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java b/vapeshop-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java new file mode 100644 index 0000000..62ad815 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java @@ -0,0 +1,50 @@ +package com.ruoyi.common.constant; + +/** + * 浠诲姟璋冨害閫氱敤甯搁噺 + * + * @author ruoyi + */ +public class ScheduleConstants +{ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 鎵ц鐩爣key */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 榛樿 */ + public static final String MISFIRE_DEFAULT = "0"; + + /** 绔嬪嵆瑙﹀彂鎵ц */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** 瑙﹀彂涓娆℃墽琛 */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** 涓嶈Е鍙戠珛鍗虫墽琛 */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status + { + /** + * 姝e父 + */ + NORMAL("0"), + /** + * 鏆傚仠 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/vapeshop-common/src/main/java/com/ruoyi/common/constant/UserConstants.java new file mode 100644 index 0000000..4ed6009 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -0,0 +1,78 @@ +package com.ruoyi.common.constant; + +/** + * 鐢ㄦ埛甯搁噺淇℃伅 + * + * @author ruoyi + */ +public class UserConstants +{ + /** + * 骞冲彴鍐呯郴缁熺敤鎴风殑鍞竴鏍囧織 + */ + public static final String SYS_USER = "SYS_USER"; + + /** 姝e父鐘舵 */ + public static final String NORMAL = "0"; + + /** 寮傚父鐘舵 */ + public static final String EXCEPTION = "1"; + + /** 鐢ㄦ埛灏佺鐘舵 */ + public static final String USER_DISABLE = "1"; + + /** 瑙掕壊灏佺鐘舵 */ + public static final String ROLE_DISABLE = "1"; + + /** 閮ㄩ棬姝e父鐘舵 */ + public static final String DEPT_NORMAL = "0"; + + /** 閮ㄩ棬鍋滅敤鐘舵 */ + public static final String DEPT_DISABLE = "1"; + + /** 瀛楀吀姝e父鐘舵 */ + public static final String DICT_NORMAL = "0"; + + /** 鏄惁涓虹郴缁熼粯璁わ紙鏄級 */ + public static final String YES = "Y"; + + /** 鏄惁鑿滃崟澶栭摼锛堟槸锛 */ + public static final String YES_FRAME = "0"; + + /** 鏄惁鑿滃崟澶栭摼锛堝惁锛 */ + public static final String NO_FRAME = "1"; + + /** 鑿滃崟绫诲瀷锛堢洰褰曪級 */ + public static final String TYPE_DIR = "M"; + + /** 鑿滃崟绫诲瀷锛堣彍鍗曪級 */ + public static final String TYPE_MENU = "C"; + + /** 鑿滃崟绫诲瀷锛堟寜閽級 */ + public static final String TYPE_BUTTON = "F"; + + /** Layout缁勪欢鏍囪瘑 */ + public final static String LAYOUT = "Layout"; + + /** ParentView缁勪欢鏍囪瘑 */ + public final static String PARENT_VIEW = "ParentView"; + + /** InnerLink缁勪欢鏍囪瘑 */ + public final static String INNER_LINK = "InnerLink"; + + /** 鏍¢獙杩斿洖缁撴灉鐮 */ + public final static String UNIQUE = "0"; + public final static String NOT_UNIQUE = "1"; + + /** + * 鐢ㄦ埛鍚嶉暱搴﹂檺鍒 + */ + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 瀵嗙爜闀垮害闄愬埗 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + public static final int PASSWORD_MAX_LENGTH = 20; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java new file mode 100644 index 0000000..86bec9f --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -0,0 +1,178 @@ +package com.ruoyi.common.core.controller; + +import com.easy.mongodb.core.biz.PageInfo; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sql.SqlUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; + +/** + * web灞傞氱敤鏁版嵁澶勭悊 + * + * @author ruoyi + */ +public class BaseController { + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 灏嗗墠鍙颁紶閫掕繃鏉ョ殑鏃ユ湡鏍煎紡鐨勫瓧绗︿覆锛岃嚜鍔ㄨ浆鍖栦负Date绫诲瀷 + */ + @InitBinder + public static void initBinder(WebDataBinder binder) { + // Date 绫诲瀷杞崲 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) { + this.setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 璁剧疆璇锋眰鍒嗛〉鏁版嵁 + */ + protected static void startPage() { +// PageUtils.startPage(); + } + + /** + * 璁剧疆璇锋眰鎺掑簭鏁版嵁 + */ + protected static void startOrderBy() { + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); +// PageHelper.orderBy(orderBy); + } + } + + /** + * 娓呯悊鍒嗛〉鐨勭嚎绋嬪彉閲 + */ + protected static void clearPage() { +// PageUtils.clearPage(); + } + + /** + * 鍝嶅簲璇锋眰鍒嗛〉鏁版嵁 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + protected static TableDataInfo getDataTable(List list) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("鏌ヨ鎴愬姛"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 鍝嶅簲璇锋眰鍒嗛〉鏁版嵁 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + protected static TableDataInfo getDataTable(PageInfo pageInfo) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("鏌ヨ鎴愬姛"); + rspData.setRows(pageInfo.getList()); + rspData.setTotal(pageInfo.getTotal()); + return rspData; + } + + /** + * 杩斿洖鎴愬姛 + */ + public static AjaxResult success() { + return AjaxResult.success(); + } + + /** + * 杩斿洖澶辫触娑堟伅 + */ + public static AjaxResult error() { + return AjaxResult.error(); + } + + /** + * 杩斿洖鎴愬姛娑堟伅 + */ + public static AjaxResult success(String message) { + return AjaxResult.success(message); + } + + /** + * 杩斿洖澶辫触娑堟伅 + */ + public static AjaxResult error(String message) { + return AjaxResult.error(message); + } + + /** + * 鍝嶅簲杩斿洖缁撴灉 + * + * @param rows 褰卞搷琛屾暟 + * @return 鎿嶄綔缁撴灉 + */ + protected static AjaxResult toAjax(int rows) { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + /** + * 鍝嶅簲杩斿洖缁撴灉 + * + * @param result 缁撴灉 + * @return 鎿嶄綔缁撴灉 + */ + protected static AjaxResult toAjax(boolean result) { + return result ? BaseController.success() : BaseController.error(); + } + + /** + * 椤甸潰璺宠浆 + */ + public static String redirect(String url) { + return StringUtils.format("redirect:{}", url); + } + + /** + * 鑾峰彇鐢ㄦ埛缂撳瓨淇℃伅 + */ + public static LoginUser getLoginUser() { + return SecurityUtils.getLoginUser(); + } + + /** + * 鑾峰彇鐧诲綍鐢ㄦ埛id + */ + public static String getUserId() { + return BaseController.getLoginUser().getUserId(); + } + + /** + * 鑾峰彇鐧诲綍閮ㄩ棬id + */ + public static String getDeptId() { + return BaseController.getLoginUser().getDeptId(); + } + + /** + * 鑾峰彇鐧诲綍鐢ㄦ埛鍚 + */ + public static String getUsername() { + return BaseController.getLoginUser().getUsername(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java new file mode 100644 index 0000000..4950bd0 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java @@ -0,0 +1,162 @@ +package com.ruoyi.common.core.domain; + +import java.util.HashMap; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.utils.StringUtils; + +/** + * 鎿嶄綔娑堟伅鎻愰啋 + * + * @author ruoyi + */ +public class AjaxResult extends HashMap +{ + private static final long serialVersionUID = 1L; + + /** 鐘舵佺爜 */ + public static final String CODE_TAG = "code"; + + /** 杩斿洖鍐呭 */ + public static final String MSG_TAG = "msg"; + + /** 鏁版嵁瀵硅薄 */ + public static final String DATA_TAG = "data"; + + /** + * 鍒濆鍖栦竴涓柊鍒涘缓鐨 AjaxResult 瀵硅薄锛屼娇鍏惰〃绀轰竴涓┖娑堟伅銆 + */ + public AjaxResult() + { + } + + /** + * 鍒濆鍖栦竴涓柊鍒涘缓鐨 AjaxResult 瀵硅薄 + * + * @param code 鐘舵佺爜 + * @param msg 杩斿洖鍐呭 + */ + public AjaxResult(int code, String msg) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 鍒濆鍖栦竴涓柊鍒涘缓鐨 AjaxResult 瀵硅薄 + * + * @param code 鐘舵佺爜 + * @param msg 杩斿洖鍐呭 + * @param data 鏁版嵁瀵硅薄 + */ + public AjaxResult(int code, String msg, Object data) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) + { + super.put(DATA_TAG, data); + } + } + + /** + * 杩斿洖鎴愬姛娑堟伅 + * + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success() + { + return AjaxResult.success("鎿嶄綔鎴愬姛"); + } + + /** + * 杩斿洖鎴愬姛鏁版嵁 + * + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success(Object data) + { + return AjaxResult.success("鎿嶄綔鎴愬姛", data); + } + + /** + * 杩斿洖鎴愬姛娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success(String msg) + { + return AjaxResult.success(msg, null); + } + + /** + * 杩斿洖鎴愬姛娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @param data 鏁版嵁瀵硅薄 + * @return 鎴愬姛娑堟伅 + */ + public static AjaxResult success(String msg, Object data) + { + return new AjaxResult(HttpStatus.SUCCESS, msg, data); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @return + */ + public static AjaxResult error() + { + return AjaxResult.error("鎿嶄綔澶辫触"); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @return 璀﹀憡娑堟伅 + */ + public static AjaxResult error(String msg) + { + return AjaxResult.error(msg, null); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @param msg 杩斿洖鍐呭 + * @param data 鏁版嵁瀵硅薄 + * @return 璀﹀憡娑堟伅 + */ + public static AjaxResult error(String msg, Object data) + { + return new AjaxResult(HttpStatus.ERROR, msg, data); + } + + /** + * 杩斿洖閿欒娑堟伅 + * + * @param code 鐘舵佺爜 + * @param msg 杩斿洖鍐呭 + * @return 璀﹀憡娑堟伅 + */ + public static AjaxResult error(int code, String msg) + { + return new AjaxResult(code, msg, null); + } + + /** + * 鏂逛究閾惧紡璋冪敤 + * + * @param key 閿 + * @param value 鍊 + * @return 鏁版嵁瀵硅薄 + */ + @Override + public AjaxResult put(String key, Object value) + { + super.put(key, value); + return this; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java new file mode 100644 index 0000000..2f7b439 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.core.domain; + +import com.easy.mongodb.common.annotation.TableField; +import com.easy.mongodb.common.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Entity鍩虹被 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + @TableId + private String id; + /** 鎼滅储鍊 */ + @TableField(exist = false) + private String searchValue; + + /** 鍒涘缓鑰 */ + private String createBy; + + /** 鍒涘缓鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField + private Date createTime; + + /** 鏇存柊鑰 */ + private String updateBy; + + /** 鏇存柊鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField + private Date updateTime; + + /** 澶囨敞 */ + private String remark; + + /** 璇锋眰鍙傛暟 */ + @TableField(exist = false) + private Map params; + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSearchValue() { + return this.searchValue; + } + + public void setSearchValue(String searchValue) { + this.searchValue = searchValue; + } + + public String getCreateBy() { + return this.createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return this.createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return this.updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return this.updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return this.remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Map getParams() { + if (this.params == null) { + this.params = new HashMap<>(); + } + return this.params; + } + + public void setParams(Map params) { + this.params = params; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/R.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/R.java new file mode 100644 index 0000000..c3df6ae --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/R.java @@ -0,0 +1,105 @@ +package com.ruoyi.common.core.domain; + +import java.io.Serializable; +import com.ruoyi.common.constant.HttpStatus; + +/** + * 鍝嶅簲淇℃伅涓讳綋 + * + * @author ruoyi + */ +public class R implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 鎴愬姛 */ + public static final int SUCCESS = HttpStatus.SUCCESS; + + /** 澶辫触 */ + public static final int FAIL = HttpStatus.ERROR; + + private int code; + + private String msg; + + private T data; + + public static R ok() + { + return restResult(null, SUCCESS, "鎿嶄綔鎴愬姛"); + } + + public static R ok(T data) + { + return restResult(data, SUCCESS, "鎿嶄綔鎴愬姛"); + } + + public static R ok(T data, String msg) + { + return restResult(data, SUCCESS, msg); + } + + public static R fail() + { + return restResult(null, FAIL, "鎿嶄綔澶辫触"); + } + + public static R fail(String msg) + { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) + { + return restResult(data, FAIL, "鎿嶄綔澶辫触"); + } + + public static R fail(T data, String msg) + { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) + { + return restResult(null, code, msg); + } + + private static R restResult(T data, int code, String msg) + { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java new file mode 100644 index 0000000..a180a18 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java @@ -0,0 +1,79 @@ +package com.ruoyi.common.core.domain; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tree鍩虹被 + * + * @author ruoyi + */ +public class TreeEntity extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 鐖惰彍鍗曞悕绉 */ + private String parentName; + + /** 鐖惰彍鍗旾D */ + private Long parentId; + + /** 鏄剧ず椤哄簭 */ + private Integer orderNum; + + /** 绁栫骇鍒楄〃 */ + private String ancestors; + + /** 瀛愰儴闂 */ + private List children = new ArrayList<>(); + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java new file mode 100644 index 0000000..915eec4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java @@ -0,0 +1,68 @@ +package com.ruoyi.common.core.domain; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysMenu; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Treeselect鏍戠粨鏋勫疄浣撶被 + * + * @author ruoyi + */ +public class TreeSelect implements Serializable { + private static final long serialVersionUID = 1L; + + /** 鑺傜偣ID */ + private String id; + + /** 鑺傜偣鍚嶇О */ + private String label; + + /** 瀛愯妭鐐 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() { + + } + + public TreeSelect(SysDept dept) { + this.id = dept.getId(); + this.label = dept.getDeptName(); + this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(SysMenu menu) { + this.id = menu.getId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public String getId() { + return this.id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLabel() { + return this.label; + } + + public void setLabel(String label) { + this.label = label; + } + + public List getChildren() { + return this.children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysCache.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysCache.java new file mode 100644 index 0000000..cea33a1 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysCache.java @@ -0,0 +1,71 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.ruoyi.common.utils.StringUtils; + +/** + * 缂撳瓨淇℃伅 + * + * @author ruoyi + */ +@Table(value = "sys_cache") +public class SysCache { + /** 缂撳瓨鍚嶇О */ + private String cacheName = ""; + + /** 缂撳瓨閿悕 */ + private String cacheKey = ""; + + /** 缂撳瓨鍐呭 */ + private String cacheValue = ""; + + /** 澶囨敞 */ + private String remark = ""; + + public SysCache() { + + } + + public SysCache(String cacheName, String remark) { + this.cacheName = cacheName; + this.remark = remark; + } + + public SysCache(String cacheName, String cacheKey, String cacheValue) { + this.cacheName = StringUtils.replace(cacheName, ":", ""); + this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); + this.cacheValue = cacheValue; + } + + public String getCacheName() { + return this.cacheName; + } + + public void setCacheName(String cacheName) { + this.cacheName = cacheName; + } + + public String getCacheKey() { + return this.cacheKey; + } + + public void setCacheKey(String cacheKey) { + this.cacheKey = cacheKey; + } + + public String getCacheValue() { + return this.cacheValue; + } + + public void setCacheValue(String cacheValue) { + this.cacheValue = cacheValue; + } + + public String getRemark() { + return this.remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysConfig.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysConfig.java new file mode 100644 index 0000000..8a44e90 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysConfig.java @@ -0,0 +1,103 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * 鍙傛暟閰嶇疆琛 sys_config + * + * @author ruoyi + */ +@Table(value = "sys_config") +public class SysConfig extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 鍙傛暟涓婚敭 */ +// @Excel(name = "鍙傛暟涓婚敭", cellType = ColumnType.NUMERIC) +// @TableId(type = IdType.SNOWFLAKEID) +// private Long configId; + + /** 鍙傛暟鍚嶇О */ + @Excel(name = "鍙傛暟鍚嶇О") + private String configName; + + /** 鍙傛暟閿悕 */ + @Excel(name = "鍙傛暟閿悕") + private String configKey; + + /** 鍙傛暟閿 */ + @Excel(name = "鍙傛暟閿") + private String configValue; + + /** 绯荤粺鍐呯疆锛圷鏄 N鍚︼級 */ + @Excel(name = "绯荤粺鍐呯疆", readConverterExp = "Y=鏄,N=鍚") + private String configType; + +// public Long getConfigId() { +// return this.configId; +// } +// +// public void setConfigId(Long configId) { +// this.configId = configId; +// } + + @NotBlank(message = "鍙傛暟鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "鍙傛暟鍚嶇О涓嶈兘瓒呰繃100涓瓧绗") + public String getConfigName() { + return this.configName; + } + + public void setConfigName(String configName) { + this.configName = configName; + } + + @NotBlank(message = "鍙傛暟閿悕闀垮害涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "鍙傛暟閿悕闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getConfigKey() { + return this.configKey; + } + + public void setConfigKey(String configKey) { + this.configKey = configKey; + } + + @NotBlank(message = "鍙傛暟閿间笉鑳戒负绌") + @Size(min = 0, max = 500, message = "鍙傛暟閿奸暱搴︿笉鑳借秴杩500涓瓧绗") + public String getConfigValue() { + return this.configValue; + } + + public void setConfigValue(String configValue) { + this.configValue = configValue; + } + + public String getConfigType() { + return this.configType; + } + + public void setConfigType(String configType) { + this.configType = configType; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("configId", this.getId()) + .append("configName", this.getConfigName()) + .append("configKey", this.getConfigKey()) + .append("configValue", this.getConfigValue()) + .append("configType", this.getConfigType()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java new file mode 100644 index 0000000..ba40a24 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java @@ -0,0 +1,183 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.easy.mongodb.common.annotation.TableField; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; + +/** + * 閮ㄩ棬琛 sys_dept + * + * @author ruoyi + */ +@Table(value = "sys_dept") +public class SysDept extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 閮ㄩ棬ID */ +// private Long deptId; + + /** 鐖堕儴闂↖D */ + private String parentId; + + /** 绁栫骇鍒楄〃 */ + private String ancestors; + + /** 閮ㄩ棬鍚嶇О */ + private String deptName; + + /** 鏄剧ず椤哄簭 */ + private Integer orderNum; + + /** 璐熻矗浜 */ + private String leader; + + /** 鑱旂郴鐢佃瘽 */ + private String phone; + + /** 閭 */ + private String email; + + /** 閮ㄩ棬鐘舵:0姝e父,1鍋滅敤 */ + private String status; + + /** 鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛 */ + private String delFlag; + + /** 鐖堕儴闂ㄥ悕绉 */ + private String parentName; + + /** 瀛愰儴闂 */ + @TableField(exist = false) + private List children = new ArrayList(); + +// public Long getDeptId() { +// return this.deptId; +// } +// +// public void setDeptId(Long deptId) { +// this.deptId = deptId; +// } + + public String getParentId() { + return this.parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getAncestors() { + return this.ancestors; + } + + public void setAncestors(String ancestors) { + this.ancestors = ancestors; + } + + @NotBlank(message = "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 30, message = "閮ㄩ棬鍚嶇О闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getDeptName() { + return this.deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + @NotNull(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public Integer getOrderNum() { + return this.orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public String getLeader() { + return this.leader; + } + + public void setLeader(String leader) { + this.leader = leader; + } + + @Size(min = 0, max = 11, message = "鑱旂郴鐢佃瘽闀垮害涓嶈兘瓒呰繃11涓瓧绗") + public String getPhone() { + return this.phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Email(message = "閭鏍煎紡涓嶆纭") + @Size(min = 0, max = 50, message = "閭闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getEmail() { + return this.email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return this.delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getParentName() { + return this.parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public List getChildren() { + return this.children; + } + + public void setChildren(List children) { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", this.getId()) + .append("parentId", this.getParentId()) + .append("ancestors", this.getAncestors()) + .append("deptName", this.getDeptName()) + .append("orderNum", this.getOrderNum()) + .append("leader", this.getLeader()) + .append("phone", this.getPhone()) + .append("email", this.getEmail()) + .append("status", this.getStatus()) + .append("delFlag", this.getDelFlag()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java new file mode 100644 index 0000000..16fcc38 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java @@ -0,0 +1,166 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 瀛楀吀鏁版嵁琛 sys_dict_data + * Author: 86631561@163.coom + * Date: 2022/7/20 15:51:56 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/20 15:51:56 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@Table(value = "sys_dict_data") +public class SysDictData extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 瀛楀吀缂栫爜 */ + @Excel(name = "瀛楀吀缂栫爜", cellType = ColumnType.NUMERIC) + private Long dictCode; + + /** 瀛楀吀鎺掑簭 */ + @Excel(name = "瀛楀吀鎺掑簭", cellType = ColumnType.NUMERIC) + private Long dictSort; + + /** 瀛楀吀鏍囩 */ + @Excel(name = "瀛楀吀鏍囩") + private String dictLabel; + + /** 瀛楀吀閿 */ + @Excel(name = "瀛楀吀閿") + private String dictValue; + + /** 瀛楀吀绫诲瀷 */ + @Excel(name = "瀛楀吀绫诲瀷") + private String dictType; + + /** 鏍峰紡灞炴э紙鍏朵粬鏍峰紡鎵╁睍锛 */ + private String cssClass; + + /** 琛ㄦ牸瀛楀吀鏍峰紡 */ + private String listClass; + + /** 鏄惁榛樿锛圷鏄 N鍚︼級 */ + @Excel(name = "鏄惁榛樿", readConverterExp = "Y=鏄,N=鍚") + private String isDefault; + + /** 鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + public Long getDictCode() { + return this.dictCode; + } + + public void setDictCode(Long dictCode) { + this.dictCode = dictCode; + } + + public Long getDictSort() { + return this.dictSort; + } + + public void setDictSort(Long dictSort) { + this.dictSort = dictSort; + } + + @NotBlank(message = "瀛楀吀鏍囩涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀鏍囩闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getDictLabel() { + return this.dictLabel; + } + + public void setDictLabel(String dictLabel) { + this.dictLabel = dictLabel; + } + + @NotBlank(message = "瀛楀吀閿间笉鑳戒负绌") + @Size(min = 0, max = 100, message = "瀛楀吀閿奸暱搴︿笉鑳借秴杩100涓瓧绗") + public String getDictValue() { + return this.dictValue; + } + + public void setDictValue(String dictValue) { + this.dictValue = dictValue; + } + + @NotBlank(message = "瀛楀吀绫诲瀷涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getDictType() { + return this.dictType; + } + + public void setDictType(String dictType) { + this.dictType = dictType; + } + + @Size(min = 0, max = 100, message = "鏍峰紡灞炴ч暱搴︿笉鑳借秴杩100涓瓧绗") + public String getCssClass() { + return this.cssClass; + } + + public void setCssClass(String cssClass) { + this.cssClass = cssClass; + } + + public String getListClass() { + return this.listClass; + } + + public void setListClass(String listClass) { + this.listClass = listClass; + } + + public boolean getDefault() { + return UserConstants.YES.equals(this.isDefault) ? true : false; + } + + public String getIsDefault() { + return this.isDefault; + } + + public void setIsDefault(String isDefault) { + this.isDefault = isDefault; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", this.getDictCode()) + .append("dictSort", this.getDictSort()) + .append("dictLabel", this.getDictLabel()) + .append("dictValue", this.getDictValue()) + .append("dictType", this.getDictType()) + .append("cssClass", this.getCssClass()) + .append("listClass", this.getListClass()) + .append("isDefault", this.getIsDefault()) + .append("status", this.getStatus()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java new file mode 100644 index 0000000..7de69fa --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java @@ -0,0 +1,89 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * 瀛楀吀绫诲瀷琛 sys_dict_type + * + * @author ruoyi + */ +@Table(value = "sys_dict_type") +public class SysDictType extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 瀛楀吀涓婚敭 */ +// @Excel(name = "瀛楀吀涓婚敭", cellType = ColumnType.NUMERIC) +// private Long dictId; + + /** 瀛楀吀鍚嶇О */ + @Excel(name = "瀛楀吀鍚嶇О") + private String dictName; + + /** 瀛楀吀绫诲瀷 */ + @Excel(name = "瀛楀吀绫诲瀷") + private String dictType; + + /** 鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + +// public Long getDictId() { +// return this.dictId; +// } +// +// public void setDictId(Long dictId) { +// this.dictId = dictId; +// } + + @NotBlank(message = "瀛楀吀鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷鍚嶇О闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getDictName() { + return this.dictName; + } + + public void setDictName(String dictName) { + this.dictName = dictName; + } + + @NotBlank(message = "瀛楀吀绫诲瀷涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷绫诲瀷闀垮害涓嶈兘瓒呰繃100涓瓧绗") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "瀛楀吀绫诲瀷蹇呴』浠ュ瓧姣嶅紑澶达紝涓斿彧鑳戒负锛堝皬鍐欏瓧姣嶏紝鏁板瓧锛屼笅婊戠嚎锛") + public String getDictType() { + return this.dictType; + } + + public void setDictType(String dictType) { + this.dictType = dictType; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", this.getId()) + .append("dictName", this.getDictName()) + .append("dictType", this.getDictType()) + .append("status", this.getStatus()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysLogininfor.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysLogininfor.java new file mode 100644 index 0000000..7539b26 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysLogininfor.java @@ -0,0 +1,132 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.easy.mongodb.common.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 绯荤粺璁块棶璁板綍琛 sys_logininfor + * Author: 86631561@163.coom + * Date: 2022/7/20 17:03:04 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/20 17:03:04 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@Table(value = "sys_logininfor") +public class SysLogininfor extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 鐢ㄦ埛璐﹀彿 */ + @Excel(name = "鐢ㄦ埛璐﹀彿") + private String userName; + + /** 鐧诲綍鐘舵 0鎴愬姛 1澶辫触 */ + @Excel(name = "鐧诲綍鐘舵", readConverterExp = "0=鎴愬姛,1=澶辫触") + private String status; + + /** 鐧诲綍IP鍦板潃 */ + @Excel(name = "鐧诲綍鍦板潃") + private String ipaddr; + + /** 鐧诲綍鍦扮偣 */ + @Excel(name = "鐧诲綍鍦扮偣") + private String loginLocation; + + /** 娴忚鍣ㄧ被鍨 */ + @Excel(name = "娴忚鍣") + private String browser; + + /** 鎿嶄綔绯荤粺 */ + @Excel(name = "鎿嶄綔绯荤粺") + private String os; + + /** 鎻愮ず娑堟伅 */ + @Excel(name = "鎻愮ず娑堟伅") + private String msg; + + /** 璁块棶鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "璁块棶鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @TableField + private Date loginTime; + +// public String getInfoId() { +// return this.infoId; +// } +// +// public void setInfoId(String infoId) { +// this.infoId = infoId; +// } + + public String getUserName() { + return this.userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getIpaddr() { + return this.ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return this.loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return this.browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return this.os; + } + + public void setOs(String os) { + this.os = os; + } + + public String getMsg() { + return this.msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Date getLoginTime() { + return this.loginTime; + } + + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java new file mode 100644 index 0000000..bc9c168 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -0,0 +1,229 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; + +/** + * 鑿滃崟鏉冮檺琛 sys_menu + * + * @author ruoyi + */ +@Table(value = "sys_menu") +public class SysMenu extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 鑿滃崟ID */ +// private Long menuId; + + /** 鑿滃崟鍚嶇О */ + private String menuName; + + /** 鐖惰彍鍗曞悕绉 */ + private String parentName; + + /** 鐖惰彍鍗旾D */ + private String parentId; + + /** 鏄剧ず椤哄簭 */ + private Integer orderNum; + + /** 璺敱鍦板潃 */ + private String path; + + /** 缁勪欢璺緞 */ + private String component; + + /** 璺敱鍙傛暟 */ + private String query; + + /** 鏄惁涓哄閾撅紙0鏄 1鍚︼級 */ + private String isFrame; + + /** 鏄惁缂撳瓨锛0缂撳瓨 1涓嶇紦瀛橈級 */ + private String isCache; + + /** 绫诲瀷锛圡鐩綍 C鑿滃崟 F鎸夐挳锛 */ + private String menuType; + + /** 鏄剧ず鐘舵侊紙0鏄剧ず 1闅愯棌锛 */ + private String visible; + + /** 鑿滃崟鐘舵侊紙0鏄剧ず 1闅愯棌锛 */ + private String status; + + /** 鏉冮檺瀛楃涓 */ + private String perms; + + /** 鑿滃崟鍥炬爣 */ + private String icon; + + /** 瀛愯彍鍗 */ + private List children = new ArrayList(); + +// public Long getMenuId() { +// return this.menuId; +// } +// +// public void setMenuId(Long menuId) { +// this.menuId = menuId; +// } + + @NotBlank(message = "鑿滃崟鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 50, message = "鑿滃崟鍚嶇О闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getMenuName() { + return this.menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getParentName() { + return this.parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public String getParentId() { + return this.parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + @NotNull(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public Integer getOrderNum() { + return this.orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "璺敱鍦板潃涓嶈兘瓒呰繃200涓瓧绗") + public String getPath() { + return this.path; + } + + public void setPath(String path) { + this.path = path; + } + + @Size(min = 0, max = 200, message = "缁勪欢璺緞涓嶈兘瓒呰繃255涓瓧绗") + public String getComponent() { + return this.component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getQuery() { + return this.query; + } + + public void setQuery(String query) { + this.query = query; + } + + public String getIsFrame() { + return this.isFrame; + } + + public void setIsFrame(String isFrame) { + this.isFrame = isFrame; + } + + public String getIsCache() { + return this.isCache; + } + + public void setIsCache(String isCache) { + this.isCache = isCache; + } + + @NotBlank(message = "鑿滃崟绫诲瀷涓嶈兘涓虹┖") + public String getMenuType() { + return this.menuType; + } + + public void setMenuType(String menuType) { + this.menuType = menuType; + } + + public String getVisible() { + return this.visible; + } + + public void setVisible(String visible) { + this.visible = visible; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Size(min = 0, max = 100, message = "鏉冮檺鏍囪瘑闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getPerms() { + return this.perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public String getIcon() { + return this.icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public List getChildren() { + return this.children; + } + + public void setChildren(List children) { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", this.getId()) + .append("menuName", this.getMenuName()) + .append("parentId", this.getParentId()) + .append("orderNum", this.getOrderNum()) + .append("path", this.getPath()) + .append("component", this.getComponent()) + .append("isFrame", this.getIsFrame()) + .append("IsCache", this.getIsCache()) + .append("menuType", this.getMenuType()) + .append("visible", this.getVisible()) + .append("status ", this.getStatus()) + .append("perms", this.getPerms()) + .append("icon", this.getIcon()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysNotice.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysNotice.java new file mode 100644 index 0000000..c7ec42f --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysNotice.java @@ -0,0 +1,94 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.xss.Xss; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * 閫氱煡鍏憡琛 sys_notice + * + * @author ruoyi + */ +@Table(value = "sys_notice") +public class SysNotice extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 鍏憡ID */ +// private Long noticeId; + + /** 鍏憡鏍囬 */ + private String noticeTitle; + + /** 鍏憡绫诲瀷锛1閫氱煡 2鍏憡锛 */ + private String noticeType; + + /** 鍏憡鍐呭 */ + private String noticeContent; + + /** 鍏憡鐘舵侊紙0姝e父 1鍏抽棴锛 */ + private String status; + +// public Long getNoticeId() { +// return this.noticeId; +// } +// +// public void setNoticeId(Long noticeId) { +// this.noticeId = noticeId; +// } + + public void setNoticeTitle(String noticeTitle) { + this.noticeTitle = noticeTitle; + } + + @Xss(message = "鍏憡鏍囬涓嶈兘鍖呭惈鑴氭湰瀛楃") + @NotBlank(message = "鍏憡鏍囬涓嶈兘涓虹┖") + @Size(min = 0, max = 50, message = "鍏憡鏍囬涓嶈兘瓒呰繃50涓瓧绗") + public String getNoticeTitle() { + return this.noticeTitle; + } + + public void setNoticeType(String noticeType) { + this.noticeType = noticeType; + } + + public String getNoticeType() { + return this.noticeType; + } + + public void setNoticeContent(String noticeContent) { + this.noticeContent = noticeContent; + } + + public String getNoticeContent() { + return this.noticeContent; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus() { + return this.status; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("noticeId", this.getId()) + .append("noticeTitle", this.getNoticeTitle()) + .append("noticeType", this.getNoticeType()) + .append("noticeContent", this.getNoticeContent()) + .append("status", this.getStatus()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysOperLog.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysOperLog.java new file mode 100644 index 0000000..bb28992 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysOperLog.java @@ -0,0 +1,224 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.easy.mongodb.common.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 鎿嶄綔鏃ュ織璁板綍琛 oper_log + * + * @author ruoyi + */ +@Table(value = "sys_oper_log") +public class SysOperLog extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 鏃ュ織涓婚敭 */ +// @Excel(name = "鎿嶄綔搴忓彿", cellType = ColumnType.NUMERIC) +// private Long operId; + + /** 鎿嶄綔妯″潡 */ + @Excel(name = "鎿嶄綔妯″潡") + private String title; + + /** 涓氬姟绫诲瀷锛0鍏跺畠 1鏂板 2淇敼 3鍒犻櫎锛 */ + @Excel(name = "涓氬姟绫诲瀷", readConverterExp = "0=鍏跺畠,1=鏂板,2=淇敼,3=鍒犻櫎,4=鎺堟潈,5=瀵煎嚭,6=瀵煎叆,7=寮洪,8=鐢熸垚浠g爜,9=娓呯┖鏁版嵁") + private Integer businessType; + + /** 涓氬姟绫诲瀷鏁扮粍 */ + private Integer[] businessTypes; + + /** 璇锋眰鏂规硶 */ + @Excel(name = "璇锋眰鏂规硶") + private String method; + + /** 璇锋眰鏂瑰紡 */ + @Excel(name = "璇锋眰鏂瑰紡") + private String requestMethod; + + /** 鎿嶄綔绫诲埆锛0鍏跺畠 1鍚庡彴鐢ㄦ埛 2鎵嬫満绔敤鎴凤級 */ + @Excel(name = "鎿嶄綔绫诲埆", readConverterExp = "0=鍏跺畠,1=鍚庡彴鐢ㄦ埛,2=鎵嬫満绔敤鎴") + private Integer operatorType; + + /** 鎿嶄綔浜哄憳 */ + @Excel(name = "鎿嶄綔浜哄憳") + private String operName; + + /** 閮ㄩ棬鍚嶇О */ + @Excel(name = "閮ㄩ棬鍚嶇О") + private String deptName; + + /** 璇锋眰url */ + @Excel(name = "璇锋眰鍦板潃") + private String operUrl; + + /** 鎿嶄綔鍦板潃 */ + @Excel(name = "鎿嶄綔鍦板潃") + private String operIp; + + /** 鎿嶄綔鍦扮偣 */ + @Excel(name = "鎿嶄綔鍦扮偣") + private String operLocation; + + /** 璇锋眰鍙傛暟 */ + @Excel(name = "璇锋眰鍙傛暟") + private String operParam; + + /** 杩斿洖鍙傛暟 */ + @Excel(name = "杩斿洖鍙傛暟") + private String jsonResult; + + /** 鎿嶄綔鐘舵侊紙0姝e父 1寮傚父锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=寮傚父") + private Integer status; + + /** 閿欒娑堟伅 */ + @Excel(name = "閿欒娑堟伅") + private String errorMsg; + + /** 鎿嶄綔鏃堕棿 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "鎿嶄綔鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @TableField + private Date operTime; + +// public Long getOperId() { +// return this.operId; +// } +// +// public void setOperId(Long operId) { +// this.operId = operId; +// } + + public String getTitle() { + return this.title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getBusinessType() { + return this.businessType; + } + + public void setBusinessType(Integer businessType) { + this.businessType = businessType; + } + + public Integer[] getBusinessTypes() { + return this.businessTypes; + } + + public void setBusinessTypes(Integer[] businessTypes) { + this.businessTypes = businessTypes; + } + + public String getMethod() { + return this.method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getRequestMethod() { + return this.requestMethod; + } + + public void setRequestMethod(String requestMethod) { + this.requestMethod = requestMethod; + } + + public Integer getOperatorType() { + return this.operatorType; + } + + public void setOperatorType(Integer operatorType) { + this.operatorType = operatorType; + } + + public String getOperName() { + return this.operName; + } + + public void setOperName(String operName) { + this.operName = operName; + } + + public String getDeptName() { + return this.deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getOperUrl() { + return this.operUrl; + } + + public void setOperUrl(String operUrl) { + this.operUrl = operUrl; + } + + public String getOperIp() { + return this.operIp; + } + + public void setOperIp(String operIp) { + this.operIp = operIp; + } + + public String getOperLocation() { + return this.operLocation; + } + + public void setOperLocation(String operLocation) { + this.operLocation = operLocation; + } + + public String getOperParam() { + return this.operParam; + } + + public void setOperParam(String operParam) { + this.operParam = operParam; + } + + public String getJsonResult() { + return this.jsonResult; + } + + public void setJsonResult(String jsonResult) { + this.jsonResult = jsonResult; + } + + public Integer getStatus() { + return this.status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getErrorMsg() { + return this.errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public Date getOperTime() { + return this.operTime; + } + + public void setOperTime(Date operTime) { + this.operTime = operTime; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysPost.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysPost.java new file mode 100644 index 0000000..e4bc4e2 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysPost.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import com.easy.mongodb.common.annotation.TableField; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 宀椾綅琛 sys_post + * Author: 86631561@163.coom + * Date: 2022/7/14 13:45:42 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/14 13:45:42 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@Table(value = "sys_post") +public class SysPost extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 宀椾綅搴忓彿 */ +// @Excel(name = "宀椾綅搴忓彿", cellType = ColumnType.NUMERIC) +// private Long postId; + + /** 宀椾綅缂栫爜 */ + @Excel(name = "宀椾綅缂栫爜") + private String postCode; + + /** 宀椾綅鍚嶇О */ + @Excel(name = "宀椾綅鍚嶇О") + private String postName; + + /** 宀椾綅鎺掑簭 */ + @Excel(name = "宀椾綅鎺掑簭") + private String postSort; + + /** 鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + /** 鐢ㄦ埛鏄惁瀛樺湪姝ゅ矖浣嶆爣璇 榛樿涓嶅瓨鍦 */ + @TableField(exist = false) + private boolean flag = false; + + @NotBlank(message = "宀椾綅缂栫爜涓嶈兘涓虹┖") + @Size(min = 0, max = 64, message = "宀椾綅缂栫爜闀垮害涓嶈兘瓒呰繃64涓瓧绗") + public String getPostCode() { + return this.postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + @NotBlank(message = "宀椾綅鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 50, message = "宀椾綅鍚嶇О闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getPostName() { + return this.postName; + } + + public void setPostName(String postName) { + this.postName = postName; + } + + @NotBlank(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public String getPostSort() { + return this.postSort; + } + + public void setPostSort(String postSort) { + this.postSort = postSort; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + public boolean isFlag() { + return this.flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("postId", this.getId()) + .append("postCode", this.getPostCode()) + .append("postName", this.getPostName()) + .append("postSort", this.getPostSort()) + .append("status", this.getStatus()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java new file mode 100644 index 0000000..60d4ec1 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -0,0 +1,216 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.JoinCondition; +import com.easy.mongodb.common.annotation.Table; +import com.easy.mongodb.common.annotation.TableField; +import com.easy.mongodb.common.enums.FieldType; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.List; +import java.util.Objects; + +/** + * 瑙掕壊琛 sys_role + * + * @author ruoyi + */ +@Table(value = "sys_role") +public class SysRole extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 瑙掕壊ID */ +// @Excel(name = "瑙掕壊搴忓彿", cellType = ColumnType.NUMERIC) +// private Long roleId; + + /** 瑙掕壊鍚嶇О */ + @Excel(name = "瑙掕壊鍚嶇О") + private String roleName; + + /** 瑙掕壊鏉冮檺 */ + @Excel(name = "瑙掕壊鏉冮檺") + private String roleKey; + + /** 瑙掕壊鎺掑簭 */ + @Excel(name = "瑙掕壊鎺掑簭") + private String roleSort; + + /** 鏁版嵁鑼冨洿锛1锛氭墍鏈夋暟鎹潈闄愶紱2锛氳嚜瀹氫箟鏁版嵁鏉冮檺锛3锛氭湰閮ㄩ棬鏁版嵁鏉冮檺锛4锛氭湰閮ㄩ棬鍙婁互涓嬫暟鎹潈闄愶紱5锛氫粎鏈汉鏁版嵁鏉冮檺锛 */ + @Excel(name = "鏁版嵁鑼冨洿", readConverterExp = "1=鎵鏈夋暟鎹潈闄,2=鑷畾涔夋暟鎹潈闄,3=鏈儴闂ㄦ暟鎹潈闄,4=鏈儴闂ㄥ強浠ヤ笅鏁版嵁鏉冮檺,5=浠呮湰浜烘暟鎹潈闄") + private String dataScope; + + /** 鑿滃崟鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀猴紙 0锛氱埗瀛愪笉浜掔浉鍏宠仈鏄剧ず 1锛氱埗瀛愪簰鐩稿叧鑱旀樉绀猴級 */ + private Boolean menuCheckStrictly; + + /** 閮ㄩ棬鏍戦夋嫨椤规槸鍚﹀叧鑱旀樉绀猴紙0锛氱埗瀛愪笉浜掔浉鍏宠仈鏄剧ず 1锛氱埗瀛愪簰鐩稿叧鑱旀樉绀 锛 */ + private Boolean deptCheckStrictly; + + /** 瑙掕壊鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "瑙掕壊鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + /** 鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛 */ + private String delFlag; + + /** 鐢ㄦ埛鏄惁瀛樺湪姝よ鑹叉爣璇 榛樿涓嶅瓨鍦 */ + @TableField(exist = false) + private Boolean flag = false; + + /** 鑿滃崟缁 */ + @TableField( + fieldType = FieldType.JOIN, + condition = @JoinCondition( + entity = SysMenu.class, field = "_id", + midEntity = SysRoleMenu.class, selfField = "_id", selfMidField = "role_id", joinMidField = "menu_id", joinField = "_id" + )) + private List menuIds; + + /** 閮ㄩ棬缁勶紙鏁版嵁鏉冮檺锛 */ + @TableField( + fieldType = FieldType.JOIN, + condition = @JoinCondition( + entity = SysDept.class, field = "_id", + midEntity = SysRoleDept.class, selfField = "_id", selfMidField = "role_id", joinMidField = "dept_id", joinField = "_id" + )) + private List deptIds; + + private Boolean admin; + + public SysRole() { + + } + + public SysRole(String roleId) { + this.setId(roleId); + } + + public Boolean getAdmin() { + return this.admin; + } + + public void setAdmin(Boolean admin) { + this.admin = admin; + } + + public boolean isAdmin() { + return Objects.isNull(this.admin) ? false : this.admin; + } + + + @NotBlank(message = "瑙掕壊鍚嶇О涓嶈兘涓虹┖") + @Size(min = 0, max = 30, message = "瑙掕壊鍚嶇О闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getRoleName() { + return this.roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + @NotBlank(message = "鏉冮檺瀛楃涓嶈兘涓虹┖") + @Size(min = 0, max = 100, message = "鏉冮檺瀛楃闀垮害涓嶈兘瓒呰繃100涓瓧绗") + public String getRoleKey() { + return this.roleKey; + } + + public void setRoleKey(String roleKey) { + this.roleKey = roleKey; + } + + @NotBlank(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖") + public String getRoleSort() { + return this.roleSort; + } + + public void setRoleSort(String roleSort) { + this.roleSort = roleSort; + } + + public String getDataScope() { + return this.dataScope; + } + + public void setDataScope(String dataScope) { + this.dataScope = dataScope; + } + + public boolean isMenuCheckStrictly() { + return this.menuCheckStrictly; + } + + public void setMenuCheckStrictly(boolean menuCheckStrictly) { + this.menuCheckStrictly = menuCheckStrictly; + } + + public boolean isDeptCheckStrictly() { + return this.deptCheckStrictly; + } + + public void setDeptCheckStrictly(boolean deptCheckStrictly) { + this.deptCheckStrictly = deptCheckStrictly; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return this.delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public boolean isFlag() { + return this.flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + public List getMenuIds() { + return this.menuIds; + } + + public void setMenuIds(List menuIds) { + this.menuIds = menuIds; + } + + public List getDeptIds() { + return this.deptIds; + } + + public void setDeptIds(List deptIds) { + this.deptIds = deptIds; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", this.getId()) + .append("roleName", this.getRoleName()) + .append("roleKey", this.getRoleKey()) + .append("roleSort", this.getRoleSort()) + .append("dataScope", this.getDataScope()) + .append("menuCheckStrictly", this.isMenuCheckStrictly()) + .append("deptCheckStrictly", this.isDeptCheckStrictly()) + .append("status", this.getStatus()) + .append("delFlag", this.getDelFlag()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRoleDept.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRoleDept.java new file mode 100644 index 0000000..cb8e14a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRoleDept.java @@ -0,0 +1,51 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.bson.types.ObjectId; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 瑙掕壊鍜岄儴闂ㄥ叧鑱 sys_role_dept + * Author: 86631561@163.coom + * Date: 2022/7/14 13:56:08 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/14 13:56:08 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@Table(value = "sys_role_dept") +public class SysRoleDept { + /** 瑙掕壊ID */ + private ObjectId roleId; + + /** 閮ㄩ棬ID */ + private ObjectId deptId; + + public ObjectId getRoleId() { + return this.roleId; + } + + public void setRoleId(String roleId) { + this.roleId = new ObjectId(roleId); + } + + public ObjectId getDeptId() { + return this.deptId; + } + + public void setDeptId(String deptId) { + this.deptId = new ObjectId(deptId); + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", this.getRoleId()) + .append("deptId", this.getDeptId()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRoleMenu.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRoleMenu.java new file mode 100644 index 0000000..e50337c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRoleMenu.java @@ -0,0 +1,44 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.bson.types.ObjectId; + +/** + * 瑙掕壊鍜岃彍鍗曞叧鑱 sys_role_menu + * + * @author ruoyi + */ +@Table(value = "sys_role_menu") +public class SysRoleMenu { + /** 瑙掕壊ID */ + private ObjectId roleId; + + /** 鑿滃崟ID */ + private ObjectId menuId; + + public ObjectId getRoleId() { + return this.roleId; + } + + public void setRoleId(String roleId) { + this.roleId = new ObjectId(roleId); + } + + public ObjectId getMenuId() { + return this.menuId; + } + + public void setMenuId(String menuId) { + this.menuId = new ObjectId(menuId); + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", this.getRoleId()) + .append("menuId", this.getMenuId()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java new file mode 100644 index 0000000..c036bb8 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -0,0 +1,309 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.JoinCondition; +import com.easy.mongodb.common.annotation.Table; +import com.easy.mongodb.common.annotation.TableField; +import com.easy.mongodb.common.enums.FieldType; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.annotation.Excels; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.xss.Xss; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 鐢ㄦ埛瀵硅薄 sys_user + * + * @author ruoyi + */ +@Table(value = "sys_user") +public class SysUser extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 閮ㄩ棬ID */ + @Excel(name = "閮ㄩ棬缂栧彿", type = Type.IMPORT) + @TableField(fieldType = FieldType.OBJECT_ID) + private String deptId; + + /** 鐢ㄦ埛璐﹀彿 */ + @Excel(name = "鐧诲綍鍚嶇О") + private String userName; + + /** 鐢ㄦ埛鏄电О */ + @Excel(name = "鐢ㄦ埛鍚嶇О") + private String nickName; + + /** 鐢ㄦ埛閭 */ + @Excel(name = "鐢ㄦ埛閭") + private String email; + + /** 鎵嬫満鍙风爜 */ + @Excel(name = "鎵嬫満鍙风爜") + private String phonenumber; + + /** 鐢ㄦ埛鎬у埆 */ + @Excel(name = "鐢ㄦ埛鎬у埆", readConverterExp = "0=鐢,1=濂,2=鏈煡") + private String sex; + + /** 鐢ㄦ埛澶村儚 */ + private String avatar; + + /** 瀵嗙爜 */ + private String password; + + /** 甯愬彿鐘舵侊紙0姝e父 1鍋滅敤锛 */ + @Excel(name = "甯愬彿鐘舵", readConverterExp = "0=姝e父,1=鍋滅敤") + private String status; + + /** 鍒犻櫎鏍囧織锛0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛 */ + private String delFlag; + + /** 鏈鍚庣櫥褰旾P */ + @Excel(name = "鏈鍚庣櫥褰旾P", type = Type.EXPORT) + private String loginIp; + + /** 鏈鍚庣櫥褰曟椂闂 */ + @Excel(name = "鏈鍚庣櫥褰曟椂闂", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + @TableField + private Date loginDate; + + /** 閮ㄩ棬瀵硅薄 */ + @Excels({ + @Excel(name = "閮ㄩ棬鍚嶇О", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "閮ㄩ棬璐熻矗浜", targetAttr = "leader", type = Type.EXPORT) + }) + @TableField( + fieldType = FieldType.JOIN, + condition = @JoinCondition( + selfField = "dept_id", joinField = "_id" + )) + private SysDept dept; + + /** 瑙掕壊瀵硅薄 */ + @TableField( + fieldType = FieldType.JOIN, + condition = @JoinCondition( + entity = SysRole.class, + midEntity = SysUserRole.class, selfField = "_id", selfMidField = "user_id", joinMidField = "role_id", joinField = "_id" + )) + private List roles; + + /** 瑙掕壊缁 */ +// @TableField( +// fieldType = FieldType.JOIN, +// condition = @JoinCondition( +// entity = SysRole.class, field = "_id", +// midEntity = SysUserRole.class, selfField = "_id", selfMidField = "user_id", joinMidField = "role_id", joinField = "_id" +// )) + private String[] roleIds; + + /** 宀椾綅缁 */ + @TableField( + fieldType = FieldType.JOIN, + condition = @JoinCondition( + entity = SysPost.class, + midEntity = SysUserPost.class, selfField = "_id", selfMidField = "user_id", joinMidField = "post_id", joinField = "_id" + )) + private List postIds; + + /** 瑙掕壊ID */ + private String roleId; + private Boolean admin; + + public SysUser() { + + } + + public Boolean getAdmin() { + return this.admin; + } + + public void setAdmin(Boolean admin) { + this.admin = admin; + } + + public SysUser(String userId) { + this.setId(userId); + } + + public boolean isAdmin() { + return Objects.isNull(this.admin) ? false : this.admin; + } + + public String getDeptId() { + return this.deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + @Xss(message = "鐢ㄦ埛鏄电О涓嶈兘鍖呭惈鑴氭湰瀛楃") + @Size(min = 0, max = 30, message = "鐢ㄦ埛鏄电О闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getNickName() { + return this.nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @Xss(message = "鐢ㄦ埛璐﹀彿涓嶈兘鍖呭惈鑴氭湰瀛楃") + @NotBlank(message = "鐢ㄦ埛璐﹀彿涓嶈兘涓虹┖") + @Size(min = 0, max = 30, message = "鐢ㄦ埛璐﹀彿闀垮害涓嶈兘瓒呰繃30涓瓧绗") + public String getUserName() { + return this.userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Email(message = "閭鏍煎紡涓嶆纭") + @Size(min = 0, max = 50, message = "閭闀垮害涓嶈兘瓒呰繃50涓瓧绗") + public String getEmail() { + return this.email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Size(min = 0, max = 11, message = "鎵嬫満鍙风爜闀垮害涓嶈兘瓒呰繃11涓瓧绗") + public String getPhonenumber() { + return this.phonenumber; + } + + public void setPhonenumber(String phonenumber) { + this.phonenumber = phonenumber; + } + + public String getSex() { + return this.sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getAvatar() { + return this.avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return this.delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getLoginIp() { + return this.loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public Date getLoginDate() { + return this.loginDate; + } + + public void setLoginDate(Date loginDate) { + this.loginDate = loginDate; + } + + public SysDept getDept() { + return this.dept; + } + + public void setDept(SysDept dept) { + this.dept = dept; + } + + public List getRoles() { + return this.roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public String[] getRoleIds() { + return this.roleIds; + } + + public void setRoleIds(String[] roleIds) { + this.roleIds = roleIds; + } + + public List getPostIds() { + return this.postIds; + } + + public void setPostIds(List postIds) { + this.postIds = postIds; + } + + public String getRoleId() { + return this.roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", this.getId()) + .append("deptId", this.getDeptId()) + .append("userName", this.getUserName()) + .append("nickName", this.getNickName()) + .append("email", this.getEmail()) + .append("phonenumber", this.getPhonenumber()) + .append("sex", this.getSex()) + .append("avatar", this.getAvatar()) + .append("password", this.getPassword()) + .append("status", this.getStatus()) + .append("delFlag", this.getDelFlag()) + .append("loginIp", this.getLoginIp()) + .append("loginDate", this.getLoginDate()) + .append("createBy", this.getCreateBy()) + .append("createTime", this.getCreateTime()) + .append("updateBy", this.getUpdateBy()) + .append("updateTime", this.getUpdateTime()) + .append("remark", this.getRemark()) + .append("dept", this.getDept()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserOnline.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserOnline.java new file mode 100644 index 0000000..3a23b9c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserOnline.java @@ -0,0 +1,99 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; + +/** + * 褰撳墠鍦ㄧ嚎浼氳瘽 + * + * @author ruoyi + */ +@Table(value = "") +public class SysUserOnline { + /** 浼氳瘽缂栧彿 */ + private String tokenId; + + /** 閮ㄩ棬鍚嶇О */ + private String deptName; + + /** 鐢ㄦ埛鍚嶇О */ + private String userName; + + /** 鐧诲綍IP鍦板潃 */ + private String ipaddr; + + /** 鐧诲綍鍦板潃 */ + private String loginLocation; + + /** 娴忚鍣ㄧ被鍨 */ + private String browser; + + /** 鎿嶄綔绯荤粺 */ + private String os; + + /** 鐧诲綍鏃堕棿 */ + private Long loginTime; + + public String getTokenId() { + return this.tokenId; + } + + public void setTokenId(String tokenId) { + this.tokenId = tokenId; + } + + public String getDeptName() { + return this.deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getUserName() { + return this.userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getIpaddr() { + return this.ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return this.loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return this.browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return this.os; + } + + public void setOs(String os) { + this.os = os; + } + + public Long getLoginTime() { + return this.loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserPost.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserPost.java new file mode 100644 index 0000000..573eec8 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserPost.java @@ -0,0 +1,44 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Table; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.bson.types.ObjectId; + +/** + * 鐢ㄦ埛鍜屽矖浣嶅叧鑱 sys_user_post + * + * @author ruoyi + */ +@Table(value = "sys_user_post") +public class SysUserPost { + /** 鐢ㄦ埛ID */ + private ObjectId userId; + + /** 宀椾綅ID */ + private ObjectId postId; + + public ObjectId getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = new ObjectId(userId); + } + + public ObjectId getPostId() { + return this.postId; + } + + public void setPostId(String postId) { + this.postId = new ObjectId(postId); + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", this.getUserId()) + .append("postId", this.getPostId()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserRole.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserRole.java new file mode 100644 index 0000000..bffeaa0 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserRole.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.core.domain.entity; + +import com.easy.mongodb.common.annotation.Index; +import com.easy.mongodb.common.annotation.IndexField; +import com.easy.mongodb.common.annotation.Table; +import com.easy.mongodb.common.enums.SortDirectionEnum; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.bson.types.ObjectId; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鐢ㄦ埛鍜岃鑹插叧鑱 sys_user_role + * Author: 86631561@163.coom + * Date: 2022/7/14 13:48:42 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/14 13:48:42 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +@Table(value = "sys_user_role", indexs = { + @Index( + fields = { + @IndexField(name = "userId", direction = SortDirectionEnum.ASC), + @IndexField(name = "roleId", direction = SortDirectionEnum.ASC)} + )}) +public class SysUserRole { + /** 鐢ㄦ埛ID */ + private ObjectId userId; + + /** 瑙掕壊ID */ + private ObjectId roleId; + + public ObjectId getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = new ObjectId(userId); + } + + public ObjectId getRoleId() { + return this.roleId; + } + + public void setRoleId(String roleId) { + this.roleId = new ObjectId(roleId); + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", this.getUserId()) + .append("roleId", this.getUserId()) + .toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java new file mode 100644 index 0000000..b5bc8c8 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java @@ -0,0 +1,69 @@ +package com.ruoyi.common.core.domain.model; + +/** + * 鐢ㄦ埛鐧诲綍瀵硅薄 + * + * @author ruoyi + */ +public class LoginBody +{ + /** + * 鐢ㄦ埛鍚 + */ + private String username; + + /** + * 鐢ㄦ埛瀵嗙爜 + */ + private String password; + + /** + * 楠岃瘉鐮 + */ + private String code; + + /** + * 鍞竴鏍囪瘑 + */ + private String uuid; + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getUuid() + { + return uuid; + } + + public void setUuid(String uuid) + { + this.uuid = uuid; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java new file mode 100644 index 0000000..987aebd --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -0,0 +1,241 @@ +package com.ruoyi.common.core.domain.model; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.ruoyi.common.core.domain.entity.SysUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.Set; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鐧诲綍鐢ㄦ埛韬唤鏉冮檺 + * Author: 86631561@163.coom + * Date: 2022/7/14 14:41:54 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/14 14:41:54 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public class LoginUser implements UserDetails { + private static final long serialVersionUID = 1L; + + /** + * 鐢ㄦ埛ID + */ + private String userId; + + /** + * 閮ㄩ棬ID + */ + private String deptId; + + /** + * 鐢ㄦ埛鍞竴鏍囪瘑 + */ + private String token; + + /** + * 鐧诲綍鏃堕棿 + */ + private Long loginTime; + + /** + * 杩囨湡鏃堕棿 + */ + private Long expireTime; + + /** + * 鐧诲綍IP鍦板潃 + */ + private String ipaddr; + + /** + * 鐧诲綍鍦扮偣 + */ + private String loginLocation; + + /** + * 娴忚鍣ㄧ被鍨 + */ + private String browser; + + /** + * 鎿嶄綔绯荤粺 + */ + private String os; + + /** + * 鏉冮檺鍒楄〃 + */ + private Set permissions; + + /** + * 鐢ㄦ埛淇℃伅 + */ + private SysUser user; + + public String getUserId() { + return this.userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getDeptId() { + return this.deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getToken() { + return this.token; + } + + public void setToken(String token) { + this.token = token; + } + + public LoginUser() { + } + + public LoginUser(SysUser user, Set permissions) { + this.user = user; + this.permissions = permissions; + } + + public LoginUser(String userId, String deptId, SysUser user, Set permissions) { + this.userId = userId; + this.deptId = deptId; + this.user = user; + this.permissions = permissions; + } + + @JSONField(serialize = false) + @Override + public String getPassword() { + return this.user.getPassword(); + } + + @Override + public String getUsername() { + return this.user.getUserName(); + } + + /** + * 璐︽埛鏄惁鏈繃鏈,杩囨湡鏃犳硶楠岃瘉 + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonExpired() { + return true; + } + + /** + * 鎸囧畾鐢ㄦ埛鏄惁瑙i攣,閿佸畾鐨勭敤鎴锋棤娉曡繘琛岃韩浠介獙璇 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonLocked() { + return true; + } + + /** + * 鎸囩ず鏄惁宸茶繃鏈熺殑鐢ㄦ埛鐨勫嚟鎹(瀵嗙爜),杩囨湡鐨勫嚟鎹槻姝㈣璇 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + /** + * 鏄惁鍙敤 ,绂佺敤鐨勭敤鎴蜂笉鑳借韩浠介獙璇 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isEnabled() { + return true; + } + + public Long getLoginTime() { + return this.loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } + + public String getIpaddr() { + return this.ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return this.loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return this.browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return this.os; + } + + public void setOs(String os) { + this.os = os; + } + + public Long getExpireTime() { + return this.expireTime; + } + + public void setExpireTime(Long expireTime) { + this.expireTime = expireTime; + } + + public Set getPermissions() { + return this.permissions; + } + + public void setPermissions(Set permissions) { + this.permissions = permissions; + } + + public SysUser getUser() { + return this.user; + } + + public void setUser(SysUser user) { + this.user = user; + } + + @Override + public Collection getAuthorities() { + return null; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java new file mode 100644 index 0000000..868a1fc --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java @@ -0,0 +1,11 @@ +package com.ruoyi.common.core.domain.model; + +/** + * 鐢ㄦ埛娉ㄥ唽瀵硅薄 + * + * @author ruoyi + */ +public class RegisterBody extends LoginBody +{ + +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/vo/MetaVo.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/vo/MetaVo.java new file mode 100644 index 0000000..d0acba4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/vo/MetaVo.java @@ -0,0 +1,106 @@ +package com.ruoyi.common.core.domain.vo; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 璺敱鏄剧ず淇℃伅 + * + * @author ruoyi + */ +public class MetaVo +{ + /** + * 璁剧疆璇ヨ矾鐢卞湪渚ц竟鏍忓拰闈㈠寘灞戜腑灞曠ず鐨勫悕瀛 + */ + private String title; + + /** + * 璁剧疆璇ヨ矾鐢辩殑鍥炬爣锛屽搴旇矾寰剆rc/assets/icons/svg + */ + private String icon; + + /** + * 璁剧疆涓簍rue锛屽垯涓嶄細琚 缂撳瓨 + */ + private boolean noCache; + + /** + * 鍐呴摼鍦板潃锛坔ttp(s)://寮澶达級 + */ + private String link; + + public MetaVo() + { + } + + public MetaVo(String title, String icon) + { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) + { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) + { + this.link = link; + } + } + + public boolean isNoCache() + { + return noCache; + } + + public void setNoCache(boolean noCache) + { + this.noCache = noCache; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public String getLink() + { + return link; + } + + public void setLink(String link) + { + this.link = link; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/vo/RouterVo.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/vo/RouterVo.java new file mode 100644 index 0000000..fbc52d2 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/domain/vo/RouterVo.java @@ -0,0 +1,130 @@ +package com.ruoyi.common.core.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.List; + +/** + * 璺敱閰嶇疆淇℃伅 + * + * @author ruoyi + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo { + /** + * 璺敱鍚嶅瓧 + */ + private String name; + + /** + * 璺敱鍦板潃 + */ + private String path; + + /** + * 鏄惁闅愯棌璺敱锛屽綋璁剧疆 true 鐨勬椂鍊欒璺敱涓嶄細鍐嶄晶杈规爮鍑虹幇 + */ + private boolean hidden; + + /** + * 閲嶅畾鍚戝湴鍧锛屽綋璁剧疆 noRedirect 鐨勬椂鍊欒璺敱鍦ㄩ潰鍖呭睉瀵艰埅涓笉鍙鐐瑰嚮 + */ + private String redirect; + + /** + * 缁勪欢鍦板潃 + */ + private String component; + + /** + * 璺敱鍙傛暟锛氬 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 褰撲綘涓涓矾鐢变笅闈㈢殑 children 澹版槑鐨勮矾鐢卞ぇ浜1涓椂锛岃嚜鍔ㄤ細鍙樻垚宓屽鐨勬ā寮--濡傜粍浠堕〉闈 + */ + private Boolean alwaysShow; + + /** + * 鍏朵粬鍏冪礌 + */ + private MetaVo meta; + + /** + * 瀛愯矾鐢 + */ + private List children; + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPath() { + return this.path; + } + + public void setPath(String path) { + this.path = path; + } + + public boolean getHidden() { + return this.hidden; + } + + public void setHidden(boolean hidden) { + this.hidden = hidden; + } + + public String getRedirect() { + return this.redirect; + } + + public void setRedirect(String redirect) { + this.redirect = redirect; + } + + public String getComponent() { + return this.component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getQuery() { + return this.query; + } + + public void setQuery(String query) { + this.query = query; + } + + public Boolean getAlwaysShow() { + return this.alwaysShow; + } + + public void setAlwaysShow(Boolean alwaysShow) { + this.alwaysShow = alwaysShow; + } + + public MetaVo getMeta() { + return this.meta; + } + + public void setMeta(MetaVo meta) { + this.meta = meta; + } + + public List getChildren() { + return this.children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysConfigMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysConfigMapper.java new file mode 100644 index 0000000..d6cfcef --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysConfigMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysConfig; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鍙傛暟閰嶇疆 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:50:03 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:50:03 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysConfigMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDeptMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDeptMapper.java new file mode 100644 index 0000000..64dab1d --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDeptMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysDept; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 閮ㄩ棬绠$悊 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:50:45 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:50:45 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysDeptMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDictDataMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..ab2dc3c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDictDataMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysDictData; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 瀛楀吀琛 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:49:23 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:49:23 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysDictDataMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDictTypeMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..dc7cf94 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysDictTypeMapper.java @@ -0,0 +1,12 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysDictType; + +/** + * 瀛楀吀琛 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysDictTypeMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysLogininforMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..6255776 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysLogininforMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysLogininfor; + + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 16:51:57 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 16:51:57 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysLogininforMapper extends BaseMongoMapper { + +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysMenuMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysMenuMapper.java new file mode 100644 index 0000000..7bc4f33 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysMenuMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysMenu; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鑿滃崟琛 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 16:03:37 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 16:03:37 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysMenuMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysNoticeMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..245c68b --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysNoticeMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysNotice; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 閫氱煡鍏憡琛 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 16:03:21 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 16:03:21 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysNoticeMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysOperLogMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..76658b0 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysOperLogMapper.java @@ -0,0 +1,12 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysOperLog; + +/** + * 鎿嶄綔鏃ュ織 鏁版嵁灞 + * + * @author ruoyi + */ +public interface SysOperLogMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysPostMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysPostMapper.java new file mode 100644 index 0000000..f01017a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysPostMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysPost; + + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 宀椾綅淇℃伅 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:59:47 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:59:47 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysPostMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleDeptMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..86107bb --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleDeptMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysRoleDept; + + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 瑙掕壊涓庨儴闂ㄥ叧鑱旇〃 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:59:24 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:59:24 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysRoleDeptMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleMapper.java new file mode 100644 index 0000000..a7d883f --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysRole; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 瑙掕壊琛 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:56:00 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:56:00 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysRoleMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleMenuMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..b2bfe94 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysRoleMenuMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysRoleMenu; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 瑙掕壊涓庤彍鍗曞叧鑱旇〃 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:55:39 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:55:39 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysRoleMenuMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserMapper.java new file mode 100644 index 0000000..e6c5715 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysUser; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鐢ㄦ埛琛 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:55:11 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:55:11 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysUserMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserPostMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..e1eb043 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserPostMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysUserPost; + + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鐢ㄦ埛涓庡矖浣嶅叧鑱旇〃 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:54:40 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:54:40 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysUserPostMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserRoleMapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..3b31aa3 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/mapper/SysUserRoleMapper.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.common.core.domain.entity.SysUserRole; + +/** + * ProjectName: RuoYi-Vue-MongoDB + * Description: 鐢ㄦ埛涓庤鑹插叧鑱旇〃 鏁版嵁灞 + * Author: 86631561@163.coom + * Date: 2022/7/12 15:53:13 + * UpdateUser: 86631561@163.coom + * UpdateDate: 2022/7/12 15:53:13 + * UpdateRemark: The modified content + * Version: 1.0 + *

+ * Copyright 漏 2022 86631561@163.coom Technologies Inc. All Rights Reserved + **/ +public interface SysUserRoleMapper extends BaseMongoMapper { +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java new file mode 100644 index 0000000..8966cb4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java @@ -0,0 +1,101 @@ +package com.ruoyi.common.core.page; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 鍒嗛〉鏁版嵁 + * + * @author ruoyi + */ +public class PageDomain +{ + /** 褰撳墠璁板綍璧峰绱㈠紩 */ + private Integer pageNum; + + /** 姣忛〉鏄剧ず璁板綍鏁 */ + private Integer pageSize; + + /** 鎺掑簭鍒 */ + private String orderByColumn; + + /** 鎺掑簭鐨勬柟鍚慸esc鎴栬卆sc */ + private String isAsc = "asc"; + + /** 鍒嗛〉鍙傛暟鍚堢悊鍖 */ + private Boolean reasonable = true; + + public String getOrderBy() + { + if (StringUtils.isEmpty(orderByColumn)) + { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() + { + return pageNum; + } + + public void setPageNum(Integer pageNum) + { + this.pageNum = pageNum; + } + + public Integer getPageSize() + { + return pageSize; + } + + public void setPageSize(Integer pageSize) + { + this.pageSize = pageSize; + } + + public String getOrderByColumn() + { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) + { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() + { + return isAsc; + } + + public void setIsAsc(String isAsc) + { + if (StringUtils.isNotEmpty(isAsc)) + { + // 鍏煎鍓嶇鎺掑簭绫诲瀷 + if ("ascending".equals(isAsc)) + { + isAsc = "asc"; + } + else if ("descending".equals(isAsc)) + { + isAsc = "desc"; + } + this.isAsc = isAsc; + } + } + + public Boolean getReasonable() + { + if (StringUtils.isNull(reasonable)) + { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) + { + this.reasonable = reasonable; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java new file mode 100644 index 0000000..847685b --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.ruoyi.common.core.page; + +import java.io.Serializable; +import java.util.List; + +/** + * 琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄 + * + * @author ruoyi + */ +public class TableDataInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 鎬昏褰曟暟 */ + private long total; + + /** 鍒楄〃鏁版嵁 */ + private List rows; + + /** 娑堟伅鐘舵佺爜 */ + private int code; + + /** 娑堟伅鍐呭 */ + private String msg; + + /** + * 琛ㄦ牸鏁版嵁瀵硅薄 + */ + public TableDataInfo() + { + } + + /** + * 鍒嗛〉 + * + * @param list 鍒楄〃鏁版嵁 + * @param total 鎬昏褰曟暟 + */ + public TableDataInfo(List list, int total) + { + this.rows = list; + this.total = total; + } + + public long getTotal() + { + return total; + } + + public void setTotal(long total) + { + this.total = total; + } + + public List getRows() + { + return rows; + } + + public void setRows(List rows) + { + this.rows = rows; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java new file mode 100644 index 0000000..a120c30 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java @@ -0,0 +1,56 @@ +package com.ruoyi.common.core.page; + +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 琛ㄦ牸鏁版嵁澶勭悊 + * + * @author ruoyi + */ +public class TableSupport +{ + /** + * 褰撳墠璁板綍璧峰绱㈠紩 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 姣忛〉鏄剧ず璁板綍鏁 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 鎺掑簭鍒 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 鎺掑簭鐨勬柟鍚 "desc" 鎴栬 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 鍒嗛〉鍙傛暟鍚堢悊鍖 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 灏佽鍒嗛〉瀵硅薄 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java new file mode 100644 index 0000000..de4a9d4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -0,0 +1,246 @@ +package com.ruoyi.common.core.redis; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +/** + * spring redis 宸ュ叿绫 + * + * @author ruoyi + **/ +@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@Component +public class RedisCache +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @param value 缂撳瓨鐨勫 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @param value 缂撳瓨鐨勫 + * @param timeout 鏃堕棿 + * @param timeUnit 鏃堕棿棰楃矑搴 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 璁剧疆鏈夋晥鏃堕棿 + * + * @param key Redis閿 + * @param timeout 瓒呮椂鏃堕棿 + * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 璁剧疆鏈夋晥鏃堕棿 + * + * @param key Redis閿 + * @param timeout 瓒呮椂鏃堕棿 + * @param unit 鏃堕棿鍗曚綅 + * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 鑾峰緱缂撳瓨鐨勫熀鏈璞° + * + * @param key 缂撳瓨閿 + * @return 缂撳瓨閿煎搴旂殑鏁版嵁 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 鍒犻櫎鍗曚釜瀵硅薄 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 鍒犻櫎闆嗗悎瀵硅薄 + * + * @param collection 澶氫釜瀵硅薄 + * @return + */ + public long deleteObject(final Collection collection) + { + return redisTemplate.delete(collection); + } + + /** + * 缂撳瓨List鏁版嵁 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @param dataList 寰呯紦瀛樼殑List鏁版嵁 + * @return 缂撳瓨鐨勫璞 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄 + * + * @param key 缂撳瓨鐨勯敭鍊 + * @return 缂撳瓨閿煎搴旂殑鏁版嵁 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缂撳瓨Set + * + * @param key 缂撳瓨閿 + * @param dataSet 缂撳瓨鐨勬暟鎹 + * @return 缂撳瓨鏁版嵁鐨勫璞 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 鑾峰緱缂撳瓨鐨剆et + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缂撳瓨Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 鑾峰緱缂撳瓨鐨凪ap + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 寰Hash涓瓨鍏ユ暟鎹 + * + * @param key Redis閿 + * @param hKey Hash閿 + * @param value 鍊 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 鑾峰彇Hash涓殑鏁版嵁 + * + * @param key Redis閿 + * @param hKey Hash閿 + * @return Hash涓殑瀵硅薄 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 鍒犻櫎Hash涓殑鏁版嵁 + * + * @param key + * @param hKey + */ + public void delCacheMapValue(final String key, final String hKey) + { + HashOperations hashOperations = redisTemplate.opsForHash(); + hashOperations.delete(key, hKey); + } + + /** + * 鑾峰彇澶氫釜Hash涓殑鏁版嵁 + * + * @param key Redis閿 + * @param hKeys Hash閿泦鍚 + * @return Hash瀵硅薄闆嗗悎 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛 + * + * @param pattern 瀛楃涓插墠缂 + * @return 瀵硅薄鍒楄〃 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysConfigService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysConfigService.java new file mode 100644 index 0000000..77a701d --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysConfigService.java @@ -0,0 +1,89 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysConfig; + +import java.util.List; + +/** + * 鍙傛暟閰嶇疆 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysConfigService { + /** + * 鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configId 鍙傛暟閰嶇疆ID + * @return 鍙傛暟閰嶇疆淇℃伅 + */ + public SysConfig selectConfigById(String configId); + + /** + * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configKey 鍙傛暟閿悕 + * @return 鍙傛暟閿 + */ + public String selectConfigByKey(String configKey); + + /** + * 鑾峰彇楠岃瘉鐮佸紑鍏 + * + * @return true寮鍚紝false鍏抽棴 + */ + public boolean selectCaptchaOnOff(); + + /** + * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 鍙傛暟閰嶇疆闆嗗悎 + */ + public List selectConfigList(SysConfig config); + + /** + * 鏂板鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + public int insertConfig(SysConfig config); + + /** + * 淇敼鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + public int updateConfig(SysConfig config); + + /** + * 鎵归噺鍒犻櫎鍙傛暟淇℃伅 + * + * @param configIds 闇瑕佸垹闄ょ殑鍙傛暟ID + */ + public void deleteConfigByIds(String[] configIds); + + /** + * 鍔犺浇鍙傛暟缂撳瓨鏁版嵁 + */ + public void loadingConfigCache(); + + /** + * 娓呯┖鍙傛暟缂撳瓨鏁版嵁 + */ + public void clearConfigCache(); + + /** + * 閲嶇疆鍙傛暟缂撳瓨鏁版嵁 + */ + public void resetConfigCache(); + + /** + * 鏍¢獙鍙傛暟閿悕鏄惁鍞竴 + * + * @param config 鍙傛暟淇℃伅 + * @return 缁撴灉 + */ + public String checkConfigKeyUnique(SysConfig config); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDeptService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDeptService.java new file mode 100644 index 0000000..8cb2bbf --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDeptService.java @@ -0,0 +1,116 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.SysDept; + +import java.util.List; + +/** + * 閮ㄩ棬绠$悊 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysDeptService { + /** + * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 閮ㄩ棬淇℃伅闆嗗悎 + */ + public List selectDeptList(SysDept dept); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + public List buildDeptTree(List depts); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + public List buildDeptTreeSelect(List depts); + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑閮ㄩ棬鍒楄〃 + */ + public List selectDeptListByRoleId(String roleId); + + /** + * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 閮ㄩ棬淇℃伅 + */ + public SysDept selectDeptById(String deptId); + + /** + * 鏍规嵁ID鏌ヨ鎵鏈夊瓙閮ㄩ棬锛堟甯哥姸鎬侊級 + * + * @param deptId 閮ㄩ棬ID + * @return 瀛愰儴闂ㄦ暟 + */ + public int selectNormalChildrenDeptById(String deptId); + + /** + * 鏄惁瀛樺湪閮ㄩ棬瀛愯妭鐐 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public boolean hasChildByDeptId(String deptId); + + /** + * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + public boolean checkDeptExistUser(String deptId); + + /** + * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public String checkDeptNameUnique(SysDept dept); + + /** + * 鏍¢獙閮ㄩ棬鏄惁鏈夋暟鎹潈闄 + * + * @param deptId 閮ㄩ棬id + */ + public void checkDeptDataScope(String deptId); + + /** + * 鏂板淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public int insertDept(SysDept dept); + + /** + * 淇敼淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + public int updateDept(SysDept dept); + + /** + * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + public int deleteDeptById(String deptId); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDictDataService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDictDataService.java new file mode 100644 index 0000000..ff49785 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDictDataService.java @@ -0,0 +1,60 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysDictData; + +import java.util.List; + +/** + * 瀛楀吀 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysDictDataService { + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictValue 瀛楀吀閿 + * @return 瀛楀吀鏍囩 + */ + public String selectDictLabel(String dictType, String dictValue); + + /** + * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅 + * + * @param dictCode 瀛楀吀鏁版嵁ID + * @return 瀛楀吀鏁版嵁 + */ + public SysDictData selectDictDataById(String dictCode); + + /** + * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅 + * + * @param dictCodes 闇瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID + */ + public void deleteDictDataByIds(String[] dictCodes); + + /** + * 鏂板淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + public int insertDictData(SysDictData dictData); + + /** + * 淇敼淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + public int updateDictData(SysDictData dictData); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDictTypeService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDictTypeService.java new file mode 100644 index 0000000..b1b35d6 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysDictTypeService.java @@ -0,0 +1,98 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.domain.entity.SysDictType; + +import java.util.List; + +/** + * 瀛楀吀 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysDictTypeService { + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 鏍规嵁鎵鏈夊瓧鍏哥被鍨 + * + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + public List selectDictTypeAll(); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + public List selectDictDataByType(String dictType); + + /** + * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅 + * + * @param dictId 瀛楀吀绫诲瀷ID + * @return 瀛楀吀绫诲瀷 + */ + public SysDictType selectDictTypeById(String dictId); + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀绫诲瀷 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 鎵归噺鍒犻櫎瀛楀吀淇℃伅 + * + * @param dictIds 闇瑕佸垹闄ょ殑瀛楀吀ID + */ + public void deleteDictTypeByIds(String[] dictIds); + + /** + * 鍔犺浇瀛楀吀缂撳瓨鏁版嵁 + */ + public void loadingDictCache(); + + /** + * 娓呯┖瀛楀吀缂撳瓨鏁版嵁 + */ + public void clearDictCache(); + + /** + * 閲嶇疆瀛楀吀缂撳瓨鏁版嵁 + */ + public void resetDictCache(); + + /** + * 鏂板淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + public int insertDictType(SysDictType dictType); + + /** + * 淇敼淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + public int updateDictType(SysDictType dictType); + + /** + * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 缁撴灉 + */ + public String checkDictTypeUnique(SysDictType dictType); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysLogininforService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysLogininforService.java new file mode 100644 index 0000000..dff34ef --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysLogininforService.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.core.service; + +import com.easy.mongodb.core.biz.PageInfo; +import com.easy.mongodb.core.conditions.Wrapper; +import com.ruoyi.common.core.domain.entity.SysLogininfor; + +import java.util.List; + +/** + * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysLogininforService { + /** + * 鏂板绯荤粺鐧诲綍鏃ュ織 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + * @return 鐧诲綍璁板綍闆嗗悎 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 鍒嗛〉鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎 + * + * @return 鐧诲綍璁板綍闆嗗悎 + */ + PageInfo page(Wrapper wrapper, Integer pageNum, Integer pageSize); + + /** + * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織 + * + * @param infoIds 闇瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteLogininforByIds(String[] infoIds); + + /** + * 娓呯┖绯荤粺鐧诲綍鏃ュ織 + */ + public void cleanLogininfor(); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysMenuService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysMenuService.java new file mode 100644 index 0000000..ef5d3f4 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysMenuService.java @@ -0,0 +1,136 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.core.domain.vo.RouterVo; + +import java.util.List; +import java.util.Set; + +/** + * 鑿滃崟 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysMenuService { + /** + * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuList(String userId); + + /** + * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param menu 鑿滃崟淇℃伅 + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuList(SysMenu menu, String userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + public Set selectMenuPermsByUserId(String userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟鏍戜俊鎭 + * + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + public List selectMenuTreeByUserId(String userId); + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑鑿滃崟鍒楄〃 + */ + public List selectMenuListByRoleId(String roleId); + + /** + * 鏋勫缓鍓嶇璺敱鎵闇瑕佺殑鑿滃崟 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 璺敱鍒楄〃 + */ + public List buildMenus(List menus); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + public List buildMenuTree(List menus); + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + public List buildMenuTreeSelect(List menus); + + /** + * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 鑿滃崟淇℃伅 + */ + public SysMenu selectMenuById(String menuId); + + /** + * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + public boolean hasChildByMenuId(String menuId); + + /** + * 鏌ヨ鑿滃崟鏄惁瀛樺湪瑙掕壊 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + public boolean checkMenuExistRole(String menuId); + + /** + * 鏂板淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public int insertMenu(SysMenu menu); + + /** + * 淇敼淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public int updateMenu(SysMenu menu); + + /** + * 鍒犻櫎鑿滃崟绠$悊淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + public int deleteMenuById(String menuId); + + /** + * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public String checkMenuNameUnique(SysMenu menu); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysNoticeService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysNoticeService.java new file mode 100644 index 0000000..715c15e --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysNoticeService.java @@ -0,0 +1,60 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysNotice; + +import java.util.List; + +/** + * 鍏憡 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysNoticeService { + /** + * 鏌ヨ鍏憡淇℃伅 + * + * @param noticeId 鍏憡ID + * @return 鍏憡淇℃伅 + */ + public SysNotice selectNoticeById(String noticeId); + + /** + * 鏌ヨ鍏憡鍒楄〃 + * + * @param notice 鍏憡淇℃伅 + * @return 鍏憡闆嗗悎 + */ + public List selectNoticeList(SysNotice notice); + + /** + * 鏂板鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + public int insertNotice(SysNotice notice); + + /** + * 淇敼鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + public int updateNotice(SysNotice notice); + + /** + * 鍒犻櫎鍏憡淇℃伅 + * + * @param noticeId 鍏憡ID + * @return 缁撴灉 + */ + public int deleteNoticeById(String noticeId); + + /** + * 鎵归噺鍒犻櫎鍏憡淇℃伅 + * + * @param noticeIds 闇瑕佸垹闄ょ殑鍏憡ID + * @return 缁撴灉 + */ + public int deleteNoticeByIds(String[] noticeIds); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysOperLogService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysOperLogService.java new file mode 100644 index 0000000..b321381 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysOperLogService.java @@ -0,0 +1,57 @@ +package com.ruoyi.common.core.service; + +import com.easy.mongodb.core.biz.PageInfo; +import com.easy.mongodb.core.conditions.Wrapper; +import com.ruoyi.common.core.domain.entity.SysOperLog; + +import java.util.List; + +/** + * 鎿嶄綔鏃ュ織 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysOperLogService { + /** + * 鏂板鎿嶄綔鏃ュ織 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + * @return 鎿嶄綔鏃ュ織闆嗗悎 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織 + * + * @param operIds 闇瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID + * @return 缁撴灉 + */ + public int deleteOperLogByIds(String[] operIds); + + /** + * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏 + * + * @param operId 鎿嶄綔ID + * @return 鎿嶄綔鏃ュ織瀵硅薄 + */ + public SysOperLog selectOperLogById(String operId); + + /** + * 娓呯┖鎿嶄綔鏃ュ織 + */ + public void cleanOperLog(); + + /** + * 鍒嗛〉鏌ヨ鎿嶄綔鏃ュ織璇︾粏 + * + * @return 鐧诲綍璁板綍闆嗗悎 + */ + PageInfo page(Wrapper wrapper, Integer pageNum, Integer pageSize); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysPostService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysPostService.java new file mode 100644 index 0000000..4841875 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysPostService.java @@ -0,0 +1,99 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysPost; + +import java.util.List; + +/** + * 宀椾綅淇℃伅 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysPostService { + /** + * 鏌ヨ宀椾綅淇℃伅闆嗗悎 + * + * @param post 宀椾綅淇℃伅 + * @return 宀椾綅鍒楄〃 + */ + public List selectPostList(SysPost post); + + /** + * 鏌ヨ鎵鏈夊矖浣 + * + * @return 宀椾綅鍒楄〃 + */ + public List selectPostAll(); + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + public SysPost selectPostById(String postId); + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑宀椾綅ID鍒楄〃 + */ + public List selectPostListByUserId(String userId); + + /** + * 鏍¢獙宀椾綅鍚嶇О + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public String checkPostNameUnique(SysPost post); + + /** + * 鏍¢獙宀椾綅缂栫爜 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public String checkPostCodeUnique(SysPost post); + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + public int countUserPostById(String postId); + + /** + * 鍒犻櫎宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + public int deletePostById(String postId); + + /** + * 鎵归噺鍒犻櫎宀椾綅淇℃伅 + * + * @param postIds 闇瑕佸垹闄ょ殑宀椾綅ID + * @return 缁撴灉 + */ + public int deletePostByIds(String[] postIds); + + /** + * 鏂板淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public int insertPost(SysPost post); + + /** + * 淇敼淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + public int updatePost(SysPost post); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysRoleService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysRoleService.java new file mode 100644 index 0000000..1a7a996 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysRoleService.java @@ -0,0 +1,173 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUserRole; + +import java.util.List; +import java.util.Set; + +/** + * 瑙掕壊涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysRoleService { + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁 + * + * @param role 瑙掕壊淇℃伅 + * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅 + */ + public List selectRoleList(SysRole role); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊鍒楄〃 + * + * @param userId 鐢ㄦ埛ID + * @return 瑙掕壊鍒楄〃 + */ + public List selectRolesByUserId(String userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + public Set selectRolePermissionByUserId(String userId); + + /** + * 鏌ヨ鎵鏈夎鑹 + * + * @return 瑙掕壊鍒楄〃 + */ + public List selectRoleAll(); + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑瑙掕壊ID鍒楄〃 + */ + public List selectRoleListByUserId(String userId); + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + public SysRole selectRoleById(String roleId); + + /** + * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public String checkRoleNameUnique(SysRole role); + + /** + * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public String checkRoleKeyUnique(SysRole role); + + /** + * 鏍¢獙瑙掕壊鏄惁鍏佽鎿嶄綔 + * + * @param role 瑙掕壊淇℃伅 + */ + public void checkRoleAllowed(SysRole role); + + /** + * 鏍¢獙瑙掕壊鏄惁鏈夋暟鎹潈闄 + * + * @param roleId 瑙掕壊id + */ + public void checkRoleDataScope(String roleId); + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int countUserRoleByRoleId(String roleId); + + /** + * 鏂板淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int insertRole(SysRole role); + + /** + * 淇敼淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int updateRole(SysRole role); + + /** + * 淇敼瑙掕壊鐘舵 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int updateRoleStatus(SysRole role); + + /** + * 淇敼鏁版嵁鏉冮檺淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + public int authDataScope(SysRole role); + + /** + * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleById(String roleId); + + /** + * 鎵归噺鍒犻櫎瑙掕壊淇℃伅 + * + * @param roleIds 闇瑕佸垹闄ょ殑瑙掕壊ID + * @return 缁撴灉 + */ + public int deleteRoleByIds(String[] roleIds); + + /** + * 鍙栨秷鎺堟潈鐢ㄦ埛瑙掕壊 + * + * @param userRole 鐢ㄦ埛鍜岃鑹插叧鑱斾俊鎭 + * @return 缁撴灉 + */ + public int deleteAuthUser(SysUserRole userRole); + + /** + * 鎵归噺鍙栨秷鎺堟潈鐢ㄦ埛瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @param userIds 闇瑕佸彇娑堟巿鏉冪殑鐢ㄦ埛鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteAuthUsers(String roleId, String[] userIds); + + /** + * 鎵归噺閫夋嫨鎺堟潈鐢ㄦ埛瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @param userIds 闇瑕佸垹闄ょ殑鐢ㄦ埛鏁版嵁ID + * @return 缁撴灉 + */ + public int insertAuthUsers(String roleId, String[] userIds); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysUserOnlineService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysUserOnlineService.java new file mode 100644 index 0000000..3e47fba --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysUserOnlineService.java @@ -0,0 +1,47 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysUserOnline; +import com.ruoyi.common.core.domain.model.LoginUser; + +/** + * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface ISysUserOnlineService { + /** + * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); + + /** + * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); + + /** + * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); + + /** + * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛 + */ + public SysUserOnline loginUserToUserOnline(LoginUser user); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysUserService.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysUserService.java new file mode 100644 index 0000000..f6c8b65 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/ISysUserService.java @@ -0,0 +1,206 @@ +package com.ruoyi.common.core.service; + +import com.ruoyi.common.core.domain.entity.SysUser; + +import java.util.List; + +/** + * 鐢ㄦ埛 涓氬姟灞 + * + * @author ruoyi + */ +public interface ISysUserService { + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + public List selectUserList(SysUser user); + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + public List selectAllocatedList(SysUser user); + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴 + * + * @param userName 鐢ㄦ埛鍚 + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + public SysUser selectUserById(String userId); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鐢ㄦ埛鎵灞炶鑹茬粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + public String selectUserRoleGroup(String userName); + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鐢ㄦ埛鎵灞炲矖浣嶇粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + public String selectUserPostGroup(String userName); + + /** + * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @return 缁撴灉 + */ + public String checkUserNameUnique(String userName); + + /** + * 鏍¢獙鎵嬫満鍙风爜鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public String checkPhoneUnique(SysUser user); + + /** + * 鏍¢獙email鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public String checkEmailUnique(SysUser user); + + /** + * 鏍¢獙鐢ㄦ埛鏄惁鍏佽鎿嶄綔 + * + * @param user 鐢ㄦ埛淇℃伅 + */ + public void checkUserAllowed(SysUser user); + + /** + * 鏍¢獙鐢ㄦ埛鏄惁鏈夋暟鎹潈闄 + * + * @param userId 鐢ㄦ埛id + */ + public void checkUserDataScope(String userId); + + /** + * 鏂板鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int insertUser(SysUser user); + + /** + * 娉ㄥ唽鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public boolean registerUser(SysUser user); + + /** + * 淇敼鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int updateUser(SysUser user); + + /** + * 鐢ㄦ埛鎺堟潈瑙掕壊 + * + * @param userId 鐢ㄦ埛ID + * @param roleIds 瑙掕壊缁 + */ + public void insertUserAuth(String userId, String[] roleIds); + + /** + * 淇敼鐢ㄦ埛鐘舵 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int updateUserStatus(SysUser user); + + /** + * 淇敼鐢ㄦ埛鍩烘湰淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int updateUserProfile(SysUser user); + + /** + * 淇敼鐢ㄦ埛澶村儚 + * + * @param userName 鐢ㄦ埛鍚 + * @param avatar 澶村儚鍦板潃 + * @return 缁撴灉 + */ + public boolean updateUserAvatar(String userName, String avatar); + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + public int resetPwd(SysUser user); + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param userName 鐢ㄦ埛鍚 + * @param password 瀵嗙爜 + * @return 缁撴灉 + */ + public int resetUserPwd(String userName, String password); + + /** + * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserById(String userId); + + /** + * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅 + * + * @param userIds 闇瑕佸垹闄ょ殑鐢ㄦ埛ID + * @return 缁撴灉 + */ + public int deleteUserByIds(String[] userIds); + + /** + * 瀵煎叆鐢ㄦ埛鏁版嵁 + * + * @param userList 鐢ㄦ埛鏁版嵁鍒楄〃 + * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁 + * @param operName 鎿嶄綔鐢ㄦ埛 + * @return 缁撴灉 + */ + public String importUser(List userList, Boolean isUpdateSupport, String operName); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysConfigServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..95c72c9 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,201 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysConfig; +import com.ruoyi.common.core.mapper.SysConfigMapper; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.service.ISysConfigService; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.enums.DataSourceType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.Collection; +import java.util.List; + +/** + * 鍙傛暟閰嶇疆 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class SysConfigServiceImpl implements ISysConfigService { + @Autowired + private SysConfigMapper configMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 椤圭洰鍚姩鏃讹紝鍒濆鍖栧弬鏁板埌缂撳瓨 + */ + @PostConstruct + public void init() { + this.loadingConfigCache(); + } + + /** + * 鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configId 鍙傛暟閰嶇疆ID + * @return 鍙傛暟閰嶇疆淇℃伅 + */ + @Override + @DataSource(DataSourceType.MASTER) + public SysConfig selectConfigById(String configId) { + return this.configMapper.selectOne(Wraps.lbQ(SysConfig.class).eq(SysConfig::getId, configId)); + } + + /** + * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅 + * + * @param configKey 鍙傛暟key + * @return 鍙傛暟閿 + */ + @Override + public String selectConfigByKey(String configKey) { + String configValue = Convert.toStr(this.redisCache.getCacheObject(SysConfigServiceImpl.getCacheKey(configKey))); + if (StringUtils.isNotEmpty(configValue)) { + return configValue; + } + SysConfig retConfig = this.configMapper.selectOne(Wraps.lbQ(SysConfig.class).eq(SysConfig::getConfigKey, configKey)); + if (StringUtils.isNotNull(retConfig)) { + this.redisCache.setCacheObject(SysConfigServiceImpl.getCacheKey(configKey), retConfig.getConfigValue()); + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 鑾峰彇楠岃瘉鐮佸紑鍏 + * + * @return true寮鍚紝false鍏抽棴 + */ + @Override + public boolean selectCaptchaOnOff() { + String captchaOnOff = this.selectConfigByKey("sys.account.captchaOnOff"); + if (StringUtils.isEmpty(captchaOnOff)) { + return true; + } + return Convert.toBool(captchaOnOff); + } + + /** + * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 鍙傛暟閰嶇疆闆嗗悎 + */ + @Override + public List selectConfigList(SysConfig config) { + return this.configMapper.selectList(config); + } + + /** + * 鏂板鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertConfig(SysConfig config) { + int row = this.configMapper.insert(config).intValue(); + if (row > 0) { + this.redisCache.setCacheObject(SysConfigServiceImpl.getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 淇敼鍙傛暟閰嶇疆 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateConfig(SysConfig config) { + int row = this.configMapper.updateById(config).intValue(); + if (row > 0) { + this.redisCache.setCacheObject(SysConfigServiceImpl.getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 鎵归噺鍒犻櫎鍙傛暟淇℃伅 + * + * @param configIds 闇瑕佸垹闄ょ殑鍙傛暟ID + */ + @Override + public void deleteConfigByIds(String[] configIds) { + for (String configId : configIds) { + SysConfig config = this.selectConfigById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { + throw new ServiceException(String.format("鍐呯疆鍙傛暟銆%1$s銆戜笉鑳藉垹闄 ", config.getConfigKey())); + } + this.configMapper.deleteById(configId); + this.redisCache.deleteObject(SysConfigServiceImpl.getCacheKey(config.getConfigKey())); + } + } + + /** + * 鍔犺浇鍙傛暟缂撳瓨鏁版嵁 + */ + @Override + public void loadingConfigCache() { + List configsList = this.configMapper.selectList(Wraps.lbQ(new SysConfig())); + for (SysConfig config : configsList) { + this.redisCache.setCacheObject(SysConfigServiceImpl.getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + } + + /** + * 娓呯┖鍙傛暟缂撳瓨鏁版嵁 + */ + @Override + public void clearConfigCache() { + Collection keys = this.redisCache.keys(CacheConstants.SYS_CONFIG_KEY + "*"); + this.redisCache.deleteObject(keys); + } + + /** + * 閲嶇疆鍙傛暟缂撳瓨鏁版嵁 + */ + @Override + public void resetConfigCache() { + this.clearConfigCache(); + this.loadingConfigCache(); + } + + /** + * 鏍¢獙鍙傛暟閿悕鏄惁鍞竴 + * + * @param config 鍙傛暟閰嶇疆淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkConfigKeyUnique(SysConfig config) { + String configId = StringUtils.isNull(config.getId()) ? "-1L" : config.getId(); + SysConfig info = this.configMapper.selectOne(Wraps.lbQ(config).eq(SysConfig::getConfigKey, config.getConfigKey())); + if (StringUtils.isNotNull(info) && !configId.equals(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 璁剧疆cache key + * + * @param configKey 鍙傛暟閿 + * @return 缂撳瓨閿甼ey + */ + private static String getCacheKey(String configKey) { + return CacheConstants.SYS_CONFIG_KEY + configKey; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDeptServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..f87f077 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,298 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.mapper.SysDeptMapper; +import com.ruoyi.common.core.mapper.SysRoleMapper; +import com.ruoyi.common.core.mapper.SysUserMapper; +import com.ruoyi.common.core.service.ISysDeptService; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 閮ㄩ棬绠$悊 鏈嶅姟瀹炵幇 + * + * @author ruoyi + */ +@Service +public class SysDeptServiceImpl implements ISysDeptService { + @Autowired + private SysDeptMapper deptMapper; + @Autowired + private SysUserMapper userMapper; + @Autowired + private SysRoleMapper roleMapper; + + /** + * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 閮ㄩ棬淇℃伅闆嗗悎 + */ + @Override + @DataScope(deptAlias = "d") + public List selectDeptList(SysDept dept) { + return this.deptMapper.selectList(dept); + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + @Override + public List buildDeptTree(List depts) { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (SysDept dept : depts) { + tempList.add(dept.getId()); + } + for (SysDept dept : depts) { + // 濡傛灉鏄《绾ц妭鐐, 閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣 + if (!tempList.contains(dept.getParentId())) { + this.recursionFn(depts, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) { + returnList = depts; + } + return returnList; + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param depts 閮ㄩ棬鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + @Override + public List buildDeptTreeSelect(List depts) { + List deptTrees = this.buildDeptTree(depts); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑閮ㄩ棬鍒楄〃 + */ + @Override + public List selectDeptListByRoleId(String roleId) { + SysRole role = this.roleMapper.selectById(roleId); + return role.getDeptIds(); + } + + /** + * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 閮ㄩ棬淇℃伅 + */ + @Override + public SysDept selectDeptById(String deptId) { + return this.deptMapper.selectById(deptId); + } + + /** + * 鏍规嵁ID鏌ヨ鎵鏈夊瓙閮ㄩ棬锛堟甯哥姸鎬侊級 + * + * @param deptId 閮ㄩ棬ID + * @return 瀛愰儴闂ㄦ暟 + */ + @Override + public int selectNormalChildrenDeptById(String deptId) { + return this.deptMapper.selectCount(Wraps.lbQ(SysDept.class).eq(SysDept::getStatus, 0).eq(SysDept::getParentId, deptId)).intValue(); + } + + /** + * 鏄惁瀛樺湪瀛愯妭鐐 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + @Override + public boolean hasChildByDeptId(String deptId) { + int result = this.deptMapper.selectCount(Wraps.lbQ(SysDept.class).eq(SysDept::getParentId, deptId)).intValue(); + return result > 0; + } + + /** + * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦 + */ + @Override + public boolean checkDeptExistUser(String deptId) { + int result = this.userMapper.selectCount(Wraps.lbQ(SysUser.class).eq(SysUser::getDeptId, deptId)).intValue(); + return result > 0; + } + + /** + * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkDeptNameUnique(SysDept dept) { + String deptId = StringUtils.isNull(dept.getId()) ? "-1L" : dept.getId(); + SysDept info = this.deptMapper.selectOne(Wraps.lbQ(dept).eq(SysDept::getDeptName, dept.getDeptName()).eq(SysDept::getParentId, dept.getParentId())); + if (StringUtils.isNotNull(info) && !deptId.equals(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙閮ㄩ棬鏄惁鏈夋暟鎹潈闄 + * + * @param deptId 閮ㄩ棬id + */ + @Override + public void checkDeptDataScope(String deptId) { + if (!SecurityUtils.getLoginUser().getUser().isAdmin()) { + SysDept dept = new SysDept(); + dept.setId(deptId); + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + if (StringUtils.isEmpty(depts)) { + throw new ServiceException("娌℃湁鏉冮檺璁块棶閮ㄩ棬鏁版嵁锛"); + } + } + } + + /** + * 鏂板淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertDept(SysDept dept) { + SysDept info = this.deptMapper.selectById(dept.getParentId()); + // 濡傛灉鐖惰妭鐐逛笉涓烘甯哥姸鎬,鍒欎笉鍏佽鏂板瀛愯妭鐐 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { + throw new ServiceException("閮ㄩ棬鍋滅敤锛屼笉鍏佽鏂板"); + } + dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); + return this.deptMapper.insert(dept).intValue(); + } + + /** + * 淇敼淇濆瓨閮ㄩ棬淇℃伅 + * + * @param dept 閮ㄩ棬淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateDept(SysDept dept) { + SysDept newParentDept = this.deptMapper.selectById(dept.getParentId()); + SysDept oldDept = this.deptMapper.selectById(dept.getId()); + if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) { + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + this.updateDeptChildren(dept.getId(), newAncestors, oldAncestors); + } + int result = this.deptMapper.updateById(dept).intValue(); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals("0", dept.getAncestors())) { + // 濡傛灉璇ラ儴闂ㄦ槸鍚敤鐘舵侊紝鍒欏惎鐢ㄨ閮ㄩ棬鐨勬墍鏈変笂绾ч儴闂 + SysDeptServiceImpl.updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 淇敼璇ラ儴闂ㄧ殑鐖剁骇閮ㄩ棬鐘舵 + * + * @param dept 褰撳墠閮ㄩ棬 + */ + private static void updateParentDeptStatusNormal(SysDept dept) { + String ancestors = dept.getAncestors(); + String[] deptIds = Convert.toStrArray(ancestors); +// this.deptMapper.updateDeptStatusNormal(deptIds); + } + + /** + * 淇敼瀛愬厓绱犲叧绯 + * + * @param deptId 琚慨鏀圭殑閮ㄩ棬ID + * @param newAncestors 鏂扮殑鐖禝D闆嗗悎 + * @param oldAncestors 鏃х殑鐖禝D闆嗗悎 + */ + public void updateDeptChildren(String deptId, String newAncestors, String oldAncestors) { + List children = this.deptMapper.selectList(Wraps.lbQ(SysDept.class).eq(SysDept::getParentId, deptId)); + for (SysDept child : children) { + child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + } + if (children.size() > 0) { +// this.deptMapper.update(children); + } + } + + /** + * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅 + * + * @param deptId 閮ㄩ棬ID + * @return 缁撴灉 + */ + @Override + public int deleteDeptById(String deptId) { + return this.deptMapper.deleteById(deptId).intValue(); + } + + /** + * 閫掑綊鍒楄〃 + */ + private void recursionFn(List list, SysDept t) { + // 寰楀埌瀛愯妭鐐瑰垪琛 + List childList = SysDeptServiceImpl.getChildList(list, t); + t.setChildren(childList); + for (SysDept tChild : childList) { + if (SysDeptServiceImpl.hasChild(list, tChild)) { + this.recursionFn(list, tChild); + } + } + } + + /** + * 寰楀埌瀛愯妭鐐瑰垪琛 + */ + private static List getChildList(List list, SysDept t) { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + SysDept n = (SysDept) it.next(); + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().equals(t.getId())) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣 + */ + private static boolean hasChild(List list, SysDept t) { + return SysDeptServiceImpl.getChildList(list, t).size() > 0; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDictDataServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..ba1030f --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,104 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.mapper.SysDictDataMapper; +import com.ruoyi.common.core.service.ISysDictDataService; +import com.ruoyi.common.utils.DictUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 瀛楀吀 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysDictDataServiceImpl implements ISysDictDataService { + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictData 瀛楀吀鏁版嵁淇℃伅 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + @Override + public List selectDictDataList(SysDictData dictData) { +// return this.dictDataMapper.selectDictDataList(dictData); + return this.dictDataMapper.selectList(dictData); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictValue 瀛楀吀閿 + * @return 瀛楀吀鏍囩 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return this.dictDataMapper.selectOne(Wraps.lbQ(SysDictData.class).eq(SysDictData::getDictType, dictType).eq(SysDictData::getDictValue, dictValue)).getDictLabel(); + } + + /** + * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅 + * + * @param dictCode 瀛楀吀鏁版嵁ID + * @return 瀛楀吀鏁版嵁 + */ + @Override + public SysDictData selectDictDataById(String dictCode) { + return this.dictDataMapper.selectOne(Wraps.lbQ(SysDictData.class).eq(SysDictData::getDictCode, dictCode)); + } + + /** + * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅 + * + * @param dictCodes 闇瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID + */ + @Override + public void deleteDictDataByIds(String[] dictCodes) { + for (String dictCode : dictCodes) { + SysDictData data = this.selectDictDataById(dictCode); + this.dictDataMapper.delete(Wraps.lbQ(SysDictData.class).eq(SysDictData::getDictCode, dictCode)); + List dictDatas = this.dictDataMapper.selectList(Wraps.lbQ().eq(SysDictData::getDictType, data.getDictType())); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + } + + /** + * 鏂板淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param data 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertDictData(SysDictData data) { + int row = this.dictDataMapper.insert(data).intValue(); + if (row > 0) { + List dictDatas = this.dictDataMapper.selectList(Wraps.lbQ(SysDictData.class).eq(SysDictData::getDictType, data.getDictType())); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } + + /** + * 淇敼淇濆瓨瀛楀吀鏁版嵁淇℃伅 + * + * @param data 瀛楀吀鏁版嵁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateDictData(SysDictData data) { + int row = this.dictDataMapper.updateById(data).intValue(); + if (row > 0) { + List dictDatas = this.dictDataMapper.selectList(Wraps.lbQ(data).eq(SysDictData::getDictType, data.getDictType())); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDictTypeServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..74b9d1a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,201 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.domain.entity.SysDictType; +import com.ruoyi.common.core.mapper.SysDictDataMapper; +import com.ruoyi.common.core.mapper.SysDictTypeMapper; +import com.ruoyi.common.core.service.ISysDictTypeService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 瀛楀吀 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService { + @Autowired + private SysDictTypeMapper dictTypeMapper; + + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 椤圭洰鍚姩鏃讹紝鍒濆鍖栧瓧鍏稿埌缂撳瓨 + */ + @PostConstruct + public void init() { + this.loadingDictCache(); + } + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷 + * + * @param dictType 瀛楀吀绫诲瀷淇℃伅 + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + @Override + public List selectDictTypeList(SysDictType dictType) { + return this.dictTypeMapper.selectList(dictType); + } + + /** + * 鏍规嵁鎵鏈夊瓧鍏哥被鍨 + * + * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅 + */ + @Override + public List selectDictTypeAll() { + return this.dictTypeMapper.selectList(new SysDictType()); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅 + */ + @Override + public List selectDictDataByType(String dictType) { + List dictDatas = DictUtils.getDictCache(dictType); + if (StringUtils.isNotEmpty(dictDatas)) { + return dictDatas; + } + dictDatas = this.dictDataMapper.selectList(Wraps.lbQ(SysDictData.class).eq(SysDictData::getDictType, dictType)); + if (StringUtils.isNotEmpty(dictDatas)) { + DictUtils.setDictCache(dictType, dictDatas); + return dictDatas; + } + return null; + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅 + * + * @param dictId 瀛楀吀绫诲瀷ID + * @return 瀛楀吀绫诲瀷 + */ + @Override + public SysDictType selectDictTypeById(String dictId) { + return this.dictTypeMapper.selectById(dictId); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅 + * + * @param dictType 瀛楀吀绫诲瀷 + * @return 瀛楀吀绫诲瀷 + */ + @Override + public SysDictType selectDictTypeByType(String dictType) { + return this.dictTypeMapper.selectOne(Wraps.lbQ(SysDictType.class).eq(SysDictType::getDictType, dictType)); + } + + /** + * 鎵归噺鍒犻櫎瀛楀吀绫诲瀷淇℃伅 + * + * @param dictIds 闇瑕佸垹闄ょ殑瀛楀吀ID + */ + @Override + public void deleteDictTypeByIds(String[] dictIds) { + for (String dictId : dictIds) { + SysDictType dictType = this.selectDictTypeById(dictId); + if (this.dictDataMapper.selectCount(Wraps.lbQ(SysDictData.class).eq(SysDictData::getDictType, dictType.getDictType())) > 0) { + throw new ServiceException(String.format("%1$s宸插垎閰,涓嶈兘鍒犻櫎", dictType.getDictName())); + } + this.dictTypeMapper.deleteById(dictId); + DictUtils.removeDictCache(dictType.getDictType()); + } + } + + /** + * 鍔犺浇瀛楀吀缂撳瓨鏁版嵁 + */ + @Override + public void loadingDictCache() { + Map> dictDataMap = this.dictDataMapper.selectList(Wraps.lbQ(SysDictData.class).eq(SysDictData::getStatus, "0")).stream().collect(Collectors.groupingBy(SysDictData::getDictType)); + for (Map.Entry> entry : dictDataMap.entrySet()) { + DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList())); + } + } + + /** + * 娓呯┖瀛楀吀缂撳瓨鏁版嵁 + */ + @Override + public void clearDictCache() { + DictUtils.clearDictCache(); + } + + /** + * 閲嶇疆瀛楀吀缂撳瓨鏁版嵁 + */ + @Override + public void resetDictCache() { + this.clearDictCache(); + this.loadingDictCache(); + } + + /** + * 鏂板淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dict 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertDictType(SysDictType dict) { + int row = this.dictTypeMapper.insert(dict).intValue(); + if (row > 0) { + DictUtils.setDictCache(dict.getDictType(), null); + } + return row; + } + + /** + * 淇敼淇濆瓨瀛楀吀绫诲瀷淇℃伅 + * + * @param dict 瀛楀吀绫诲瀷淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int updateDictType(SysDictType dict) { + SysDictType oldDict = this.dictTypeMapper.selectOne(Wraps.lbQ(dict).eq(SysDictType::getId, dict.getId())); + this.dictDataMapper.update(new SysDictData(), Wraps.lbU(SysDictData.class).set(SysDictData::getDictType, dict.getDictType()).eq(SysDictData::getDictType, oldDict.getDictType())); + int row = this.dictTypeMapper.updateById(dict).intValue(); + if (row > 0) { + List dictDatas = this.dictDataMapper.selectList(Wraps.lbQ().eq(SysDictData::getDictType, dict.getDictType())); + DictUtils.setDictCache(dict.getDictType(), dictDatas); + } + return row; + } + + /** + * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓 + * + * @param dict 瀛楀吀绫诲瀷 + * @return 缁撴灉 + */ + @Override + public String checkDictTypeUnique(SysDictType dict) { + String dictId = StringUtils.isNull(dict.getId()) ? "-1L" : dict.getId(); + SysDictType dictType = this.dictTypeMapper.selectOne(Wraps.lbQ(dict).eq(SysDictType::getDictType, dict.getDictType())); + if (StringUtils.isNotNull(dictType) && !dictId.equals(dictType.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysLogininforServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..5d84506 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,69 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.biz.PageInfo; +import com.easy.mongodb.core.conditions.Wrapper; +import com.ruoyi.common.core.domain.entity.SysLogininfor; +import com.ruoyi.common.core.mapper.SysLogininforMapper; +import com.ruoyi.common.core.service.ISysLogininforService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysLogininforServiceImpl implements ISysLogininforService { + + @Autowired + private SysLogininforMapper logininforMapper; + + /** + * 鏂板绯荤粺鐧诲綍鏃ュ織 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + */ + @Override + public void insertLogininfor(SysLogininfor logininfor) { + this.logininforMapper.insert(logininfor); + } + + /** + * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎 + * + * @param logininfor 璁块棶鏃ュ織瀵硅薄 + * @return 鐧诲綍璁板綍闆嗗悎 + */ + @Override + public List selectLogininforList(SysLogininfor logininfor) { + return this.logininforMapper.selectList(logininfor); + } + + @Override + public PageInfo page(Wrapper wrapper, Integer pageNum, Integer pageSize) { + return this.logininforMapper.page(wrapper, pageNum, pageSize); + } + + /** + * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織 + * + * @param infoIds 闇瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID + * @return 缁撴灉 + */ + @Override + public int deleteLogininforByIds(String[] infoIds) { + return this.logininforMapper.deleteBatchIds(Arrays.asList(infoIds)).intValue(); + } + + /** + * 娓呯┖绯荤粺鐧诲綍鏃ュ織 + */ + @Override + public void cleanLogininfor() { + this.logininforMapper.drop(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysMenuServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..fbfdceb --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,458 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.TreeSelect; +import com.ruoyi.common.core.domain.entity.*; +import com.ruoyi.common.core.domain.vo.MetaVo; +import com.ruoyi.common.core.domain.vo.RouterVo; +import com.ruoyi.common.core.mapper.*; +import com.ruoyi.common.core.service.ISysMenuService; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 鑿滃崟 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysMenuServiceImpl implements ISysMenuService { + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; + + @Autowired + private SysMenuMapper menuMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + @Autowired + private SysUserMapper userMapper; + @Autowired + private SysUserRoleMapper userRoleMapper; + + /** + * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param userId 鐢ㄦ埛ID + * @return 鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuList(String userId) { + return this.selectMenuList(new SysMenu(), userId); + } + + /** + * 鏌ヨ绯荤粺鑿滃崟鍒楄〃 + * + * @param menu 鑿滃崟淇℃伅 + * @return 鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuList(SysMenu menu, String userId) { + List menuList = null; + // 绠$悊鍛樻樉绀烘墍鏈夎彍鍗曚俊鎭 + SysUser user = this.userMapper.selectOne(Wraps.lbQ(SysUser.class).eq(SysUser::getId, userId)); + if (user.isAdmin()) { + menuList = this.menuMapper.selectList(Wraps.lbQ(menu)); + } else { + menu.getParams().put("userId", userId); + List roleIds = this.userRoleMapper.selectList(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)).stream().map(e -> e.getRoleId().toHexString()).collect(Collectors.toList()); + List roleMenus = this.roleMenuMapper.selectList(Wraps.lbQ(SysRoleMenu.class).in(SysRoleMenu::getRoleId, roleIds)); + menuList = this.menuMapper.selectList(Wraps.lbQ(SysMenu.class).in(SysMenu::getId, roleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()))); + } + return menuList; + } + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + @Override + public Set selectMenuPermsByUserId(String userId) { + List roleIds = this.userRoleMapper.selectList(Wraps.lbQ().eq(SysUserRole::getUserId, userId)).stream().map(e -> e.getRoleId().toHexString()).collect(Collectors.toList()); + List roleMenus = this.roleMenuMapper.selectList(Wraps.lbQ(SysRoleMenu.class).in(SysRoleMenu::getRoleId, roleIds)); + List menus = this.menuMapper.selectList(Wraps.lbQ(SysMenu.class).in(SysMenu::getId, roleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()))); + List perms = menus.stream().map(e -> e.getPerms()).collect(Collectors.toList()); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟 + * + * @param userId 鐢ㄦ埛鍚嶇О + * @return 鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuTreeByUserId(String userId) { + List menus = null; + SysUser user = this.userMapper.selectById(userId); + if (user.isAdmin()) { + menus = this.menuMapper.selectList(Wraps.lbQ()); + } else { + List roleIds = this.userRoleMapper.selectList(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)).stream().map(e -> e.getRoleId().toHexString()).collect(Collectors.toList()); + List roleMenus = this.roleMenuMapper.selectList(Wraps.lbQ(SysRoleMenu.class).in(SysRoleMenu::getRoleId, roleIds)); + menus = this.menuMapper.selectList(Wraps.lbQ(SysMenu.class).in(SysMenu::getId, roleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()))); + } + return this.getChildPerms(menus, "0"); + } + + /** + * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭 + * + * @param roleId 瑙掕壊ID + * @return 閫変腑鑿滃崟鍒楄〃 + */ + @Override + public List selectMenuListByRoleId(String roleId) { + SysRole role = this.roleMapper.selectById(roleId); +// return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); + return role.getMenuIds(); + } + + /** + * 鏋勫缓鍓嶇璺敱鎵闇瑕佺殑鑿滃崟 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 璺敱鍒楄〃 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList(); + for (SysMenu menu : menus) { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(SysMenuServiceImpl.getRouteName(menu)); + router.setPath(SysMenuServiceImpl.getRouterPath(menu)); + router.setComponent(SysMenuServiceImpl.getComponent(menu)); + router.setQuery(menu.getQuery()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(this.buildMenus(cMenus)); + } else if (SysMenuServiceImpl.isMenuFrame(menu)) { + router.setMeta(null); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQuery()); + childrenList.add(children); + router.setChildren(childrenList); + } else if ("0".equals(menu.getParentId()) && SysMenuServiceImpl.isInnerLink(menu)) { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + String routerPath = SysMenuServiceImpl.innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(StringUtils.capitalize(routerPath)); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佹爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 鏍戠粨鏋勫垪琛 + */ + @Override + public List buildMenuTree(List menus) { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (SysMenu dept : menus) { + tempList.add(dept.getId()); + } + for (Iterator iterator = menus.iterator(); iterator.hasNext(); ) { + SysMenu menu = (SysMenu) iterator.next(); + // 濡傛灉鏄《绾ц妭鐐, 閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣 + if (!tempList.contains(menu.getParentId())) { + this.recursionFn(menus, menu); + returnList.add(menu); + } + } + if (returnList.isEmpty()) { + returnList = menus; + } + return returnList; + } + + /** + * 鏋勫缓鍓嶇鎵闇瑕佷笅鎷夋爲缁撴瀯 + * + * @param menus 鑿滃崟鍒楄〃 + * @return 涓嬫媺鏍戠粨鏋勫垪琛 + */ + @Override + public List buildMenuTreeSelect(List menus) { + List menuTrees = this.buildMenuTree(menus); + return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 鑿滃崟淇℃伅 + */ + @Override + public SysMenu selectMenuById(String menuId) { + return this.menuMapper.selectOne(Wraps.lbQ(SysMenu.class).eq(SysMenu::getParentId, menuId)); + } + + /** + * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + @Override + public boolean hasChildByMenuId(String menuId) { + int result = this.menuMapper.selectCount(Wraps.lbQ(SysMenu.class).eq(SysMenu::getParentId, menuId)).intValue(); + return result > 0; + } + + /** + * 鏌ヨ鑿滃崟浣跨敤鏁伴噺 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + @Override + public boolean checkMenuExistRole(String menuId) { + int result = this.roleMenuMapper.selectCount(Wraps.lbQ(SysRoleMenu.class).eq(SysRoleMenu::getMenuId, menuId)).intValue(); + return result > 0; + } + + /** + * 鏂板淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertMenu(SysMenu menu) { + return this.menuMapper.insert(menu).intValue(); + } + + /** + * 淇敼淇濆瓨鑿滃崟淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateMenu(SysMenu menu) { + return this.menuMapper.updateById(menu).intValue(); + } + + /** + * 鍒犻櫎鑿滃崟绠$悊淇℃伅 + * + * @param menuId 鑿滃崟ID + * @return 缁撴灉 + */ + @Override + public int deleteMenuById(String menuId) { + return this.menuMapper.deleteById(menuId).intValue(); + } + + /** + * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkMenuNameUnique(SysMenu menu) { + String menuId = StringUtils.isNull(menu.getId()) ? "-1L" : menu.getId(); + SysMenu info = this.menuMapper.selectOne(Wraps.lbQ(SysMenu.class).eq(SysMenu::getMenuName, menu.getMenuName()).eq(SysMenu::getParentId, menu.getParentId())); + if (StringUtils.isNotNull(info) && !menuId.equals(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鑾峰彇璺敱鍚嶇О + * + * @param menu 鑿滃崟淇℃伅 + * @return 璺敱鍚嶇О + */ + public static String getRouteName(SysMenu menu) { + String routerName = StringUtils.capitalize(menu.getPath()); + // 闈炲閾惧苟涓旀槸涓绾х洰褰曪紙绫诲瀷涓虹洰褰曪級 + if (SysMenuServiceImpl.isMenuFrame(menu)) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 鑾峰彇璺敱鍦板潃 + * + * @param menu 鑿滃崟淇℃伅 + * @return 璺敱鍦板潃 + */ + public static String getRouterPath(SysMenu menu) { + String routerPath = menu.getPath(); + // 鍐呴摼鎵撳紑澶栫綉鏂瑰紡 + if (!"0".equals(menu.getParentId()) && SysMenuServiceImpl.isInnerLink(menu)) { + routerPath = SysMenuServiceImpl.innerLinkReplaceEach(routerPath); + } + // 闈炲閾惧苟涓旀槸涓绾х洰褰曪紙绫诲瀷涓虹洰褰曪級 + if ("0".equals(menu.getParentId()) && UserConstants.TYPE_DIR.equals(menu.getMenuType()) + && UserConstants.NO_FRAME.equals(menu.getIsFrame())) { + routerPath = "/" + menu.getPath(); + } + // 闈炲閾惧苟涓旀槸涓绾х洰褰曪紙绫诲瀷涓鸿彍鍗曪級 + else if (SysMenuServiceImpl.isMenuFrame(menu)) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 鑾峰彇缁勪欢淇℃伅 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁勪欢淇℃伅 + */ + public static String getComponent(SysMenu menu) { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !SysMenuServiceImpl.isMenuFrame(menu)) { + component = menu.getComponent(); + } else if (StringUtils.isEmpty(menu.getComponent()) && !"0".equals(menu.getParentId()) && SysMenuServiceImpl.isInnerLink(menu)) { + component = UserConstants.INNER_LINK; + } else if (StringUtils.isEmpty(menu.getComponent()) && SysMenuServiceImpl.isParentView(menu)) { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 鏄惁涓鸿彍鍗曞唴閮ㄨ烦杞 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public static boolean isMenuFrame(SysMenu menu) { + return "0".equals(menu.getParentId()) && UserConstants.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(UserConstants.NO_FRAME); + } + + /** + * 鏄惁涓哄唴閾剧粍浠 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public static boolean isInnerLink(SysMenu menu) { + return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); + } + + /** + * 鏄惁涓簆arent_view缁勪欢 + * + * @param menu 鑿滃崟淇℃伅 + * @return 缁撴灉 + */ + public static boolean isParentView(SysMenu menu) { + return !"0".equals(menu.getParentId()) && UserConstants.TYPE_DIR.equals(menu.getMenuType()); + } + + /** + * 鏍规嵁鐖惰妭鐐圭殑ID鑾峰彇鎵鏈夊瓙鑺傜偣 + * + * @param list 鍒嗙被琛 + * @param parentId 浼犲叆鐨勭埗鑺傜偣ID + * @return String + */ + public List getChildPerms(List list, String parentId) { + List returnList = new ArrayList(); + for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { + SysMenu t = (SysMenu) iterator.next(); + // 涓銆佹牴鎹紶鍏ョ殑鏌愪釜鐖惰妭鐐笽D,閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣 + if (t.getParentId().equals(parentId)) { + this.recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 閫掑綊鍒楄〃 + * + * @param list + * @param t + */ + private void recursionFn(List list, SysMenu t) { + // 寰楀埌瀛愯妭鐐瑰垪琛 + List childList = SysMenuServiceImpl.getChildList(list, t); + t.setChildren(childList); + for (SysMenu tChild : childList) { + if (SysMenuServiceImpl.hasChild(list, tChild)) { + this.recursionFn(list, tChild); + } + } + } + + /** + * 寰楀埌瀛愯妭鐐瑰垪琛 + */ + private static List getChildList(List list, SysMenu t) { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + SysMenu n = (SysMenu) it.next(); + if (t.getId().equals(n.getParentId())) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣 + */ + private static boolean hasChild(List list, SysMenu t) { + return SysMenuServiceImpl.getChildList(list, t).size() > 0; + } + + /** + * 鍐呴摼鍩熷悕鐗规畩瀛楃鏇挎崲 + * + * @return + */ + public static String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS}, + new String[]{"", ""}); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysNoticeServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..8fc5d17 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,87 @@ +package com.ruoyi.common.core.service.impl; + +import com.ruoyi.common.core.domain.entity.SysNotice; +import com.ruoyi.common.core.mapper.SysNoticeMapper; +import com.ruoyi.common.core.service.ISysNoticeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 鍏憡 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class SysNoticeServiceImpl implements ISysNoticeService { + @Autowired + private SysNoticeMapper noticeMapper; + + /** + * 鏌ヨ鍏憡淇℃伅 + * + * @param noticeId 鍏憡ID + * @return 鍏憡淇℃伅 + */ + @Override + public SysNotice selectNoticeById(String noticeId) { + return this.noticeMapper.selectById(noticeId); + } + + /** + * 鏌ヨ鍏憡鍒楄〃 + * + * @param notice 鍏憡淇℃伅 + * @return 鍏憡闆嗗悎 + */ + @Override + public List selectNoticeList(SysNotice notice) { + return this.noticeMapper.selectList(notice); + } + + /** + * 鏂板鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertNotice(SysNotice notice) { + return this.noticeMapper.insert(notice).intValue(); + } + + /** + * 淇敼鍏憡 + * + * @param notice 鍏憡淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateNotice(SysNotice notice) { + return this.noticeMapper.updateById(notice).intValue(); + } + + /** + * 鍒犻櫎鍏憡瀵硅薄 + * + * @param noticeId 鍏憡ID + * @return 缁撴灉 + */ + @Override + public int deleteNoticeById(String noticeId) { + return this.noticeMapper.deleteById(noticeId).intValue(); + } + + /** + * 鎵归噺鍒犻櫎鍏憡淇℃伅 + * + * @param noticeIds 闇瑕佸垹闄ょ殑鍏憡ID + * @return 缁撴灉 + */ + @Override + public int deleteNoticeByIds(String[] noticeIds) { + return this.noticeMapper.deleteBatchIds(Arrays.asList(noticeIds)).intValue(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysOperLogServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..a8d3e8c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,79 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.biz.PageInfo; +import com.easy.mongodb.core.conditions.Wrapper; +import com.ruoyi.common.core.domain.entity.SysOperLog; +import com.ruoyi.common.core.mapper.SysOperLogMapper; +import com.ruoyi.common.core.service.ISysOperLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 鎿嶄綔鏃ュ織 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysOperLogServiceImpl implements ISysOperLogService { + @Autowired + private SysOperLogMapper operLogMapper; + + /** + * 鏂板鎿嶄綔鏃ュ織 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + */ + @Override + public void insertOperlog(SysOperLog operLog) { + this.operLogMapper.insert(operLog); + } + + /** + * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎 + * + * @param operLog 鎿嶄綔鏃ュ織瀵硅薄 + * @return 鎿嶄綔鏃ュ織闆嗗悎 + */ + @Override + public List selectOperLogList(SysOperLog operLog) { + return this.operLogMapper.selectList(operLog); + } + + /** + * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織 + * + * @param operIds 闇瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID + * @return 缁撴灉 + */ + @Override + public int deleteOperLogByIds(String[] operIds) { + return this.operLogMapper.deleteBatchIds(Arrays.asList(operIds)).intValue(); + } + + /** + * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏 + * + * @param operId 鎿嶄綔ID + * @return 鎿嶄綔鏃ュ織瀵硅薄 + */ + @Override + public SysOperLog selectOperLogById(String operId) { + return this.operLogMapper.selectById(operId); + } + + /** + * 娓呯┖鎿嶄綔鏃ュ織 + */ + @Override + public void cleanOperLog() { + this.operLogMapper.drop(); + } + + @Override + public PageInfo page(Wrapper wrapper, Integer pageNum, Integer pageSize) { + return this.operLogMapper.page(wrapper, pageNum, pageSize); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysPostServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..5a9a848 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysPostServiceImpl.java @@ -0,0 +1,167 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysPost; +import com.ruoyi.common.core.domain.entity.SysUserPost; +import com.ruoyi.common.core.mapper.SysPostMapper; +import com.ruoyi.common.core.mapper.SysUserPostMapper; +import com.ruoyi.common.core.service.ISysPostService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 宀椾綅淇℃伅 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysPostServiceImpl implements ISysPostService { + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + /** + * 鏌ヨ宀椾綅淇℃伅闆嗗悎 + * + * @param post 宀椾綅淇℃伅 + * @return 宀椾綅淇℃伅闆嗗悎 + */ + @Override + public List selectPostList(SysPost post) { + return this.postMapper.selectList(post); + } + + /** + * 鏌ヨ鎵鏈夊矖浣 + * + * @return 宀椾綅鍒楄〃 + */ + @Override + public List selectPostAll() { + return this.postMapper.selectList(new SysPost()); + } + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + @Override + public SysPost selectPostById(String postId) { + return this.postMapper.selectById(postId); + } + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑宀椾綅ID鍒楄〃 + */ + @Override + public List selectPostListByUserId(String userId) { + return this.userPostMapper.selectList(Wraps.lbQ(SysUserPost.class).eq(SysUserPost::getUserId, userId)).stream().map(e -> e.getPostId().toHexString()).collect(Collectors.toList()); + } + + /** + * 鏍¢獙宀椾綅鍚嶇О鏄惁鍞竴 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkPostNameUnique(SysPost post) { + String postId = StringUtils.isNull(post.getId()) ? "-1L" : post.getId(); + SysPost info = this.postMapper.selectOne(Wraps.lbQ(SysPost.class).eq(SysPost::getPostName, post.getPostName())); + if (StringUtils.isNotNull(info) && !postId.equalsIgnoreCase(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙宀椾綅缂栫爜鏄惁鍞竴 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkPostCodeUnique(SysPost post) { + String postId = StringUtils.isNull(post.getId()) ? "-1L" : post.getId(); + SysPost info = this.postMapper.selectOne(Wraps.lbQ(SysPost.class).eq(SysPost::getPostCode, post.getPostCode())); + if (StringUtils.isNotNull(info) && !postId.equals(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + @Override + public int countUserPostById(String postId) { + return this.userPostMapper.selectCount(Wraps.lbQ(SysUserPost.class).eq(SysUserPost::getPostId, postId)).intValue(); + } + + /** + * 鍒犻櫎宀椾綅淇℃伅 + * + * @param postId 宀椾綅ID + * @return 缁撴灉 + */ + @Override + public int deletePostById(String postId) { + return this.postMapper.deleteById(postId).intValue(); + } + + /** + * 鎵归噺鍒犻櫎宀椾綅淇℃伅 + * + * @param postIds 闇瑕佸垹闄ょ殑宀椾綅ID + * @return 缁撴灉 + */ + @Override + public int deletePostByIds(String[] postIds) { + for (String postId : postIds) { + SysPost post = this.selectPostById(postId); + if (this.countUserPostById(postId) > 0) { + throw new ServiceException(String.format("%1$s宸插垎閰,涓嶈兘鍒犻櫎", post.getPostName())); + } + } + return this.postMapper.deleteBatchIds(Arrays.asList(postIds)).intValue(); + } + + /** + * 鏂板淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertPost(SysPost post) { + return this.postMapper.insert(post).intValue(); + } + + /** + * 淇敼淇濆瓨宀椾綅淇℃伅 + * + * @param post 宀椾綅淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updatePost(SysPost post) { + return this.postMapper.updateById(post).intValue(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysRoleServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..e8dfdff --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,384 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysRoleDept; +import com.ruoyi.common.core.domain.entity.SysRoleMenu; +import com.ruoyi.common.core.domain.entity.SysUserRole; +import com.ruoyi.common.core.mapper.*; +import com.ruoyi.common.core.service.ISysRoleService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 瑙掕壊 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysRoleServiceImpl implements ISysRoleService { + @Autowired + private SysUserMapper userMapper; + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁 + * + * @param role 瑙掕壊淇℃伅 + * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅 + */ + @Override + @DataScope(deptAlias = "d") + public List selectRoleList(SysRole role) { + return this.roleMapper.selectList(role); + } + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊 + * + * @param userId 鐢ㄦ埛ID + * @return 瑙掕壊鍒楄〃 + */ + @Override + public List selectRolesByUserId(String userId) { + List userRoleMids = this.userRoleMapper.selectList(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)); + List userRoles = this.roleMapper.selectList(Wraps.lbQ(SysRole.class).in(SysRole::getId, userRoleMids.stream().map(e -> e.getRoleId()).collect(Collectors.toList()))); + List roles = this.selectRoleAll(); + for (SysRole role : roles) { + for (SysRole userRole : userRoles) { + if (role.getId().equalsIgnoreCase(userRole.getId())) { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺 + * + * @param userId 鐢ㄦ埛ID + * @return 鏉冮檺鍒楄〃 + */ + @Override + public Set selectRolePermissionByUserId(String userId) { + List userRoleMids = this.userRoleMapper.selectList(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)); + List perms = this.roleMapper.selectList(Wraps.lbQ(SysRole.class).in(SysRole::getId, userRoleMids.stream().map(e -> e.getRoleId()).collect(Collectors.toList()))); + Set permsSet = new HashSet<>(); + for (SysRole perm : perms) { + if (StringUtils.isNotNull(perm)) { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + /** + * 鏌ヨ鎵鏈夎鑹 + * + * @return 瑙掕壊鍒楄〃 + */ + @Override + public List selectRoleAll() { + return SpringUtils.getAopProxy(this).selectRoleList(new SysRole()); + } + + /** + * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛 + * + * @param userId 鐢ㄦ埛ID + * @return 閫変腑瑙掕壊ID鍒楄〃 + */ + @Override + public List selectRoleListByUserId(String userId) { + List userRoleMids = this.userRoleMapper.selectList(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)); + return userRoleMids.stream().map(e -> e.getRoleId().toHexString()).collect(Collectors.toList()); + } + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 瑙掕壊瀵硅薄淇℃伅 + */ + @Override + public SysRole selectRoleById(String roleId) { + return this.roleMapper.selectById(roleId); + } + + /** + * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkRoleNameUnique(SysRole role) { + String roleId = StringUtils.isNull(role.getId()) ? "-1L" : role.getId(); + SysRole info = this.roleMapper.selectOne(Wraps.lbQ(SysRole.class).eq(SysRole::getRoleName, role.getRoleName())); + if (StringUtils.isNotNull(info) && !roleId.equals(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + public String checkRoleKeyUnique(SysRole role) { + String roleId = StringUtils.isNull(role.getId()) ? "-1L" : role.getId(); + SysRole info = this.roleMapper.selectOne(Wraps.lbQ(SysRole.class).eq(SysRole::getRoleKey, role.getRoleKey())); + if (StringUtils.isNotNull(info) && !roleId.equals(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙瑙掕壊鏄惁鍏佽鎿嶄綔 + * + * @param role 瑙掕壊淇℃伅 + */ + @Override + public void checkRoleAllowed(SysRole role) { + if (StringUtils.isNotNull(role.getId()) && role.isAdmin()) { + throw new ServiceException("涓嶅厑璁告搷浣滆秴绾х鐞嗗憳瑙掕壊"); + } + } + + /** + * 鏍¢獙瑙掕壊鏄惁鏈夋暟鎹潈闄 + * + * @param roleId 瑙掕壊id + */ + @Override + public void checkRoleDataScope(String roleId) { + if (!SecurityUtils.getLoginUser().getUser().isAdmin()) { + SysRole role = new SysRole(); + role.setId(roleId); + List roles = SpringUtils.getAopProxy(this).selectRoleList(role); + if (StringUtils.isEmpty(roles)) { + throw new ServiceException("娌℃湁鏉冮檺璁块棶瑙掕壊鏁版嵁锛"); + } + } + } + + /** + * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + @Override + public int countUserRoleByRoleId(String roleId) { + return this.userRoleMapper.selectCount(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getRoleId, roleId)).intValue(); + } + + /** + * 鏂板淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int insertRole(SysRole role) { + // 鏂板瑙掕壊淇℃伅 + this.roleMapper.insert(role); + return this.insertRoleMenu(role); + } + + /** + * 淇敼淇濆瓨瑙掕壊淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int updateRole(SysRole role) { + // 淇敼瑙掕壊淇℃伅 + this.roleMapper.updateById(role); + // 鍒犻櫎瑙掕壊涓庤彍鍗曞叧鑱 + this.roleMenuMapper.delete(Wraps.lbQ(SysRoleMenu.class).eq(SysRoleMenu::getRoleId, role.getId())); + return this.insertRoleMenu(role); + } + + /** + * 淇敼瑙掕壊鐘舵 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateRoleStatus(SysRole role) { + return this.roleMapper.updateById(role).intValue(); + } + + /** + * 淇敼鏁版嵁鏉冮檺淇℃伅 + * + * @param role 瑙掕壊淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int authDataScope(SysRole role) { + // 淇敼瑙掕壊淇℃伅 + this.roleMapper.updateById(role); + // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱 + this.roleDeptMapper.delete(Wraps.lbQ(SysRoleDept.class).eq(SysRoleDept::getRoleId, role.getId())); + // 鏂板瑙掕壊鍜岄儴闂ㄤ俊鎭紙鏁版嵁鏉冮檺锛 + return this.insertRoleDept(role); + } + + /** + * 鏂板瑙掕壊鑿滃崟淇℃伅 + * + * @param role 瑙掕壊瀵硅薄 + */ + public int insertRoleMenu(SysRole role) { + int rows = 1; + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + List list = new ArrayList(); + for (String menuId : role.getMenuIds()) { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) { + rows = this.roleMenuMapper.insertBatch(list).intValue(); + } + return rows; + } + + /** + * 鏂板瑙掕壊閮ㄩ棬淇℃伅(鏁版嵁鏉冮檺) + * + * @param role 瑙掕壊瀵硅薄 + */ + public int insertRoleDept(SysRole role) { + int rows = 1; + // 鏂板瑙掕壊涓庨儴闂紙鏁版嵁鏉冮檺锛夌鐞 + List list = new ArrayList(); + for (String deptId : role.getDeptIds()) { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) { + rows = this.roleDeptMapper.insertBatch(list).intValue(); + } + return rows; + } + + /** + * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteRoleById(String roleId) { + // 鍒犻櫎瑙掕壊涓庤彍鍗曞叧鑱 + this.roleMenuMapper.delete(Wraps.lbQ(SysRoleMenu.class).eq(SysRoleMenu::getRoleId, roleId)); + // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱 + this.roleDeptMapper.delete(Wraps.lbQ(SysRoleDept.class).eq(SysRoleDept::getRoleId, roleId)); + return this.roleMapper.deleteById(roleId).intValue(); + } + + /** + * 鎵归噺鍒犻櫎瑙掕壊淇℃伅 + * + * @param roleIds 闇瑕佸垹闄ょ殑瑙掕壊ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteRoleByIds(String[] roleIds) { + for (String roleId : roleIds) { + this.checkRoleAllowed(new SysRole(roleId)); + this.checkRoleDataScope(roleId); + SysRole role = this.selectRoleById(roleId); + if (this.countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException(String.format("%1$s宸插垎閰,涓嶈兘鍒犻櫎", role.getRoleName())); + } + } + // 鍒犻櫎瑙掕壊涓庤彍鍗曞叧鑱 + this.roleMenuMapper.delete(Wraps.lbQ(SysRoleMenu.class).in(SysRoleMenu::getRoleId, roleIds)); + // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱 + this.roleDeptMapper.delete(Wraps.lbQ(SysRoleDept.class).in(SysRoleDept::getRoleId, roleIds)); + return this.roleMapper.deleteBatchIds(Arrays.asList(roleIds)).intValue(); + } + + /** + * 鍙栨秷鎺堟潈鐢ㄦ埛瑙掕壊 + * + * @param userRole 鐢ㄦ埛鍜岃鑹插叧鑱斾俊鎭 + * @return 缁撴灉 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) { + return this.userRoleMapper.deleteById(userRole).intValue(); + } + + /** + * 鎵归噺鍙栨秷鎺堟潈鐢ㄦ埛瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @param userIds 闇瑕佸彇娑堟巿鏉冪殑鐢ㄦ埛鏁版嵁ID + * @return 缁撴灉 + */ + @Override + public int deleteAuthUsers(String roleId, String[] userIds) { + return this.userRoleMapper.delete(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getRoleId, roleId).in(SysUserRole::getUserId, userIds)).intValue(); + } + + /** + * 鎵归噺閫夋嫨鎺堟潈鐢ㄦ埛瑙掕壊 + * + * @param roleId 瑙掕壊ID + * @param userIds 闇瑕佹巿鏉冪殑鐢ㄦ埛鏁版嵁ID + * @return 缁撴灉 + */ + @Override + public int insertAuthUsers(String roleId, String[] userIds) { + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + List list = new ArrayList(); + for (String userId : userIds) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + return this.userRoleMapper.insertBatch(list).intValue(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysUserOnlineServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysUserOnlineServiceImpl.java new file mode 100644 index 0000000..55f68c1 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysUserOnlineServiceImpl.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.core.service.impl; + +import com.ruoyi.common.core.domain.entity.SysUserOnline; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.service.ISysUserOnlineService; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.stereotype.Service; + +/** + * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysUserOnlineServiceImpl implements ISysUserOnlineService { + /** + * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + @Override + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { + if (StringUtils.equals(ipaddr, user.getIpaddr())) { + return this.loginUserToUserOnline(user); + } + return null; + } + + /** + * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + @Override + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) { + if (StringUtils.equals(userName, user.getUsername())) { + return this.loginUserToUserOnline(user); + } + return null; + } + + /** + * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 + * + * @param ipaddr 鐧诲綍鍦板潃 + * @param userName 鐢ㄦ埛鍚嶇О + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 + */ + @Override + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { + return this.loginUserToUserOnline(user); + } + return null; + } + + /** + * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鍦ㄧ嚎鐢ㄦ埛 + */ + @Override + public SysUserOnline loginUserToUserOnline(LoginUser user) { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) { + return null; + } + SysUserOnline sysUserOnline = new SysUserOnline(); + sysUserOnline.setTokenId(user.getToken()); + sysUserOnline.setUserName(user.getUsername()); + sysUserOnline.setIpaddr(user.getIpaddr()); + sysUserOnline.setLoginLocation(user.getLoginLocation()); + sysUserOnline.setBrowser(user.getBrowser()); + sysUserOnline.setOs(user.getOs()); + sysUserOnline.setLoginTime(user.getLoginTime()); + if (StringUtils.isNotNull(user.getUser().getDept())) { + sysUserOnline.setDeptName(user.getUser().getDept().getDeptName()); + } + return sysUserOnline; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysUserServiceImpl.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..489e7fa --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/service/impl/SysUserServiceImpl.java @@ -0,0 +1,485 @@ +package com.ruoyi.common.core.service.impl; + +import com.easy.mongodb.core.toolkit.Wraps; +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.*; +import com.ruoyi.common.core.mapper.*; +import com.ruoyi.common.core.service.ISysConfigService; +import com.ruoyi.common.core.service.ISysUserService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanValidators; +import com.ruoyi.common.utils.spring.SpringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.validation.Validator; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 鐢ㄦ埛 涓氬姟灞傚鐞 + * + * @author ruoyi + */ +@Service +public class SysUserServiceImpl implements ISysUserService { + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); + + @Autowired + private SysUserMapper userMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + @Autowired + private ISysConfigService configService; + + @Autowired + protected Validator validator; + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUserList(SysUser user) { + return this.userMapper.selectList(user); + } + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectAllocatedList(SysUser user) { +// return this.userMapper.selectAllocatedList(user); + return this.userMapper.selectList(Wraps.lbQ(user)); + } + + /** + * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUnallocatedList(SysUser user) { +// return this.userMapper.selectUnallocatedList(user); + return this.userMapper.selectList(user); + } + + /** + * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴 + * + * @param userName 鐢ㄦ埛鍚 + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + @Override + public SysUser selectUserByUserName(String userName) { + return this.userMapper.selectOne(Wraps.lbQ(SysUser.class).eq(SysUser::getUserName, userName)); + } + + /** + * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + @Override + public SysUser selectUserById(String userId) { + return this.userMapper.selectOne(Wraps.lbQ(SysUser.class).eq(SysUser::getId, userId)); + } + + /** + * 鏌ヨ鐢ㄦ埛鎵灞炶鑹茬粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + @Override + public String selectUserRoleGroup(String userName) { + this.userMapper.selectOne(Wraps.lbQ(SysUser.class).eq(SysUser::getUserName, userName)); + List list = this.roleMapper.selectList(Wraps.lbQ()); + if (CollectionUtils.isEmpty(list)) { + return StringUtils.EMPTY; + } + return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); + } + + /** + * 鏌ヨ鐢ㄦ埛鎵灞炲矖浣嶇粍 + * + * @param userName 鐢ㄦ埛鍚 + * @return 缁撴灉 + */ + @Override + public String selectUserPostGroup(String userName) { + List list = this.userMapper.selectOne(Wraps.lbQ(SysUser.class).eq(SysUser::getUserName, userName)).getPostIds(); + if (CollectionUtils.isEmpty(list)) { + return StringUtils.EMPTY; + } + return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); + } + + /** + * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴 + * + * @param userName 鐢ㄦ埛鍚嶇О + * @return 缁撴灉 + */ + @Override + public String checkUserNameUnique(String userName) { + int count = this.userMapper.selectCount(Wraps.lbQ(SysUser.class).eq(SysUser::getUserName, userName)).intValue(); + if (count > 0) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙鎵嬫満鍙风爜鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return + */ + @Override + public String checkPhoneUnique(SysUser user) { + String userId = StringUtils.isNull(user.getId()) ? "-1" : user.getId(); + SysUser info = this.userMapper.selectOne(Wraps.lbQ().eq(SysUser::getPhonenumber, user.getPhonenumber())); + if (StringUtils.isNotNull(info) && info.getId() != userId) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙email鏄惁鍞竴 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return + */ + @Override + public String checkEmailUnique(SysUser user) { + String userId = StringUtils.isNull(user.getId()) ? "-1L" : user.getId(); + SysUser info = this.userMapper.selectOne(Wraps.lbQ(user).eq(SysUser::getEmail, user.getEmail())); + if (StringUtils.isNotNull(info) && !userId.equals(info.getId())) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 鏍¢獙鐢ㄦ埛鏄惁鍏佽鎿嶄綔 + * + * @param user 鐢ㄦ埛淇℃伅 + */ + @Override + public void checkUserAllowed(SysUser user) { + if (StringUtils.isNotNull(user.getId()) && user.isAdmin()) { + throw new ServiceException("涓嶅厑璁告搷浣滆秴绾х鐞嗗憳鐢ㄦ埛"); + } + } + + /** + * 鏍¢獙鐢ㄦ埛鏄惁鏈夋暟鎹潈闄 + * + * @param userId 鐢ㄦ埛id + */ + @Override + public void checkUserDataScope(String userId) { + SysUser user = this.userMapper.selectById(SecurityUtils.getUserId()); + if (!user.isAdmin()) { + SysUser user1 = new SysUser(); + user1.setId(userId); + List users = SpringUtils.getAopProxy(this).selectUserList(user1); + if (StringUtils.isEmpty(users)) { + throw new ServiceException("娌℃湁鏉冮檺璁块棶鐢ㄦ埛鏁版嵁锛"); + } + } + } + + /** + * 鏂板淇濆瓨鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int insertUser(SysUser user) { + // 鏂板鐢ㄦ埛淇℃伅 + int rows = this.userMapper.insert(user).intValue(); + // 鏂板鐢ㄦ埛宀椾綅鍏宠仈 + this.insertUserPost(user); + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + this.insertUserRole(user); + return rows; + } + + /** + * 娉ㄥ唽鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + public boolean registerUser(SysUser user) { + return this.userMapper.insert(user) > 0; + } + + /** + * 淇敼淇濆瓨鐢ㄦ埛淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public int updateUser(SysUser user) { + String userId = user.getId(); + // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱 + this.userRoleMapper.delete(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)); + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + this.insertUserRole(user); + // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶅叧鑱 + this.userPostMapper.delete(Wraps.lbQ(SysUserPost.class).eq(SysUserPost::getUserId, userId)); + // 鏂板鐢ㄦ埛涓庡矖浣嶇鐞 + this.insertUserPost(user); + return 1;//this.userMapper.updateUser(user); + } + + /** + * 鐢ㄦ埛鎺堟潈瑙掕壊 + * + * @param userId 鐢ㄦ埛ID + * @param roleIds 瑙掕壊缁 + */ + @Override + @Transactional + public void insertUserAuth(String userId, String[] roleIds) { + this.userRoleMapper.delete(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)); + this.insertUserRole(userId, roleIds); + } + + /** + * 淇敼鐢ㄦ埛鐘舵 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateUserStatus(SysUser user) { + return 1;//this.userMapper.updateUser(user); + } + + /** + * 淇敼鐢ㄦ埛鍩烘湰淇℃伅 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateUserProfile(SysUser user) { + return 1;//this.userMapper.updateUser(user); + } + + /** + * 淇敼鐢ㄦ埛澶村儚 + * + * @param userName 鐢ㄦ埛鍚 + * @param avatar 澶村儚鍦板潃 + * @return 缁撴灉 + */ + @Override + public boolean updateUserAvatar(String userName, String avatar) { + return true;//this.userMapper.updateUserAvatar(userName, avatar) > 0; + } + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 缁撴灉 + */ + @Override + public int resetPwd(SysUser user) { + return 1;//this.userMapper.updateUser(user); + } + + /** + * 閲嶇疆鐢ㄦ埛瀵嗙爜 + * + * @param userName 鐢ㄦ埛鍚 + * @param password 瀵嗙爜 + * @return 缁撴灉 + */ + @Override + public int resetUserPwd(String userName, String password) { + return 1;//this.userMapper.resetUserPwd(userName, password); + } + + /** + * 鏂板鐢ㄦ埛瑙掕壊淇℃伅 + * + * @param user 鐢ㄦ埛瀵硅薄 + */ + public void insertUserRole(SysUser user) { + this.insertUserRole(user.getId(), user.getRoleIds()); + } + + /** + * 鏂板鐢ㄦ埛宀椾綅淇℃伅 + * + * @param user 鐢ㄦ埛瀵硅薄 + */ + public void insertUserPost(SysUser user) { + List posts = user.getPostIds().stream().map(SysPost::getId).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(posts)) { + // 鏂板鐢ㄦ埛涓庡矖浣嶇鐞 + List list = new ArrayList(posts.size()); + for (String postId : posts) { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getId()); + up.setPostId(postId); + list.add(up); + } + this.userPostMapper.insertBatch(list); + } + } + + /** + * 鏂板鐢ㄦ埛瑙掕壊淇℃伅 + * + * @param userId 鐢ㄦ埛ID + * @param roleIds 瑙掕壊缁 + */ + public void insertUserRole(String userId, String[] roleIds) { + if (StringUtils.isNotEmpty(roleIds)) { + // 鏂板鐢ㄦ埛涓庤鑹茬鐞 + List list = new ArrayList(roleIds.length); + for (String roleId : roleIds) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + this.userRoleMapper.insertBatch(list); + } + } + + /** + * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteUserById(String userId) { + // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱 + this.userRoleMapper.delete(Wraps.lbQ(SysUserRole.class).eq(SysUserRole::getUserId, userId)); + // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶅叧鑱 + this.userPostMapper.delete(Wraps.lbQ(SysUserPost.class).eq(SysUserPost::getUserId, userId)); + return this.userMapper.delete(Wraps.lbQ(SysUser.class).eq(SysUser::getId, userId)).intValue(); + } + + /** + * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅 + * + * @param userIds 闇瑕佸垹闄ょ殑鐢ㄦ埛ID + * @return 缁撴灉 + */ + @Override + @Transactional + public int deleteUserByIds(String[] userIds) { + for (String userId : userIds) { + this.checkUserAllowed(new SysUser(userId)); + this.checkUserDataScope(userId); + } + // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱 + this.userRoleMapper.delete(Wraps.lbQ(SysUserRole.class).in(SysUserRole::getUserId, userIds)); + // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶅叧鑱 + this.userPostMapper.delete(Wraps.lbQ(SysUserPost.class).in(SysUserPost::getUserId, userIds)); + return this.userMapper.delete(Wraps.lbQ(SysUser.class).in(SysUser::getId, userIds)).intValue(); + } + + /** + * 瀵煎叆鐢ㄦ埛鏁版嵁 + * + * @param userList 鐢ㄦ埛鏁版嵁鍒楄〃 + * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁 + * @param operName 鎿嶄綔鐢ㄦ埛 + * @return 缁撴灉 + */ + @Override + public String importUser(List userList, Boolean isUpdateSupport, String operName) { + if (StringUtils.isNull(userList) || userList.size() == 0) { + throw new ServiceException("瀵煎叆鐢ㄦ埛鏁版嵁涓嶈兘涓虹┖锛"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + String password = this.configService.selectConfigByKey("sys.user.initPassword"); + for (SysUser user : userList) { + try { + // 楠岃瘉鏄惁瀛樺湪杩欎釜鐢ㄦ埛 + SysUser u = this.userMapper.selectOne(Wraps.lbQ(SysUser.class).eq(SysUser::getUserName + , user.getUserName())); + if (StringUtils.isNull(u)) { + BeanValidators.validateWithException(this.validator, user); + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operName); + this.insertUser(user); + successNum++; + successMsg.append("
" + successNum + "銆佽处鍙 " + user.getUserName() + " 瀵煎叆鎴愬姛"); + } else if (isUpdateSupport) { + BeanValidators.validateWithException(this.validator, user); + user.setUpdateBy(operName); + this.updateUser(user); + successNum++; + successMsg.append("
" + successNum + "銆佽处鍙 " + user.getUserName() + " 鏇存柊鎴愬姛"); + } else { + failureNum++; + failureMsg.append("
" + failureNum + "銆佽处鍙 " + user.getUserName() + " 宸插瓨鍦"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "銆佽处鍙 " + user.getUserName() + " 瀵煎叆澶辫触锛"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + } + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏 " + successNum + " 鏉★紝鏁版嵁濡備笅锛"); + } + return successMsg.toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java new file mode 100644 index 0000000..84124aa --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import com.ruoyi.common.utils.StringUtils; + +/** + * 瀛楃闆嗗伐鍏风被 + * + * @author ruoyi + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 杞崲涓篊harset瀵硅薄 + * + * @param charset 瀛楃闆嗭紝涓虹┖鍒欒繑鍥為粯璁ゅ瓧绗﹂泦 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮 + * + * @param source 瀛楃涓 + * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1 + * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8 + * @return 杞崲鍚庣殑瀛楃闆 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮 + * + * @param source 瀛楃涓 + * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1 + * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8 + * @return 杞崲鍚庣殑瀛楃闆 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 绯荤粺瀛楃闆嗙紪鐮 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/text/Convert.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/text/Convert.java new file mode 100644 index 0000000..32200ee --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/text/Convert.java @@ -0,0 +1,1000 @@ +package com.ruoyi.common.core.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import com.ruoyi.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 绫诲瀷杞崲鍣 + * + * @author ruoyi + */ +public class Convert +{ + /** + * 杞崲涓哄瓧绗︿覆
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 杞崲涓哄瓧绗︿覆
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 杞崲涓哄瓧绗
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 杞崲涓哄瓧绗
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 杞崲涓篵yte
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篵yte
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 杞崲涓篠hort
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篠hort
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 杞崲涓篘umber
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篘umber
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 杞崲涓篿nt
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篿nt
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 杞崲涓篒nteger鏁扮粍
+ * + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 杞崲涓篖ong鏁扮粍
+ * + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 杞崲涓篒nteger鏁扮粍
+ * + * @param split 鍒嗛殧绗 + * @param split 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 杞崲涓篖ong鏁扮粍
+ * + * @param split 鍒嗛殧绗 + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 杞崲涓篠tring鏁扮粍
+ * + * @param str 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 杞崲涓篠tring鏁扮粍
+ * + * @param split 鍒嗛殧绗 + * @param split 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 杞崲涓簂ong
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 鏀寔绉戝璁℃暟娉 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓簂ong
+ * 濡傛灉缁欏畾鐨勫间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 杞崲涓篸ouble
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 鏀寔绉戝璁℃暟娉 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篸ouble
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 杞崲涓篎loat
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篎loat
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 杞崲涓篵oolean
+ * String鏀寔鐨勫间负锛歵rue銆乫alse銆亂es銆乷k銆乶o锛1,0 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 杞崲涓篵oolean
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 杞崲涓篍num瀵硅薄
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * + * @param clazz Enum鐨凜lass + * @param value 鍊 + * @param defaultValue 榛樿鍊 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓篍num瀵硅薄
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * + * @param clazz Enum鐨凜lass + * @param value 鍊 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 杞崲涓築igInteger
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓築igInteger
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊null
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 杞崲涓築igDecimal
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊 + * @return 缁撴灉 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return new BigDecimal((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 杞崲涓築igDecimal
+ * 濡傛灉缁欏畾鐨勫间负绌猴紝鎴栬呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊
+ * 杞崲澶辫触涓嶄細鎶ラ敊 + * + * @param value 琚浆鎹㈢殑鍊 + * @return 缁撴灉 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 灏嗗璞¤浆涓哄瓧绗︿覆
+ * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶 + * + * @param obj 瀵硅薄 + * @return 瀛楃涓 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 灏嗗璞¤浆涓哄瓧绗︿覆
+ * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶 + * + * @param obj 瀵硅薄 + * @param charsetName 瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 灏嗗璞¤浆涓哄瓧绗︿覆
+ * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶 + * + * @param obj 瀵硅薄 + * @param charset 瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 灏哹yte鏁扮粍杞负瀛楃涓 + * + * @param bytes byte鏁扮粍 + * @param charset 瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 瑙g爜瀛楄妭鐮 + * + * @param data 瀛楃涓 + * @param charset 瀛楃闆嗭紝濡傛灉姝ゅ瓧娈典负绌猴紝鍒欒В鐮佺殑缁撴灉鍙栧喅浜庡钩鍙 + * @return 瑙g爜鍚庣殑瀛楃涓 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆 + * + * @param data 鏁版嵁 + * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆 + * + * @param data 鏁版嵁 + * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆 + * @return 瀛楃涓 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 鍏ㄨ鍗婅杞崲 + /** + * 鍗婅杞叏瑙 + * + * @param input String. + * @return 鍏ㄨ瀛楃涓. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 鍗婅杞叏瑙 + * + * @param input String + * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎 + * @return 鍏ㄨ瀛楃涓. + */ + public static String toSBC(String input, Set notConvertSet) + { + char c[] = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 璺宠繃涓嶆浛鎹㈢殑瀛楃 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 鍏ㄨ杞崐瑙 + * + * @param input String. + * @return 鍗婅瀛楃涓 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 鏇挎崲鍏ㄨ涓哄崐瑙 + * + * @param text 鏂囨湰 + * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎 + * @return 鏇挎崲鍚庣殑瀛楃 + */ + public static String toDBC(String text, Set notConvertSet) + { + char c[] = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 璺宠繃涓嶆浛鎹㈢殑瀛楃 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 鏁板瓧閲戦澶у啓杞崲 鍏堝啓涓畬鏁寸殑鐒跺悗灏嗗闆舵嬀鏇挎崲鎴愰浂 + * + * @param n 鏁板瓧 + * @return 涓枃澶у啓鏁板瓧 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "瑙", "鍒" }; + String[] digit = { "闆", "澹", "璐", "鍙", "鑲", "浼", "闄", "鏌", "鎹", "鐜" }; + String[][] unit = { { "鍏", "涓", "浜" }, { "", "鎷", "浣", "浠" } }; + + String head = n < 0 ? "璐" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(闆.)+", ""); + } + if (s.length() < 1) + { + s = "鏁"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(闆.)*闆$", "").replaceAll("^$", "闆") + unit[0][i] + s; + } + return head + s.replaceAll("(闆.)*闆跺厓", "鍏").replaceFirst("(闆.)+", "").replaceAll("(闆.)+", "闆").replaceAll("^鏁$", "闆跺厓鏁"); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java b/vapeshop-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java new file mode 100644 index 0000000..c78ac77 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java @@ -0,0 +1,92 @@ +package com.ruoyi.common.core.text; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 瀛楃涓叉牸寮忓寲 + * + * @author ruoyi + */ +public class StrFormatter +{ + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 鏍煎紡鍖栧瓧绗︿覆
+ * 姝ゆ柟娉曞彧鏄畝鍗曞皢鍗犱綅绗 {} 鎸夌収椤哄簭鏇挎崲涓哄弬鏁
+ * 濡傛灉鎯宠緭鍑 {} 浣跨敤 \\杞箟 { 鍗冲彲锛屽鏋滄兂杈撳嚭 {} 涔嬪墠鐨 \ 浣跨敤鍙岃浆涔夌 \\\\ 鍗冲彲
+ * 渚嬶細
+ * 閫氬父浣跨敤锛歠ormat("this is {} for {}", "a", "b") -> this is a for b
+ * 杞箟{}锛 format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 杞箟\锛 format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 瀛楃涓叉ā鏉 + * @param argArray 鍙傛暟鍒楄〃 + * @return 缁撴灉 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 鍒濆鍖栧畾涔夊ソ鐨勯暱搴︿互鑾峰緱鏇村ソ鐨勬ц兘 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 鍗犱綅绗︽墍鍦ㄤ綅缃 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 瀛楃涓叉ā鏉垮墿浣欓儴鍒嗕笉鍐嶅寘鍚崰浣嶇锛屽姞鍏ュ墿浣欓儴鍒嗗悗杩斿洖缁撴灉 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 杞箟绗︿箣鍓嶈繕鏈変竴涓浆涔夌锛屽崰浣嶇渚濇棫鏈夋晥 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 鍗犱綅绗﹁杞箟 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 姝e父鍗犱綅绗 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 鍔犲叆鏈鍚庝竴涓崰浣嶇鍚庢墍鏈夌殑瀛楃 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java b/vapeshop-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java new file mode 100644 index 0000000..10b7306 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.enums; + +/** + * 鎿嶄綔鐘舵 + * + * @author ruoyi + * + */ +public enum BusinessStatus +{ + /** + * 鎴愬姛 + */ + SUCCESS, + + /** + * 澶辫触 + */ + FAIL, +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/enums/BusinessType.java b/vapeshop-common/src/main/java/com/ruoyi/common/enums/BusinessType.java new file mode 100644 index 0000000..2e17c4a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.enums; + +/** + * 涓氬姟鎿嶄綔绫诲瀷 + * + * @author ruoyi + */ +public enum BusinessType +{ + /** + * 鍏跺畠 + */ + OTHER, + + /** + * 鏂板 + */ + INSERT, + + /** + * 淇敼 + */ + UPDATE, + + /** + * 鍒犻櫎 + */ + DELETE, + + /** + * 鎺堟潈 + */ + GRANT, + + /** + * 瀵煎嚭 + */ + EXPORT, + + /** + * 瀵煎叆 + */ + IMPORT, + + /** + * 寮洪 + */ + FORCE, + + /** + * 鐢熸垚浠g爜 + */ + GENCODE, + + /** + * 娓呯┖鏁版嵁 + */ + CLEAN, +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/vapeshop-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java new file mode 100644 index 0000000..0d945be --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.enums; + +/** + * 鏁版嵁婧 + * + * @author ruoyi + */ +public enum DataSourceType +{ + /** + * 涓诲簱 + */ + MASTER, + + /** + * 浠庡簱 + */ + SLAVE +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java b/vapeshop-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java new file mode 100644 index 0000000..be6f739 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java @@ -0,0 +1,36 @@ +package com.ruoyi.common.enums; + +import java.util.HashMap; +import java.util.Map; +import org.springframework.lang.Nullable; + +/** + * 璇锋眰鏂瑰紡 + * + * @author ruoyi + */ +public enum HttpMethod +{ + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; + + private static final Map mappings = new HashMap<>(16); + + static + { + for (HttpMethod httpMethod : values()) + { + mappings.put(httpMethod.name(), httpMethod); + } + } + + @Nullable + public static HttpMethod resolve(@Nullable String method) + { + return (method != null ? mappings.get(method) : null); + } + + public boolean matches(String method) + { + return (this == resolve(method)); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/enums/LimitType.java b/vapeshop-common/src/main/java/com/ruoyi/common/enums/LimitType.java new file mode 100644 index 0000000..c609fd8 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/enums/LimitType.java @@ -0,0 +1,20 @@ +package com.ruoyi.common.enums; + +/** + * 闄愭祦绫诲瀷 + * + * @author ruoyi + */ + +public enum LimitType +{ + /** + * 榛樿绛栫暐鍏ㄥ眬闄愭祦 + */ + DEFAULT, + + /** + * 鏍规嵁璇锋眰鑰匢P杩涜闄愭祦 + */ + IP +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/enums/OperatorType.java b/vapeshop-common/src/main/java/com/ruoyi/common/enums/OperatorType.java new file mode 100644 index 0000000..bdd143c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.enums; + +/** + * 鎿嶄綔浜虹被鍒 + * + * @author ruoyi + */ +public enum OperatorType +{ + /** + * 鍏跺畠 + */ + OTHER, + + /** + * 鍚庡彴鐢ㄦ埛 + */ + MANAGE, + + /** + * 鎵嬫満绔敤鎴 + */ + MOBILE +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/enums/UserStatus.java b/vapeshop-common/src/main/java/com/ruoyi/common/enums/UserStatus.java new file mode 100644 index 0000000..d7ff44a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.enums; + +/** + * 鐢ㄦ埛鐘舵 + * + * @author ruoyi + */ +public enum UserStatus +{ + OK("0", "姝e父"), DISABLE("1", "鍋滅敤"), DELETED("2", "鍒犻櫎"); + + private final String code; + private final String info; + + UserStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java new file mode 100644 index 0000000..f6ad2ab --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java @@ -0,0 +1,15 @@ +package com.ruoyi.common.exception; + +/** + * 婕旂ず妯″紡寮傚父 + * + * @author ruoyi + */ +public class DemoModeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public DemoModeException() + { + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/GlobalException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/GlobalException.java new file mode 100644 index 0000000..211441b --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/GlobalException.java @@ -0,0 +1,58 @@ +package com.ruoyi.common.exception; + +/** + * 鍏ㄥ眬寮傚父 + * + * @author ruoyi + */ +public class GlobalException extends RuntimeException +{ + + private static final long serialVersionUID = 1L; + + /** + * 閿欒鎻愮ず + */ + private String message; + + /** + * 閿欒鏄庣粏锛屽唴閮ㄨ皟璇曢敊璇 + * + * 鍜 {@link CommonResult#getDetailMessage()} 涓鑷寸殑璁捐 + */ + private String detailMessage; + + /** + * 绌烘瀯閫犳柟娉曪紝閬垮厤鍙嶅簭鍒楀寲闂 + */ + public GlobalException() + { + } + + public GlobalException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public GlobalException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + public String getMessage() + { + return message; + } + + public GlobalException setMessage(String message) + { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/ServiceException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/ServiceException.java new file mode 100644 index 0000000..6297f87 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/ServiceException.java @@ -0,0 +1,73 @@ +package com.ruoyi.common.exception; + +/** + * 涓氬姟寮傚父 + * + * @author ruoyi + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 閿欒鐮 + */ + private Integer code; + + /** + * 閿欒鎻愮ず + */ + private String message; + + /** + * 閿欒鏄庣粏锛屽唴閮ㄨ皟璇曢敊璇 + * + * 鍜 {@link CommonResult#getDetailMessage()} 涓鑷寸殑璁捐 + */ + private String detailMessage; + + /** + * 绌烘瀯閫犳柟娉曪紝閬垮厤鍙嶅簭鍒楀寲闂 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public ServiceException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/UtilException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/UtilException.java new file mode 100644 index 0000000..980fa46 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/UtilException.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.exception; + +/** + * 宸ュ叿绫诲紓甯 + * + * @author ruoyi + */ +public class UtilException extends RuntimeException +{ + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) + { + super(e.getMessage(), e); + } + + public UtilException(String message) + { + super(message); + } + + public UtilException(String message, Throwable throwable) + { + super(message, throwable); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java new file mode 100644 index 0000000..b55d72e --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/base/BaseException.java @@ -0,0 +1,97 @@ +package com.ruoyi.common.exception.base; + +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 鍩虹寮傚父 + * + * @author ruoyi + */ +public class BaseException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 鎵灞炴ā鍧 + */ + private String module; + + /** + * 閿欒鐮 + */ + private String code; + + /** + * 閿欒鐮佸搴旂殑鍙傛暟 + */ + private Object[] args; + + /** + * 閿欒娑堟伅 + */ + private String defaultMessage; + + public BaseException(String module, String code, Object[] args, String defaultMessage) + { + this.module = module; + this.code = code; + this.args = args; + this.defaultMessage = defaultMessage; + } + + public BaseException(String module, String code, Object[] args) + { + this(module, code, args, null); + } + + public BaseException(String module, String defaultMessage) + { + this(module, null, null, defaultMessage); + } + + public BaseException(String code, Object[] args) + { + this(null, code, args, null); + } + + public BaseException(String defaultMessage) + { + this(null, null, null, defaultMessage); + } + + @Override + public String getMessage() + { + String message = null; + if (!StringUtils.isEmpty(code)) + { + message = MessageUtils.message(code, args); + } + if (message == null) + { + message = defaultMessage; + } + return message; + } + + public String getModule() + { + return module; + } + + public String getCode() + { + return code; + } + + public Object[] getArgs() + { + return args; + } + + public String getDefaultMessage() + { + return defaultMessage; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileException.java new file mode 100644 index 0000000..871f09b --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileException.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.exception.file; + +import com.ruoyi.common.exception.base.BaseException; + +/** + * 鏂囦欢淇℃伅寮傚父绫 + * + * @author ruoyi + */ +public class FileException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public FileException(String code, Object[] args) + { + super("file", code, args, null); + } + +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..70e0ec9 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.file; + +/** + * 鏂囦欢鍚嶇О瓒呴暱闄愬埗寮傚父绫 + * + * @author ruoyi + */ +public class FileNameLengthLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) + { + super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..ec6ab05 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.file; + +/** + * 鏂囦欢鍚嶅ぇ灏忛檺鍒跺紓甯哥被 + * + * @author ruoyi + */ +public class FileSizeLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) + { + super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java new file mode 100644 index 0000000..8b2af16 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java @@ -0,0 +1,81 @@ +package com.ruoyi.common.exception.file; + +import java.util.Arrays; +import org.apache.commons.fileupload.FileUploadException; + +/** + * 鏂囦欢涓婁紶 璇紓甯哥被 + * + * @author ruoyi + */ +public class InvalidExtensionException extends FileUploadException +{ + private static final long serialVersionUID = 1L; + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) + { + super("鏂囦欢[" + filename + "]鍚庣紑[" + extension + "]涓嶆纭紝璇蜂笂浼" + Arrays.toString(allowedExtension) + "鏍煎紡"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() + { + return allowedExtension; + } + + public String getExtension() + { + return extension; + } + + public String getFilename() + { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidVideoExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java new file mode 100644 index 0000000..a567b40 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/job/TaskException.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.exception.job; + +/** + * 璁″垝绛栫暐寮傚父 + * + * @author ruoyi + */ +public class TaskException extends Exception +{ + private static final long serialVersionUID = 1L; + + private Code code; + + public TaskException(String msg, Code code) + { + this(msg, code, null); + } + + public TaskException(String msg, Code code, Exception nestedEx) + { + super(msg, nestedEx); + this.code = code; + } + + public Code getCode() + { + return code; + } + + public enum Code + { + TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java new file mode 100644 index 0000000..389dbc7 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 楠岃瘉鐮侀敊璇紓甯哥被 + * + * @author ruoyi + */ +public class CaptchaException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException() + { + super("user.jcaptcha.error", null); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java new file mode 100644 index 0000000..85f9486 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 楠岃瘉鐮佸け鏁堝紓甯哥被 + * + * @author ruoyi + */ +public class CaptchaExpireException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaExpireException() + { + super("user.jcaptcha.expire", null); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/UserException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/UserException.java new file mode 100644 index 0000000..c292d70 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/UserException.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.exception.user; + +import com.ruoyi.common.exception.base.BaseException; + +/** + * 鐢ㄦ埛淇℃伅寮傚父绫 + * + * @author ruoyi + */ +public class UserException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public UserException(String code, Object[] args) + { + super("user", code, args, null); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 0000000..a7f3e5f --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,16 @@ +package com.ruoyi.common.exception.user; + +/** + * 鐢ㄦ埛瀵嗙爜涓嶆纭垨涓嶇鍚堣鑼冨紓甯哥被 + * + * @author ruoyi + */ +public class UserPasswordNotMatchException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordNotMatchException() + { + super("user.password.not.match", null); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java b/vapeshop-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java new file mode 100644 index 0000000..a1bcfe2 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java @@ -0,0 +1,52 @@ +package com.ruoyi.common.filter; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.springframework.http.MediaType; +import com.ruoyi.common.utils.StringUtils; + +/** + * Repeatable 杩囨护鍣 + * + * @author ruoyi + */ +public class RepeatableFilter implements Filter +{ + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) + { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) + { + chain.doFilter(request, response); + } + else + { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() + { + + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java new file mode 100644 index 0000000..407d1ba --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java @@ -0,0 +1,76 @@ +package com.ruoyi.common.filter; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import com.ruoyi.common.utils.http.HttpHelper; +import com.ruoyi.common.constant.Constants; + +/** + * 鏋勫缓鍙噸澶嶈鍙杋nputStream鐨剅equest + * + * @author ruoyi + */ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper +{ + private final byte[] body; + + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException + { + super(request); + request.setCharacterEncoding(Constants.UTF8); + response.setCharacterEncoding(Constants.UTF8); + + body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8); + } + + @Override + public BufferedReader getReader() throws IOException + { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() + { + @Override + public int read() throws IOException + { + return bais.read(); + } + + @Override + public int available() throws IOException + { + return body.length; + } + + @Override + public boolean isFinished() + { + return false; + } + + @Override + public boolean isReady() + { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) + { + + } + }; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/filter/XssFilter.java b/vapeshop-common/src/main/java/com/ruoyi/common/filter/XssFilter.java new file mode 100644 index 0000000..9052f0d --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/filter/XssFilter.java @@ -0,0 +1,75 @@ +package com.ruoyi.common.filter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.enums.HttpMethod; + +/** + * 闃叉XSS鏀诲嚮鐨勮繃婊ゅ櫒 + * + * @author ruoyi + */ +public class XssFilter implements Filter +{ + /** + * 鎺掗櫎閾炬帴 + */ + public List excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String tempExcludes = filterConfig.getInitParameter("excludes"); + if (StringUtils.isNotEmpty(tempExcludes)) + { + String[] url = tempExcludes.split(","); + for (int i = 0; url != null && i < url.length; i++) + { + excludes.add(url[i]); + } + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) + { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) + { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 涓嶈繃婊 + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) + { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() + { + + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/vapeshop-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..b1eeb65 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,111 @@ +package com.ruoyi.common.filter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.html.EscapeUtil; + +/** + * XSS杩囨护澶勭悊 + * + * @author ruoyi + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper +{ + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) + { + super(request); + } + + @Override + public String[] getParameterValues(String name) + { + String[] values = super.getParameterValues(name); + if (values != null) + { + int length = values.length; + String[] escapseValues = new String[length]; + for (int i = 0; i < length; i++) + { + // 闃瞲ss鏀诲嚮鍜岃繃婊ゅ墠鍚庣┖鏍 + escapseValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapseValues; + } + return super.getParameterValues(name); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + // 闈瀓son绫诲瀷锛岀洿鎺ヨ繑鍥 + if (!isJsonRequest()) + { + return super.getInputStream(); + } + + // 涓虹┖锛岀洿鎺ヨ繑鍥 + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isEmpty(json)) + { + return super.getInputStream(); + } + + // xss杩囨护 + json = EscapeUtil.clean(json).trim(); + byte[] jsonBytes = json.getBytes("utf-8"); + final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes); + return new ServletInputStream() + { + @Override + public boolean isFinished() + { + return true; + } + + @Override + public boolean isReady() + { + return true; + } + + @Override + public int available() throws IOException + { + return jsonBytes.length; + } + + @Override + public void setReadListener(ReadListener readListener) + { + } + + @Override + public int read() throws IOException + { + return bis.read(); + } + }; + } + + /** + * 鏄惁鏄疛son璇锋眰 + * + * @param request + */ + public boolean isJsonRequest() + { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/Arith.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/Arith.java new file mode 100644 index 0000000..b6326c2 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/Arith.java @@ -0,0 +1,114 @@ +package com.ruoyi.common.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 绮剧‘鐨勬诞鐐规暟杩愮畻 + * + * @author ruoyi + */ +public class Arith +{ + + /** 榛樿闄ゆ硶杩愮畻绮惧害 */ + private static final int DEF_DIV_SCALE = 10; + + /** 杩欎釜绫讳笉鑳藉疄渚嬪寲 */ + private Arith() + { + } + + /** + * 鎻愪緵绮剧‘鐨勫姞娉曡繍绠椼 + * @param v1 琚姞鏁 + * @param v2 鍔犳暟 + * @return 涓や釜鍙傛暟鐨勫拰 + */ + public static double add(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 鎻愪緵绮剧‘鐨勫噺娉曡繍绠椼 + * @param v1 琚噺鏁 + * @param v2 鍑忔暟 + * @return 涓や釜鍙傛暟鐨勫樊 + */ + public static double sub(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 鎻愪緵绮剧‘鐨勪箻娉曡繍绠椼 + * @param v1 琚箻鏁 + * @param v2 涔樻暟 + * @return 涓や釜鍙傛暟鐨勭Н + */ + public static double mul(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 鎻愪緵锛堢浉瀵癸級绮剧‘鐨勯櫎娉曡繍绠楋紝褰撳彂鐢熼櫎涓嶅敖鐨勬儏鍐垫椂锛岀簿纭埌 + * 灏忔暟鐐逛互鍚10浣嶏紝浠ュ悗鐨勬暟瀛楀洓鑸嶄簲鍏ャ + * @param v1 琚櫎鏁 + * @param v2 闄ゆ暟 + * @return 涓や釜鍙傛暟鐨勫晢 + */ + public static double div(double v1, double v2) + { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 鎻愪緵锛堢浉瀵癸級绮剧‘鐨勯櫎娉曡繍绠椼傚綋鍙戠敓闄や笉灏界殑鎯呭喌鏃讹紝鐢眘cale鍙傛暟鎸 + * 瀹氱簿搴︼紝浠ュ悗鐨勬暟瀛楀洓鑸嶄簲鍏ャ + * @param v1 琚櫎鏁 + * @param v2 闄ゆ暟 + * @param scale 琛ㄧず琛ㄧず闇瑕佺簿纭埌灏忔暟鐐逛互鍚庡嚑浣嶃 + * @return 涓や釜鍙傛暟鐨勫晢 + */ + public static double div(double v1, double v2, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 鎻愪緵绮剧‘鐨勫皬鏁颁綅鍥涜垗浜斿叆澶勭悊銆 + * @param v 闇瑕佸洓鑸嶄簲鍏ョ殑鏁板瓧 + * @param scale 灏忔暟鐐瑰悗淇濈暀鍑犱綅 + * @return 鍥涜垗浜斿叆鍚庣殑缁撴灉 + */ + public static double round(double v, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = BigDecimal.ONE; + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/DateUtils.java new file mode 100644 index 0000000..d0f8c69 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -0,0 +1,187 @@ +package com.ruoyi.common.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import org.apache.commons.lang3.time.DateFormatUtils; + +/** + * 鏃堕棿宸ュ叿绫 + * + * @author ruoyi + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 鑾峰彇褰撳墠Date鍨嬫棩鏈 + * + * @return Date() 褰撳墠鏃ユ湡 + */ + public static Date getNowDate() + { + return new Date(); + } + + /** + * 鑾峰彇褰撳墠鏃ユ湡, 榛樿鏍煎紡涓簓yyy-MM-dd + * + * @return String + */ + public static String getDate() + { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + /** + * 鏃ユ湡璺緞 鍗冲勾/鏈/鏃 濡2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 鏃ユ湡璺緞 鍗冲勾/鏈/鏃 濡20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈 鏍煎紡 + */ + public static Date parseDate(Object str) + { + if (str == null) + { + return null; + } + try + { + return parseDate(str.toString(), parsePatterns); + } + catch (ParseException e) + { + return null; + } + } + + /** + * 鑾峰彇鏈嶅姟鍣ㄥ惎鍔ㄦ椂闂 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 璁$畻鐩稿樊澶╂暟 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 璁$畻涓や釜鏃堕棿宸 + */ + public static String getDatePoor(Date endDate, Date nowDate) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 鑾峰緱涓や釜鏃堕棿鐨勬绉掓椂闂村樊寮 + long diff = endDate.getTime() - nowDate.getTime(); + // 璁$畻宸灏戝ぉ + long day = diff / nd; + // 璁$畻宸灏戝皬鏃 + long hour = diff % nd / nh; + // 璁$畻宸灏戝垎閽 + long min = diff % nd % nh / nm; + // 璁$畻宸灏戠//杈撳嚭缁撴灉 + // long sec = diff % nd % nh % nm / ns; + return day + "澶" + hour + "灏忔椂" + min + "鍒嗛挓"; + } + + /** + * 澧炲姞 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 澧炲姞 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/DictUtils.java new file mode 100644 index 0000000..cc5eab2 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/DictUtils.java @@ -0,0 +1,186 @@ +package com.ruoyi.common.utils; + +import java.util.Collection; +import java.util.List; +import com.alibaba.fastjson2.JSONArray; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.domain.entity.SysDictData; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 瀛楀吀宸ュ叿绫 + * + * @author ruoyi + */ +public class DictUtils +{ + /** + * 鍒嗛殧绗 + */ + public static final String SEPARATOR = ","; + + /** + * 璁剧疆瀛楀吀缂撳瓨 + * + * @param key 鍙傛暟閿 + * @param dictDatas 瀛楀吀鏁版嵁鍒楄〃 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 鑾峰彇瀛楀吀缂撳瓨 + * + * @param key 鍙傛暟閿 + * @return dictDatas 瀛楀吀鏁版嵁鍒楄〃 + */ + public static List getDictCache(String key) + { + JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(arrayCache)) + { + return arrayCache.toList(SysDictData.class); + } + return null; + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏稿艰幏鍙栧瓧鍏告爣绛 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictValue 瀛楀吀鍊 + * @return 瀛楀吀鏍囩 + */ + public static String getDictLabel(String dictType, String dictValue) + { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏告爣绛捐幏鍙栧瓧鍏稿 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictLabel 瀛楀吀鏍囩 + * @return 瀛楀吀鍊 + */ + public static String getDictValue(String dictType, String dictLabel) + { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏稿艰幏鍙栧瓧鍏告爣绛 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictValue 瀛楀吀鍊 + * @param separator 鍒嗛殧绗 + * @return 瀛楀吀鏍囩 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.isNotNull(datas)) + { + if (StringUtils.containsAny(separator, dictValue)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏告爣绛捐幏鍙栧瓧鍏稿 + * + * @param dictType 瀛楀吀绫诲瀷 + * @param dictLabel 瀛楀吀鏍囩 + * @param separator 鍒嗛殧绗 + * @return 瀛楀吀鍊 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 鍒犻櫎鎸囧畾瀛楀吀缂撳瓨 + * + * @param key 瀛楀吀閿 + */ + public static void removeDictCache(String key) + { + SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); + } + + /** + * 娓呯┖瀛楀吀缂撳瓨 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 璁剧疆cache key + * + * @param configKey 鍙傛暟閿 + * @return 缂撳瓨閿甼ey + */ + public static String getCacheKey(String configKey) + { + return CacheConstants.SYS_DICT_KEY + configKey; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java new file mode 100644 index 0000000..214e4a0 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ExceptionUtil.java @@ -0,0 +1,39 @@ +package com.ruoyi.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 閿欒淇℃伅澶勭悊绫汇 + * + * @author ruoyi + */ +public class ExceptionUtil +{ + /** + * 鑾峰彇exception鐨勮缁嗛敊璇俊鎭 + */ + public static String getExceptionMessage(Throwable e) + { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + return sw.toString(); + } + + public static String getRootErrorMessage(Exception e) + { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) + { + return ""; + } + String msg = root.getMessage(); + if (msg == null) + { + return "null"; + } + return StringUtils.defaultString(msg); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/LogUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/LogUtils.java new file mode 100644 index 0000000..0de30c6 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/LogUtils.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.utils; + +/** + * 澶勭悊骞惰褰曟棩蹇楁枃浠 + * + * @author ruoyi + */ +public class LogUtils +{ + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java new file mode 100644 index 0000000..7dac75a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 鑾峰彇i18n璧勬簮鏂囦欢 + * + * @author ruoyi + */ +public class MessageUtils +{ + /** + * 鏍规嵁娑堟伅閿拰鍙傛暟 鑾峰彇娑堟伅 濮旀墭缁檚pring messageSource + * + * @param code 娑堟伅閿 + * @param args 鍙傛暟 + * @return 鑾峰彇鍥介檯鍖栫炕璇戝 + */ + public static String message(String code, Object... args) + { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java new file mode 100644 index 0000000..df56f24 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -0,0 +1,99 @@ +package com.ruoyi.common.utils; + +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.exception.ServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * 瀹夊叏鏈嶅姟宸ュ叿绫 + * + * @author ruoyi + */ +public class SecurityUtils { + /** + * 鐢ㄦ埛ID + **/ + public static String getUserId() { + try { + return getLoginUser().getUserId(); + } catch (Exception e) { + throw new ServiceException("鑾峰彇鐢ㄦ埛ID寮傚父", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 鑾峰彇閮ㄩ棬ID + **/ + public static String getDeptId() { + try { + return getLoginUser().getDeptId(); + } catch (Exception e) { + throw new ServiceException("鑾峰彇閮ㄩ棬ID寮傚父", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 鑾峰彇鐢ㄦ埛璐︽埛 + **/ + public static String getUsername() { + try { + return getLoginUser().getUsername(); + } catch (Exception e) { + throw new ServiceException("鑾峰彇鐢ㄦ埛璐︽埛寮傚父", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 鑾峰彇鐢ㄦ埛 + **/ + public static LoginUser getLoginUser() { + try { + return (LoginUser) getAuthentication().getPrincipal(); + } catch (Exception e) { + throw new ServiceException("鑾峰彇鐢ㄦ埛淇℃伅寮傚父", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 鑾峰彇Authentication + */ + public static Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 鐢熸垚BCryptPasswordEncoder瀵嗙爜 + * + * @param password 瀵嗙爜 + * @return 鍔犲瘑瀛楃涓 + */ + public static String encryptPassword(String password) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 鍒ゆ柇瀵嗙爜鏄惁鐩稿悓 + * + * @param rawPassword 鐪熷疄瀵嗙爜 + * @param encodedPassword 鍔犲瘑鍚庡瓧绗 + * @return 缁撴灉 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 鏄惁涓虹鐞嗗憳 + * + * @param userId 鐢ㄦ埛ID + * @return 缁撴灉 + */ +// public static boolean isAdmin(String userId) { +// return userId != null && 1L == userId; +// } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java new file mode 100644 index 0000000..1c19b4e --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -0,0 +1,186 @@ +package com.ruoyi.common.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.Convert; + +/** + * 瀹㈡埛绔伐鍏风被 + * + * @author ruoyi + */ +public class ServletUtils +{ + /** + * 鑾峰彇String鍙傛暟 + */ + public static String getParameter(String name) + { + return getRequest().getParameter(name); + } + + /** + * 鑾峰彇String鍙傛暟 + */ + public static String getParameter(String name, String defaultValue) + { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 鑾峰彇Integer鍙傛暟 + */ + public static Integer getParameterToInt(String name) + { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 鑾峰彇Integer鍙傛暟 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) + { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 鑾峰彇Boolean鍙傛暟 + */ + public static Boolean getParameterToBool(String name) + { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 鑾峰彇Boolean鍙傛暟 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) + { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 鑾峰彇request + */ + public static HttpServletRequest getRequest() + { + return getRequestAttributes().getRequest(); + } + + /** + * 鑾峰彇response + */ + public static HttpServletResponse getResponse() + { + return getRequestAttributes().getResponse(); + } + + /** + * 鑾峰彇session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 灏嗗瓧绗︿覆娓叉煋鍒板鎴风 + * + * @param response 娓叉煋瀵硅薄 + * @param string 寰呮覆鏌撶殑瀛楃涓 + */ + public static void renderString(HttpServletResponse response, String string) + { + try + { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + /** + * 鏄惁鏄疉jax寮傛璇锋眰 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.contains("application/json")) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); + } + + /** + * 鍐呭缂栫爜 + * + * @param str 鍐呭 + * @return 缂栫爜鍚庣殑鍐呭 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 鍐呭瑙g爜 + * + * @param str 鍐呭 + * @return 瑙g爜鍚庣殑鍐呭 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/StringUtils.java new file mode 100644 index 0000000..6b70889 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -0,0 +1,583 @@ +package com.ruoyi.common.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.springframework.util.AntPathMatcher; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.text.StrFormatter; + +/** + * 瀛楃涓插伐鍏风被 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 绌哄瓧绗︿覆 */ + private static final String NULLSTR = ""; + + /** 涓嬪垝绾 */ + private static final char SEPARATOR = '_'; + + /** + * 鑾峰彇鍙傛暟涓嶄负绌哄 + * + * @param value defaultValue 瑕佸垽鏂殑value + * @return value 杩斿洖鍊 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 鍒ゆ柇涓涓狢ollection鏄惁涓虹┖锛 鍖呭惈List锛孲et锛孮ueue + * + * @param coll 瑕佸垽鏂殑Collection + * @return true锛氫负绌 false锛氶潪绌 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 鍒ゆ柇涓涓狢ollection鏄惁闈炵┖锛屽寘鍚獿ist锛孲et锛孮ueue + * + * @param coll 瑕佸垽鏂殑Collection + * @return true锛氶潪绌 false锛氱┖ + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 鍒ゆ柇涓涓璞℃暟缁勬槸鍚︿负绌 + * + * @param objects 瑕佸垽鏂殑瀵硅薄鏁扮粍 + ** @return true锛氫负绌 false锛氶潪绌 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 鍒ゆ柇涓涓璞℃暟缁勬槸鍚﹂潪绌 + * + * @param objects 瑕佸垽鏂殑瀵硅薄鏁扮粍 + * @return true锛氶潪绌 false锛氱┖ + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 鍒ゆ柇涓涓狹ap鏄惁涓虹┖ + * + * @param map 瑕佸垽鏂殑Map + * @return true锛氫负绌 false锛氶潪绌 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 鍒ゆ柇涓涓狹ap鏄惁涓虹┖ + * + * @param map 瑕佸垽鏂殑Map + * @return true锛氶潪绌 false锛氱┖ + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 鍒ゆ柇涓涓瓧绗︿覆鏄惁涓虹┖涓 + * + * @param str String + * @return true锛氫负绌 false锛氶潪绌 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 鍒ゆ柇涓涓瓧绗︿覆鏄惁涓洪潪绌轰覆 + * + * @param str String + * @return true锛氶潪绌轰覆 false锛氱┖涓 + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 鍒ゆ柇涓涓璞℃槸鍚︿负绌 + * + * @param object Object + * @return true锛氫负绌 false锛氶潪绌 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 鍒ゆ柇涓涓璞℃槸鍚﹂潪绌 + * + * @param object Object + * @return true锛氶潪绌 false锛氱┖ + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 鍒ゆ柇涓涓璞℃槸鍚︽槸鏁扮粍绫诲瀷锛圝ava鍩烘湰鍨嬪埆鐨勬暟缁勶級 + * + * @param object 瀵硅薄 + * @return true锛氭槸鏁扮粍 false锛氫笉鏄暟缁 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 鍘荤┖鏍 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 鎴彇瀛楃涓 + * + * @param str 瀛楃涓 + * @param start 寮濮 + * @return 缁撴灉 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 鎴彇瀛楃涓 + * + * @param str 瀛楃涓 + * @param start 寮濮 + * @param end 缁撴潫 + * @return 缁撴灉 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 鏍煎紡鍖栨枃鏈, {} 琛ㄧず鍗犱綅绗
+ * 姝ゆ柟娉曞彧鏄畝鍗曞皢鍗犱綅绗 {} 鎸夌収椤哄簭鏇挎崲涓哄弬鏁
+ * 濡傛灉鎯宠緭鍑 {} 浣跨敤 \\杞箟 { 鍗冲彲锛屽鏋滄兂杈撳嚭 {} 涔嬪墠鐨 \ 浣跨敤鍙岃浆涔夌 \\\\ 鍗冲彲
+ * 渚嬶細
+ * 閫氬父浣跨敤锛歠ormat("this is {} for {}", "a", "b") -> this is a for b
+ * 杞箟{}锛 format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 杞箟\锛 format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 鏂囨湰妯℃澘锛岃鏇挎崲鐨勯儴鍒嗙敤 {} 琛ㄧず + * @param params 鍙傛暟鍊 + * @return 鏍煎紡鍖栧悗鐨勬枃鏈 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 鏄惁涓篽ttp(s)://寮澶 + * + * @param link 閾炬帴 + * @return 缁撴灉 + */ + public static boolean ishttp(String link) + { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 瀛楃涓茶浆set + * + * @param str 瀛楃涓 + * @param sep 鍒嗛殧绗 + * @return set闆嗗悎 + */ + public static final Set str2Set(String str, String sep) + { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 瀛楃涓茶浆list + * + * @param str 瀛楃涓 + * @param sep 鍒嗛殧绗 + * @param filterBlank 杩囨护绾┖鐧 + * @param trim 鍘绘帀棣栧熬绌虹櫧 + * @return list闆嗗悎 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 杩囨护绌虹櫧瀛楃涓 + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀寘鍚寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓涓瓧绗︿覆鍚屾椂涓插拷鐣ュぇ灏忓啓 + * + * @param cs 鎸囧畾瀛楃涓 + * @param searchCharSequences 闇瑕佹鏌ョ殑瀛楃涓叉暟缁 + * @return 鏄惁鍖呭惈浠绘剰涓涓瓧绗︿覆 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 椹煎嘲杞笅鍒掔嚎鍛藉悕 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 鍓嶇疆瀛楃鏄惁澶у啓 + boolean preCharIsUpperCase = true; + // 褰撳墠瀛楃鏄惁澶у啓 + boolean curreCharIsUpperCase = true; + // 涓嬩竴瀛楃鏄惁澶у啓 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 鏄惁鍖呭惈瀛楃涓 + * + * @param str 楠岃瘉瀛楃涓 + * @param strs 瀛楃涓茬粍 + * @return 鍖呭惈杩斿洖true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 灏嗕笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆杞崲涓洪┘宄板紡銆傚鏋滆浆鎹㈠墠鐨勪笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆涓虹┖锛屽垯杩斿洖绌哄瓧绗︿覆銆 渚嬪锛欻ELLO_WORLD->HelloWorld + * + * @param name 杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓 + * @return 杞崲鍚庣殑椹煎嘲寮忓懡鍚嶇殑瀛楃涓 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 蹇熸鏌 + if (name == null || name.isEmpty()) + { + // 娌″繀瑕佽浆鎹 + return ""; + } + else if (!name.contains("_")) + { + // 涓嶅惈涓嬪垝绾匡紝浠呭皢棣栧瓧姣嶅ぇ鍐 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 鐢ㄤ笅鍒掔嚎灏嗗師濮嬪瓧绗︿覆鍒嗗壊 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 璺宠繃鍘熷瀛楃涓蹭腑寮澶淬佺粨灏剧殑涓嬫崲绾挎垨鍙岄噸涓嬪垝绾 + if (camel.isEmpty()) + { + continue; + } + // 棣栧瓧姣嶅ぇ鍐 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 椹煎嘲寮忓懡鍚嶆硶 渚嬪锛歶ser_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀尮閰嶆寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓涓瓧绗︿覆 + * + * @param str 鎸囧畾瀛楃涓 + * @param strs 闇瑕佹鏌ョ殑瀛楃涓叉暟缁 + * @return 鏄惁鍖归厤 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 鍒ゆ柇url鏄惁涓庤鍒欓厤缃: + * ? 琛ㄧず鍗曚釜瀛楃; + * * 琛ㄧず涓灞傝矾寰勫唴鐨勪换鎰忓瓧绗︿覆锛屼笉鍙法灞傜骇; + * ** 琛ㄧず浠绘剰灞傝矾寰; + * + * @param pattern 鍖归厤瑙勫垯 + * @param url 闇瑕佸尮閰嶇殑url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 鏁板瓧宸﹁竟琛ラ綈0锛屼娇涔嬭揪鍒版寚瀹氶暱搴︺傛敞鎰忥紝濡傛灉鏁板瓧杞崲涓哄瓧绗︿覆鍚庯紝闀垮害澶т簬size锛屽垯鍙繚鐣 鏈鍚巗ize涓瓧绗︺ + * + * @param num 鏁板瓧瀵硅薄 + * @param size 瀛楃涓叉寚瀹氶暱搴 + * @return 杩斿洖鏁板瓧鐨勫瓧绗︿覆鏍煎紡锛岃瀛楃涓蹭负鎸囧畾闀垮害銆 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 瀛楃涓插乏琛ラ綈銆傚鏋滃師濮嬪瓧绗︿覆s闀垮害澶т簬size锛屽垯鍙繚鐣欐渶鍚巗ize涓瓧绗︺ + * + * @param s 鍘熷瀛楃涓 + * @param size 瀛楃涓叉寚瀹氶暱搴 + * @param c 鐢ㄤ簬琛ラ綈鐨勫瓧绗 + * @return 杩斿洖鎸囧畾闀垮害鐨勫瓧绗︿覆锛岀敱鍘熷瓧绗︿覆宸﹁ˉ榻愭垨鎴彇寰楀埌銆 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/Threads.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/Threads.java new file mode 100644 index 0000000..71fe6d5 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/Threads.java @@ -0,0 +1,99 @@ +package com.ruoyi.common.utils; + +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 绾跨▼鐩稿叧宸ュ叿绫. + * + * @author ruoyi + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep绛夊緟,鍗曚綅涓烘绉 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 鍋滄绾跨▼姹 + * 鍏堜娇鐢╯hutdown, 鍋滄鎺ユ敹鏂颁换鍔″苟灏濊瘯瀹屾垚鎵鏈夊凡瀛樺湪浠诲姟. + * 濡傛灉瓒呮椂, 鍒欒皟鐢╯hutdownNow, 鍙栨秷鍦╳orkQueue涓璓ending鐨勪换鍔,骞朵腑鏂墍鏈夐樆濉炲嚱鏁. + * 濡傛灉浠嶇劧瓒呮檪锛屽墖寮峰埗閫鍑. + * 鍙﹀鍦╯hutdown鏃剁嚎绋嬫湰韬璋冪敤涓柇鍋氫簡澶勭悊. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 鎵撳嵃绾跨▼寮傚父淇℃伅 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java new file mode 100644 index 0000000..4463662 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/bean/BeanUtils.java @@ -0,0 +1,110 @@ +package com.ruoyi.common.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 宸ュ叿绫 + * + * @author ruoyi + */ +public class BeanUtils extends org.springframework.beans.BeanUtils +{ + /** Bean鏂规硶鍚嶄腑灞炴у悕寮濮嬬殑涓嬫爣 */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** * 鍖归厤getter鏂规硶鐨勬鍒欒〃杈惧紡 */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** * 鍖归厤setter鏂规硶鐨勬鍒欒〃杈惧紡 */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean灞炴у鍒跺伐鍏锋柟娉曘 + * + * @param dest 鐩爣瀵硅薄 + * @param src 婧愬璞 + */ + public static void copyBeanProp(Object dest, Object src) + { + try + { + copyProperties(src, dest); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * 鑾峰彇瀵硅薄鐨剆etter鏂规硶銆 + * + * @param obj 瀵硅薄 + * @return 瀵硅薄鐨剆etter鏂规硶鍒楄〃 + */ + public static List getSetterMethods(Object obj) + { + // setter鏂规硶鍒楄〃 + List setterMethods = new ArrayList(); + + // 鑾峰彇鎵鏈夋柟娉 + Method[] methods = obj.getClass().getMethods(); + + // 鏌ユ壘setter鏂规硶 + + for (Method method : methods) + { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) + { + setterMethods.add(method); + } + } + // 杩斿洖setter鏂规硶鍒楄〃 + return setterMethods; + } + + /** + * 鑾峰彇瀵硅薄鐨刧etter鏂规硶銆 + * + * @param obj 瀵硅薄 + * @return 瀵硅薄鐨刧etter鏂规硶鍒楄〃 + */ + + public static List getGetterMethods(Object obj) + { + // getter鏂规硶鍒楄〃 + List getterMethods = new ArrayList(); + // 鑾峰彇鎵鏈夋柟娉 + Method[] methods = obj.getClass().getMethods(); + // 鏌ユ壘getter鏂规硶 + for (Method method : methods) + { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) + { + getterMethods.add(method); + } + } + // 杩斿洖getter鏂规硶鍒楄〃 + return getterMethods; + } + + /** + * 妫鏌ean鏂规硶鍚嶄腑鐨勫睘鎬у悕鏄惁鐩哥瓑銆
+ * 濡俫etName()鍜宻etName()灞炴у悕涓鏍凤紝getName()鍜宻etAge()灞炴у悕涓嶄竴鏍枫 + * + * @param m1 鏂规硶鍚1 + * @param m2 鏂规硶鍚2 + * @return 灞炴у悕涓鏍疯繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse + */ + + public static boolean isMethodPropEquals(String m1, String m2) + { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java new file mode 100644 index 0000000..80bfed7 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/bean/BeanValidators.java @@ -0,0 +1,24 @@ +package com.ruoyi.common.utils.bean; + +import java.util.Set; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; + +/** + * bean瀵硅薄灞炴ч獙璇 + * + * @author ruoyi + */ +public class BeanValidators +{ + public static void validateWithException(Validator validator, Object object, Class... groups) + throws ConstraintViolationException + { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) + { + throw new ConstraintViolationException(constraintViolations); + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java new file mode 100644 index 0000000..68130b9 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java @@ -0,0 +1,76 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import org.apache.commons.lang3.StringUtils; + +/** + * 鏂囦欢绫诲瀷宸ュ叿绫 + * + * @author ruoyi + */ +public class FileTypeUtils +{ + /** + * 鑾峰彇鏂囦欢绫诲瀷 + *

+ * 渚嬪: ruoyi.txt, 杩斿洖: txt + * + * @param file 鏂囦欢鍚 + * @return 鍚庣紑锛堜笉鍚".") + */ + public static String getFileType(File file) + { + if (null == file) + { + return StringUtils.EMPTY; + } + return getFileType(file.getName()); + } + + /** + * 鑾峰彇鏂囦欢绫诲瀷 + *

+ * 渚嬪: ruoyi.txt, 杩斿洖: txt + * + * @param fileName 鏂囦欢鍚 + * @return 鍚庣紑锛堜笉鍚".") + */ + public static String getFileType(String fileName) + { + int separatorIndex = fileName.lastIndexOf("."); + if (separatorIndex < 0) + { + return ""; + } + return fileName.substring(separatorIndex + 1).toLowerCase(); + } + + /** + * 鑾峰彇鏂囦欢绫诲瀷 + * + * @param photoByte 鏂囦欢瀛楄妭鐮 + * @return 鍚庣紑锛堜笉鍚".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..d9f2b13 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java @@ -0,0 +1,232 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException; +import com.ruoyi.common.exception.file.FileSizeLimitExceededException; +import com.ruoyi.common.exception.file.InvalidExtensionException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.Seq; + +/** + * 鏂囦欢涓婁紶宸ュ叿绫 + * + * @author ruoyi + */ +public class FileUploadUtils +{ + /** + * 榛樿澶у皬 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 榛樿鐨勬枃浠跺悕鏈澶ч暱搴 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 榛樿涓婁紶鐨勫湴鍧 + */ + private static String defaultBaseDir = RuoYiConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 浠ラ粯璁ら厤缃繘琛屾枃浠朵笂浼 + * + * @param file 涓婁紶鐨勬枃浠 + * @return 鏂囦欢鍚嶇О + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 鏍规嵁鏂囦欢璺緞涓婁紶 + * + * @param baseDir 鐩稿搴旂敤鐨勫熀鐩綍 + * @param file 涓婁紶鐨勬枃浠 + * @return 鏂囦欢鍚嶇О + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 鏂囦欢涓婁紶 + * + * @param baseDir 鐩稿搴旂敤鐨勫熀鐩綍 + * @param file 涓婁紶鐨勬枃浠 + * @param allowedExtension 涓婁紶鏂囦欢绫诲瀷 + * @return 杩斿洖涓婁紶鎴愬姛鐨勬枃浠跺悕 + * @throws FileSizeLimitExceededException 濡傛灉瓒呭嚭鏈澶уぇ灏 + * @throws FileNameLengthLimitExceededException 鏂囦欢鍚嶅お闀 + * @throws IOException 姣斿璇诲啓鏂囦欢鍑洪敊鏃 + * @throws InvalidExtensionException 鏂囦欢鏍¢獙寮傚父 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 缂栫爜鏂囦欢鍚 + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = RuoYiConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 鏂囦欢澶у皬鏍¢獙 + * + * @param file 涓婁紶鐨勬枃浠 + * @return + * @throws FileSizeLimitExceededException 濡傛灉瓒呭嚭鏈澶уぇ灏 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 鍒ゆ柇MIME绫诲瀷鏄惁鏄厑璁哥殑MIME绫诲瀷 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 鑾峰彇鏂囦欢鍚嶇殑鍚庣紑 + * + * @param file 琛ㄥ崟鏂囦欢 + * @return 鍚庣紑鍚 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + } + return extension; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java new file mode 100644 index 0000000..f844270 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -0,0 +1,293 @@ +package com.ruoyi.common.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; +import org.apache.commons.io.FilenameUtils; + +/** + * 鏂囦欢澶勭悊宸ュ叿绫 + * + * @author ruoyi + */ +public class FileUtils +{ + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 杈撳嚭鎸囧畾鏂囦欢鐨刡yte鏁扮粍 + * + * @param filePath 鏂囦欢璺緞 + * @param os 杈撳嚭娴 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 鍐欐暟鎹埌鏂囦欢涓 + * + * @param data 鏁版嵁 + * @return 鐩爣鏂囦欢 + * @throws IOException IO寮傚父 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, RuoYiConfig.getImportPath()); + } + + /** + * 鍐欐暟鎹埌鏂囦欢涓 + * + * @param data 鏁版嵁 + * @param uploadDir 鐩爣鏂囦欢 + * @return 鐩爣鏂囦欢 + * @throws IOException IO寮傚父 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 鍒犻櫎鏂囦欢 + * + * @param filePath 鏂囦欢 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 璺緞涓烘枃浠朵笖涓嶄负绌哄垯杩涜鍒犻櫎 + if (file.isFile() && file.exists()) + { + file.delete(); + flag = true; + } + return flag; + } + + /** + * 鏂囦欢鍚嶇О楠岃瘉 + * + * @param filename 鏂囦欢鍚嶇О + * @return true 姝e父 false 闈炴硶 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 妫鏌ユ枃浠舵槸鍚﹀彲涓嬭浇 + * + * @param resource 闇瑕佷笅杞界殑鏂囦欢 + * @return true 姝e父 false 闈炴硶 + */ + public static boolean checkAllowDownload(String resource) + { + // 绂佹鐩綍涓婅烦绾у埆 + if (StringUtils.contains(resource, "..")) + { + return false; + } + + // 妫鏌ュ厑璁镐笅杞界殑鏂囦欢瑙勫垯 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 涓嶅湪鍏佽涓嬭浇鐨勬枃浠惰鍒 + return false; + } + + /** + * 涓嬭浇鏂囦欢鍚嶉噸鏂扮紪鐮 + * + * @param request 璇锋眰瀵硅薄 + * @param fileName 鏂囦欢鍚 + * @return 缂栫爜鍚庣殑鏂囦欢鍚 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException + { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) + { + // IE娴忚鍣 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } + else if (agent.contains("Firefox")) + { + // 鐏嫄娴忚鍣 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } + else if (agent.contains("Chrome")) + { + // google娴忚鍣 + filename = URLEncoder.encode(filename, "utf-8"); + } + else + { + // 鍏跺畠娴忚鍣 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 涓嬭浇鏂囦欢鍚嶉噸鏂扮紪鐮 + * + * @param response 鍝嶅簲瀵硅薄 + * @param realFileName 鐪熷疄鏂囦欢鍚 + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException + { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); + response.setHeader("Content-disposition", contentDispositionValue.toString()); + response.setHeader("download-filename", percentEncodedFileName); + } + + /** + * 鐧惧垎鍙风紪鐮佸伐鍏锋柟娉 + * + * @param s 闇瑕佺櫨鍒嗗彿缂栫爜鐨勫瓧绗︿覆 + * @return 鐧惧垎鍙风紪鐮佸悗鐨勫瓧绗︿覆 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 鑾峰彇鍥惧儚鍚庣紑 + * + * @param photoByte 鍥惧儚鏁版嵁 + * @return 鍚庣紑鍚 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 鑾峰彇鏂囦欢鍚嶇О /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png + * + * @param fileName 璺緞鍚嶇О + * @return 娌℃湁鏂囦欢璺緞鐨勫悕绉 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 鑾峰彇涓嶅甫鍚庣紑鏂囦欢鍚嶇О /profile/upload/2022/04/16/ruoyi.png -- ruoyi + * + * @param fileName 璺緞鍚嶇О + * @return 娌℃湁鏂囦欢璺緞鍜屽悗缂鐨勫悕绉 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } + +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java new file mode 100644 index 0000000..432dfda --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java @@ -0,0 +1,98 @@ +package com.ruoyi.common.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; + +/** + * 鍥剧墖澶勭悊宸ュ叿绫 + * + * @author ruoyi + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("鍥剧墖鍔犺浇寮傚父 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("鑾峰彇鍥剧墖寮傚父 {}", e); + } + return null; + } + + /** + * 璇诲彇鏂囦欢涓哄瓧鑺傛暟鎹 + * + * @param url 鍦板潃 + * @return 瀛楄妭鏁版嵁 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + if (url.startsWith("http")) + { + // 缃戠粶鍦板潃 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 鏈満鍦板潃 + String localPath = RuoYiConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("鑾峰彇鏂囦欢璺緞寮傚父 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..f968f1a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.ruoyi.common.utils.file; + +/** + * 濯掍綋绫诲瀷宸ュ叿绫 + * + * @author ruoyi + */ +public class MimeTypeUtils +{ + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + + public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + + public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb" }; + + public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 鍥剧墖 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 鍘嬬缉鏂囦欢 + "rar", "zip", "gz", "bz2", + // 瑙嗛鏍煎紡 + "mp4", "avi", "rmvb", + // pdf + "pdf" }; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java new file mode 100644 index 0000000..f52e83e --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java @@ -0,0 +1,167 @@ +package com.ruoyi.common.utils.html; + +import com.ruoyi.common.utils.StringUtils; + +/** + * 杞箟鍜屽弽杞箟宸ュ叿绫 + * + * @author ruoyi + */ +public class EscapeUtil +{ + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static + { + for (int i = 0; i < 64; i++) + { + TEXT[i] = new char[] { (char) i }; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 鍗曞紩鍙 + TEXT['"'] = """.toCharArray(); // 鍙屽紩鍙 + TEXT['&'] = "&".toCharArray(); // &绗 + TEXT['<'] = "<".toCharArray(); // 灏忎簬鍙 + TEXT['>'] = ">".toCharArray(); // 澶т簬鍙 + } + + /** + * 杞箟鏂囨湰涓殑HTML瀛楃涓哄畨鍏ㄧ殑瀛楃 + * + * @param text 琚浆涔夌殑鏂囨湰 + * @return 杞箟鍚庣殑鏂囨湰 + */ + public static String escape(String text) + { + return encode(text); + } + + /** + * 杩樺師琚浆涔夌殑HTML鐗规畩瀛楃 + * + * @param content 鍖呭惈杞箟绗︾殑HTML鍐呭 + * @return 杞崲鍚庣殑瀛楃涓 + */ + public static String unescape(String content) + { + return decode(content); + } + + /** + * 娓呴櫎鎵鏈塇TML鏍囩锛屼絾鏄笉鍒犻櫎鏍囩鍐呯殑鍐呭 + * + * @param content 鏂囨湰 + * @return 娓呴櫎鏍囩鍚庣殑鏂囨湰 + */ + public static String clean(String content) + { + return new HTMLFilter().filter(content); + } + + /** + * Escape缂栫爜 + * + * @param text 琚紪鐮佺殑鏂囨湰 + * @return 缂栫爜鍚庣殑瀛楃 + */ + private static String encode(String text) + { + if (StringUtils.isEmpty(text)) + { + return StringUtils.EMPTY; + } + + final StringBuilder tmp = new StringBuilder(text.length() * 6); + char c; + for (int i = 0; i < text.length(); i++) + { + c = text.charAt(i); + if (c < 256) + { + tmp.append("%"); + if (c < 16) + { + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + else + { + tmp.append("%u"); + if (c <= 0xfff) + { + // issue#I49JU8@Gitee + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + } + return tmp.toString(); + } + + /** + * Escape瑙g爜 + * + * @param content 琚浆涔夌殑鍐呭 + * @return 瑙g爜鍚庣殑瀛楃涓 + */ + public static String decode(String content) + { + if (StringUtils.isEmpty(content)) + { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) + { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) + { + if (content.charAt(pos + 1) == 'u') + { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } + else + { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } + else + { + if (pos == -1) + { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } + else + { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) + { + String html = ""; + String escape = EscapeUtil.escape(html); + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println("clean: " + EscapeUtil.clean(html)); + System.out.println("escape: " + escape); + System.out.println("unescape: " + EscapeUtil.unescape(escape)); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java new file mode 100644 index 0000000..db069bc --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java @@ -0,0 +1,570 @@ +package com.ruoyi.common.utils.html; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * HTML杩囨护鍣紝鐢ㄤ簬鍘婚櫎XSS婕忔礊闅愭偅銆 + * + * @author ruoyi + */ +public final class HTMLFilter +{ + /** + * regex flag union representing /si modifiers in php + **/ + private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); + private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); + private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); + private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); + private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); + private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); + private static final Pattern P_END_ARROW = Pattern.compile("^>"); + private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_AMP = Pattern.compile("&"); + private static final Pattern P_QUOTE = Pattern.compile("\""); + private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); + private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); + private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); + + // @xxx could grow large... maybe use sesat's ReferenceMap + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); + + /** + * set of allowed html elements, along with allowed attributes for each element + **/ + private final Map> vAllowed; + /** + * counts of open tags for each (allowable) html element + **/ + private final Map vTagCounts = new HashMap<>(); + + /** + * html elements which must always be self-closing (e.g. "") + **/ + private final String[] vSelfClosingTags; + /** + * html elements which must always have separate opening and closing tags (e.g. "") + **/ + private final String[] vNeedClosingTags; + /** + * set of disallowed html elements + **/ + private final String[] vDisallowed; + /** + * attributes which should be checked for valid protocols + **/ + private final String[] vProtocolAtts; + /** + * allowed protocols + **/ + private final String[] vAllowedProtocols; + /** + * tags which should be removed if they contain no content (e.g. "" or "") + **/ + private final String[] vRemoveBlanks; + /** + * entities allowed within html markup + **/ + private final String[] vAllowedEntities; + /** + * flag determining whether comments are allowed in input String. + */ + private final boolean stripComment; + private final boolean encodeQuotes; + /** + * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "" + * becomes " text "). If set to false, unbalanced angle brackets will be html escaped. + */ + private final boolean alwaysMakeTags; + + /** + * Default constructor. + */ + public HTMLFilter() + { + vAllowed = new HashMap<>(); + + final ArrayList a_atts = new ArrayList<>(); + a_atts.add("href"); + a_atts.add("target"); + vAllowed.put("a", a_atts); + + final ArrayList img_atts = new ArrayList<>(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + vAllowed.put("img", img_atts); + + final ArrayList no_atts = new ArrayList<>(); + vAllowed.put("b", no_atts); + vAllowed.put("strong", no_atts); + vAllowed.put("i", no_atts); + vAllowed.put("em", no_atts); + + vSelfClosingTags = new String[] { "img" }; + vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; + vDisallowed = new String[] {}; + vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. + vProtocolAtts = new String[] { "src", "href" }; + vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; + vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; + stripComment = true; + encodeQuotes = true; + alwaysMakeTags = false; + } + + /** + * Map-parameter configurable constructor. + * + * @param conf map containing configuration. keys match field names. + */ + @SuppressWarnings("unchecked") + public HTMLFilter(final Map conf) + { + + assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; + assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; + assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; + assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; + assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; + assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; + assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; + assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; + + vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed")); + vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); + vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); + vDisallowed = (String[]) conf.get("vDisallowed"); + vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); + vProtocolAtts = (String[]) conf.get("vProtocolAtts"); + vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); + vAllowedEntities = (String[]) conf.get("vAllowedEntities"); + stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; + encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; + alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; + } + + private void reset() + { + vTagCounts.clear(); + } + + // --------------------------------------------------------------- + // my versions of some PHP library functions + public static String chr(final int decimal) + { + return String.valueOf((char) decimal); + } + + public static String htmlSpecialChars(final String s) + { + String result = s; + result = regexReplace(P_AMP, "&", result); + result = regexReplace(P_QUOTE, """, result); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + // --------------------------------------------------------------- + + /** + * given a user submitted input String, filter out any invalid or restricted html. + * + * @param input text (i.e. submitted by a user) than may contain html + * @return "clean" version of input, with only valid, whitelisted html elements allowed + */ + public String filter(final String input) + { + reset(); + String s = input; + + s = escapeComments(s); + + s = balanceHTML(s); + + s = checkTags(s); + + s = processRemoveBlanks(s); + + // s = validateEntities(s); + + return s; + } + + public boolean isAlwaysMakeTags() + { + return alwaysMakeTags; + } + + public boolean isStripComments() + { + return stripComment; + } + + private String escapeComments(final String s) + { + final Matcher m = P_COMMENTS.matcher(s); + final StringBuffer buf = new StringBuffer(); + if (m.find()) + { + final String match = m.group(1); // (.*?) + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + m.appendTail(buf); + + return buf.toString(); + } + + private String balanceHTML(String s) + { + if (alwaysMakeTags) + { + // + // try and form html + // + s = regexReplace(P_END_ARROW, "", s); + // 涓嶈拷鍔犵粨鏉熸爣绛 + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s); + + } + else + { + // + // escape stray brackets + // + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + + // + // the last regexp causes '<>' entities to appear + // (we need to do a lookahead assertion so that the last bracket can + // be used in the next pass of the regexp) + // + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) + { + Matcher m = P_TAGS.matcher(s); + + final StringBuffer buf = new StringBuffer(); + while (m.find()) + { + String replaceStr = m.group(1); + replaceStr = processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + m.appendTail(buf); + + // these get tallied in processTag + // (remember to reset before subsequent calls to filter method) + final StringBuilder sBuilder = new StringBuilder(buf.toString()); + for (String key : vTagCounts.keySet()) + { + for (int ii = 0; ii < vTagCounts.get(key); ii++) + { + sBuilder.append(""); + } + } + s = sBuilder.toString(); + + return s; + } + + private String processRemoveBlanks(final String s) + { + String result = s; + for (String tag : vRemoveBlanks) + { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) + { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) + { + P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); + } + result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + return result; + } + + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) + { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + + private String processTag(final String s) + { + // ending tags + Matcher m = P_END_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + if (allowed(name)) + { + if (!inArray(name, vSelfClosingTags)) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) - 1); + return ""; + } + } + } + } + + // starting tags + m = P_START_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + final String body = m.group(2); + String ending = m.group(3); + + // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); + if (allowed(name)) + { + final StringBuilder params = new StringBuilder(); + + final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + final List paramNames = new ArrayList<>(); + final List paramValues = new ArrayList<>(); + while (m2.find()) + { + paramNames.add(m2.group(1)); // ([a-z0-9]+) + paramValues.add(m2.group(3)); // (.*?) + } + while (m3.find()) + { + paramNames.add(m3.group(1)); // ([a-z0-9]+) + paramValues.add(m3.group(3)); // ([^\"\\s']+) + } + + String paramName, paramValue; + for (int ii = 0; ii < paramNames.size(); ii++) + { + paramName = paramNames.get(ii).toLowerCase(); + paramValue = paramValues.get(ii); + + // debug( "paramName='" + paramName + "'" ); + // debug( "paramValue='" + paramValue + "'" ); + // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); + + if (allowedAttribute(name, paramName)) + { + if (inArray(paramName, vProtocolAtts)) + { + paramValue = processParamProtocol(paramValue); + } + params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\""); + } + } + + if (inArray(name, vSelfClosingTags)) + { + ending = " /"; + } + + if (inArray(name, vNeedClosingTags)) + { + ending = ""; + } + + if (ending == null || ending.length() < 1) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) + 1); + } + else + { + vTagCounts.put(name, 1); + } + } + else + { + ending = " /"; + } + return "<" + name + params + ending + ">"; + } + else + { + return ""; + } + } + + // comments + m = P_COMMENT.matcher(s); + if (!stripComment && m.find()) + { + return "<" + m.group() + ">"; + } + + return ""; + } + + private String processParamProtocol(String s) + { + s = decodeEntities(s); + final Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) + { + final String protocol = m.group(1); + if (!inArray(protocol, vAllowedProtocols)) + { + // bad protocol, turn into local anchor link instead + s = "#" + s.substring(protocol.length() + 1); + if (s.startsWith("#//")) + { + s = "#" + s.substring(3); + } + } + } + + return s; + } + + private String decodeEntities(String s) + { + StringBuffer buf = new StringBuffer(); + + Matcher m = P_ENTITY.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.decode(match).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENTITY_UNICODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENCODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + s = validateEntities(s); + return s; + } + + private String validateEntities(final String s) + { + StringBuffer buf = new StringBuffer(); + + // validate entities throughout the string + Matcher m = P_VALID_ENTITIES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // ([^&;]*) + final String two = m.group(2); // (?=(;|&|$)) + m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); + } + m.appendTail(buf); + + return encodeQuotes(buf.toString()); + } + + private String encodeQuotes(final String s) + { + if (encodeQuotes) + { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // (>|^) + final String two = m.group(2); // ([^<]+?) + final String three = m.group(3); // (<|$) + // 涓嶆浛鎹㈠弻寮曞彿涓"锛岄槻姝son鏍煎紡鏃犳晥 regexReplace(P_QUOTE, """, two) + m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); + } + m.appendTail(buf); + return buf.toString(); + } + else + { + return s; + } + } + + private String checkEntity(final String preamble, final String term) + { + + return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(final String entity) + { + return inArray(entity, vAllowedEntities); + } + + private static boolean inArray(final String s, final String[] array) + { + for (String item : array) + { + if (item != null && item.equals(s)) + { + return true; + } + } + return false; + } + + private boolean allowed(final String name) + { + return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); + } + + private boolean allowedAttribute(final String name, final String paramName) + { + return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java new file mode 100644 index 0000000..589d123 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java @@ -0,0 +1,55 @@ +package com.ruoyi.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import javax.servlet.ServletRequest; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 閫氱敤http宸ュ叿灏佽 + * + * @author ruoyi + */ +public class HttpHelper +{ + private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); + + public static String getBodyString(ServletRequest request) + { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = null; + try (InputStream inputStream = request.getInputStream()) + { + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) + { + sb.append(line); + } + } + catch (IOException e) + { + LOGGER.warn("getBodyString鍑虹幇闂锛"); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + LOGGER.error(ExceptionUtils.getMessage(e)); + } + } + } + return sb.toString(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java new file mode 100644 index 0000000..f85c82c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -0,0 +1,274 @@ +package com.ruoyi.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; + +/** + * 閫氱敤http鍙戦佹柟娉 + * + * @author ruoyi + */ +public class HttpUtils +{ + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 鍚戞寚瀹 URL 鍙戦丟ET鏂规硶鐨勮姹 + * + * @param url 鍙戦佽姹傜殑 URL + * @return 鎵浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋 + */ + public static String sendGet(String url) + { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 鍚戞寚瀹 URL 鍙戦丟ET鏂规硶鐨勮姹 + * + * @param url 鍙戦佽姹傜殑 URL + * @param param 璇锋眰鍙傛暟锛岃姹傚弬鏁板簲璇ユ槸 name1=value1&name2=value2 鐨勫舰寮忋 + * @return 鎵浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋 + */ + public static String sendGet(String url, String param) + { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 鍚戞寚瀹 URL 鍙戦丟ET鏂规硶鐨勮姹 + * + * @param url 鍙戦佽姹傜殑 URL + * @param param 璇锋眰鍙傛暟锛岃姹傚弬鏁板簲璇ユ槸 name1=value1&name2=value2 鐨勫舰寮忋 + * @param contentType 缂栫爜绫诲瀷 + * @return 鎵浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋 + */ + public static String sendGet(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try + { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("璋冪敤HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("璋冪敤HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("璋冪敤HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("璋冪敤HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (in != null) + { + in.close(); + } + } + catch (Exception ex) + { + log.error("璋冪敤in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 鍚戞寚瀹 URL 鍙戦丳OST鏂规硶鐨勮姹 + * + * @param url 鍙戦佽姹傜殑 URL + * @param param 璇锋眰鍙傛暟锛岃姹傚弬鏁板簲璇ユ槸 name1=value1&name2=value2 鐨勫舰寮忋 + * @return 鎵浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋 + */ + public static String sendPost(String url, String param) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("璋冪敤HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("璋冪敤HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("璋冪敤HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("璋冪敤HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("璋冪敤in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) + { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try + { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) + { + if (ret != null && !"".equals(ret.trim())) + { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) + { + log.error("璋冪敤HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("璋冪敤HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("璋冪敤HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("璋冪敤HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[] {}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java new file mode 100644 index 0000000..edfe419 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -0,0 +1,56 @@ +package com.ruoyi.common.utils.ip; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpUtils; + +/** + * 鑾峰彇鍦板潃绫 + * + * @author ruoyi + */ +public class AddressUtils +{ + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + + // IP鍦板潃鏌ヨ + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + + // 鏈煡鍦板潃 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) + { + // 鍐呯綉涓嶆煡璇 + if (IpUtils.internalIp(ip)) + { + return "鍐呯綉IP"; + } + if (RuoYiConfig.isAddressEnabled()) + { + try + { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) + { + log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSON.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) + { + log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip); + } + } + return UNKNOWN; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java new file mode 100644 index 0000000..c18c56a --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java @@ -0,0 +1,264 @@ +package com.ruoyi.common.utils.ip; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; +import com.ruoyi.common.utils.StringUtils; + +/** + * 鑾峰彇IP鏂规硶 + * + * @author ruoyi + */ +public class IpUtils +{ + /** + * 鑾峰彇瀹㈡埛绔疘P + * + * @param request 璇锋眰瀵硅薄 + * @return IP鍦板潃 + */ + public static String getIpAddr(HttpServletRequest request) + { + if (request == null) + { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + + /** + * 妫鏌ユ槸鍚︿负鍐呴儴IP鍦板潃 + * + * @param ip IP鍦板潃 + * @return 缁撴灉 + */ + public static boolean internalIp(String ip) + { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + /** + * 妫鏌ユ槸鍚︿负鍐呴儴IP鍦板潃 + * + * @param addr byte鍦板潃 + * @return 缁撴灉 + */ + private static boolean internalIp(byte[] addr) + { + if (StringUtils.isNull(addr) || addr.length < 2) + { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) + { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) + { + return true; + } + case SECTION_5: + switch (b1) + { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 灏咺Pv4鍦板潃杞崲鎴愬瓧鑺 + * + * @param text IPv4鍦板潃 + * @return byte 瀛楄妭 + */ + public static byte[] textToNumericFormatV4(String text) + { + if (text.length() == 0) + { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try + { + long l; + int i; + switch (elements.length) + { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) + { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) + { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) + { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } + catch (NumberFormatException e) + { + return null; + } + return bytes; + } + + /** + * 鑾峰彇IP鍦板潃 + * + * @return 鏈湴IP鍦板潃 + */ + public static String getHostIp() + { + try + { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException e) + { + } + return "127.0.0.1"; + } + + /** + * 鑾峰彇涓绘満鍚 + * + * @return 鏈湴涓绘満鍚 + */ + public static String getHostName() + { + try + { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException e) + { + } + return "鏈煡"; + } + + /** + * 浠庡绾у弽鍚戜唬鐞嗕腑鑾峰緱绗竴涓潪unknown IP鍦板潃 + * + * @param ip 鑾峰緱鐨処P鍦板潃 + * @return 绗竴涓潪unknown IP鍦板潃 + */ + public static String getMultistageReverseProxyIp(String ip) + { + // 澶氱骇鍙嶅悜浠g悊妫娴 + if (ip != null && ip.indexOf(",") > 0) + { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) + { + if (false == isUnknown(subIp)) + { + ip = subIp; + break; + } + } + } + return ip; + } + + /** + * 妫娴嬬粰瀹氬瓧绗︿覆鏄惁涓烘湭鐭ワ紝澶氱敤浜庢娴婬TTP璇锋眰鐩稿叧 + * + * @param checkString 琚娴嬬殑瀛楃涓 + * @return 鏄惁鏈煡 + */ + public static boolean isUnknown(String checkString) + { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } +} \ No newline at end of file diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 0000000..5ea74c1 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.utils.poi; + +/** + * Excel鏁版嵁鏍煎紡澶勭悊閫傞厤鍣 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter +{ + /** + * 鏍煎紡鍖 + * + * @param value 鍗曞厓鏍兼暟鎹 + * @param args excel娉ㄨВargs鍙傛暟缁 + * + * @return 澶勭悊鍚庣殑鍊 + */ + Object format(Object value, String[] args); +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..26a33ce --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -0,0 +1,1432 @@ +package com.ruoyi.common.utils.poi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.RegExUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFPicture; +import org.apache.poi.hssf.usermodel.HSSFPictureData; +import org.apache.poi.hssf.usermodel.HSSFShape; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.PictureData; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.XSSFDrawing; +import org.apache.poi.xssf.usermodel.XSSFPicture; +import org.apache.poi.xssf.usermodel.XSSFShape; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.annotation.Excel.ColumnType; +import com.ruoyi.common.annotation.Excel.Type; +import com.ruoyi.common.annotation.Excels; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileTypeUtils; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.common.utils.file.ImageUtils; +import com.ruoyi.common.utils.reflect.ReflectUtils; + +/** + * Excel鐩稿叧澶勭悊 + * + * @author ruoyi + */ +public class ExcelUtil +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * Excel sheet鏈澶ц鏁帮紝榛樿65536 + */ + public static final int sheetSize = 65536; + + /** + * 宸ヤ綔琛ㄥ悕绉 + */ + private String sheetName; + + /** + * 瀵煎嚭绫诲瀷锛圗XPORT:瀵煎嚭鏁版嵁锛汭MPORT锛氬鍏ユā鏉匡級 + */ + private Type type; + + /** + * 宸ヤ綔钖勫璞 + */ + private Workbook wb; + + /** + * 宸ヤ綔琛ㄥ璞 + */ + private Sheet sheet; + + /** + * 鏍峰紡鍒楄〃 + */ + private Map styles; + + /** + * 瀵煎叆瀵煎嚭鏁版嵁鍒楄〃 + */ + private List list; + + /** + * 娉ㄨВ鍒楄〃 + */ + private List fields; + + /** + * 褰撳墠琛屽彿 + */ + private int rownum; + + /** + * 鏍囬 + */ + private String title; + + /** + * 鏈澶ч珮搴 + */ + private short maxHeight; + + /** + * 缁熻鍒楄〃 + */ + private Map statistics = new HashMap(); + + /** + * 鏁板瓧鏍煎紡 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 瀹炰綋瀵硅薄 + */ + public Class clazz; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + public void init(List list, String sheetName, String title, Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createWorkbook(); + createTitle(); + } + + /** + * 鍒涘缓excel绗竴琛屾爣棰 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), + this.fields.size() - 1)); + } + } + + /** + * 瀵筫xcel琛ㄥ崟榛樿绗竴涓储寮曞悕杞崲鎴恖ist + * + * @param is 杈撳叆娴 + * @return 杞崲鍚庨泦鍚 + */ + public List importExcel(InputStream is) throws Exception + { + return importExcel(is, 0); + } + + /** + * 瀵筫xcel琛ㄥ崟榛樿绗竴涓储寮曞悕杞崲鎴恖ist + * + * @param is 杈撳叆娴 + * @param titleNum 鏍囬鍗犵敤琛屾暟 + * @return 杞崲鍚庨泦鍚 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + + /** + * 瀵筫xcel琛ㄥ崟鎸囧畾琛ㄦ牸绱㈠紩鍚嶈浆鎹㈡垚list + * + * @param sheetName 琛ㄦ牸绱㈠紩鍚 + * @param titleNum 鏍囬鍗犵敤琛屾暟 + * @param is 杈撳叆娴 + * @return 杞崲鍚庨泦鍚 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 濡傛灉鎸囧畾sheet鍚,鍒欏彇鎸囧畾sheet涓殑鍐呭 鍚﹀垯榛樿鎸囧悜绗1涓猻heet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("鏂囦欢sheet涓嶅瓨鍦"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 鑾峰彇鏈鍚庝竴涓潪绌鸿鐨勮涓嬫爣锛屾瘮濡傛昏鏁颁负n锛屽垯杩斿洖鐨勪负n-1 + int rows = sheet.getLastRowNum(); + + if (rows > 0) + { + // 瀹氫箟涓涓猰ap鐢ㄤ簬瀛樻斁excel鍒楃殑搴忓彿鍜宖ield. + Map cellMap = new HashMap(); + // 鑾峰彇琛ㄥご + Row heard = sheet.getRow(titleNum); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 鏈夋暟鎹椂鎵嶅鐞 寰楀埌绫荤殑鎵鏈塮ield. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) + { + // 浠庣2琛屽紑濮嬪彇鏁版嵁,榛樿绗竴琛屾槸琛ㄥご. + Row row = sheet.getRow(i); + // 鍒ゆ柇褰撳墠琛屾槸鍚︽槸绌鸿 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 濡傛灉涓嶅瓨鍦ㄥ疄渚嬪垯鏂板缓. + entity = (entity == null ? clazz.newInstance() : entity); + // 浠巑ap涓緱鍒板搴斿垪鐨刦ield. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 鍙栧緱绫诲瀷,骞舵牴鎹璞$被鍨嬭缃. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (StringUtils.isNotEmpty(attr.dictType())) + { + val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr); + } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @return 缁撴灉 + */ + public AjaxResult exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param title 鏍囬 + * @return 缁撴灉 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param response 杩斿洖鏁版嵁 + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @return 缁撴灉 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param response 杩斿洖鏁版嵁 + * @param list 瀵煎嚭鏁版嵁闆嗗悎 + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param title 鏍囬 + * @return 缁撴灉 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Type.EXPORT); + exportExcel(response); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @return 缁撴灉 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param title 鏍囬 + * @return 缁撴灉 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @return 缁撴灉 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О + * @param title 鏍囬 + * @return 缁撴灉 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Type.IMPORT); + exportExcel(response); + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @return 缁撴灉 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("瀵煎嚭Excel寮傚父{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟 + * + * @return 缁撴灉 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("瀵煎嚭Excel寮傚父{}", e.getMessage()); + throw new UtilException("瀵煎嚭Excel澶辫触锛岃鑱旂郴缃戠珯绠$悊鍛橈紒"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 鍒涘缓鍐欏叆鏁版嵁鍒癝heet + */ + public void writeSheet() + { + // 鍙栧嚭涓鍏辨湁澶氬皯涓猻heet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 浜х敓涓琛 + Row row = sheet.createRow(rownum); + int column = 0; + // 鍐欏叆鍚勪釜瀛楁鐨勫垪澶村悕绉 + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + this.createCell(excel, row, column++); + } + if (Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 濉厖excel鏁版嵁 + * + * @param index 搴忓彿 + * @param row 鍗曞厓鏍艰 + */ + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + for (int i = startNo; i < endNo; i++) + { + row = sheet.createRow(i + 1 + rownum - startNo); + // 寰楀埌瀵煎嚭瀵硅薄. + T vo = (T) list.get(i); + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + this.addCell(excel, row, vo, field, column++); + } + } + } + + /** + * 鍒涘缓琛ㄦ牸鏍峰紡 + * + * @param wb 宸ヤ綔钖勫璞 + * @return 鏍峰紡鍒楄〃 + */ + private Map createStyles(Workbook wb) + { + // 鍐欏叆鍚勬潯璁板綍,姣忔潯璁板綍瀵瑰簲excel琛ㄤ腑鐨勪竴琛 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + styles.put("header", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationStyles(wb)); + + return styles; + } + + /** + * 鏍规嵁Excel娉ㄨВ鍒涘缓琛ㄦ牸鏍峰紡 + * + * @param wb 宸ヤ綔钖勫璞 + * @return 鑷畾涔夋牱寮忓垪琛 + */ + private Map annotationStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = "data_" + excel.align() + "_" + excel.color(); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + styles.put(key, style); + } + } + return styles; + } + + /** + * 鍒涘缓鍗曞厓鏍 + */ + public Cell createCell(Excel attr, Row row, int column) + { + // 鍒涘缓鍒 + Cell cell = row.createCell(column); + // 鍐欏叆鍒椾俊鎭 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get("header")); + return cell; + } + + /** + * 璁剧疆鍗曞厓鏍间俊鎭 + * + * @param value 鍗曞厓鏍煎 + * @param attr 娉ㄨВ鐩稿叧 + * @param cell 鍗曞厓鏍间俊鎭 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType()) + { + String cellValue = Convert.toStr(value); + // 瀵逛簬浠讳綍浠ヨ〃杈惧紡瑙﹀彂瀛楃 =-+@寮澶寸殑鍗曞厓鏍硷紝鐩存帴浣跨敤tab瀛楃浣滀负鍓嶇紑锛岄槻姝SV娉ㄥ叆銆 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + else if (ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 鑾峰彇鐢诲竷 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 鑾峰彇鍥剧墖绫诲瀷,璁剧疆鍥剧墖鎻掑叆绫诲瀷 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 鍒涘缓琛ㄦ牸鏍峰紡 + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("娉細") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 璁剧疆鍒楀 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + } + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) + { + // 鎻愮ず淇℃伅鎴栧彧鑳介夋嫨涓嶈兘杈撳叆鐨勫垪鍐呭. + setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + } + + /** + * 娣诲姞鍗曞厓鏍 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 璁剧疆琛岄珮 + row.setHeight(maxHeight); + // 鏍规嵁Excel涓缃儏鍐靛喅瀹氭槸鍚﹀鍑,鏈変簺鎯呭喌闇瑕佷繚鎸佷负绌,甯屾湜鐢ㄦ埛濉啓杩欎竴鍒. + if (attr.isExport()) + { + // 鍒涘缓cell + cell = row.createCell(column); + cell.setCellStyle(styles.get("data_" + attr.align() + "_" + attr.color())); + + // 鐢ㄤ簬璇诲彇瀵硅薄涓殑灞炴 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(parseDateToStr(dateFormat, value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator)); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr)); + } + else + { + // 璁剧疆鍒楃被鍨 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } + catch (Exception e) + { + log.error("瀵煎嚭Excel澶辫触{}", e); + } + return cell; + } + + /** + * 璁剧疆 POI XSSFSheet 鍗曞厓鏍兼彁绀烘垨閫夋嫨妗 + * + * @param sheet 琛ㄥ崟 + * @param textlist 涓嬫媺妗嗘樉绀虹殑鍐呭 + * @param promptContent 鎻愮ず鍐呭 + * @param firstRow 寮濮嬭 + * @param endRow 缁撴潫琛 + * @param firstCol 寮濮嬪垪 + * @param endCol 缁撴潫鍒 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 濡傛灉璁剧疆浜嗘彁绀轰俊鎭垯榧犳爣鏀句笂鍘绘彁绀 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 澶勭悊Excel鍏煎鎬ч棶棰 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 瑙f瀽瀵煎嚭鍊 0=鐢,1=濂,2=鏈煡 + * + * @param propertyValue 鍙傛暟鍊 + * @param converterExp 缈昏瘧娉ㄨВ + * @param separator 鍒嗛殧绗 + * @return 瑙f瀽鍚庡 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[0].equals(value)) + { + propertyString.append(itemArray[1] + separator); + break; + } + } + } + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 鍙嶅悜瑙f瀽鍊 鐢=0,濂=1,鏈煡=2 + * + * @param propertyValue 鍙傛暟鍊 + * @param converterExp 缈昏瘧娉ㄨВ + * @param separator 鍒嗛殧绗 + * @return 瑙f瀽鍚庡 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[1].equals(value)) + { + propertyString.append(itemArray[0] + separator); + break; + } + } + } + else + { + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 瑙f瀽瀛楀吀鍊 + * + * @param dictValue 瀛楀吀鍊 + * @param dictType 瀛楀吀绫诲瀷 + * @param separator 鍒嗛殧绗 + * @return 瀛楀吀鏍囩 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) + { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 鍙嶅悜瑙f瀽鍊煎瓧鍏稿 + * + * @param dictLabel 瀛楀吀鏍囩 + * @param dictType 瀛楀吀绫诲瀷 + * @param separator 鍒嗛殧绗 + * @return 瀛楀吀鍊 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) + { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 鏁版嵁澶勭悊鍣 + * + * @param value 鏁版嵁鍊 + * @param excel 鏁版嵁娉ㄨВ + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); + value = formatMethod.invoke(instance, value, excel.args()); + } + catch (Exception e) + { + log.error("涓嶈兘鏍煎紡鍖栨暟鎹 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 鍚堣缁熻淇℃伅 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 鍒涘缓缁熻琛 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("鍚堣"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 缂栫爜鏂囦欢鍚 + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 鑾峰彇涓嬭浇璺緞 + * + * @param filename 鏂囦欢鍚嶇О + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = RuoYiConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 鑾峰彇bean涓殑灞炴у + * + * @param vo 瀹炰綋瀵硅薄 + * @param field 瀛楁 + * @param excel 娉ㄨВ + * @return 鏈缁堢殑灞炴у + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.contains(".")) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 浠ョ被鐨勫睘鎬х殑get鏂规硶鏂规硶褰㈠紡鑾峰彇鍊 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 寰楀埌鎵鏈夊畾涔夊瓧娈 + */ + private void createExcelField() + { + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 鑾峰彇瀛楁娉ㄨВ淇℃伅 + */ + public List getFields() + { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + // 鍗曟敞瑙 + if (field.isAnnotationPresent(Excel.class)) + { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } + + // 澶氭敞瑙 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } + } + } + return fields; + } + + /** + * 鏍规嵁娉ㄨВ鑾峰彇鏈澶ц楂 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short) (maxHeight * 20); + } + + /** + * 鍒涘缓涓涓伐浣滅翱 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 鍒涘缓宸ヤ綔琛 + * + * @param sheetNo sheet鏁伴噺 + * @param index 搴忓彿 + */ + public void createSheet(int sheetNo, int index) + { + // 璁剧疆宸ヤ綔琛ㄧ殑鍚嶇О. + if (sheetNo > 1 && index > 0) + { + this.sheet = wb.createSheet(); + this.createTitle(); + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 鑾峰彇鍗曞厓鏍煎 + * + * @param row 鑾峰彇鐨勮 + * @param column 鑾峰彇鍗曞厓鏍煎垪鍙 + * @return 鍗曞厓鏍煎 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 鏃ユ湡鏍煎紡杞崲 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + /** + * 鍒ゆ柇鏄惁鏄┖琛 + * + * @param row 鍒ゆ柇鐨勮 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 鑾峰彇Excel2003鍥剧墖 + * + * @param sheet 褰撳墠sheet瀵硅薄 + * @param workbook 宸ヤ綔绨垮璞 + * @return Map key:鍥剧墖鍗曞厓鏍肩储寮曪紙1_1锛塖tring锛寁alue:鍥剧墖娴丳ictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1()); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 鑾峰彇Excel2007鍥剧墖 + * + * @param sheet 褰撳墠sheet瀵硅薄 + * @param workbook 宸ヤ綔绨垮璞 + * @return Map key:鍥剧墖鍗曞厓鏍肩储寮曪紙1_1锛塖tring锛寁alue:鍥剧墖娴丳ictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 鏍煎紡鍖栦笉鍚岀被鍨嬬殑鏃ユ湡瀵硅薄 + * + * @param dateFormat 鏃ユ湡鏍煎紡 + * @param val 琚牸寮忓寲鐨勬棩鏈熷璞 + * @return 鏍煎紡鍖栧悗鐨勬棩鏈熷瓧绗 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..b19953e --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,410 @@ +package com.ruoyi.common.utils.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.DateUtils; + +/** + * 鍙嶅皠宸ュ叿绫. 鎻愪緵璋冪敤getter/setter鏂规硶, 璁块棶绉佹湁鍙橀噺, 璋冪敤绉佹湁鏂规硶, 鑾峰彇娉涘瀷绫诲瀷Class, 琚獳OP杩囩殑鐪熷疄绫荤瓑宸ュ叿鍑芥暟. + * + * @author ruoyi + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 璋冪敤Getter鏂规硶. + * 鏀寔澶氱骇锛屽锛氬璞″悕.瀵硅薄鍚.鏂规硶 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 璋冪敤Setter鏂规硶, 浠呭尮閰嶆柟娉曞悕銆 + * 鏀寔澶氱骇锛屽锛氬璞″悕.瀵硅薄鍚.鏂规硶 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 鐩存帴璇诲彇瀵硅薄灞炴у, 鏃犺private/protected淇グ绗, 涓嶇粡杩噂etter鍑芥暟. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("涓嶅彲鑳芥姏鍑虹殑寮傚父{}", e.getMessage()); + } + return result; + } + + /** + * 鐩存帴璁剧疆瀵硅薄灞炴у, 鏃犺private/protected淇グ绗, 涓嶇粡杩噑etter鍑芥暟. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 "); + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("涓嶅彲鑳芥姏鍑虹殑寮傚父: {}", e.getMessage()); + } + } + + /** + * 鐩存帴璋冪敤瀵硅薄鏂规硶, 鏃犺private/protected淇グ绗. + * 鐢ㄤ簬涓娆℃ц皟鐢ㄧ殑鎯呭喌锛屽惁鍒欏簲浣跨敤getAccessibleMethod()鍑芥暟鑾峰緱Method鍚庡弽澶嶈皟鐢. + * 鍚屾椂鍖归厤鏂规硶鍚+鍙傛暟绫诲瀷锛 + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + methodName + "] 鏂规硶 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 鐩存帴璋冪敤瀵硅薄鏂规硶, 鏃犺private/protected淇グ绗︼紝 + * 鐢ㄤ簬涓娆℃ц皟鐢ㄧ殑鎯呭喌锛屽惁鍒欏簲浣跨敤getAccessibleMethodByName()鍑芥暟鑾峰緱Method鍚庡弽澶嶈皟鐢. + * 鍙尮閰嶅嚱鏁板悕锛屽鏋滄湁澶氫釜鍚屽悕鍑芥暟璋冪敤绗竴涓 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 濡傛灉涓虹┖涓嶆姤閿欙紝鐩存帴杩斿洖绌恒 + logger.debug("鍦 [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + methodName + "] 鏂规硶 "); + return null; + } + try + { + // 绫诲瀷杞崲锛堝皢鍙傛暟鏁版嵁绫诲瀷杞崲涓虹洰鏍囨柟娉曞弬鏁扮被鍨嬶級 + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredField, 骞跺己鍒惰缃负鍙闂. + * 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒, 杩斿洖null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 涓虹┖涓嶆姤閿欍傜洿鎺ヨ繑鍥 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredMethod,骞跺己鍒惰缃负鍙闂. + * 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒, 杩斿洖null. + * 鍖归厤鍑芥暟鍚+鍙傛暟绫诲瀷銆 + * 鐢ㄤ簬鏂规硶闇瑕佽澶氭璋冪敤鐨勬儏鍐. 鍏堜娇鐢ㄦ湰鍑芥暟鍏堝彇寰桵ethod,鐒跺悗璋冪敤Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 涓虹┖涓嶆姤閿欍傜洿鎺ヨ繑鍥 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredMethod,骞跺己鍒惰缃负鍙闂. + * 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒, 杩斿洖null. + * 鍙尮閰嶅嚱鏁板悕銆 + * 鐢ㄤ簬鏂规硶闇瑕佽澶氭璋冪敤鐨勬儏鍐. 鍏堜娇鐢ㄦ湰鍑芥暟鍏堝彇寰桵ethod,鐒跺悗璋冪敤Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 涓虹┖涓嶆姤閿欍傜洿鎺ヨ繑鍥 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 鏀瑰彉private/protected鐨勬柟娉曚负public锛屽敖閲忎笉璋冪敤瀹為檯鏀瑰姩鐨勮鍙ワ紝閬垮厤JDK鐨凷ecurityManager鎶辨ㄣ + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 鏀瑰彉private/protected鐨勬垚鍛樺彉閲忎负public锛屽敖閲忎笉璋冪敤瀹為檯鏀瑰姩鐨勮鍙ワ紝閬垮厤JDK鐨凷ecurityManager鎶辨ㄣ + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 閫氳繃鍙嶅皠, 鑾峰緱Class瀹氫箟涓0鏄庣殑娉涘瀷鍙傛暟鐨勭被鍨, 娉ㄦ剰娉涘瀷蹇呴』瀹氫箟鍦ㄧ埗绫诲 + * 濡傛棤娉曟壘鍒, 杩斿洖Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 閫氳繃鍙嶅皠, 鑾峰緱Class瀹氫箟涓0鏄庣殑鐖剁被鐨勬硾鍨嬪弬鏁扮殑绫诲瀷. + * 濡傛棤娉曟壘鍒, 杩斿洖Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 灏嗗弽灏勬椂鐨刢hecked exception杞崲涓簎nchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java new file mode 100644 index 0000000..ca1cd92 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/sign/Base64.java @@ -0,0 +1,291 @@ +package com.ruoyi.common.utils.sign; + +/** + * Base64宸ュ叿绫 + * + * @author ruoyi + */ +public final class Base64 +{ + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static + { + for (int i = 0; i < BASELENGTH; ++i) + { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) + { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) + { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) + { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) + { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + } + + private static boolean isWhiteSpace(char octect) + { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) + { + return (octect == PAD); + } + + private static boolean isData(char octect) + { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) + { + if (binaryData == null) + { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) + { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) + { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) + { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } + else if (fewerThan24bits == SIXTEENBIT) + { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) + { + if (encoded == null) + { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) + { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) + { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) + { + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) + { + return null; + } // if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) + { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) + {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) + { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } + else if (!isPad(d3) && isPad(d4)) + { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } + else + { + return null; + } + } + else + { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) + { + if (data == null) + { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) + { + if (!isWhiteSpace(data[i])) + { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java new file mode 100644 index 0000000..c1c58db --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/sign/Md5Utils.java @@ -0,0 +1,67 @@ +package com.ruoyi.common.utils.sign; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Md5鍔犲瘑鏂规硶 + * + * @author ruoyi + */ +public class Md5Utils +{ + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) + { + MessageDigest algorithm; + try + { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } + catch (Exception e) + { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) + { + if (hash == null) + { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) + { + if ((hash[i] & 0xff) < 0x10) + { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) + { + try + { + return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } + catch (Exception e) + { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java new file mode 100644 index 0000000..f290ec3 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/spring/SpringUtils.java @@ -0,0 +1,158 @@ +package com.ruoyi.common.utils.spring; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.StringUtils; + +/** + * spring宸ュ叿绫 鏂逛究鍦ㄩ潪spring绠$悊鐜涓幏鍙朾ean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring搴旂敤涓婁笅鏂囩幆澧 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 鑾峰彇瀵硅薄 + * + * @param name + * @return Object 涓涓互鎵缁欏悕瀛楁敞鍐岀殑bean鐨勫疄渚 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 鑾峰彇绫诲瀷涓簉equiredType鐨勫璞 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 濡傛灉BeanFactory鍖呭惈涓涓笌鎵缁欏悕绉板尮閰嶇殑bean瀹氫箟锛屽垯杩斿洖true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 鍒ゆ柇浠ョ粰瀹氬悕瀛楁敞鍐岀殑bean瀹氫箟鏄竴涓猻ingleton杩樻槸涓涓猵rototype銆 濡傛灉涓庣粰瀹氬悕瀛楃浉搴旂殑bean瀹氫箟娌℃湁琚壘鍒帮紝灏嗕細鎶涘嚭涓涓紓甯革紙NoSuchBeanDefinitionException锛 + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 娉ㄥ唽瀵硅薄鐨勭被鍨 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 濡傛灉缁欏畾鐨刡ean鍚嶅瓧鍦╞ean瀹氫箟涓湁鍒悕锛屽垯杩斿洖杩欎簺鍒悕 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 鑾峰彇aop浠g悊瀵硅薄 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 鑾峰彇褰撳墠鐨勭幆澧冮厤缃紝鏃犻厤缃繑鍥瀗ull + * + * @return 褰撳墠鐨勭幆澧冮厤缃 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 鑾峰彇褰撳墠鐨勭幆澧冮厤缃紝褰撴湁澶氫釜鐜閰嶇疆鏃讹紝鍙幏鍙栫涓涓 + * + * @return 褰撳墠鐨勭幆澧冮厤缃 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 鑾峰彇閰嶇疆鏂囦欢涓殑鍊 + * + * @param key 閰嶇疆鏂囦欢鐨刱ey + * @return 褰撳墠鐨勯厤缃枃浠剁殑鍊 + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java new file mode 100644 index 0000000..246a9cf --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -0,0 +1,61 @@ +package com.ruoyi.common.utils.sql; + +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.StringUtils; + +/** + * sql鎿嶄綔宸ュ叿绫 + * + * @author ruoyi + */ +public class SqlUtil +{ + /** + * 瀹氫箟甯哥敤鐨 sql鍏抽敭瀛 + */ + public static String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare "; + + /** + * 浠呮敮鎸佸瓧姣嶃佹暟瀛椼佷笅鍒掔嚎銆佺┖鏍笺侀楀彿銆佸皬鏁扮偣锛堟敮鎸佸涓瓧娈垫帓搴忥級 + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 妫鏌ュ瓧绗︼紝闃叉娉ㄥ叆缁曡繃 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + throw new UtilException("鍙傛暟涓嶇鍚堣鑼冿紝涓嶈兘杩涜鏌ヨ"); + } + return value; + } + + /** + * 楠岃瘉 order by 璇硶鏄惁绗﹀悎瑙勮寖 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } + + /** + * SQL鍏抽敭瀛楁鏌 + */ + public static void filterKeyword(String value) + { + if (StringUtils.isEmpty(value)) + { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) + { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) + { + throw new UtilException("鍙傛暟瀛樺湪SQL娉ㄥ叆椋庨櫓"); + } + } + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java new file mode 100644 index 0000000..2c84427 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/IdUtils.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.utils.uuid; + +/** + * ID鐢熸垚鍣ㄥ伐鍏风被 + * + * @author ruoyi + */ +public class IdUtils +{ + /** + * 鑾峰彇闅忔満UUID + * + * @return 闅忔満UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎 + * + * @return 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 鑾峰彇闅忔満UUID锛屼娇鐢ㄦц兘鏇村ソ鐨凾hreadLocalRandom鐢熸垚UUID + * + * @return 闅忔満UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎锛屼娇鐢ㄦц兘鏇村ソ鐨凾hreadLocalRandom鐢熸垚UUID + * + * @return 绠鍖栫殑UUID锛屽幓鎺変簡妯嚎 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java new file mode 100644 index 0000000..528f3c1 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/Seq.java @@ -0,0 +1,86 @@ +package com.ruoyi.common.utils.uuid; + +import java.util.concurrent.atomic.AtomicInteger; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * @author ruoyi 搴忓垪鐢熸垚绫 + */ +public class Seq +{ + // 閫氱敤搴忓垪绫诲瀷 + public static final String commSeqType = "COMMON"; + + // 涓婁紶搴忓垪绫诲瀷 + public static final String uploadSeqType = "UPLOAD"; + + // 閫氱敤鎺ュ彛搴忓垪鏁 + private static AtomicInteger commSeq = new AtomicInteger(1); + + // 涓婁紶鎺ュ彛搴忓垪鏁 + private static AtomicInteger uploadSeq = new AtomicInteger(1); + + // 鏈哄櫒鏍囪瘑 + private static String machineCode = "A"; + + /** + * 鑾峰彇閫氱敤搴忓垪鍙 + * + * @return 搴忓垪鍊 + */ + public static String getId() + { + return getId(commSeqType); + } + + /** + * 榛樿16浣嶅簭鍒楀彿 yyMMddHHmmss + 涓浣嶆満鍣ㄦ爣璇 + 3闀垮害寰幆閫掑瀛楃涓 + * + * @return 搴忓垪鍊 + */ + public static String getId(String type) + { + AtomicInteger atomicInt = commSeq; + if (uploadSeqType.equals(type)) + { + atomicInt = uploadSeq; + } + return getId(atomicInt, 3); + } + + /** + * 閫氱敤鎺ュ彛搴忓垪鍙 yyMMddHHmmss + 涓浣嶆満鍣ㄦ爣璇 + length闀垮害寰幆閫掑瀛楃涓 + * + * @param atomicInt 搴忓垪鏁 + * @param length 鏁板奸暱搴 + * @return 搴忓垪鍊 + */ + public static String getId(AtomicInteger atomicInt, int length) + { + String result = DateUtils.dateTimeNow(); + result += machineCode; + result += getSeq(atomicInt, length); + return result; + } + + /** + * 搴忓垪寰幆閫掑瀛楃涓瞇1, 10 鐨 (length)骞傛鏂), 鐢0宸﹁ˉ榻恖ength浣嶆暟 + * + * @return 搴忓垪鍊 + */ + private synchronized static String getSeq(AtomicInteger atomicInt, int length) + { + // 鍏堝彇鍊煎啀+1 + int value = atomicInt.getAndIncrement(); + + // 濡傛灉鏇存柊鍚庡>=10 鐨 (length)骞傛鏂瑰垯閲嶇疆涓1 + int maxSeq = (int) Math.pow(10, length); + if (atomicInt.get() >= maxSeq) + { + atomicInt.set(1); + } + // 杞瓧绗︿覆锛岀敤0宸﹁ˉ榻 + return StringUtils.padl(value, length); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java b/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java new file mode 100644 index 0000000..dfda46c --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/utils/uuid/UUID.java @@ -0,0 +1,484 @@ +package com.ruoyi.common.utils.uuid; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import com.ruoyi.common.exception.UtilException; + +/** + * 鎻愪緵閫氱敤鍞竴璇嗗埆鐮侊紙universally unique identifier锛夛紙UUID锛夊疄鐜 + * + * @author ruoyi + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 鐨勫崟渚 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 姝UID鐨勬渶楂64鏈夋晥浣 */ + private final long mostSigBits; + + /** 姝UID鐨勬渶浣64鏈夋晥浣 */ + private final long leastSigBits; + + /** + * 绉佹湁鏋勯 + * + * @param data 鏁版嵁 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 浣跨敤鎸囧畾鐨勬暟鎹瀯閫犳柊鐨 UUID銆 + * + * @param mostSigBits 鐢ㄤ簬 {@code UUID} 鐨勬渶楂樻湁鏁 64 浣 + * @param leastSigBits 鐢ㄤ簬 {@code UUID} 鐨勬渶浣庢湁鏁 64 浣 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘 浣跨敤鍔犲瘑鐨勬湰鍦扮嚎绋嬩吉闅忔満鏁扮敓鎴愬櫒鐢熸垚璇 UUID銆 + * + * @return 闅忔満鐢熸垚鐨 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘 浣跨敤鍔犲瘑鐨勫己浼殢鏈烘暟鐢熸垚鍣ㄧ敓鎴愯 UUID銆 + * + * @return 闅忔満鐢熸垚鐨 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘 浣跨敤鍔犲瘑鐨勫己浼殢鏈烘暟鐢熸垚鍣ㄧ敓鎴愯 UUID銆 + * + * @param isSecure 鏄惁浣跨敤{@link SecureRandom}濡傛灉鏄彲浠ヨ幏寰楁洿瀹夊叏鐨勯殢鏈虹爜锛屽惁鍒欏彲浠ュ緱鍒版洿濂界殑鎬ц兘 + * @return 闅忔満鐢熸垚鐨 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 鏍规嵁鎸囧畾鐨勫瓧鑺傛暟缁勮幏鍙栫被鍨 3锛堝熀浜庡悕绉扮殑锛塙UID 鐨勯潤鎬佸伐鍘傘 + * + * @param name 鐢ㄤ簬鏋勯 UUID 鐨勫瓧鑺傛暟缁勩 + * + * @return 鏍规嵁鎸囧畾鏁扮粍鐢熸垚鐨 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 鏍规嵁 {@link #toString()} 鏂规硶涓弿杩扮殑瀛楃涓叉爣鍑嗚〃绀哄舰寮忓垱寤簕@code UUID}銆 + * + * @param name 鎸囧畾 {@code UUID} 瀛楃涓 + * @return 鍏锋湁鎸囧畾鍊肩殑 {@code UUID} + * @throws IllegalArgumentException 濡傛灉 name 涓 {@link #toString} 涓弿杩扮殑瀛楃涓茶〃绀哄舰寮忎笉绗︽姏鍑烘寮傚父 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 杩斿洖姝 UUID 鐨 128 浣嶅间腑鐨勬渶浣庢湁鏁 64 浣嶃 + * + * @return 姝 UUID 鐨 128 浣嶅间腑鐨勬渶浣庢湁鏁 64 浣嶃 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 杩斿洖姝 UUID 鐨 128 浣嶅间腑鐨勬渶楂樻湁鏁 64 浣嶃 + * + * @return 姝 UUID 鐨 128 浣嶅间腑鏈楂樻湁鏁 64 浣嶃 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 涓庢 {@code UUID} 鐩稿叧鑱旂殑鐗堟湰鍙. 鐗堟湰鍙锋弿杩版 {@code UUID} 鏄浣曠敓鎴愮殑銆 + *

+ * 鐗堟湰鍙峰叿鏈変互涓嬪惈鎰: + *

    + *
  • 1 鍩轰簬鏃堕棿鐨 UUID + *
  • 2 DCE 瀹夊叏 UUID + *
  • 3 鍩轰簬鍚嶇О鐨 UUID + *
  • 4 闅忔満鐢熸垚鐨 UUID + *
+ * + * @return 姝 {@code UUID} 鐨勭増鏈彿 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 涓庢 {@code UUID} 鐩稿叧鑱旂殑鍙樹綋鍙枫傚彉浣撳彿鎻忚堪 {@code UUID} 鐨勫竷灞銆 + *

+ * 鍙樹綋鍙峰叿鏈変互涓嬪惈鎰忥細 + *

    + *
  • 0 涓 NCS 鍚戝悗鍏煎淇濈暀 + *
  • 2 IETF RFC 4122(Leach-Salz), 鐢ㄤ簬姝ょ被 + *
  • 6 淇濈暀锛屽井杞悜鍚庡吋瀹 + *
  • 7 淇濈暀渚涗互鍚庡畾涔変娇鐢 + *
+ * + * @return 姝 {@code UUID} 鐩稿叧鑱旂殑鍙樹綋鍙 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 涓庢 UUID 鐩稿叧鑱旂殑鏃堕棿鎴冲笺 + * + *

+ * 60 浣嶇殑鏃堕棿鎴冲兼牴鎹 {@code UUID} 鐨 time_low銆乼ime_mid 鍜 time_hi 瀛楁鏋勯犮
+ * 鎵寰楀埌鐨勬椂闂存埑浠 100 姣井绉掍负鍗曚綅锛屼粠 UTC锛堥氱敤鍗忚皟鏃堕棿锛 1582 骞 10 鏈 15 鏃ラ浂鏃跺紑濮嬨 + * + *

+ * 鏃堕棿鎴冲间粎鍦ㄥ湪鍩轰簬鏃堕棿鐨 UUID锛堝叾 version 绫诲瀷涓 1锛変腑鎵嶆湁鎰忎箟銆
+ * 濡傛灉姝 {@code UUID} 涓嶆槸鍩轰簬鏃堕棿鐨 UUID锛屽垯姝ゆ柟娉曟姏鍑 UnsupportedOperationException銆 + * + * @throws UnsupportedOperationException 濡傛灉姝 {@code UUID} 涓嶆槸 version 涓 1 鐨 UUID銆 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 涓庢 UUID 鐩稿叧鑱旂殑鏃堕挓搴忓垪鍊笺 + * + *

+ * 14 浣嶇殑鏃堕挓搴忓垪鍊兼牴鎹 UUID 鐨 clock_seq 瀛楁鏋勯犮俢lock_seq 瀛楁鐢ㄤ簬淇濊瘉鍦ㄥ熀浜庢椂闂寸殑 UUID 涓殑鏃堕棿鍞竴鎬с + *

+ * {@code clockSequence} 鍊间粎鍦ㄥ熀浜庢椂闂寸殑 UUID锛堝叾 version 绫诲瀷涓 1锛変腑鎵嶆湁鎰忎箟銆 濡傛灉姝 UUID 涓嶆槸鍩轰簬鏃堕棿鐨 UUID锛屽垯姝ゆ柟娉曟姏鍑 + * UnsupportedOperationException銆 + * + * @return 姝 {@code UUID} 鐨勬椂閽熷簭鍒 + * + * @throws UnsupportedOperationException 濡傛灉姝 UUID 鐨 version 涓嶄负 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 涓庢 UUID 鐩稿叧鐨勮妭鐐瑰笺 + * + *

+ * 48 浣嶇殑鑺傜偣鍊兼牴鎹 UUID 鐨 node 瀛楁鏋勯犮傛瀛楁鏃ㄥ湪鐢ㄤ簬淇濆瓨鏈哄櫒鐨 IEEE 802 鍦板潃锛岃鍦板潃鐢ㄤ簬鐢熸垚姝 UUID 浠ヤ繚璇佺┖闂村敮涓鎬с + *

+ * 鑺傜偣鍊间粎鍦ㄥ熀浜庢椂闂寸殑 UUID锛堝叾 version 绫诲瀷涓 1锛変腑鎵嶆湁鎰忎箟銆
+ * 濡傛灉姝 UUID 涓嶆槸鍩轰簬鏃堕棿鐨 UUID锛屽垯姝ゆ柟娉曟姏鍑 UnsupportedOperationException銆 + * + * @return 姝 {@code UUID} 鐨勮妭鐐瑰 + * + * @throws UnsupportedOperationException 濡傛灉姝 UUID 鐨 version 涓嶄负 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 杩斿洖姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡銆 + * + *

+ * UUID 鐨勫瓧绗︿覆琛ㄧず褰㈠紡鐢辨 BNF 鎻忚堪锛 + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @return 姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 杩斿洖姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡銆 + * + *

+ * UUID 鐨勫瓧绗︿覆琛ㄧず褰㈠紡鐢辨 BNF 鎻忚堪锛 + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @param isSimple 鏄惁绠鍗曟ā寮忥紝绠鍗曟ā寮忎负涓嶅甫'-'鐨刄UID瀛楃涓 + * @return 姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (!isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (!isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (!isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (!isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 杩斿洖姝 UUID 鐨勫搱甯岀爜銆 + * + * @return UUID 鐨勫搱甯岀爜鍊笺 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 灏嗘瀵硅薄涓庢寚瀹氬璞℃瘮杈冦 + *

+ * 褰撲笖浠呭綋鍙傛暟涓嶄负 {@code null}銆佽屾槸涓涓 UUID 瀵硅薄銆佸叿鏈変笌姝 UUID 鐩稿悓鐨 varriant銆佸寘鍚浉鍚岀殑鍊硷紙姣忎竴浣嶅潎鐩稿悓锛夋椂锛岀粨鏋滄墠涓 {@code true}銆 + * + * @param obj 瑕佷笌涔嬫瘮杈冪殑瀵硅薄 + * + * @return 濡傛灉瀵硅薄鐩稿悓锛屽垯杩斿洖 {@code true}锛涘惁鍒欒繑鍥 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 灏嗘 UUID 涓庢寚瀹氱殑 UUID 姣旇緝銆 + * + *

+ * 濡傛灉涓や釜 UUID 涓嶅悓锛屼笖绗竴涓 UUID 鐨勬渶楂樻湁鏁堝瓧娈靛ぇ浜庣浜屼釜 UUID 鐨勫搴斿瓧娈碉紝鍒欑涓涓 UUID 澶т簬绗簩涓 UUID銆 + * + * @param val 涓庢 UUID 姣旇緝鐨 UUID + * + * @return 鍦ㄦ UUID 灏忎簬銆佺瓑浜庢垨澶т簬 val 鏃讹紝鍒嗗埆杩斿洖 -1銆0 鎴 1銆 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 杩斿洖鎸囧畾鏁板瓧瀵瑰簲鐨刪ex鍊 + * + * @param val 鍊 + * @param digits 浣 + * @return 鍊 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 妫鏌ユ槸鍚︿负time-based鐗堟湰UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 鑾峰彇{@link SecureRandom}锛岀被鎻愪緵鍔犲瘑鐨勫己闅忔満鏁扮敓鎴愬櫒 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 鑾峰彇闅忔満鏁扮敓鎴愬櫒瀵硅薄
+ * ThreadLocalRandom鏄疛DK 7涔嬪悗鎻愪緵骞跺彂浜х敓闅忔満鏁帮紝鑳藉瑙e喅澶氫釜绾跨▼鍙戠敓鐨勭珵浜変簤澶恒 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/xss/Xss.java b/vapeshop-common/src/main/java/com/ruoyi/common/xss/Xss.java new file mode 100644 index 0000000..7bfdf04 --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/xss/Xss.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.xss; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 鑷畾涔墄ss鏍¢獙娉ㄨВ + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Constraint(validatedBy = { XssValidator.class }) +public @interface Xss +{ + String message() + + default "涓嶅厑璁镐换浣曡剼鏈繍琛"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/vapeshop-common/src/main/java/com/ruoyi/common/xss/XssValidator.java b/vapeshop-common/src/main/java/com/ruoyi/common/xss/XssValidator.java new file mode 100644 index 0000000..ed9ec1f --- /dev/null +++ b/vapeshop-common/src/main/java/com/ruoyi/common/xss/XssValidator.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.xss; + +import com.ruoyi.common.utils.StringUtils; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 鑷畾涔墄ss鏍¢獙娉ㄨВ瀹炵幇 + * + * @author ruoyi + */ +public class XssValidator implements ConstraintValidator +{ + private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) + { + if (StringUtils.isBlank(value)) + { + return true; + } + return !containsHtml(value); + } + + public static boolean containsHtml(String value) + { + Pattern pattern = Pattern.compile(HTML_PATTERN); + Matcher matcher = pattern.matcher(value); + return matcher.matches(); + } +} \ No newline at end of file diff --git a/vapeshop-framework/pom.xml b/vapeshop-framework/pom.xml new file mode 100644 index 0000000..ff21dff --- /dev/null +++ b/vapeshop-framework/pom.xml @@ -0,0 +1,63 @@ + + + + vapeshop + cn.com.vapeshop + 3.8.3 + + 4.0.0 + + vapeshop-framework + + + framework妗嗘灦鏍稿績 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + cn.com.vapeshop + easy-mongodb-boot-starter + + + + + com.github.penggle + kaptcha + + + javax.servlet-api + javax.servlet + + + + + + + com.github.oshi + oshi-core + + + + + cn.com.vapeshop + vapeshop-system + + + + + \ No newline at end of file diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..285c840 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,126 @@ +package com.ruoyi.framework.aspectj; + +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +/** + * 鏁版嵁杩囨护澶勭悊 + * + * @author ruoyi + */ +@Aspect +@Component +public class DataScopeAspect { + /** + * 鍏ㄩ儴鏁版嵁鏉冮檺 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 鑷畾鏁版嵁鏉冮檺 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 閮ㄩ棬鏁版嵁鏉冮檺 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 閮ㄩ棬鍙婁互涓嬫暟鎹潈闄 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 浠呮湰浜烘暟鎹潈闄 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 鏁版嵁鏉冮檺杩囨护鍏抽敭瀛 + */ + public static final String DATA_SCOPE = "dataScope"; + + @Before("@annotation(controllerDataScope)") + public static void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable { + DataScopeAspect.clearDataScope(point); + DataScopeAspect.handleDataScope(point, controllerDataScope); + } + + protected static void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) { + // 鑾峰彇褰撳墠鐨勭敤鎴 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) { + SysUser currentUser = loginUser.getUser(); + // 濡傛灉鏄秴绾х鐞嗗憳锛屽垯涓嶈繃婊ゆ暟鎹 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias()); + } + } + } + + /** + * 鏁版嵁鑼冨洿杩囨护 + * + * @param joinPoint 鍒囩偣 + * @param user 鐢ㄦ埛 + * @param userAlias 鍒悕 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) { + StringBuilder sqlString = new StringBuilder(); + + for (SysRole role : user.getRoles()) { + String dataScope = role.getDataScope(); + if (DATA_SCOPE_ALL.equals(dataScope)) { + sqlString = new StringBuilder(); + break; + } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, + role.getId())); + } else if (DATA_SCOPE_DEPT.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); + } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", + deptAlias, user.getDeptId(), user.getDeptId())); + } else if (DATA_SCOPE_SELF.equals(dataScope)) { + if (StringUtils.isNotBlank(userAlias)) { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getId())); + } else { + // 鏁版嵁鏉冮檺涓轰粎鏈汉涓旀病鏈塽serAlias鍒悕涓嶆煡璇换浣曟暟鎹 + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + } + } + + if (StringUtils.isNotBlank(sqlString.toString())) { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 鎷兼帴鏉冮檺sql鍓嶅厛娓呯┖params.dataScope鍙傛暟闃叉娉ㄥ叆 + */ + private static void clearDataScope(final JoinPoint joinPoint) { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, ""); + } + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java new file mode 100644 index 0000000..8c2c9f4 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java @@ -0,0 +1,72 @@ +package com.ruoyi.framework.aspectj; + +import java.util.Objects; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.DataSource; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; + +/** + * 澶氭暟鎹簮澶勭悊 + * + * @author ruoyi + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect +{ + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" + + "|| @within(com.ruoyi.common.annotation.DataSource)") + public void dsPointCut() + { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable + { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) + { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try + { + return point.proceed(); + } + finally + { + // 閿姣佹暟鎹簮 鍦ㄦ墽琛屾柟娉曚箣鍚 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 鑾峰彇闇瑕佸垏鎹㈢殑鏁版嵁婧 + */ + public DataSource getDataSource(ProceedingJoinPoint point) + { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) + { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java new file mode 100644 index 0000000..fd46217 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -0,0 +1,187 @@ +package com.ruoyi.framework.aspectj; + +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.entity.SysOperLog; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.BusinessStatus; +import com.ruoyi.common.enums.HttpMethod; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.HandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Collection; +import java.util.Map; + +/** + * 鎿嶄綔鏃ュ織璁板綍澶勭悊 + * + * @author ruoyi + */ +@Aspect +@Component +public class LogAspect { + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + /** + * 澶勭悊瀹岃姹傚悗鎵ц + * + * @param joinPoint 鍒囩偣 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public static void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) { + LogAspect.handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 鎷︽埅寮傚父鎿嶄綔 + * + * @param joinPoint 鍒囩偣 + * @param e 寮傚父 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public static void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) { + LogAspect.handleLog(joinPoint, controllerLog, e, null); + } + + protected static void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { + try { + // 鑾峰彇褰撳墠鐨勭敤鎴 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // *========鏁版嵁搴撴棩蹇=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 璇锋眰鐨勫湴鍧 + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + operLog.setOperIp(ip); + operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); + if (loginUser != null) { + operLog.setOperName(loginUser.getUsername()); + } + + if (e != null) { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 璁剧疆鏂规硶鍚嶇О + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 璁剧疆璇锋眰鏂瑰紡 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 澶勭悊璁剧疆娉ㄨВ涓婄殑鍙傛暟 + LogAspect.getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 淇濆瓨鏁版嵁搴 + AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); + } catch (Exception exp) { + // 璁板綍鏈湴寮傚父鏃ュ織 + log.error("==鍓嶇疆閫氱煡寮傚父=="); + log.error("寮傚父淇℃伅:{}", exp.getMessage()); + exp.printStackTrace(); + } + } + + /** + * 鑾峰彇娉ㄨВ涓鏂规硶鐨勬弿杩颁俊鎭 鐢ㄤ簬Controller灞傛敞瑙 + * + * @param log 鏃ュ織 + * @param operLog 鎿嶄綔鏃ュ織 + * @throws Exception + */ + public static void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception { + // 璁剧疆action鍔ㄤ綔 + operLog.setBusinessType(log.businessType().ordinal()); + // 璁剧疆鏍囬 + operLog.setTitle(log.title()); + // 璁剧疆鎿嶄綔浜虹被鍒 + operLog.setOperatorType(log.operatorType().ordinal()); + // 鏄惁闇瑕佷繚瀛榬equest锛屽弬鏁板拰鍊 + if (log.isSaveRequestData()) { + // 鑾峰彇鍙傛暟鐨勪俊鎭紝浼犲叆鍒版暟鎹簱涓 + LogAspect.setRequestValue(joinPoint, operLog); + } + // 鏄惁闇瑕佷繚瀛榬esponse锛屽弬鏁板拰鍊 + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) { + operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); + } + } + + /** + * 鑾峰彇璇锋眰鐨勫弬鏁帮紝鏀惧埌log涓 + * + * @param operLog 鎿嶄綔鏃ュ織 + * @throws Exception 寮傚父 + */ + private static void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception { + String requestMethod = operLog.getRequestMethod(); + if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) { + String params = LogAspect.argsArrayToString(joinPoint.getArgs()); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } else { + Map paramsMap = (Map) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); + operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000)); + } + } + + /** + * 鍙傛暟鎷艰 + */ + private static String argsArrayToString(Object[] paramsArray) { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) { + for (Object o : paramsArray) { + if (StringUtils.isNotNull(o) && !LogAspect.isFilterObject(o)) { + try { + Object jsonObj = JSON.toJSON(o); + params += jsonObj.toString() + " "; + } catch (Exception e) { + } + } + } + } + return params.trim(); + } + + /** + * 鍒ゆ柇鏄惁闇瑕佽繃婊ょ殑瀵硅薄銆 + * + * @param o 瀵硅薄淇℃伅銆 + * @return 濡傛灉鏄渶瑕佽繃婊ょ殑瀵硅薄锛屽垯杩斿洖true锛涘惁鍒欒繑鍥瀎alse銆 + */ + @SuppressWarnings("rawtypes") + public static boolean isFilterObject(final Object o) { + Class clazz = o.getClass(); + if (clazz.isArray()) { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } else if (Collection.class.isAssignableFrom(clazz)) { + Collection collection = (Collection) o; + for (Object value : collection) { + return value instanceof MultipartFile; + } + } else if (Map.class.isAssignableFrom(clazz)) { + Map map = (Map) o; + for (Object value : map.entrySet()) { + Map.Entry entry = (Map.Entry) value; + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java new file mode 100644 index 0000000..0d1b62f --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -0,0 +1,91 @@ +package com.ruoyi.framework.aspectj; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; +import com.ruoyi.common.annotation.RateLimiter; +import com.ruoyi.common.enums.LimitType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; + +/** + * 闄愭祦澶勭悊 + * + * @author ruoyi + */ +@Aspect +@Component +public class RateLimiterAspect +{ + private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); + + private RedisTemplate redisTemplate; + + private RedisScript limitScript; + + @Autowired + public void setRedisTemplate1(RedisTemplate redisTemplate) + { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(RedisScript limitScript) + { + this.limitScript = limitScript; + } + + @Before("@annotation(rateLimiter)") + public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable + { + String key = rateLimiter.key(); + int time = rateLimiter.time(); + int count = rateLimiter.count(); + + String combineKey = getCombineKey(rateLimiter, point); + List keys = Collections.singletonList(combineKey); + try + { + Long number = redisTemplate.execute(limitScript, keys, count, time); + if (StringUtils.isNull(number) || number.intValue() > count) + { + throw new ServiceException("璁块棶杩囦簬棰戠箒锛岃绋嶅欏啀璇"); + } + log.info("闄愬埗璇锋眰'{}',褰撳墠璇锋眰'{}',缂撳瓨key'{}'", count, number.intValue(), key); + } + catch (ServiceException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException("鏈嶅姟鍣ㄩ檺娴佸紓甯革紝璇风◢鍊欏啀璇"); + } + } + + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) + { + StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); + if (rateLimiter.limitType() == LimitType.IP) + { + stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest())).append("-"); + } + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + stringBuffer.append(targetClass.getName()).append("-").append(method.getName()); + return stringBuffer.toString(); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java new file mode 100644 index 0000000..4dd08fe --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java @@ -0,0 +1,29 @@ +package com.ruoyi.framework.config; + +import com.easy.mongodb.starter.register.MongoDBMapperScan; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +import java.util.TimeZone; + +/** + * 绋嬪簭娉ㄨВ閰嶇疆 + * + * @author ruoyi + */ +@Configuration +// 琛ㄧず閫氳繃aop妗嗘灦鏆撮湶璇ヤ唬鐞嗗璞,AopContext鑳藉璁块棶 +@EnableAspectJAutoProxy(exposeProxy = true) +// 鎸囧畾瑕佹壂鎻忕殑Mapper绫荤殑鍖呯殑璺緞 +@MongoDBMapperScan("com.ruoyi.**.mapper") +public class ApplicationConfig { + /** + * 鏃跺尯閰嶇疆 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java new file mode 100644 index 0000000..43e78ae --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java @@ -0,0 +1,83 @@ +package com.ruoyi.framework.config; + +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import static com.google.code.kaptcha.Constants.*; + +/** + * 楠岃瘉鐮侀厤缃 + * + * @author ruoyi + */ +@Configuration +public class CaptchaConfig +{ + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 鏄惁鏈夎竟妗 榛樿涓簍rue 鎴戜滑鍙互鑷繁璁剧疆yes锛宯o + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂鑹 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 楠岃瘉鐮佸浘鐗囧搴 榛樿涓200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 楠岃瘉鐮佸浘鐗囬珮搴 榛樿涓50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 楠岃瘉鐮佹枃鏈瓧绗﹀ぇ灏 榛樿涓40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂暱搴 榛樿涓5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 楠岃瘉鐮佹枃鏈瓧浣撴牱寮 榛樿涓簄ew Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 鍥剧墖鏍峰紡 姘寸汗com.google.code.kaptcha.impl.WaterRipple 楸肩溂com.google.code.kaptcha.impl.FishEyeGimpy 闃村奖com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 鏄惁鏈夎竟妗 榛樿涓簍rue 鎴戜滑鍙互鑷繁璁剧疆yes锛宯o + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 杈规棰滆壊 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂鑹 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 楠岃瘉鐮佸浘鐗囧搴 榛樿涓200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 楠岃瘉鐮佸浘鐗囬珮搴 榛樿涓50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 楠岃瘉鐮佹枃鏈瓧绗﹀ぇ灏 榛樿涓40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 楠岃瘉鐮佹枃鏈敓鎴愬櫒 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂棿璺 榛樿涓2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 楠岃瘉鐮佹枃鏈瓧绗﹂暱搴 榛樿涓5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 楠岃瘉鐮佹枃鏈瓧浣撴牱寮 榛樿涓簄ew Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 楠岃瘉鐮佸櫔鐐归鑹 榛樿涓篊olor.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 骞叉壈瀹炵幇绫 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 鍥剧墖鏍峰紡 姘寸汗com.google.code.kaptcha.impl.WaterRipple 楸肩溂com.google.code.kaptcha.impl.FishEyeGimpy 闃村奖com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java new file mode 100644 index 0000000..4036217 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -0,0 +1,126 @@ +//package com.ruoyi.framework.config; +// +//import java.io.IOException; +//import java.util.HashMap; +//import java.util.Map; +//import javax.servlet.Filter; +//import javax.servlet.FilterChain; +//import javax.servlet.ServletException; +//import javax.servlet.ServletRequest; +//import javax.servlet.ServletResponse; +//import javax.sql.DataSource; +//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +//import org.springframework.boot.context.properties.ConfigurationProperties; +//import org.springframework.boot.web.servlet.FilterRegistrationBean; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.context.annotation.Primary; +//import com.alibaba.druid.pool.DruidDataSource; +//import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; +//import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +//import com.alibaba.druid.util.Utils; +//import com.ruoyi.common.enums.DataSourceType; +//import com.ruoyi.common.utils.spring.SpringUtils; +//import com.ruoyi.framework.config.properties.DruidProperties; +//import com.ruoyi.framework.datasource.DynamicDataSource; +// +///** +// * druid 閰嶇疆澶氭暟鎹簮 +// * +// * @author ruoyi +// */ +//@Configuration +//public class DruidConfig +//{ +// @Bean +// @ConfigurationProperties("spring.datasource.druid.master") +// public DataSource masterDataSource(DruidProperties druidProperties) +// { +// DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); +// return druidProperties.dataSource(dataSource); +// } +// +// @Bean +// @ConfigurationProperties("spring.datasource.druid.slave") +// @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") +// public DataSource slaveDataSource(DruidProperties druidProperties) +// { +// DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); +// return druidProperties.dataSource(dataSource); +// } +// +// @Bean(name = "dynamicDataSource") +// @Primary +// public DynamicDataSource dataSource(DataSource masterDataSource) +// { +// Map targetDataSources = new HashMap<>(); +// targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); +// setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); +// return new DynamicDataSource(masterDataSource, targetDataSources); +// } +// +// /** +// * 璁剧疆鏁版嵁婧 +// * +// * @param targetDataSources 澶囬夋暟鎹簮闆嗗悎 +// * @param sourceName 鏁版嵁婧愬悕绉 +// * @param beanName bean鍚嶇О +// */ +// public void setDataSource(Map targetDataSources, String sourceName, String beanName) +// { +// try +// { +// DataSource dataSource = SpringUtils.getBean(beanName); +// targetDataSources.put(sourceName, dataSource); +// } +// catch (Exception e) +// { +// } +// } +// +// /** +// * 鍘婚櫎鐩戞帶椤甸潰搴曢儴鐨勫箍鍛 +// */ +// @SuppressWarnings({ "rawtypes", "unchecked" }) +// @Bean +// @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") +// public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) +// { +// // 鑾峰彇web鐩戞帶椤甸潰鐨勫弬鏁 +// DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); +// // 鎻愬彇common.js鐨勯厤缃矾寰 +// String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; +// String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); +// final String filePath = "support/http/resources/js/common.js"; +// // 鍒涘缓filter杩涜杩囨护 +// Filter filter = new Filter() +// { +// @Override +// public void init(javax.servlet.FilterConfig filterConfig) throws ServletException +// { +// } +// @Override +// public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) +// throws IOException, ServletException +// { +// chain.doFilter(request, response); +// // 閲嶇疆缂撳啿鍖猴紝鍝嶅簲澶翠笉浼氳閲嶇疆 +// response.resetBuffer(); +// // 鑾峰彇common.js +// String text = Utils.readFromResource(filePath); +// // 姝e垯鏇挎崲banner, 闄ゅ幓搴曢儴鐨勫箍鍛婁俊鎭 +// text = text.replaceAll("
", ""); +// text = text.replaceAll("powered.*?shrek.wang", ""); +// response.getWriter().write(text); +// } +// @Override +// public void destroy() +// { +// } +// }; +// FilterRegistrationBean registrationBean = new FilterRegistrationBean(); +// registrationBean.setFilter(filter); +// registrationBean.addUrlPatterns(commonJsPattern); +// return registrationBean; +// } +//} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..b6d6110 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/FastJson2JsonRedisSerializer.java @@ -0,0 +1,48 @@ +package com.ruoyi.framework.config; + +import java.nio.charset.Charset; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; + +/** + * Redis浣跨敤FastJson搴忓垪鍖 + * + * @author ruoyi + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer +{ + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + public FastJson2JsonRedisSerializer(Class clazz) + { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException + { + if (t == null) + { + return new byte[0]; + } + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException + { + if (bytes == null || bytes.length <= 0) + { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java new file mode 100644 index 0000000..bb14c04 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/FilterConfig.java @@ -0,0 +1,58 @@ +package com.ruoyi.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.filter.RepeatableFilter; +import com.ruoyi.common.filter.XssFilter; +import com.ruoyi.common.utils.StringUtils; + +/** + * Filter閰嶇疆 + * + * @author ruoyi + */ +@Configuration +public class FilterConfig +{ + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") + public FilterRegistrationBean xssFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + public FilterRegistrationBean someFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java new file mode 100644 index 0000000..3e74580 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java @@ -0,0 +1,75 @@ +package com.ruoyi.framework.config; + +import java.util.Random; +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +/** + * 楠岃瘉鐮佹枃鏈敓鎴愬櫒 + * + * @author ruoyi + */ +public class KaptchaTextCreator extends DefaultTextCreator +{ + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() + { + Integer result = 0; + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = (int) Math.round(Math.random() * 2); + if (randomoperands == 0) + { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } + else if (randomoperands == 1) + { + if (!(x == 0) && y % x == 0) + { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } + else if (randomoperands == 2) + { + if (x >= y) + { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } + else + { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} \ No newline at end of file diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java new file mode 100644 index 0000000..bc6618a --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java @@ -0,0 +1,132 @@ +//package com.ruoyi.framework.config; +// +//import java.io.IOException; +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.HashSet; +//import java.util.List; +//import javax.sql.DataSource; +//import org.apache.ibatis.io.VFS; +//import org.apache.ibatis.session.SqlSessionFactory; +//import org.mybatis.spring.SqlSessionFactoryBean; +//import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.core.env.Environment; +//import org.springframework.core.io.DefaultResourceLoader; +//import org.springframework.core.io.Resource; +//import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +//import org.springframework.core.io.support.ResourcePatternResolver; +//import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +//import org.springframework.core.type.classreading.MetadataReader; +//import org.springframework.core.type.classreading.MetadataReaderFactory; +//import org.springframework.util.ClassUtils; +//import com.ruoyi.common.utils.StringUtils; +// +///** +// * Mybatis鏀寔*鍖归厤鎵弿鍖 +// * +// * @author ruoyi +// */ +//@Configuration +//public class MyBatisConfig +//{ +// @Autowired +// private Environment env; +// +// static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; +// +// public static String setTypeAliasesPackage(String typeAliasesPackage) +// { +// ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); +// MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); +// List allResult = new ArrayList(); +// try +// { +// for (String aliasesPackage : typeAliasesPackage.split(",")) +// { +// List result = new ArrayList(); +// aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +// + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; +// Resource[] resources = resolver.getResources(aliasesPackage); +// if (resources != null && resources.length > 0) +// { +// MetadataReader metadataReader = null; +// for (Resource resource : resources) +// { +// if (resource.isReadable()) +// { +// metadataReader = metadataReaderFactory.getMetadataReader(resource); +// try +// { +// result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); +// } +// catch (ClassNotFoundException e) +// { +// e.printStackTrace(); +// } +// } +// } +// } +// if (result.size() > 0) +// { +// HashSet hashResult = new HashSet(result); +// allResult.addAll(hashResult); +// } +// } +// if (allResult.size() > 0) +// { +// typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); +// } +// else +// { +// throw new RuntimeException("mybatis typeAliasesPackage 璺緞鎵弿閿欒,鍙傛暟typeAliasesPackage:" + typeAliasesPackage + "鏈壘鍒颁换浣曞寘"); +// } +// } +// catch (IOException e) +// { +// e.printStackTrace(); +// } +// return typeAliasesPackage; +// } +// +// public Resource[] resolveMapperLocations(String[] mapperLocations) +// { +// ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); +// List resources = new ArrayList(); +// if (mapperLocations != null) +// { +// for (String mapperLocation : mapperLocations) +// { +// try +// { +// Resource[] mappers = resourceResolver.getResources(mapperLocation); +// resources.addAll(Arrays.asList(mappers)); +// } +// catch (IOException e) +// { +// // ignore +// } +// } +// } +// return resources.toArray(new Resource[resources.size()]); +// } +// +// @Bean +// public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception +// { +// String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); +// String mapperLocations = env.getProperty("mybatis.mapperLocations"); +// String configLocation = env.getProperty("mybatis.configLocation"); +// typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); +// VFS.addImplClass(SpringBootVFS.class); +// +// final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); +// sessionFactory.setDataSource(dataSource); +// sessionFactory.setTypeAliasesPackage(typeAliasesPackage); +// sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); +// sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); +// return sessionFactory.getObject(); +// } +//} \ No newline at end of file diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java new file mode 100644 index 0000000..3f4f485 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -0,0 +1,69 @@ +package com.ruoyi.framework.config; + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * redis閰嶇疆 + * + * @author ruoyi + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport +{ + @Bean + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + // 浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash鐨刱ey涔熼噰鐢⊿tringRedisSerializer鐨勫簭鍒楀寲鏂瑰紡 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } + + @Bean + public DefaultRedisScript limitScript() + { + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(limitScriptText()); + redisScript.setResultType(Long.class); + return redisScript; + } + + /** + * 闄愭祦鑴氭湰 + */ + private String limitScriptText() + { + return "local key = KEYS[1]\n" + + "local count = tonumber(ARGV[1])\n" + + "local time = tonumber(ARGV[2])\n" + + "local current = redis.call('get', key);\n" + + "if current and tonumber(current) > count then\n" + + " return tonumber(current);\n" + + "end\n" + + "current = redis.call('incr', key)\n" + + "if tonumber(current) == 1 then\n" + + " redis.call('expire', key, time)\n" + + "end\n" + + "return tonumber(current);"; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java new file mode 100644 index 0000000..50ad496 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -0,0 +1,70 @@ +package com.ruoyi.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 閫氱敤閰嶇疆 + * + * @author ruoyi + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer +{ + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) + { + /** 鏈湴鏂囦欢涓婁紶璺緞 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") + .addResourceLocations("file:" + RuoYiConfig.getProfile() + "/"); + + /** swagger閰嶇疆 */ + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); + } + + /** + * 鑷畾涔夋嫤鎴鍒 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } + + /** + * 璺ㄥ煙閰嶇疆 + */ + @Bean + public CorsFilter corsFilter() + { + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + // 璁剧疆璁块棶婧愬湴鍧 + config.addAllowedOriginPattern("*"); + // 璁剧疆璁块棶婧愯姹傚ご + config.addAllowedHeader("*"); + // 璁剧疆璁块棶婧愯姹傛柟娉 + config.addAllowedMethod("*"); + // 鏈夋晥鏈 1800绉 + config.setMaxAge(1800L); + // 娣诲姞鏄犲皠璺緞锛屾嫤鎴竴鍒囪姹 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + // 杩斿洖鏂扮殑CorsFilter + return new CorsFilter(source); + } +} \ No newline at end of file diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java new file mode 100644 index 0000000..15d7a3b --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -0,0 +1,146 @@ +package com.ruoyi.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.web.filter.CorsFilter; +import com.ruoyi.framework.config.properties.PermitAllUrlProperties; +import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; +import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; +import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; + +/** + * spring security閰嶇疆 + * + * @author ruoyi + */ +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter +{ + /** + * 鑷畾涔夌敤鎴疯璇侀昏緫 + */ + @Autowired + private UserDetailsService userDetailsService; + + /** + * 璁よ瘉澶辫触澶勭悊绫 + */ + @Autowired + private AuthenticationEntryPointImpl unauthorizedHandler; + + /** + * 閫鍑哄鐞嗙被 + */ + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + + /** + * token璁よ瘉杩囨护鍣 + */ + @Autowired + private JwtAuthenticationTokenFilter authenticationTokenFilter; + + /** + * 璺ㄥ煙杩囨护鍣 + */ + @Autowired + private CorsFilter corsFilter; + + /** + * 鍏佽鍖垮悕璁块棶鐨勫湴鍧 + */ + @Autowired + private PermitAllUrlProperties permitAllUrl; + + /** + * 瑙e喅 鏃犳硶鐩存帴娉ㄥ叆 AuthenticationManager + * + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception + { + return super.authenticationManagerBean(); + } + + /** + * anyRequest | 鍖归厤鎵鏈夎姹傝矾寰 + * access | SpringEl琛ㄨ揪寮忕粨鏋滀负true鏃跺彲浠ヨ闂 + * anonymous | 鍖垮悕鍙互璁块棶 + * denyAll | 鐢ㄦ埛涓嶈兘璁块棶 + * fullyAuthenticated | 鐢ㄦ埛瀹屽叏璁よ瘉鍙互璁块棶锛堥潪remember-me涓嬭嚜鍔ㄧ櫥褰曪級 + * hasAnyAuthority | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず鏉冮檺锛屽垯鍏朵腑浠讳綍涓涓潈闄愬彲浠ヨ闂 + * hasAnyRole | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず瑙掕壊锛屽垯鍏朵腑浠讳綍涓涓鑹插彲浠ヨ闂 + * hasAuthority | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず鏉冮檺锛屽垯鍏舵潈闄愬彲浠ヨ闂 + * hasIpAddress | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧずIP鍦板潃锛屽鏋滅敤鎴稩P鍜屽弬鏁板尮閰嶏紝鍒欏彲浠ヨ闂 + * hasRole | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず瑙掕壊锛屽垯鍏惰鑹插彲浠ヨ闂 + * permitAll | 鐢ㄦ埛鍙互浠绘剰璁块棶 + * rememberMe | 鍏佽閫氳繃remember-me鐧诲綍鐨勭敤鎴疯闂 + * authenticated | 鐢ㄦ埛鐧诲綍鍚庡彲璁块棶 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception + { + // 娉ㄨВ鏍囪鍏佽鍖垮悕璁块棶鐨剈rl + ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); + permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); + + httpSecurity + // CSRF绂佺敤锛屽洜涓轰笉浣跨敤session + .csrf().disable() + // 璁よ瘉澶辫触澶勭悊绫 + .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() + // 鍩轰簬token锛屾墍浠ヤ笉闇瑕乻ession + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 杩囨护璇锋眰 + .authorizeRequests() + // 瀵逛簬鐧诲綍login 娉ㄥ唽register 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶 + .antMatchers("/login", "/register", "/captchaImage").anonymous() + // 闈欐佽祫婧愶紝鍙尶鍚嶈闂 + .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() + .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() + // 闄や笂闈㈠鐨勬墍鏈夎姹傚叏閮ㄩ渶瑕侀壌鏉冭璇 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable(); + // 娣诲姞Logout filter + httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); + // 娣诲姞JWT filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + // 娣诲姞CORS filter + httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); + httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); + } + + /** + * 寮烘暎鍒楀搱甯屽姞瀵嗗疄鐜 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() + { + return new BCryptPasswordEncoder(); + } + + /** + * 韬唤璁よ瘉鎺ュ彛 + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception + { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java new file mode 100644 index 0000000..b5b7de3 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ServerConfig.java @@ -0,0 +1,32 @@ +package com.ruoyi.framework.config; + +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 鏈嶅姟鐩稿叧閰嶇疆 + * + * @author ruoyi + */ +@Component +public class ServerConfig +{ + /** + * 鑾峰彇瀹屾暣鐨勮姹傝矾寰勶紝鍖呮嫭锛氬煙鍚嶏紝绔彛锛屼笂涓嬫枃璁块棶璺緞 + * + * @return 鏈嶅姟鍦板潃 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java new file mode 100644 index 0000000..7840141 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java @@ -0,0 +1,63 @@ +package com.ruoyi.framework.config; + +import com.ruoyi.common.utils.Threads; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 绾跨▼姹犻厤缃 + * + * @author ruoyi + **/ +@Configuration +public class ThreadPoolConfig +{ + // 鏍稿績绾跨▼姹犲ぇ灏 + private int corePoolSize = 50; + + // 鏈澶у彲鍒涘缓鐨勭嚎绋嬫暟 + private int maxPoolSize = 200; + + // 闃熷垪鏈澶ч暱搴 + private int queueCapacity = 1000; + + // 绾跨▼姹犵淮鎶ょ嚎绋嬫墍鍏佽鐨勭┖闂叉椂闂 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() + { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 绾跨▼姹犲鎷掔粷浠诲姟(鏃犵嚎绋嬪彲鐢)鐨勫鐞嗙瓥鐣 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 鎵ц鍛ㄦ湡鎬ф垨瀹氭椂浠诲姟 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() + { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) + { + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java new file mode 100644 index 0000000..fe74bc0 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java @@ -0,0 +1,77 @@ +//package com.ruoyi.framework.config.properties; +// +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Configuration; +//import com.alibaba.druid.pool.DruidDataSource; +// +///** +// * druid 閰嶇疆灞炴 +// * +// * @author ruoyi +// */ +//@Configuration +//public class DruidProperties +//{ +// @Value("${spring.datasource.druid.initialSize}") +// private int initialSize; +// +// @Value("${spring.datasource.druid.minIdle}") +// private int minIdle; +// +// @Value("${spring.datasource.druid.maxActive}") +// private int maxActive; +// +// @Value("${spring.datasource.druid.maxWait}") +// private int maxWait; +// +// @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") +// private int timeBetweenEvictionRunsMillis; +// +// @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") +// private int minEvictableIdleTimeMillis; +// +// @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") +// private int maxEvictableIdleTimeMillis; +// +// @Value("${spring.datasource.druid.validationQuery}") +// private String validationQuery; +// +// @Value("${spring.datasource.druid.testWhileIdle}") +// private boolean testWhileIdle; +// +// @Value("${spring.datasource.druid.testOnBorrow}") +// private boolean testOnBorrow; +// +// @Value("${spring.datasource.druid.testOnReturn}") +// private boolean testOnReturn; +// +// public DruidDataSource dataSource(DruidDataSource datasource) +// { +// /** 閰嶇疆鍒濆鍖栧ぇ灏忋佹渶灏忋佹渶澶 */ +// datasource.setInitialSize(initialSize); +// datasource.setMaxActive(maxActive); +// datasource.setMinIdle(minIdle); +// +// /** 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂 */ +// datasource.setMaxWait(maxWait); +// +// /** 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣 */ +// datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); +// +// /** 閰嶇疆涓涓繛鎺ュ湪姹犱腑鏈灏忋佹渶澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣 */ +// datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); +// datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); +// +// /** +// * 鐢ㄦ潵妫娴嬭繛鎺ユ槸鍚︽湁鏁堢殑sql锛岃姹傛槸涓涓煡璇㈣鍙ワ紝甯哥敤select 'x'銆傚鏋渧alidationQuery涓簄ull锛宼estOnBorrow銆乼estOnReturn銆乼estWhileIdle閮戒笉浼氳捣浣滅敤銆 +// */ +// datasource.setValidationQuery(validationQuery); +// /** 寤鸿閰嶇疆涓簍rue锛屼笉褰卞搷鎬ц兘锛屽苟涓斾繚璇佸畨鍏ㄦс傜敵璇疯繛鎺ョ殑鏃跺欐娴嬶紝濡傛灉绌洪棽鏃堕棿澶т簬timeBetweenEvictionRunsMillis锛屾墽琛寁alidationQuery妫娴嬭繛鎺ユ槸鍚︽湁鏁堛 */ +// datasource.setTestWhileIdle(testWhileIdle); +// /** 鐢宠杩炴帴鏃舵墽琛寁alidationQuery妫娴嬭繛鎺ユ槸鍚︽湁鏁堬紝鍋氫簡杩欎釜閰嶇疆浼氶檷浣庢ц兘銆 */ +// datasource.setTestOnBorrow(testOnBorrow); +// /** 褰掕繕杩炴帴鏃舵墽琛寁alidationQuery妫娴嬭繛鎺ユ槸鍚︽湁鏁堬紝鍋氫簡杩欎釜閰嶇疆浼氶檷浣庢ц兘銆 */ +// datasource.setTestOnReturn(testOnReturn); +// return datasource; +// } +//} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java new file mode 100644 index 0000000..9632eb1 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java @@ -0,0 +1,72 @@ +package com.ruoyi.framework.config.properties; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Pattern; +import org.apache.commons.lang3.RegExUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import com.ruoyi.common.annotation.Anonymous; + +/** + * 璁剧疆Anonymous娉ㄨВ鍏佽鍖垮悕璁块棶鐨剈rl + * + * @author ruoyi + */ +@Configuration +public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware +{ + private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); + + private ApplicationContext applicationContext; + + private List urls = new ArrayList<>(); + + public String ASTERISK = "*"; + + @Override + public void afterPropertiesSet() + { + RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class); + Map map = mapping.getHandlerMethods(); + + map.keySet().forEach(info -> { + HandlerMethod handlerMethod = map.get(info); + + // 鑾峰彇鏂规硶涓婅竟鐨勬敞瑙 鏇夸唬path variable 涓 * + Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class); + Optional.ofNullable(method).ifPresent(anonymous -> info.getPatternsCondition().getPatterns() + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + + // 鑾峰彇绫讳笂杈圭殑娉ㄨВ, 鏇夸唬path variable 涓 * + Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class); + Optional.ofNullable(controller).ifPresent(anonymous -> info.getPatternsCondition().getPatterns() + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + }); + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException + { + this.applicationContext = context; + } + + public List getUrls() + { + return urls; + } + + public void setUrls(List urls) + { + this.urls = urls; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java new file mode 100644 index 0000000..895d02f --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java @@ -0,0 +1,26 @@ +//package com.ruoyi.framework.datasource; +// +//import java.util.Map; +//import javax.sql.DataSource; +//import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +// +///** +// * 鍔ㄦ佹暟鎹簮 +// * +// * @author ruoyi +// */ +//public class DynamicDataSource extends AbstractRoutingDataSource +//{ +// public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) +// { +// super.setDefaultTargetDataSource(defaultTargetDataSource); +// super.setTargetDataSources(targetDataSources); +// super.afterPropertiesSet(); +// } +// +// @Override +// protected Object determineCurrentLookupKey() +// { +// return DynamicDataSourceContextHolder.getDataSourceType(); +// } +//} \ No newline at end of file diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 0000000..3572db9 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,45 @@ +package com.ruoyi.framework.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 鏁版嵁婧愬垏鎹㈠鐞 + * + * @author ruoyi + */ +public class DynamicDataSourceContextHolder +{ + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 浣跨敤ThreadLocal缁存姢鍙橀噺锛孴hreadLocal涓烘瘡涓娇鐢ㄨ鍙橀噺鐨勭嚎绋嬫彁渚涚嫭绔嬬殑鍙橀噺鍓湰锛 + * 鎵浠ユ瘡涓涓嚎绋嬮兘鍙互鐙珛鍦版敼鍙樿嚜宸辩殑鍓湰锛岃屼笉浼氬奖鍝嶅叾瀹冪嚎绋嬫墍瀵瑰簲鐨勫壇鏈 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 璁剧疆鏁版嵁婧愮殑鍙橀噺 + */ + public static void setDataSourceType(String dsType) + { + log.info("鍒囨崲鍒皗}鏁版嵁婧", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 鑾峰緱鏁版嵁婧愮殑鍙橀噺 + */ + public static String getDataSourceType() + { + return CONTEXT_HOLDER.get(); + } + + /** + * 娓呯┖鏁版嵁婧愬彉閲 + */ + public static void clearDataSourceType() + { + CONTEXT_HOLDER.remove(); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 0000000..4ddacae --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,55 @@ +package com.ruoyi.framework.interceptor; + +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; + +/** + * 闃叉閲嶅鎻愪氦鎷︽埅鍣 + * + * @author ruoyi + */ +@Component +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor +{ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception + { + if (handler instanceof HandlerMethod) + { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) + { + if (this.isRepeatSubmit(request, annotation)) + { + AjaxResult ajaxResult = AjaxResult.error(annotation.message()); + ServletUtils.renderString(response, JSON.toJSONString(ajaxResult)); + return false; + } + } + return true; + } + else + { + return true; + } + } + + /** + * 楠岃瘉鏄惁閲嶅鎻愪氦鐢卞瓙绫诲疄鐜板叿浣撶殑闃查噸澶嶆彁浜ょ殑瑙勫垯 + * + * @param request + * @return + * @throws Exception + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation); +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java new file mode 100644 index 0000000..9dc9511 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -0,0 +1,110 @@ +package com.ruoyi.framework.interceptor.impl; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.filter.RepeatedlyRequestWrapper; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.http.HttpHelper; +import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 鍒ゆ柇璇锋眰url鍜屾暟鎹槸鍚﹀拰涓婁竴娆$浉鍚岋紝 + * 濡傛灉鍜屼笂娆$浉鍚岋紝鍒欐槸閲嶅鎻愪氦琛ㄥ崟銆 鏈夋晥鏃堕棿涓10绉掑唴銆 + * + * @author ruoyi + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor +{ + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + // 浠ょ墝鑷畾涔夋爣璇 + @Value("${token.header}") + private String header; + + @Autowired + private RedisCache redisCache; + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) + { + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) + { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + nowParams = HttpHelper.getBodyString(repeatedlyRequest); + } + + // body鍙傛暟涓虹┖锛岃幏鍙朠arameter鐨勬暟鎹 + if (StringUtils.isEmpty(nowParams)) + { + nowParams = JSON.toJSONString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 璇锋眰鍦板潃锛堜綔涓哄瓨鏀綾ache鐨刱ey鍊硷級 + String url = request.getRequestURI(); + + // 鍞竴鍊硷紙娌℃湁娑堟伅澶村垯浣跨敤璇锋眰鍦板潃锛 + String submitKey = StringUtils.trimToEmpty(request.getHeader(header)); + + // 鍞竴鏍囪瘑锛堟寚瀹歬ey + url + 娑堟伅澶达級 + String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; + + Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); + if (sessionObj != null) + { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) + { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) + { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); + return false; + } + + /** + * 鍒ゆ柇鍙傛暟鏄惁鐩稿悓 + */ + private boolean compareParams(Map nowMap, Map preMap) + { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 鍒ゆ柇涓ゆ闂撮殧鏃堕棿 + */ + private boolean compareTime(Map nowMap, Map preMap, int interval) + { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < interval) + { + return true; + } + return false; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java new file mode 100644 index 0000000..7387a02 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/AsyncManager.java @@ -0,0 +1,55 @@ +package com.ruoyi.framework.manager; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import com.ruoyi.common.utils.Threads; +import com.ruoyi.common.utils.spring.SpringUtils; + +/** + * 寮傛浠诲姟绠$悊鍣 + * + * @author ruoyi + */ +public class AsyncManager +{ + /** + * 鎿嶄綔寤惰繜10姣 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 寮傛鎿嶄綔浠诲姟璋冨害绾跨▼姹 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 鍗曚緥妯″紡 + */ + private AsyncManager(){} + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() + { + return me; + } + + /** + * 鎵ц浠诲姟 + * + * @param task 浠诲姟 + */ + public void execute(TimerTask task) + { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 鍋滄浠诲姟绾跨▼姹 + */ + public void shutdown() + { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java new file mode 100644 index 0000000..e36ca3c --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -0,0 +1,39 @@ +package com.ruoyi.framework.manager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import javax.annotation.PreDestroy; + +/** + * 纭繚搴旂敤閫鍑烘椂鑳藉叧闂悗鍙扮嚎绋 + * + * @author ruoyi + */ +@Component +public class ShutdownManager +{ + private static final Logger logger = LoggerFactory.getLogger("sys-user"); + + @PreDestroy + public void destroy() + { + shutdownAsyncManager(); + } + + /** + * 鍋滄寮傛鎵ц浠诲姟 + */ + private void shutdownAsyncManager() + { + try + { + logger.info("====鍏抽棴鍚庡彴浠诲姟浠诲姟绾跨▼姹===="); + AsyncManager.me().shutdown(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java new file mode 100644 index 0000000..f28c97c --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java @@ -0,0 +1,93 @@ +package com.ruoyi.framework.manager.factory; + +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.SysLogininfor; +import com.ruoyi.common.core.domain.entity.SysOperLog; +import com.ruoyi.common.core.service.ISysLogininforService; +import com.ruoyi.common.core.service.ISysOperLogService; +import com.ruoyi.common.utils.LogUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import eu.bitwalker.useragentutils.UserAgent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.TimerTask; + +/** + * 寮傛宸ュ巶锛堜骇鐢熶换鍔$敤锛 + * + * @author ruoyi + */ +public class AsyncFactory { + private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); + + /** + * 璁板綍鐧诲綍淇℃伅 + * + * @param username 鐢ㄦ埛鍚 + * @param status 鐘舵 + * @param message 娑堟伅 + * @param args 鍒楄〃 + * @return 浠诲姟task + */ + public static TimerTask recordLogininfor(final String username, final String status, final String message, + final Object... args) { + final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + return new TimerTask() { + @Override + public void run() { + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(LogUtils.getBlock(ip)); + s.append(address); + s.append(LogUtils.getBlock(username)); + s.append(LogUtils.getBlock(status)); + s.append(LogUtils.getBlock(message)); + // 鎵撳嵃淇℃伅鍒版棩蹇 + sys_user_logger.info(s.toString(), args); + // 鑾峰彇瀹㈡埛绔搷浣滅郴缁 + String os = userAgent.getOperatingSystem().getName(); + // 鑾峰彇瀹㈡埛绔祻瑙堝櫒 + String browser = userAgent.getBrowser().getName(); + // 灏佽瀵硅薄 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 鏃ュ織鐘舵 + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { + logininfor.setStatus(Constants.SUCCESS); + } else if (Constants.LOGIN_FAIL.equals(status)) { + logininfor.setStatus(Constants.FAIL); + } + // 鎻掑叆鏁版嵁 + SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); + } + }; + } + + /** + * 鎿嶄綔鏃ュ織璁板綍 + * + * @param operLog 鎿嶄綔鏃ュ織淇℃伅 + * @return 浠诲姟task + */ + public static TimerTask recordOper(final SysOperLog operLog) { + return new TimerTask() { + @Override + public void run() { + // 杩滅▼鏌ヨ鎿嶄綔鍦扮偣 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); + } + }; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..3eb2495 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,44 @@ +package com.ruoyi.framework.security.filter; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.web.service.TokenService; + +/** + * token杩囨护鍣 楠岃瘉token鏈夋晥鎬 + * + * @author ruoyi + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter +{ + @Autowired + private TokenService tokenService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) + { + tokenService.verifyToken(loginUser); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + chain.doFilter(request, response); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..93b7032 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java @@ -0,0 +1,34 @@ +package com.ruoyi.framework.security.handle; + +import java.io.IOException; +import java.io.Serializable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * 璁よ瘉澶辫触澶勭悊绫 杩斿洖鏈巿鏉 + * + * @author ruoyi + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable +{ + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) + throws IOException + { + int code = HttpStatus.UNAUTHORIZED; + String msg = StringUtils.format("璇锋眰璁块棶锛歿}锛岃璇佸け璐ワ紝鏃犳硶璁块棶绯荤粺璧勬簮", request.getRequestURI()); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java new file mode 100644 index 0000000..059f519 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -0,0 +1,53 @@ +package com.ruoyi.framework.security.handle; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import com.ruoyi.framework.web.service.TokenService; + +/** + * 鑷畾涔夐鍑哄鐞嗙被 杩斿洖鎴愬姛 + * + * @author ruoyi + */ +@Configuration +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler +{ + @Autowired + private TokenService tokenService; + + /** + * 閫鍑哄鐞 + * + * @return + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) + { + String userName = loginUser.getUsername(); + // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍 + tokenService.delLoginUser(loginUser.getToken()); + // 璁板綍鐢ㄦ埛閫鍑烘棩蹇 + AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "閫鍑烘垚鍔")); + } + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, "閫鍑烘垚鍔"))); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java new file mode 100644 index 0000000..63b03da --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/Server.java @@ -0,0 +1,240 @@ +package com.ruoyi.framework.web.domain; + +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import com.ruoyi.common.utils.Arith; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.framework.web.domain.server.Cpu; +import com.ruoyi.framework.web.domain.server.Jvm; +import com.ruoyi.framework.web.domain.server.Mem; +import com.ruoyi.framework.web.domain.server.Sys; +import com.ruoyi.framework.web.domain.server.SysFile; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +/** + * 鏈嶅姟鍣ㄧ浉鍏充俊鎭 + * + * @author ruoyi + */ +public class Server +{ + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU鐩稿叧淇℃伅 + */ + private Cpu cpu = new Cpu(); + + /** + * 鍏у瓨鐩稿叧淇℃伅 + */ + private Mem mem = new Mem(); + + /** + * JVM鐩稿叧淇℃伅 + */ + private Jvm jvm = new Jvm(); + + /** + * 鏈嶅姟鍣ㄧ浉鍏充俊鎭 + */ + private Sys sys = new Sys(); + + /** + * 纾佺洏鐩稿叧淇℃伅 + */ + private List sysFiles = new LinkedList(); + + public Cpu getCpu() + { + return cpu; + } + + public void setCpu(Cpu cpu) + { + this.cpu = cpu; + } + + public Mem getMem() + { + return mem; + } + + public void setMem(Mem mem) + { + this.mem = mem; + } + + public Jvm getJvm() + { + return jvm; + } + + public void setJvm(Jvm jvm) + { + this.jvm = jvm; + } + + public Sys getSys() + { + return sys; + } + + public void setSys(Sys sys) + { + this.sys = sys; + } + + public List getSysFiles() + { + return sysFiles; + } + + public void setSysFiles(List sysFiles) + { + this.sysFiles = sysFiles; + } + + public void copyTo() throws Exception + { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + setCpuInfo(hal.getProcessor()); + + setMemInfo(hal.getMemory()); + + setSysInfo(); + + setJvmInfo(); + + setSysFiles(si.getOperatingSystem()); + } + + /** + * 璁剧疆CPU淇℃伅 + */ + private void setCpuInfo(CentralProcessor processor) + { + // CPU淇℃伅 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 璁剧疆鍐呭瓨淇℃伅 + */ + private void setMemInfo(GlobalMemory memory) + { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 璁剧疆鏈嶅姟鍣ㄤ俊鎭 + */ + private void setSysInfo() + { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 璁剧疆Java铏氭嫙鏈 + */ + private void setJvmInfo() throws UnknownHostException + { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + } + + /** + * 璁剧疆纾佺洏淇℃伅 + */ + private void setSysFiles(OperatingSystem os) + { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + + /** + * 瀛楄妭杞崲 + * + * @param size 瀛楄妭澶у皬 + * @return 杞崲鍚庡 + */ + public String convertFileSize(long size) + { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) + { + return String.format("%.1f GB", (float) size / gb); + } + else if (size >= mb) + { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } + else if (size >= kb) + { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } + else + { + return String.format("%d B", size); + } + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java new file mode 100644 index 0000000..a13a66c --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java @@ -0,0 +1,101 @@ +package com.ruoyi.framework.web.domain.server; + +import com.ruoyi.common.utils.Arith; + +/** + * CPU鐩稿叧淇℃伅 + * + * @author ruoyi + */ +public class Cpu +{ + /** + * 鏍稿績鏁 + */ + private int cpuNum; + + /** + * CPU鎬荤殑浣跨敤鐜 + */ + private double total; + + /** + * CPU绯荤粺浣跨敤鐜 + */ + private double sys; + + /** + * CPU鐢ㄦ埛浣跨敤鐜 + */ + private double used; + + /** + * CPU褰撳墠绛夊緟鐜 + */ + private double wait; + + /** + * CPU褰撳墠绌洪棽鐜 + */ + private double free; + + public int getCpuNum() + { + return cpuNum; + } + + public void setCpuNum(int cpuNum) + { + this.cpuNum = cpuNum; + } + + public double getTotal() + { + return Arith.round(Arith.mul(total, 100), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getSys() + { + return Arith.round(Arith.mul(sys / total, 100), 2); + } + + public void setSys(double sys) + { + this.sys = sys; + } + + public double getUsed() + { + return Arith.round(Arith.mul(used / total, 100), 2); + } + + public void setUsed(double used) + { + this.used = used; + } + + public double getWait() + { + return Arith.round(Arith.mul(wait / total, 100), 2); + } + + public void setWait(double wait) + { + this.wait = wait; + } + + public double getFree() + { + return Arith.round(Arith.mul(free / total, 100), 2); + } + + public void setFree(double free) + { + this.free = free; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java new file mode 100644 index 0000000..444b280 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java @@ -0,0 +1,130 @@ +package com.ruoyi.framework.web.domain.server; + +import java.lang.management.ManagementFactory; +import com.ruoyi.common.utils.Arith; +import com.ruoyi.common.utils.DateUtils; + +/** + * JVM鐩稿叧淇℃伅 + * + * @author ruoyi + */ +public class Jvm +{ + /** + * 褰撳墠JVM鍗犵敤鐨勫唴瀛樻绘暟(M) + */ + private double total; + + /** + * JVM鏈澶у彲鐢ㄥ唴瀛樻绘暟(M) + */ + private double max; + + /** + * JVM绌洪棽鍐呭瓨(M) + */ + private double free; + + /** + * JDK鐗堟湰 + */ + private String version; + + /** + * JDK璺緞 + */ + private String home; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getMax() + { + return Arith.div(max, (1024 * 1024), 2); + } + + public void setMax(double max) + { + this.max = max; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024), 2); + } + + public void setFree(double free) + { + this.free = free; + } + + public double getUsed() + { + return Arith.div(total - free, (1024 * 1024), 2); + } + + public double getUsage() + { + return Arith.mul(Arith.div(total - free, total, 4), 100); + } + + /** + * 鑾峰彇JDK鍚嶇О + */ + public String getName() + { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getHome() + { + return home; + } + + public void setHome(String home) + { + this.home = home; + } + + /** + * JDK鍚姩鏃堕棿 + */ + public String getStartTime() + { + return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); + } + + /** + * JDK杩愯鏃堕棿 + */ + public String getRunTime() + { + return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate()); + } + + /** + * 杩愯鍙傛暟 + */ + public String getInputArgs() + { + return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java new file mode 100644 index 0000000..13eec52 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java @@ -0,0 +1,61 @@ +package com.ruoyi.framework.web.domain.server; + +import com.ruoyi.common.utils.Arith; + +/** + * 鍏у瓨鐩稿叧淇℃伅 + * + * @author ruoyi + */ +public class Mem +{ + /** + * 鍐呭瓨鎬婚噺 + */ + private double total; + + /** + * 宸茬敤鍐呭瓨 + */ + private double used; + + /** + * 鍓╀綑鍐呭瓨 + */ + private double free; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024 * 1024), 2); + } + + public void setTotal(long total) + { + this.total = total; + } + + public double getUsed() + { + return Arith.div(used, (1024 * 1024 * 1024), 2); + } + + public void setUsed(long used) + { + this.used = used; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024 * 1024), 2); + } + + public void setFree(long free) + { + this.free = free; + } + + public double getUsage() + { + return Arith.mul(Arith.div(used, total, 4), 100); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java new file mode 100644 index 0000000..45d64d9 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java @@ -0,0 +1,84 @@ +package com.ruoyi.framework.web.domain.server; + +/** + * 绯荤粺鐩稿叧淇℃伅 + * + * @author ruoyi + */ +public class Sys +{ + /** + * 鏈嶅姟鍣ㄥ悕绉 + */ + private String computerName; + + /** + * 鏈嶅姟鍣↖p + */ + private String computerIp; + + /** + * 椤圭洰璺緞 + */ + private String userDir; + + /** + * 鎿嶄綔绯荤粺 + */ + private String osName; + + /** + * 绯荤粺鏋舵瀯 + */ + private String osArch; + + public String getComputerName() + { + return computerName; + } + + public void setComputerName(String computerName) + { + this.computerName = computerName; + } + + public String getComputerIp() + { + return computerIp; + } + + public void setComputerIp(String computerIp) + { + this.computerIp = computerIp; + } + + public String getUserDir() + { + return userDir; + } + + public void setUserDir(String userDir) + { + this.userDir = userDir; + } + + public String getOsName() + { + return osName; + } + + public void setOsName(String osName) + { + this.osName = osName; + } + + public String getOsArch() + { + return osArch; + } + + public void setOsArch(String osArch) + { + this.osArch = osArch; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java new file mode 100644 index 0000000..1320cde --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java @@ -0,0 +1,114 @@ +package com.ruoyi.framework.web.domain.server; + +/** + * 绯荤粺鏂囦欢鐩稿叧淇℃伅 + * + * @author ruoyi + */ +public class SysFile +{ + /** + * 鐩樼璺緞 + */ + private String dirName; + + /** + * 鐩樼绫诲瀷 + */ + private String sysTypeName; + + /** + * 鏂囦欢绫诲瀷 + */ + private String typeName; + + /** + * 鎬诲ぇ灏 + */ + private String total; + + /** + * 鍓╀綑澶у皬 + */ + private String free; + + /** + * 宸茬粡浣跨敤閲 + */ + private String used; + + /** + * 璧勬簮鐨勪娇鐢ㄧ巼 + */ + private double usage; + + public String getDirName() + { + return dirName; + } + + public void setDirName(String dirName) + { + this.dirName = dirName; + } + + public String getSysTypeName() + { + return sysTypeName; + } + + public void setSysTypeName(String sysTypeName) + { + this.sysTypeName = sysTypeName; + } + + public String getTypeName() + { + return typeName; + } + + public void setTypeName(String typeName) + { + this.typeName = typeName; + } + + public String getTotal() + { + return total; + } + + public void setTotal(String total) + { + this.total = total; + } + + public String getFree() + { + return free; + } + + public void setFree(String free) + { + this.free = free; + } + + public String getUsed() + { + return used; + } + + public void setUsed(String used) + { + this.used = used; + } + + public double getUsage() + { + return usage; + } + + public void setUsage(double usage) + { + this.usage = usage; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..51dd8c5 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -0,0 +1,114 @@ +package com.ruoyi.framework.web.exception; + +import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; + +/** + * 鍏ㄥ眬寮傚父澶勭悊鍣 + * + * @author ruoyi + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 鏉冮檺鏍¢獙寮傚父 + */ + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("璇锋眰鍦板潃'{}',鏉冮檺鏍¢獙澶辫触'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "娌℃湁鏉冮檺锛岃鑱旂郴绠$悊鍛樻巿鏉"); + } + + /** + * 璇锋眰鏂瑰紡涓嶆敮鎸 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("璇锋眰鍦板潃'{}',涓嶆敮鎸'{}'璇锋眰", requestURI, e.getMethod()); + return AjaxResult.error(e.getMessage()); + } + + /** + * 涓氬姟寮傚父 + */ + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) + { + log.error(e.getMessage(), e); + Integer code = e.getCode(); + return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); + } + + /** + * 鎷︽埅鏈煡鐨勮繍琛屾椂寮傚父 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("璇锋眰鍦板潃'{}',鍙戠敓鏈煡寮傚父.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 绯荤粺寮傚父 + */ + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("璇锋眰鍦板潃'{}',鍙戠敓绯荤粺寮傚父.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 鑷畾涔夐獙璇佸紓甯 + */ + @ExceptionHandler(BindException.class) + public AjaxResult handleBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 鑷畾涔夐獙璇佸紓甯 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) + { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 婕旂ず妯″紡寮傚父 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult handleDemoModeException(DemoModeException e) + { + return AjaxResult.error("婕旂ず妯″紡锛屼笉鍏佽鎿嶄綔"); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java new file mode 100644 index 0000000..68b1d69 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java @@ -0,0 +1,165 @@ +package com.ruoyi.framework.web.service; + +import java.util.Set; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; + +/** + * RuoYi棣栧垱 鑷畾涔夋潈闄愬疄鐜帮紝ss鍙栬嚜SpringSecurity棣栧瓧姣 + * + * @author ruoyi + */ +@Service("ss") +public class PermissionService +{ + /** 鎵鏈夋潈闄愭爣璇 */ + private static final String ALL_PERMISSION = "*:*:*"; + + /** 绠$悊鍛樿鑹叉潈闄愭爣璇 */ + private static final String SUPER_ADMIN = "admin"; + + private static final String ROLE_DELIMETER = ","; + + private static final String PERMISSION_DELIMETER = ","; + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏峰鏌愭潈闄 + * + * @param permission 鏉冮檺瀛楃涓 + * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄 + */ + public boolean hasPermi(String permission) + { + if (StringUtils.isEmpty(permission)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + return hasPermissions(loginUser.getPermissions(), permission); + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺锛屼笌 hasPermi閫昏緫鐩稿弽 + * + * @param permission 鏉冮檺瀛楃涓 + * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺 + */ + public boolean lacksPermi(String permission) + { + return hasPermi(permission) != true; + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓潈闄 + * + * @param permissions 浠 PERMISSION_NAMES_DELIMETER 涓哄垎闅旂鐨勬潈闄愬垪琛 + * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓潈闄 + */ + public boolean hasAnyPermi(String permissions) + { + if (StringUtils.isEmpty(permissions)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + Set authorities = loginUser.getPermissions(); + for (String permission : permissions.split(PERMISSION_DELIMETER)) + { + if (permission != null && hasPermissions(authorities, permission)) + { + return true; + } + } + return false; + } + + /** + * 鍒ゆ柇鐢ㄦ埛鏄惁鎷ユ湁鏌愪釜瑙掕壊 + * + * @param role 瑙掕壊瀛楃涓 + * @return 鐢ㄦ埛鏄惁鍏峰鏌愯鑹 + */ + public boolean hasRole(String role) + { + if (StringUtils.isEmpty(role)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (SysRole sysRole : loginUser.getUser().getRoles()) + { + String roleKey = sysRole.getRoleKey(); + if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) + { + return true; + } + } + return false; + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊锛屼笌 isRole閫昏緫鐩稿弽銆 + * + * @param role 瑙掕壊鍚嶇О + * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊 + */ + public boolean lacksRole(String role) + { + return hasRole(role) != true; + } + + /** + * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓鑹 + * + * @param roles 浠 ROLE_NAMES_DELIMETER 涓哄垎闅旂鐨勮鑹插垪琛 + * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓涓鑹 + */ + public boolean hasAnyRoles(String roles) + { + if (StringUtils.isEmpty(roles)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (String role : roles.split(ROLE_DELIMETER)) + { + if (hasRole(role)) + { + return true; + } + } + return false; + } + + /** + * 鍒ゆ柇鏄惁鍖呭惈鏉冮檺 + * + * @param permissions 鏉冮檺鍒楄〃 + * @param permission 鏉冮檺瀛楃涓 + * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄 + */ + private boolean hasPermissions(Set permissions, String permission) + { + return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java new file mode 100644 index 0000000..fabfc1d --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -0,0 +1,123 @@ +package com.ruoyi.framework.web.service; + +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.service.ISysConfigService; +import com.ruoyi.common.core.service.ISysUserService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.exception.user.CaptchaException; +import com.ruoyi.common.exception.user.CaptchaExpireException; +import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 鐧诲綍鏍¢獙鏂规硶 + * + * @author ruoyi + */ +@Component +public class SysLoginService { + @Autowired + private TokenService tokenService; + + @Resource + private AuthenticationManager authenticationManager; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + /** + * 鐧诲綍楠岃瘉 + * + * @param username 鐢ㄦ埛鍚 + * @param password 瀵嗙爜 + * @param code 楠岃瘉鐮 + * @param uuid 鍞竴鏍囪瘑 + * @return 缁撴灉 + */ + public String login(String username, String password, String code, String uuid) { + boolean captchaOnOff = this.configService.selectCaptchaOnOff(); + // 楠岃瘉鐮佸紑鍏 + if (captchaOnOff) { + this.validateCaptcha(username, code, uuid); + } + // 鐢ㄦ埛楠岃瘉 + Authentication authentication = null; + try { + // 璇ユ柟娉曚細鍘昏皟鐢║serDetailsServiceImpl.loadUserByUsername + authentication = this.authenticationManager + .authenticate(new UsernamePasswordAuthenticationToken(username, password)); + } catch (Exception e) { + if (e instanceof BadCredentialsException) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } else { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + this.recordLoginInfo(loginUser.getUserId()); + // 鐢熸垚token + return this.tokenService.createToken(loginUser); + } + + /** + * 鏍¢獙楠岃瘉鐮 + * + * @param username 鐢ㄦ埛鍚 + * @param code 楠岃瘉鐮 + * @param uuid 鍞竴鏍囪瘑 + * @return 缁撴灉 + */ + public void validateCaptcha(String username, String code, String uuid) { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = this.redisCache.getCacheObject(verifyKey); + this.redisCache.deleteObject(verifyKey); + if (captcha == null) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); + } + } + + /** + * 璁板綍鐧诲綍淇℃伅 + * + * @param userId 鐢ㄦ埛ID + */ + public void recordLoginInfo(String userId) { + SysUser sysUser = new SysUser(); + sysUser.setId(userId); + sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest())); + sysUser.setLoginDate(DateUtils.getNowDate()); + this.userService.updateUserProfile(sysUser); + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java new file mode 100644 index 0000000..f960e9f --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysPermissionService.java @@ -0,0 +1,58 @@ +package com.ruoyi.framework.web.service; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.service.ISysMenuService; +import com.ruoyi.common.core.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashSet; +import java.util.Set; + +/** + * 鐢ㄦ埛鏉冮檺澶勭悊 + * + * @author ruoyi + */ +@Component +public class SysPermissionService { + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysMenuService menuService; + + /** + * 鑾峰彇瑙掕壊鏁版嵁鏉冮檺 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 瑙掕壊鏉冮檺淇℃伅 + */ + public Set getRolePermission(SysUser user) { + Set roles = new HashSet(); + // 绠$悊鍛樻嫢鏈夋墍鏈夋潈闄 + if (user.isAdmin()) { + roles.add("admin"); + } else { + roles.addAll(this.roleService.selectRolePermissionByUserId(user.getId())); + } + return roles; + } + + /** + * 鑾峰彇鑿滃崟鏁版嵁鏉冮檺 + * + * @param user 鐢ㄦ埛淇℃伅 + * @return 鑿滃崟鏉冮檺淇℃伅 + */ + public Set getMenuPermission(SysUser user) { + Set perms = new HashSet(); + // 绠$悊鍛樻嫢鏈夋墍鏈夋潈闄 + if (user.isAdmin()) { + perms.add("*:*:*"); + } else { + perms.addAll(this.menuService.selectMenuPermsByUserId(user.getId())); + } + return perms; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java new file mode 100644 index 0000000..4818ca9 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java @@ -0,0 +1,96 @@ +package com.ruoyi.framework.web.service; + +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.RegisterBody; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.service.ISysConfigService; +import com.ruoyi.common.core.service.ISysUserService; +import com.ruoyi.common.exception.user.CaptchaException; +import com.ruoyi.common.exception.user.CaptchaExpireException; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.manager.AsyncManager; +import com.ruoyi.framework.manager.factory.AsyncFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 娉ㄥ唽鏍¢獙鏂规硶 + * + * @author ruoyi + */ +@Component +public class SysRegisterService { + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private RedisCache redisCache; + + /** + * 娉ㄥ唽 + */ + public String register(RegisterBody registerBody) { + String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + + boolean captchaOnOff = this.configService.selectCaptchaOnOff(); + // 楠岃瘉鐮佸紑鍏 + if (captchaOnOff) { + this.validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) { + msg = "鐢ㄦ埛鍚嶄笉鑳戒负绌"; + } else if (StringUtils.isEmpty(password)) { + msg = "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖"; + } else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) { + msg = "璐︽埛闀垮害蹇呴』鍦2鍒20涓瓧绗︿箣闂"; + } else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { + msg = "瀵嗙爜闀垮害蹇呴』鍦5鍒20涓瓧绗︿箣闂"; + } else if (UserConstants.NOT_UNIQUE.equals(this.userService.checkUserNameUnique(username))) { + msg = "淇濆瓨鐢ㄦ埛'" + username + "'澶辫触锛屾敞鍐岃处鍙峰凡瀛樺湪"; + } else { + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + sysUser.setNickName(username); + sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); + boolean regFlag = this.userService.registerUser(sysUser); + if (!regFlag) { + msg = "娉ㄥ唽澶辫触,璇疯仈绯荤郴缁熺鐞嗕汉鍛"; + } else { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, + MessageUtils.message("user.register.success"))); + } + } + return msg; + } + + /** + * 鏍¢獙楠岃瘉鐮 + * + * @param username 鐢ㄦ埛鍚 + * @param code 楠岃瘉鐮 + * @param uuid 鍞竴鏍囪瘑 + * @return 缁撴灉 + */ + public void validateCaptcha(String username, String code, String uuid) { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = this.redisCache.getCacheObject(verifyKey); + this.redisCache.deleteObject(verifyKey); + if (captcha == null) { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + throw new CaptchaException(); + } + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java new file mode 100644 index 0000000..3d41241 --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -0,0 +1,226 @@ +package com.ruoyi.framework.web.service; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.common.utils.uuid.IdUtils; +import eu.bitwalker.useragentutils.UserAgent; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * token楠岃瘉澶勭悊 + * + * @author ruoyi + */ +@Component +public class TokenService +{ + // 浠ょ墝鑷畾涔夋爣璇 + @Value("${token.header}") + private String header; + + // 浠ょ墝绉橀挜 + @Value("${token.secret}") + private String secret; + + // 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛 + @Value("${token.expireTime}") + private int expireTime; + + protected static final long MILLIS_SECOND = 1000; + + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; + + @Autowired + private RedisCache redisCache; + + /** + * 鑾峰彇鐢ㄦ埛韬唤淇℃伅 + * + * @return 鐢ㄦ埛淇℃伅 + */ + public LoginUser getLoginUser(HttpServletRequest request) + { + // 鑾峰彇璇锋眰鎼哄甫鐨勪护鐗 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) + { + try + { + Claims claims = parseToken(token); + // 瑙f瀽瀵瑰簲鐨勬潈闄愪互鍙婄敤鎴蜂俊鎭 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + catch (Exception e) + { + } + } + return null; + } + + /** + * 璁剧疆鐢ㄦ埛韬唤淇℃伅 + */ + public void setLoginUser(LoginUser loginUser) + { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) + { + refreshToken(loginUser); + } + } + + /** + * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅 + */ + public void delLoginUser(String token) + { + if (StringUtils.isNotEmpty(token)) + { + String userKey = getTokenKey(token); + redisCache.deleteObject(userKey); + } + } + + /** + * 鍒涘缓浠ょ墝 + * + * @param loginUser 鐢ㄦ埛淇℃伅 + * @return 浠ょ墝 + */ + public String createToken(LoginUser loginUser) + { + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + setUserAgent(loginUser); + refreshToken(loginUser); + + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY, token); + return createToken(claims); + } + + /** + * 楠岃瘉浠ょ墝鏈夋晥鏈燂紝鐩稿樊涓嶈冻20鍒嗛挓锛岃嚜鍔ㄥ埛鏂扮紦瀛 + * + * @param loginUser + * @return 浠ょ墝 + */ + public void verifyToken(LoginUser loginUser) + { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) + { + refreshToken(loginUser); + } + } + + /** + * 鍒锋柊浠ょ墝鏈夋晥鏈 + * + * @param loginUser 鐧诲綍淇℃伅 + */ + public void refreshToken(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 鏍规嵁uuid灏唋oginUser缂撳瓨 + String userKey = getTokenKey(loginUser.getToken()); + redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); + } + + /** + * 璁剧疆鐢ㄦ埛浠g悊淇℃伅 + * + * @param loginUser 鐧诲綍淇℃伅 + */ + public void setUserAgent(LoginUser loginUser) + { + UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + loginUser.setIpaddr(ip); + loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + loginUser.setBrowser(userAgent.getBrowser().getName()); + loginUser.setOs(userAgent.getOperatingSystem().getName()); + } + + /** + * 浠庢暟鎹0鏄庣敓鎴愪护鐗 + * + * @param claims 鏁版嵁澹版槑 + * @return 浠ょ墝 + */ + private String createToken(Map claims) + { + String token = Jwts.builder() + .setClaims(claims) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 浠庝护鐗屼腑鑾峰彇鏁版嵁澹版槑 + * + * @param token 浠ょ墝 + * @return 鏁版嵁澹版槑 + */ + private Claims parseToken(String token) + { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } + + /** + * 浠庝护鐗屼腑鑾峰彇鐢ㄦ埛鍚 + * + * @param token 浠ょ墝 + * @return 鐢ㄦ埛鍚 + */ + public String getUsernameFromToken(String token) + { + Claims claims = parseToken(token); + return claims.getSubject(); + } + + /** + * 鑾峰彇璇锋眰token + * + * @param request + * @return token + */ + private String getToken(HttpServletRequest request) + { + String token = request.getHeader(header); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) + { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + return token; + } + + private String getTokenKey(String uuid) + { + return CacheConstants.LOGIN_TOKEN_KEY + uuid; + } +} diff --git a/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..02015ae --- /dev/null +++ b/vapeshop-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java @@ -0,0 +1,52 @@ +package com.ruoyi.framework.web.service; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.service.ISysUserService; +import com.ruoyi.common.enums.UserStatus; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +/** + * 鐢ㄦ埛楠岃瘉澶勭悊 + * + * @author ruoyi + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); + + @Autowired + private ISysUserService userService; + + @Autowired + private SysPermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + SysUser user = this.userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) { + log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦.", username); + throw new ServiceException("鐧诲綍鐢ㄦ埛锛" + username + " 涓嶅瓨鍦"); + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { + log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍒犻櫎.", username); + throw new ServiceException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛" + username + " 宸茶鍒犻櫎"); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username); + throw new ServiceException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛" + username + " 宸插仠鐢"); + } + + return this.createLoginUser(user); + } + + public UserDetails createLoginUser(SysUser user) { + return new LoginUser(user.getId(), user.getDeptId(), user, this.permissionService.getMenuPermission(user)); + } +} diff --git a/vapeshop-generator/pom.xml b/vapeshop-generator/pom.xml new file mode 100644 index 0000000..1622b61 --- /dev/null +++ b/vapeshop-generator/pom.xml @@ -0,0 +1,40 @@ + + + + vapeshop + cn.com.vapeshop + 3.8.3 + + 4.0.0 + + vapeshop-generator + + + generator浠g爜鐢熸垚 + + + + + + + org.apache.velocity + velocity-engine-core + + + + + commons-collections + commons-collections + + + + + cn.com.vapeshop + vapeshop-common + + + + + \ No newline at end of file diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java new file mode 100644 index 0000000..cc4cd14 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java @@ -0,0 +1,73 @@ +package com.ruoyi.generator.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 璇诲彇浠g爜鐢熸垚鐩稿叧閰嶇疆 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = { "classpath:generator.yml" }) +public class GenConfig +{ + /** 浣滆 */ + public static String author; + + /** 鐢熸垚鍖呰矾寰 */ + public static String packageName; + + /** 鑷姩鍘婚櫎琛ㄥ墠缂锛岄粯璁ゆ槸false */ + public static boolean autoRemovePre; + + /** 琛ㄥ墠缂(绫诲悕涓嶄細鍖呭惈琛ㄥ墠缂) */ + public static String tablePrefix; + + public static String getAuthor() + { + return author; + } + + @Value("${author}") + public void setAuthor(String author) + { + GenConfig.author = author; + } + + public static String getPackageName() + { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) + { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() + { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) + { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() + { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) + { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/controller/GenController.java new file mode 100644 index 0000000..8521b53 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -0,0 +1,214 @@ +package com.ruoyi.generator.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.service.IGenTableColumnService; +import com.ruoyi.generator.service.IGenTableService; + +/** + * 浠g爜鐢熸垚 鎿嶄綔澶勭悊 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController +{ + @Autowired + private IGenTableService genTableService; + + @Autowired + private IGenTableColumnService genTableColumnService; + + /** + * 鏌ヨ浠g爜鐢熸垚鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable) + { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 淇敼浠g爜鐢熸垚涓氬姟 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @GetMapping(value = "/{tableId}") + public AjaxResult getInfo(@PathVariable Long tableId) + { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return AjaxResult.success(map); + } + + /** + * 鏌ヨ鏁版嵁搴撳垪琛 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable) + { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(Long tableId) + { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) + { + String[] tableNames = Convert.toStrArray(tables); + // 鏌ヨ琛ㄤ俊鎭 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return AjaxResult.success(); + } + + /** + * 淇敼淇濆瓨浠g爜鐢熸垚涓氬姟 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) + { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return AjaxResult.success(); + } + + /** + * 鍒犻櫎浠g爜鐢熸垚 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) + { + genTableService.deleteGenTableByIds(tableIds); + return AjaxResult.success(); + } + + /** + * 棰勮浠g爜 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException + { + Map dataMap = genTableService.previewCode(tableId); + return AjaxResult.success(dataMap); + } + + /** + * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException + { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) + { + genTableService.generatorCode(tableName); + return AjaxResult.success(); + } + + /** + * 鍚屾鏁版嵁搴 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) + { + genTableService.synchDb(tableName); + return AjaxResult.success(); + } + + /** + * 鎵归噺鐢熸垚浠g爜 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException + { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 鐢熸垚zip鏂囦欢 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException + { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} \ No newline at end of file diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java new file mode 100644 index 0000000..269779c --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -0,0 +1,372 @@ +package com.ruoyi.generator.domain; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import org.apache.commons.lang3.ArrayUtils; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.utils.StringUtils; + +/** + * 涓氬姟琛 gen_table + * + * @author ruoyi + */ +public class GenTable extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 缂栧彿 */ + private Long tableId; + + /** 琛ㄥ悕绉 */ + @NotBlank(message = "琛ㄥ悕绉颁笉鑳戒负绌") + private String tableName; + + /** 琛ㄦ弿杩 */ + @NotBlank(message = "琛ㄦ弿杩颁笉鑳戒负绌") + private String tableComment; + + /** 鍏宠仈鐖惰〃鐨勮〃鍚 */ + private String subTableName; + + /** 鏈〃鍏宠仈鐖惰〃鐨勫閿悕 */ + private String subTableFkName; + + /** 瀹炰綋绫诲悕绉(棣栧瓧姣嶅ぇ鍐) */ + @NotBlank(message = "瀹炰綋绫诲悕绉颁笉鑳戒负绌") + private String className; + + /** 浣跨敤鐨勬ā鏉匡紙crud鍗曡〃鎿嶄綔 tree鏍戣〃鎿嶄綔 sub涓诲瓙琛ㄦ搷浣滐級 */ + private String tplCategory; + + /** 鐢熸垚鍖呰矾寰 */ + @NotBlank(message = "鐢熸垚鍖呰矾寰勪笉鑳戒负绌") + private String packageName; + + /** 鐢熸垚妯″潡鍚 */ + @NotBlank(message = "鐢熸垚妯″潡鍚嶄笉鑳戒负绌") + private String moduleName; + + /** 鐢熸垚涓氬姟鍚 */ + @NotBlank(message = "鐢熸垚涓氬姟鍚嶄笉鑳戒负绌") + private String businessName; + + /** 鐢熸垚鍔熻兘鍚 */ + @NotBlank(message = "鐢熸垚鍔熻兘鍚嶄笉鑳戒负绌") + private String functionName; + + /** 鐢熸垚浣滆 */ + @NotBlank(message = "浣滆呬笉鑳戒负绌") + private String functionAuthor; + + /** 鐢熸垚浠g爜鏂瑰紡锛0zip鍘嬬缉鍖 1鑷畾涔夎矾寰勶級 */ + private String genType; + + /** 鐢熸垚璺緞锛堜笉濉粯璁ら」鐩矾寰勶級 */ + private String genPath; + + /** 涓婚敭淇℃伅 */ + private GenTableColumn pkColumn; + + /** 瀛愯〃淇℃伅 */ + private GenTable subTable; + + /** 琛ㄥ垪淇℃伅 */ + @Valid + private List columns; + + /** 鍏跺畠鐢熸垚閫夐」 */ + private String options; + + /** 鏍戠紪鐮佸瓧娈 */ + private String treeCode; + + /** 鏍戠埗缂栫爜瀛楁 */ + private String treeParentCode; + + /** 鏍戝悕绉板瓧娈 */ + private String treeName; + + /** 涓婄骇鑿滃崟ID瀛楁 */ + private String parentMenuId; + + /** 涓婄骇鑿滃崟鍚嶇О瀛楁 */ + private String parentMenuName; + + public Long getTableId() + { + return tableId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public String getTableName() + { + return tableName; + } + + public void setTableName(String tableName) + { + this.tableName = tableName; + } + + public String getTableComment() + { + return tableComment; + } + + public void setTableComment(String tableComment) + { + this.tableComment = tableComment; + } + + public String getSubTableName() + { + return subTableName; + } + + public void setSubTableName(String subTableName) + { + this.subTableName = subTableName; + } + + public String getSubTableFkName() + { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) + { + this.subTableFkName = subTableFkName; + } + + public String getClassName() + { + return className; + } + + public void setClassName(String className) + { + this.className = className; + } + + public String getTplCategory() + { + return tplCategory; + } + + public void setTplCategory(String tplCategory) + { + this.tplCategory = tplCategory; + } + + public String getPackageName() + { + return packageName; + } + + public void setPackageName(String packageName) + { + this.packageName = packageName; + } + + public String getModuleName() + { + return moduleName; + } + + public void setModuleName(String moduleName) + { + this.moduleName = moduleName; + } + + public String getBusinessName() + { + return businessName; + } + + public void setBusinessName(String businessName) + { + this.businessName = businessName; + } + + public String getFunctionName() + { + return functionName; + } + + public void setFunctionName(String functionName) + { + this.functionName = functionName; + } + + public String getFunctionAuthor() + { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) + { + this.functionAuthor = functionAuthor; + } + + public String getGenType() + { + return genType; + } + + public void setGenType(String genType) + { + this.genType = genType; + } + + public String getGenPath() + { + return genPath; + } + + public void setGenPath(String genPath) + { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() + { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) + { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() + { + return subTable; + } + + public void setSubTable(GenTable subTable) + { + this.subTable = subTable; + } + + public List getColumns() + { + return columns; + } + + public void setColumns(List columns) + { + this.columns = columns; + } + + public String getOptions() + { + return options; + } + + public void setOptions(String options) + { + this.options = options; + } + + public String getTreeCode() + { + return treeCode; + } + + public void setTreeCode(String treeCode) + { + this.treeCode = treeCode; + } + + public String getTreeParentCode() + { + return treeParentCode; + } + + public void setTreeParentCode(String treeParentCode) + { + this.treeParentCode = treeParentCode; + } + + public String getTreeName() + { + return treeName; + } + + public void setTreeName(String treeName) + { + this.treeName = treeName; + } + + public String getParentMenuId() + { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) + { + this.parentMenuId = parentMenuId; + } + + public String getParentMenuName() + { + return parentMenuName; + } + + public void setParentMenuName(String parentMenuName) + { + this.parentMenuName = parentMenuName; + } + + public boolean isSub() + { + return isSub(this.tplCategory); + } + + public static boolean isSub(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + + public boolean isTree() + { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() + { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) + { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) + { + if (isTree(tplCategory)) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} \ No newline at end of file diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java new file mode 100644 index 0000000..d1733b6 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -0,0 +1,373 @@ +package com.ruoyi.generator.domain; + +import javax.validation.constraints.NotBlank; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.utils.StringUtils; + +/** + * 浠g爜鐢熸垚涓氬姟瀛楁琛 gen_table_column + * + * @author ruoyi + */ +public class GenTableColumn extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 缂栧彿 */ + private Long columnId; + + /** 褰掑睘琛ㄧ紪鍙 */ + private Long tableId; + + /** 鍒楀悕绉 */ + private String columnName; + + /** 鍒楁弿杩 */ + private String columnComment; + + /** 鍒楃被鍨 */ + private String columnType; + + /** JAVA绫诲瀷 */ + private String javaType; + + /** JAVA瀛楁鍚 */ + @NotBlank(message = "Java灞炴т笉鑳戒负绌") + private String javaField; + + /** 鏄惁涓婚敭锛1鏄級 */ + private String isPk; + + /** 鏄惁鑷锛1鏄級 */ + private String isIncrement; + + /** 鏄惁蹇呭~锛1鏄級 */ + private String isRequired; + + /** 鏄惁涓烘彃鍏ュ瓧娈碉紙1鏄級 */ + private String isInsert; + + /** 鏄惁缂栬緫瀛楁锛1鏄級 */ + private String isEdit; + + /** 鏄惁鍒楄〃瀛楁锛1鏄級 */ + private String isList; + + /** 鏄惁鏌ヨ瀛楁锛1鏄級 */ + private String isQuery; + + /** 鏌ヨ鏂瑰紡锛圗Q绛変簬銆丯E涓嶇瓑浜庛丟T澶т簬銆丩T灏忎簬銆丩IKE妯$硦銆丅ETWEEN鑼冨洿锛 */ + private String queryType; + + /** 鏄剧ず绫诲瀷锛坕nput鏂囨湰妗嗐乼extarea鏂囨湰鍩熴乻elect涓嬫媺妗嗐乧heckbox澶嶉夋銆乺adio鍗曢夋銆乨atetime鏃ユ湡鎺т欢銆乮mage鍥剧墖涓婁紶鎺т欢銆乽pload鏂囦欢涓婁紶鎺т欢銆乪ditor瀵屾枃鏈帶浠讹級 */ + private String htmlType; + + /** 瀛楀吀绫诲瀷 */ + private String dictType; + + /** 鎺掑簭 */ + private Integer sort; + + public void setColumnId(Long columnId) + { + this.columnId = columnId; + } + + public Long getColumnId() + { + return columnId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public Long getTableId() + { + return tableId; + } + + public void setColumnName(String columnName) + { + this.columnName = columnName; + } + + public String getColumnName() + { + return columnName; + } + + public void setColumnComment(String columnComment) + { + this.columnComment = columnComment; + } + + public String getColumnComment() + { + return columnComment; + } + + public void setColumnType(String columnType) + { + this.columnType = columnType; + } + + public String getColumnType() + { + return columnType; + } + + public void setJavaType(String javaType) + { + this.javaType = javaType; + } + + public String getJavaType() + { + return javaType; + } + + public void setJavaField(String javaField) + { + this.javaField = javaField; + } + + public String getJavaField() + { + return javaField; + } + + public String getCapJavaField() + { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) + { + this.isPk = isPk; + } + + public String getIsPk() + { + return isPk; + } + + public boolean isPk() + { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) + { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() + { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) + { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() + { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) + { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) + { + this.isRequired = isRequired; + } + + public String getIsRequired() + { + return isRequired; + } + + public boolean isRequired() + { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) + { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) + { + this.isInsert = isInsert; + } + + public String getIsInsert() + { + return isInsert; + } + + public boolean isInsert() + { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) + { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) + { + this.isEdit = isEdit; + } + + public String getIsEdit() + { + return isEdit; + } + + public boolean isEdit() + { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) + { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) + { + this.isList = isList; + } + + public String getIsList() + { + return isList; + } + + public boolean isList() + { + return isList(this.isList); + } + + public boolean isList(String isList) + { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) + { + this.isQuery = isQuery; + } + + public String getIsQuery() + { + return isQuery; + } + + public boolean isQuery() + { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) + { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) + { + this.queryType = queryType; + } + + public String getQueryType() + { + return queryType; + } + + public String getHtmlType() + { + return htmlType; + } + + public void setHtmlType(String htmlType) + { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getDictType() + { + return dictType; + } + + public void setSort(Integer sort) + { + this.sort = sort; + } + + public Integer getSort() + { + return sort; + } + + public boolean isSuperColumn() + { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() + { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) + { + // isSuperColumn()涓殑鍚嶅崟鐢ㄤ簬閬垮厤鐢熸垚澶氫綑Domain灞炴э紝鑻ユ煇浜涘睘鎬у湪鐢熸垚椤甸潰鏃堕渶瑕佺敤鍒颁笉鑳藉拷鐣ワ紝鍒欐斁鍦ㄦ澶勭櫧鍚嶅崟 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() + { + String remarks = StringUtils.substringBetween(this.columnComment, "锛", "锛"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) + { + for (String value : remarks.split(" ")) + { + if (StringUtils.isNotEmpty(value)) + { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } + else + { + return this.columnComment; + } + } +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..71061fc --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.generator.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.generator.domain.GenTableColumn; + +import java.util.List; + +/** + * 涓氬姟瀛楁 鏁版嵁灞 + * + * @author ruoyi + */ +public interface GenTableColumnMapper extends BaseMongoMapper { + /** + * 鏍规嵁琛ㄥ悕绉版煡璇㈠垪淇℃伅 + * + * @param tableName 琛ㄥ悕绉 + * @return 鍒椾俊鎭 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 鏌ヨ涓氬姟瀛楁鍒楄〃 + * + * @param tableId 涓氬姟瀛楁缂栧彿 + * @return 涓氬姟瀛楁闆嗗悎 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 鏂板涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 淇敼涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 鍒犻櫎涓氬姟瀛楁 + * + * @param genTableColumns 鍒楁暟鎹 + * @return 缁撴灉 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 鎵归噺鍒犻櫎涓氬姟瀛楁 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java new file mode 100644 index 0000000..f8ddf47 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -0,0 +1,85 @@ +package com.ruoyi.generator.mapper; + +import com.easy.mongodb.core.conditions.interfaces.BaseMongoMapper; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; + +import java.util.List; + +/** + * 涓氬姟 鏁版嵁灞 + * + * @author ruoyi + */ +public interface GenTableMapper extends BaseMongoMapper { + /** + * 鏌ヨ涓氬姟鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 涓氬姟闆嗗悎 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param tableNames 琛ㄥ悕绉扮粍 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 鏌ヨ鎵鏈夎〃淇℃伅 + * + * @return 琛ㄤ俊鎭泦鍚 + */ + public List selectGenTableAll(); + + /** + * 鏌ヨ琛↖D涓氬姟淇℃伅 + * + * @param id 涓氬姟ID + * @return 涓氬姟淇℃伅 + */ + public GenTable selectGenTableById(Long id); + + /** + * 鏌ヨ琛ㄥ悕绉颁笟鍔′俊鎭 + * + * @param tableName 琛ㄥ悕绉 + * @return 涓氬姟淇℃伅 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 鏂板涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + public int insertGenTable(GenTable genTable); + + /** + * 淇敼涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + public int updateGenTable(GenTable genTable); + + /** + * 鎵归噺鍒犻櫎涓氬姟 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteGenTableByIds(Long[] ids); +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..0679689 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -0,0 +1,68 @@ +package com.ruoyi.generator.service; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.mapper.GenTableColumnMapper; + +/** + * 涓氬姟瀛楁 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class GenTableColumnServiceImpl implements IGenTableColumnService +{ + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 鏌ヨ涓氬姟瀛楁鍒楄〃 + * + * @param tableId 涓氬姟瀛楁缂栧彿 + * @return 涓氬姟瀛楁闆嗗悎 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) + { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + + /** + * 鏂板涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** + * 淇敼涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** + * 鍒犻櫎涓氬姟瀛楁瀵硅薄 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + @Override + public int deleteGenTableColumnByIds(String ids) + { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java new file mode 100644 index 0000000..4889f81 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -0,0 +1,521 @@ +package com.ruoyi.generator.service; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.core.text.CharsetKit; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; +import com.ruoyi.generator.mapper.GenTableColumnMapper; +import com.ruoyi.generator.mapper.GenTableMapper; +import com.ruoyi.generator.util.GenUtils; +import com.ruoyi.generator.util.VelocityInitializer; +import com.ruoyi.generator.util.VelocityUtils; + +/** + * 涓氬姟 鏈嶅姟灞傚疄鐜 + * + * @author ruoyi + */ +@Service +public class GenTableServiceImpl implements IGenTableService +{ + private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Autowired + private GenTableMapper genTableMapper; + + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 鏌ヨ涓氬姟淇℃伅 + * + * @param id 涓氬姟ID + * @return 涓氬姟淇℃伅 + */ + @Override + public GenTable selectGenTableById(Long id) + { + GenTable genTable = genTableMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + /** + * 鏌ヨ涓氬姟鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 涓氬姟闆嗗悎 + */ + @Override + public List selectGenTableList(GenTable genTable) + { + return genTableMapper.selectGenTableList(genTable); + } + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + @Override + public List selectDbTableList(GenTable genTable) + { + return genTableMapper.selectDbTableList(genTable); + } + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param tableNames 琛ㄥ悕绉扮粍 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) + { + return genTableMapper.selectDbTableListByNames(tableNames); + } + + /** + * 鏌ヨ鎵鏈夎〃淇℃伅 + * + * @return 琛ㄤ俊鎭泦鍚 + */ + @Override + public List selectGenTableAll() + { + return genTableMapper.selectGenTableAll(); + } + + /** + * 淇敼涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + @Override + @Transactional + public void updateGenTable(GenTable genTable) + { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableMapper.updateGenTable(genTable); + if (row > 0) + { + for (GenTableColumn cenTableColumn : genTable.getColumns()) + { + genTableColumnMapper.updateGenTableColumn(cenTableColumn); + } + } + } + + /** + * 鍒犻櫎涓氬姟瀵硅薄 + * + * @param tableIds 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) + { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 瀵煎叆琛ㄧ粨鏋 + * + * @param tableList 瀵煎叆琛ㄥ垪琛 + */ + @Override + @Transactional + public void importGenTable(List tableList) + { + String operName = SecurityUtils.getUsername(); + try + { + for (GenTable table : tableList) + { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableMapper.insertGenTable(table); + if (row > 0) + { + // 淇濆瓨鍒椾俊鎭 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) + { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + } + } + } + catch (Exception e) + { + throw new ServiceException("瀵煎叆澶辫触锛" + e.getMessage()); + } + } + + /** + * 棰勮浠g爜 + * + * @param tableId 琛ㄧ紪鍙 + * @return 棰勮鏁版嵁鍒楄〃 + */ + @Override + public Map previewCode(Long tableId) + { + Map dataMap = new LinkedHashMap<>(); + // 鏌ヨ琛ㄤ俊鎭 + GenTable table = genTableMapper.selectGenTableById(tableId); + // 璁剧疆涓诲瓙琛ㄤ俊鎭 + setSubTable(table); + // 璁剧疆涓婚敭鍒椾俊鎭 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 鑾峰彇妯℃澘鍒楄〃 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 娓叉煋妯℃澘 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableName 琛ㄥ悕绉 + * @return 鏁版嵁 + */ + @Override + public byte[] downloadCode(String tableName) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛 + * + * @param tableName 琛ㄥ悕绉 + */ + @Override + public void generatorCode(String tableName) + { + // 鏌ヨ琛ㄤ俊鎭 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 璁剧疆涓诲瓙琛ㄤ俊鎭 + setSubTable(table); + // 璁剧疆涓婚敭鍒椾俊鎭 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 鑾峰彇妯℃澘鍒楄〃 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) + { + // 娓叉煋妯℃澘 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } + catch (IOException e) + { + throw new ServiceException("娓叉煋妯℃澘澶辫触锛岃〃鍚嶏細" + table.getTableName()); + } + } + } + } + + /** + * 鍚屾鏁版嵁搴 + * + * @param tableName 琛ㄥ悕绉 + */ + @Override + @Transactional + public void synchDb(String tableName) + { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) + { + throw new ServiceException("鍚屾鏁版嵁澶辫触锛屽師琛ㄧ粨鏋勪笉瀛樺湪"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) + { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) + { + // 濡傛灉鏄垪琛紝缁х画淇濈暀鏌ヨ鏂瑰紡/瀛楀吀绫诲瀷閫夐」 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) + { + // 濡傛灉鏄(鏂板/淇敼&闈炰富閿/闈炲拷鐣ュ強鐖跺睘鎬)锛岀户缁繚鐣欏繀濉/鏄剧ず绫诲瀷閫夐」 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + genTableColumnMapper.updateGenTableColumn(column); + } + else + { + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) + { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 鎵归噺鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableNames 琛ㄦ暟缁 + * @return 鏁版嵁 + */ + @Override + public byte[] downloadCode(String[] tableNames) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) + { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 鏌ヨ琛ㄤ俊鎭苟鐢熸垚浠g爜 + */ + private void generatorCode(String tableName, ZipOutputStream zip) + { + // 鏌ヨ琛ㄤ俊鎭 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 璁剧疆涓诲瓙琛ㄤ俊鎭 + setSubTable(table); + // 璁剧疆涓婚敭鍒椾俊鎭 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 鑾峰彇妯℃澘鍒楄〃 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 娓叉煋妯℃澘 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + // 娣诲姞鍒皕ip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } + catch (IOException e) + { + log.error("娓叉煋妯℃澘澶辫触锛岃〃鍚嶏細" + table.getTableName(), e); + } + } + } + + /** + * 淇敼淇濆瓨鍙傛暟鏍¢獙 + * + * @param genTable 涓氬姟淇℃伅 + */ + @Override + public void validateEdit(GenTable genTable) + { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) + { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSON.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) + { + throw new ServiceException("鏍戠紪鐮佸瓧娈典笉鑳戒负绌"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) + { + throw new ServiceException("鏍戠埗缂栫爜瀛楁涓嶈兘涓虹┖"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) + { + throw new ServiceException("鏍戝悕绉板瓧娈典笉鑳戒负绌"); + } + else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) + { + if (StringUtils.isEmpty(genTable.getSubTableName())) + { + throw new ServiceException("鍏宠仈瀛愯〃鐨勮〃鍚嶄笉鑳戒负绌"); + } + else if (StringUtils.isEmpty(genTable.getSubTableFkName())) + { + throw new ServiceException("瀛愯〃鍏宠仈鐨勫閿悕涓嶈兘涓虹┖"); + } + } + } + } + + /** + * 璁剧疆涓婚敭鍒椾俊鎭 + * + * @param table 涓氬姟琛ㄤ俊鎭 + */ + public void setPkColumn(GenTable table) + { + for (GenTableColumn column : table.getColumns()) + { + if (column.isPk()) + { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) + { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) + { + for (GenTableColumn column : table.getSubTable().getColumns()) + { + if (column.isPk()) + { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) + { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 璁剧疆涓诲瓙琛ㄤ俊鎭 + * + * @param table 涓氬姟琛ㄤ俊鎭 + */ + public void setSubTable(GenTable table) + { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) + { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 璁剧疆浠g爜鐢熸垚鍏朵粬閫夐」鍊 + * + * @param genTable 璁剧疆鍚庣殑鐢熸垚瀵硅薄 + */ + public void setTableFromOptions(GenTable genTable) + { + JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) + { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 鑾峰彇浠g爜鐢熸垚鍦板潃 + * + * @param table 涓氬姟琛ㄤ俊鎭 + * @param template 妯℃澘鏂囦欢璺緞 + * @return 鐢熸垚鍦板潃 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} \ No newline at end of file diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java new file mode 100644 index 0000000..3037f70 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java @@ -0,0 +1,44 @@ +package com.ruoyi.generator.service; + +import java.util.List; +import com.ruoyi.generator.domain.GenTableColumn; + +/** + * 涓氬姟瀛楁 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface IGenTableColumnService +{ + /** + * 鏌ヨ涓氬姟瀛楁鍒楄〃 + * + * @param tableId 涓氬姟瀛楁缂栧彿 + * @return 涓氬姟瀛楁闆嗗悎 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 鏂板涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 淇敼涓氬姟瀛楁 + * + * @param genTableColumn 涓氬姟瀛楁淇℃伅 + * @return 缁撴灉 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 鍒犻櫎涓氬姟瀛楁淇℃伅 + * + * @param ids 闇瑕佸垹闄ょ殑鏁版嵁ID + * @return 缁撴灉 + */ + public int deleteGenTableColumnByIds(String ids); +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java new file mode 100644 index 0000000..9d53f95 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -0,0 +1,121 @@ +package com.ruoyi.generator.service; + +import java.util.List; +import java.util.Map; +import com.ruoyi.generator.domain.GenTable; + +/** + * 涓氬姟 鏈嶅姟灞 + * + * @author ruoyi + */ +public interface IGenTableService +{ + /** + * 鏌ヨ涓氬姟鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 涓氬姟闆嗗悎 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param genTable 涓氬姟淇℃伅 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 鏌ヨ鎹簱鍒楄〃 + * + * @param tableNames 琛ㄥ悕绉扮粍 + * @return 鏁版嵁搴撹〃闆嗗悎 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 鏌ヨ鎵鏈夎〃淇℃伅 + * + * @return 琛ㄤ俊鎭泦鍚 + */ + public List selectGenTableAll(); + + /** + * 鏌ヨ涓氬姟淇℃伅 + * + * @param id 涓氬姟ID + * @return 涓氬姟淇℃伅 + */ + public GenTable selectGenTableById(Long id); + + /** + * 淇敼涓氬姟 + * + * @param genTable 涓氬姟淇℃伅 + * @return 缁撴灉 + */ + public void updateGenTable(GenTable genTable); + + /** + * 鍒犻櫎涓氬姟淇℃伅 + * + * @param tableIds 闇瑕佸垹闄ょ殑琛ㄦ暟鎹甀D + * @return 缁撴灉 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 瀵煎叆琛ㄧ粨鏋 + * + * @param tableList 瀵煎叆琛ㄥ垪琛 + */ + public void importGenTable(List tableList); + + /** + * 棰勮浠g爜 + * + * @param tableId 琛ㄧ紪鍙 + * @return 棰勮鏁版嵁鍒楄〃 + */ + public Map previewCode(Long tableId); + + /** + * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableName 琛ㄥ悕绉 + * @return 鏁版嵁 + */ + public byte[] downloadCode(String tableName); + + /** + * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛 + * + * @param tableName 琛ㄥ悕绉 + * @return 鏁版嵁 + */ + public void generatorCode(String tableName); + + /** + * 鍚屾鏁版嵁搴 + * + * @param tableName 琛ㄥ悕绉 + */ + public void synchDb(String tableName); + + /** + * 鎵归噺鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 + * + * @param tableNames 琛ㄦ暟缁 + * @return 鏁版嵁 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 淇敼淇濆瓨鍙傛暟鏍¢獙 + * + * @param genTable 涓氬姟淇℃伅 + */ + public void validateEdit(GenTable genTable); +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java new file mode 100644 index 0000000..e7ebc20 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -0,0 +1,257 @@ +package com.ruoyi.generator.util; + +import java.util.Arrays; +import org.apache.commons.lang3.RegExUtils; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.generator.config.GenConfig; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; + +/** + * 浠g爜鐢熸垚鍣 宸ュ叿绫 + * + * @author ruoyi + */ +public class GenUtils +{ + /** + * 鍒濆鍖栬〃淇℃伅 + */ + public static void initTable(GenTable genTable, String operName) + { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 鍒濆鍖栧垪灞炴у瓧娈 + */ + public static void initColumnField(GenTableColumn column, GenTable table) + { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 璁剧疆java瀛楁鍚 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 璁剧疆榛樿绫诲瀷 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 瀛楃涓查暱搴﹁秴杩500璁剧疆涓烘枃鏈煙 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 濡傛灉鏄暣褰 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 闀挎暣褰 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 鎻掑叆瀛楁锛堥粯璁ゆ墍鏈夊瓧娈甸兘闇瑕佹彃鍏ワ級 + column.setIsInsert(GenConstants.REQUIRE); + + // 缂栬緫瀛楁 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 鍒楄〃瀛楁 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 鏌ヨ瀛楁 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 鏌ヨ瀛楁绫诲瀷 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 鐘舵佸瓧娈佃缃崟閫夋 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 绫诲瀷&鎬у埆瀛楁璁剧疆涓嬫媺妗 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 鍥剧墖瀛楁璁剧疆鍥剧墖涓婁紶鎺т欢 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 鏂囦欢瀛楁璁剧疆鏂囦欢涓婁紶鎺т欢 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 鍐呭瀛楁璁剧疆瀵屾枃鏈帶浠 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 鏍¢獙鏁扮粍鏄惁鍖呭惈鎸囧畾鍊 + * + * @param arr 鏁扮粍 + * @param targetValue 鍊 + * @return 鏄惁鍖呭惈 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 鑾峰彇妯″潡鍚 + * + * @param packageName 鍖呭悕 + * @return 妯″潡鍚 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 鑾峰彇涓氬姟鍚 + * + * @param tableName 琛ㄥ悕 + * @return 涓氬姟鍚 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + return StringUtils.substring(tableName, lastIndex + 1, nameLength); + } + + /** + * 琛ㄥ悕杞崲鎴怞ava绫诲悕 + * + * @param tableName 琛ㄥ悕绉 + * @return 绫诲悕 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 鎵归噺鏇挎崲鍓嶇紑 + * + * @param replacementm 鏇挎崲鍊 + * @param searchList 鏇挎崲鍒楄〃 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 鍏抽敭瀛楁浛鎹 + * + * @param text 闇瑕佽鏇挎崲鐨勫悕瀛 + * @return 鏇挎崲鍚庣殑鍚嶅瓧 + */ + public static String replaceText(String text) + { + return RegExUtils.replaceAll(text, "(?:琛▅鑻ヤ緷)", ""); + } + + /** + * 鑾峰彇鏁版嵁搴撶被鍨嬪瓧娈 + * + * @param columnType 鍒楃被鍨 + * @return 鎴彇鍚庣殑鍒楃被鍨 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 鑾峰彇瀛楁闀垮害 + * + * @param columnType 鍒楃被鍨 + * @return 鎴彇鍚庣殑鍒楃被鍨 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java new file mode 100644 index 0000000..9f69403 --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java @@ -0,0 +1,34 @@ +package com.ruoyi.generator.util; + +import java.util.Properties; +import org.apache.velocity.app.Velocity; +import com.ruoyi.common.constant.Constants; + +/** + * VelocityEngine宸ュ巶 + * + * @author ruoyi + */ +public class VelocityInitializer +{ + /** + * 鍒濆鍖杤m鏂规硶 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 鍔犺浇classpath鐩綍涓嬬殑vm鏂囦欢 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 瀹氫箟瀛楃闆 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 鍒濆鍖朧elocity寮曟搸锛屾寚瀹氶厤缃甈roperties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/vapeshop-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/vapeshop-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java new file mode 100644 index 0000000..7ede02d --- /dev/null +++ b/vapeshop-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -0,0 +1,402 @@ +package com.ruoyi.generator.util; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.velocity.VelocityContext; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; + +/** + * 妯℃澘澶勭悊宸ュ叿绫 + * + * @author ruoyi + */ +public class VelocityUtils +{ + /** 椤圭洰绌洪棿璺緞 */ + private static final String PROJECT_PATH = "main/java"; + + /** mybatis绌洪棿璺緞 */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** 榛樿涓婄骇鑿滃崟锛岀郴缁熷伐鍏 */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 璁剧疆妯℃澘鍙橀噺淇℃伅 + * + * @return 妯℃澘鍒楄〃 + */ + public static VelocityContext prepareContext(GenTable genTable) + { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "銆愯濉啓鍔熻兘鍚嶇О銆"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) + { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) + { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) + { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 鑾峰彇妯℃澘淇℃伅 + * + * @return 妯℃澘鍒楄〃 + */ + public static List getTemplateList(String tplCategory) + { + List templates = new ArrayList(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + templates.add("vm/sql/sql.vm"); + templates.add("vm/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + } + else if (GenConstants.TPL_TREE.equals(tplCategory)) + { + templates.add("vm/vue/index-tree.vue.vm"); + } + else if (GenConstants.TPL_SUB.equals(tplCategory)) + { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 鑾峰彇鏂囦欢鍚 + */ + public static String getFileName(String template, GenTable genTable) + { + // 鏂囦欢鍚嶇О + String fileName = ""; + // 鍖呰矾寰 + String packageName = genTable.getPackageName(); + // 妯″潡鍚 + String moduleName = genTable.getModuleName(); + // 澶у啓绫诲悕 + String className = genTable.getClassName(); + // 涓氬姟鍚嶇О + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } + else if (template.contains("mapper.java.vm")) + { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } + else if (template.contains("service.java.vm")) + { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } + else if (template.contains("serviceImpl.java.vm")) + { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } + else if (template.contains("controller.java.vm")) + { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } + else if (template.contains("mapper.xml.vm")) + { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } + else if (template.contains("sql.vm")) + { + fileName = businessName + "Menu.sql"; + } + else if (template.contains("api.js.vm")) + { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } + else if (template.contains("index.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + else if (template.contains("index-tree.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 鑾峰彇鍖呭墠缂 + * + * @param packageName 鍖呭悕绉 + * @return 鍖呭墠缂鍚嶇О + */ + public static String getPackagePrefix(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 鏍规嵁鍒楃被鍨嬭幏鍙栧鍏ュ寘 + * + * @param genTable 涓氬姟琛ㄥ璞 + * @return 杩斿洖闇瑕佸鍏ョ殑鍖呭垪琛 + */ + public static HashSet getImportList(GenTable genTable) + { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) + { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) + { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } + else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) + { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 鏍规嵁鍒楃被鍨嬭幏鍙栧瓧鍏哥粍 + * + * @param genTable 涓氬姟琛ㄥ璞 + * @return 杩斿洖瀛楀吀缁 + */ + public static String getDicts(GenTable genTable) + { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + addDicts(dicts, columns); + if (StringUtils.isNotNull(genTable.getSubTable())) + { + List subColumns = genTable.getSubTable().getColumns(); + addDicts(dicts, subColumns); + } + return StringUtils.join(dicts, ", "); + } + + /** + * 娣诲姞瀛楀吀鍒楄〃 + * + * @param dicts 瀛楀吀鍒楄〃 + * @param columns 鍒楅泦鍚 + */ + public static void addDicts(Set dicts, List columns) + { + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) + { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 鑾峰彇鏉冮檺鍓嶇紑 + * + * @param moduleName 妯″潡鍚嶇О + * @param businessName 涓氬姟鍚嶇О + * @return 杩斿洖鏉冮檺鍓嶇紑 + */ + public static String getPermissionPrefix(String moduleName, String businessName) + { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 鑾峰彇涓婄骇鑿滃崟ID瀛楁 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 涓婄骇鑿滃崟ID瀛楁 + */ + public static String getParentMenuId(JSONObject paramsObj) + { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) + { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 鑾峰彇鏍戠紪鐮 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 鏍戠紪鐮 + */ + public static String getTreecode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 鑾峰彇鏍戠埗缂栫爜 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 鏍戠埗缂栫爜 + */ + public static String getTreeParentCode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 鑾峰彇鏍戝悕绉 + * + * @param paramsObj 鐢熸垚鍏朵粬閫夐」 + * @return 鏍戝悕绉 + */ + public static String getTreeName(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 鑾峰彇闇瑕佸湪鍝竴鍒椾笂闈㈡樉绀哄睍寮鎸夐挳 + * + * @param genTable 涓氬姟琛ㄥ璞 + * @return 灞曞紑鎸夐挳鍒楀簭鍙 + */ + public static int getExpandColumn(GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) + { + if (column.isList()) + { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) + { + break; + } + } + } + return num; + } +} diff --git a/vapeshop-generator/src/main/resources/generator.yml b/vapeshop-generator/src/main/resources/generator.yml new file mode 100644 index 0000000..5bd3dd6 --- /dev/null +++ b/vapeshop-generator/src/main/resources/generator.yml @@ -0,0 +1,10 @@ +# 浠g爜鐢熸垚 +gen: + # 浣滆 + author: ruoyi + # 榛樿鐢熸垚鍖呰矾寰 system 闇鏀规垚鑷繁鐨勬ā鍧楀悕绉 濡 system monitor tool + packageName: com.ruoyi.system + # 鑷姩鍘婚櫎琛ㄥ墠缂锛岄粯璁ゆ槸false + autoRemovePre: false + # 琛ㄥ墠缂锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛 + tablePrefix: sys_ \ No newline at end of file diff --git a/vapeshop-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/vapeshop-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..5fa790f --- /dev/null +++ b/vapeshop-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/vapeshop-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/vapeshop-generator/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..b605e90 --- /dev/null +++ b/vapeshop-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/vapeshop-generator/src/main/resources/vm/java/controller.java.vm b/vapeshop-generator/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..ab19cf5 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,115 @@ +package ${packageName}.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.ruoyi.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.ruoyi.common.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 鏌ヨ${functionName}鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return AjaxResult.success(list); + } +#end + + /** + * 瀵煎嚭${functionName}鍒楄〃 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}鏁版嵁"); + } + + /** + * 鑾峰彇${functionName}璇︾粏淇℃伅 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return AjaxResult.success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 鏂板${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 淇敼${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 鍒犻櫎${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/vapeshop-generator/src/main/resources/vm/java/domain.java.vm b/vapeshop-generator/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..bd51c17 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,105 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +#if($table.crud || $table.sub) +import com.ruoyi.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.ruoyi.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}瀵硅薄 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("锛")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName淇℃伅 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/vapeshop-generator/src/main/resources/vm/java/mapper.java.vm b/vapeshop-generator/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..7e7d7c2 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper鎺ュ彛 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 鏌ヨ${functionName} + * + * @param ${pkColumn.javaField} ${functionName}涓婚敭 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 鏌ヨ${functionName}鍒楄〃 + * + * @param ${className} ${functionName} + * @return ${functionName}闆嗗悎 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 鏂板${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 淇敼${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField} ${functionName}涓婚敭 + * @return 缁撴灉 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 鎵归噺鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField}s 闇瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎 + * @return 缁撴灉 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 鎵归噺鍒犻櫎${subTable.functionName} + * + * @param ${pkColumn.javaField}s 闇瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎 + * @return 缁撴灉 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 鎵归噺鏂板${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}鍒楄〃 + * @return 缁撴灉 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 閫氳繃${functionName}涓婚敭鍒犻櫎${subTable.functionName}淇℃伅 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 缁撴灉 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/vapeshop-generator/src/main/resources/vm/java/service.java.vm b/vapeshop-generator/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..264882b --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,61 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service鎺ュ彛 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 鏌ヨ${functionName} + * + * @param ${pkColumn.javaField} ${functionName}涓婚敭 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 鏌ヨ${functionName}鍒楄〃 + * + * @param ${className} ${functionName} + * @return ${functionName}闆嗗悎 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 鏂板${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 淇敼${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 鎵归噺鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField}s 闇瑕佸垹闄ょ殑${functionName}涓婚敭闆嗗悎 + * @return 缁撴灉 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 鍒犻櫎${functionName}淇℃伅 + * + * @param ${pkColumn.javaField} ${functionName}涓婚敭 + * @return 缁撴灉 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/vapeshop-generator/src/main/resources/vm/java/serviceImpl.java.vm b/vapeshop-generator/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..14746e1 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,169 @@ +package ${packageName}.service.impl; + +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.ruoyi.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName}Service涓氬姟灞傚鐞 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 鏌ヨ${functionName} + * + * @param ${pkColumn.javaField} ${functionName}涓婚敭 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 鏌ヨ${functionName}鍒楄〃 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 鏂板${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 淇敼${functionName} + * + * @param ${className} ${functionName} + * @return 缁撴灉 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 鎵归噺鍒犻櫎${functionName} + * + * @param ${pkColumn.javaField}s 闇瑕佸垹闄ょ殑${functionName}涓婚敭 + * @return 缁撴灉 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 鍒犻櫎${functionName}淇℃伅 + * + * @param ${pkColumn.javaField} ${functionName}涓婚敭 + * @return 缁撴灉 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 鏂板${subTable.functionName}淇℃伅 + * + * @param ${className} ${functionName}瀵硅薄 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/vapeshop-generator/src/main/resources/vm/java/sub-domain.java.vm b/vapeshop-generator/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..a3f53eb --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}瀵硅薄 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("锛")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/vapeshop-generator/src/main/resources/vm/js/api.js.vm b/vapeshop-generator/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 鏌ヨ${functionName}鍒楄〃 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ${functionName}璇︾粏 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 鏂板${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 淇敼${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 鍒犻櫎${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/vapeshop-generator/src/main/resources/vm/sql/sql.vm b/vapeshop-generator/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..0575583 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 鑿滃崟 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}鑿滃崟'); + +-- 鎸夐挳鐖惰彍鍗旾D +SELECT @parentId := LAST_INSERT_ID(); + +-- 鎸夐挳 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}鏌ヨ', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}鏂板', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}淇敼', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}鍒犻櫎', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}瀵煎嚭', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/vapeshop-generator/src/main/resources/vm/vue/index-tree.vue.vm b/vapeshop-generator/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..3def704 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,502 @@ + + + diff --git a/vapeshop-generator/src/main/resources/vm/vue/index.vue.vm b/vapeshop-generator/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..e9a1fae --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,598 @@ + + + diff --git a/vapeshop-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/vapeshop-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..862297c --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,486 @@ + + + diff --git a/vapeshop-generator/src/main/resources/vm/vue/v3/index.vue.vm b/vapeshop-generator/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..a363ef3 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,596 @@ + + + diff --git a/vapeshop-generator/src/main/resources/vm/vue/v3/readme.txt b/vapeshop-generator/src/main/resources/vm/vue/v3/readme.txt new file mode 100644 index 0000000..99239bb --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +如果使用的是RuoYi-Vue3前端,那么需要覆盖一下此目录的模板index.vue.vm、index-tree.vue.vm文件到上级vue目录。 \ No newline at end of file diff --git a/vapeshop-generator/src/main/resources/vm/xml/mapper.xml.vm b/vapeshop-generator/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..0ceb3d8 --- /dev/null +++ b/vapeshop-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,135 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/vapeshop-system/pom.xml b/vapeshop-system/pom.xml new file mode 100644 index 0000000..124bb1d --- /dev/null +++ b/vapeshop-system/pom.xml @@ -0,0 +1,27 @@ + + + + vapeshop + cn.com.vapeshop + 3.8.3 + + 4.0.0 + vapeshop-system + + + system绯荤粺妯″潡 + + + + + + + cn.com.vapeshop + vapeshop-common + + + + + \ No newline at end of file diff --git a/vapeshop-ui/.editorconfig b/vapeshop-ui/.editorconfig new file mode 100644 index 0000000..7034f9b --- /dev/null +++ b/vapeshop-ui/.editorconfig @@ -0,0 +1,22 @@ +# 鍛婅瘔EditorConfig鎻掍欢锛岃繖鏄牴鏂囦欢锛屼笉鐢ㄧ户缁線涓婃煡鎵 +root = true + +# 鍖归厤鍏ㄩ儴鏂囦欢 +[*] +# 璁剧疆瀛楃闆 +charset = utf-8 +# 缂╄繘椋庢牸锛屽彲閫塻pace銆乼ab +indent_style = space +# 缂╄繘鐨勭┖鏍兼暟 +indent_size = 2 +# 缁撳熬鎹㈣绗︼紝鍙塴f銆乧r銆乧rlf +end_of_line = lf +# 鍦ㄦ枃浠剁粨灏炬彃鍏ユ柊琛 +insert_final_newline = true +# 鍒犻櫎涓琛屼腑鐨勫墠鍚庣┖鏍 +trim_trailing_whitespace = true + +# 鍖归厤md缁撳熬鐨勬枃浠 +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/vapeshop-ui/.env.development b/vapeshop-ui/.env.development new file mode 100644 index 0000000..302ecd1 --- /dev/null +++ b/vapeshop-ui/.env.development @@ -0,0 +1,11 @@ +# 椤甸潰鏍囬 +VUE_APP_TITLE = 鑻ヤ緷绠$悊绯荤粺 + +# 寮鍙戠幆澧冮厤缃 +ENV = 'development' + +# 鑻ヤ緷绠$悊绯荤粺/寮鍙戠幆澧 +VUE_APP_BASE_API = '/dev-api' + +# 璺敱鎳掑姞杞 +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/vapeshop-ui/.env.production b/vapeshop-ui/.env.production new file mode 100644 index 0000000..b4893b0 --- /dev/null +++ b/vapeshop-ui/.env.production @@ -0,0 +1,8 @@ +# 椤甸潰鏍囬 +VUE_APP_TITLE = 鑻ヤ緷绠$悊绯荤粺 + +# 鐢熶骇鐜閰嶇疆 +ENV = 'production' + +# 鑻ヤ緷绠$悊绯荤粺/鐢熶骇鐜 +VUE_APP_BASE_API = '/prod-api' diff --git a/vapeshop-ui/.env.staging b/vapeshop-ui/.env.staging new file mode 100644 index 0000000..361859f --- /dev/null +++ b/vapeshop-ui/.env.staging @@ -0,0 +1,10 @@ +# 椤甸潰鏍囬 +VUE_APP_TITLE = 鑻ヤ緷绠$悊绯荤粺 + +NODE_ENV = production + +# 娴嬭瘯鐜閰嶇疆 +ENV = 'staging' + +# 鑻ヤ緷绠$悊绯荤粺/娴嬭瘯鐜 +VUE_APP_BASE_API = '/stage-api' diff --git a/vapeshop-ui/.eslintignore b/vapeshop-ui/.eslintignore new file mode 100644 index 0000000..89be6f6 --- /dev/null +++ b/vapeshop-ui/.eslintignore @@ -0,0 +1,10 @@ +# 蹇界暐build鐩綍涓嬬被鍨嬩负js鐨勬枃浠剁殑璇硶妫鏌 +build/*.js +# 蹇界暐src/assets鐩綍涓嬫枃浠剁殑璇硶妫鏌 +src/assets +# 蹇界暐public鐩綍涓嬫枃浠剁殑璇硶妫鏌 +public +# 蹇界暐褰撳墠鐩綍涓嬩负js鐨勬枃浠剁殑璇硶妫鏌 +*.js +# 蹇界暐褰撳墠鐩綍涓嬩负vue鐨勬枃浠剁殑璇硶妫鏌 +*.vue \ No newline at end of file diff --git a/vapeshop-ui/.eslintrc.js b/vapeshop-ui/.eslintrc.js new file mode 100644 index 0000000..82bbdee --- /dev/null +++ b/vapeshop-ui/.eslintrc.js @@ -0,0 +1,199 @@ +// ESlint 妫鏌ラ厤缃 +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + sourceType: 'module' + }, + env: { + browser: true, + node: true, + es6: true, + }, + extends: ['plugin:vue/recommended', 'eslint:recommended'], + + // add your custom rules here + //it is base on https://github.com/vuejs/eslint-config-vue + rules: { + "vue/max-attributes-per-line": [2, { + "singleline": 10, + "multiline": { + "max": 1, + "allowFirstLine": false + } + }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", + "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", + 'accessor-pairs': 2, + 'arrow-spacing': [2, { + 'before': true, + 'after': true + }], + 'block-spacing': [2, 'always'], + 'brace-style': [2, '1tbs', { + 'allowSingleLine': true + }], + 'camelcase': [0, { + 'properties': 'always' + }], + 'comma-dangle': [2, 'never'], + 'comma-spacing': [2, { + 'before': false, + 'after': true + }], + 'comma-style': [2, 'last'], + 'constructor-super': 2, + 'curly': [2, 'multi-line'], + 'dot-location': [2, 'property'], + 'eol-last': 2, + 'eqeqeq': ["error", "always", {"null": "ignore"}], + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + 'handle-callback-err': [2, '^(err|error)$'], + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + 'jsx-quotes': [2, 'prefer-single'], + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, + 'no-array-constructor': 2, + 'no-caller': 2, + 'no-console': 'off', + 'no-class-assign': 2, + 'no-cond-assign': 2, + 'no-const-assign': 2, + 'no-control-regex': 0, + 'no-delete-var': 2, + 'no-dupe-args': 2, + 'no-dupe-class-members': 2, + 'no-dupe-keys': 2, + 'no-duplicate-case': 2, + 'no-empty-character-class': 2, + 'no-empty-pattern': 2, + 'no-eval': 2, + 'no-ex-assign': 2, + 'no-extend-native': 2, + 'no-extra-bind': 2, + 'no-extra-boolean-cast': 2, + 'no-extra-parens': [2, 'functions'], + 'no-fallthrough': 2, + 'no-floating-decimal': 2, + 'no-func-assign': 2, + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], + 'no-invalid-regexp': 2, + 'no-irregular-whitespace': 2, + 'no-iterator': 2, + 'no-label-var': 2, + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, + 'no-mixed-spaces-and-tabs': 2, + 'no-multi-spaces': 2, + 'no-multi-str': 2, + 'no-multiple-empty-lines': [2, { + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 2, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': [2, { + 'defaultAssignment': false + }], + 'no-unreachable': 2, + 'no-unsafe-finally': 2, + 'no-unused-vars': [2, { + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, + 'no-useless-computed-key': 2, + 'no-useless-constructor': 2, + 'no-useless-escape': 0, + 'no-whitespace-before-property': 2, + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + 'semi': [2, 'never'], + 'semi-spacing': [2, { + 'before': false, + 'after': true + }], + 'space-before-blocks': [2, 'always'], + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 2, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} diff --git a/vapeshop-ui/.gitignore b/vapeshop-ui/.gitignore new file mode 100644 index 0000000..78a752d --- /dev/null +++ b/vapeshop-ui/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/vapeshop-ui/README.md b/vapeshop-ui/README.md new file mode 100644 index 0000000..00c0ab8 --- /dev/null +++ b/vapeshop-ui/README.md @@ -0,0 +1,30 @@ +## 寮鍙 + +```bash +# 鍏嬮殕椤圭洰 +git clone https://gitee.com/y_project/RuoYi-Vue + +# 杩涘叆椤圭洰鐩綍 +cd ruoyi-ui + +# 瀹夎渚濊禆 +npm install + +# 寤鸿涓嶈鐩存帴浣跨敤 cnpm 瀹夎渚濊禆锛屼細鏈夊悇绉嶈寮傜殑 bug銆傚彲浠ラ氳繃濡備笅鎿嶄綔瑙e喅 npm 涓嬭浇閫熷害鎱㈢殑闂 +npm install --registry=https://registry.npmmirror.com + +# 鍚姩鏈嶅姟 +npm run dev +``` + +娴忚鍣ㄨ闂 http://localhost:80 + +## 鍙戝竷 + +```bash +# 鏋勫缓娴嬭瘯鐜 +npm run build:stage + +# 鏋勫缓鐢熶骇鐜 +npm run build:prod +``` \ No newline at end of file diff --git a/vapeshop-ui/babel.config.js b/vapeshop-ui/babel.config.js new file mode 100644 index 0000000..c8267b2 --- /dev/null +++ b/vapeshop-ui/babel.config.js @@ -0,0 +1,13 @@ +module.exports = { + presets: [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset' + ], + 'env': { + 'development': { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + 'plugins': ['dynamic-import-node'] + } + } +} \ No newline at end of file diff --git a/vapeshop-ui/package.json b/vapeshop-ui/package.json new file mode 100644 index 0000000..bef6d58 --- /dev/null +++ b/vapeshop-ui/package.json @@ -0,0 +1,90 @@ +{ + "name": "ruoyi", + "version": "3.8.3", + "description": "鑻ヤ緷绠$悊绯荤粺", + "author": "鑻ヤ緷", + "license": "MIT", + "scripts": { + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "lint": "eslint --ext .js,.vue src" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "src/**/*.{js,vue}": [ + "eslint --fix", + "git add" + ] + }, + "keywords": [ + "vue", + "admin", + "dashboard", + "element-ui", + "boilerplate", + "admin-template", + "management-system" + ], + "repository": { + "type": "git", + "url": "https://gitee.com/y_project/RuoYi-Vue.git" + }, + "dependencies": { + "@riophae/vue-treeselect": "0.4.0", + "axios": "0.24.0", + "clipboard": "2.0.8", + "core-js": "3.19.1", + "echarts": "4.9.0", + "element-ui": "2.15.8", + "file-saver": "2.0.5", + "fuse.js": "6.4.3", + "highlight.js": "9.18.5", + "js-beautify": "1.13.0", + "js-cookie": "3.0.1", + "jsencrypt": "3.0.0-rc.1", + "nprogress": "0.2.0", + "quill": "1.3.7", + "screenfull": "5.0.2", + "sortablejs": "1.10.2", + "vue": "2.6.12", + "vue-count-to": "1.0.13", + "vue-cropper": "0.5.5", + "vue-meta": "2.4.0", + "vue-router": "3.4.9", + "vuedraggable": "2.24.3", + "vuex": "3.6.0" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.6", + "@vue/cli-plugin-eslint": "4.4.6", + "@vue/cli-service": "4.4.6", + "babel-eslint": "10.1.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "4.1.0", + "compression-webpack-plugin": "5.0.2", + "connect": "3.6.6", + "eslint": "7.15.0", + "eslint-plugin-vue": "7.2.0", + "lint-staged": "10.5.3", + "runjs": "4.4.2", + "sass": "1.32.13", + "sass-loader": "10.1.1", + "script-ext-html-webpack-plugin": "2.1.5", + "svg-sprite-loader": "5.1.1", + "vue-template-compiler": "2.6.12" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ] +} diff --git a/vapeshop-ui/public/favicon.ico b/vapeshop-ui/public/favicon.ico new file mode 100644 index 0000000..e263760 Binary files /dev/null and b/vapeshop-ui/public/favicon.ico differ diff --git a/vapeshop-ui/public/html/ie.html b/vapeshop-ui/public/html/ie.html new file mode 100644 index 0000000..052ffcd --- /dev/null +++ b/vapeshop-ui/public/html/ie.html @@ -0,0 +1,46 @@ + + + + + + 璇峰崌绾ф偍鐨勬祻瑙堝櫒 + + + + + + +

璇峰崌绾ф偍鐨勬祻瑙堝櫒锛屼互渚挎垜浠洿濂界殑涓烘偍鎻愪緵鏈嶅姟锛

+

鎮ㄦ鍦ㄤ娇鐢 Internet Explorer 鐨勬棭鏈熺増鏈紙IE11浠ヤ笅鐗堟湰鎴栦娇鐢ㄨ鍐呮牳鐨勬祻瑙堝櫒锛夈傝繖鎰忓懗鐫鍦ㄥ崌绾ф祻瑙堝櫒鍓嶏紝鎮ㄥ皢鏃犳硶璁块棶姝ょ綉绔欍

+
+

璇锋敞鎰忥細寰蒋鍏徃瀵筗indows XP 鍙 Internet Explorer 鏃╂湡鐗堟湰鐨勬敮鎸佸凡缁忕粨鏉

+

鑷 2016 骞 1 鏈 12 鏃ヨ捣锛孧icrosoft 涓嶅啀涓 IE 11 浠ヤ笅鐗堟湰鎻愪緵鐩稿簲鏀寔鍜屾洿鏂般傛病鏈夊叧閿殑娴忚鍣ㄥ畨鍏ㄦ洿鏂帮紝鎮ㄧ殑鐢佃剳鍙兘鏄撳彈鏈夊鐥呮瘨銆侀棿璋嶈蒋浠跺拰鍏朵粬鎭舵剰杞欢鐨勬敾鍑伙紝瀹冧滑鍙互绐冨彇鎴栨崯瀹虫偍鐨勪笟鍔℃暟鎹拰淇℃伅銆傝鍙傞槄 寰蒋瀵 Internet Explorer 鏃╂湡鐗堟湰鐨勬敮鎸佸皢浜 2016 骞 1 鏈 12 鏃ョ粨鏉熺殑璇存槑

+
+

鎮ㄥ彲浠ラ夋嫨鏇村厛杩涚殑娴忚鍣

+

鎺ㄨ崘浣跨敤浠ヤ笅娴忚鍣ㄧ殑鏈鏂扮増鏈傚鏋滄偍鐨勭數鑴戝凡鏈変互涓嬫祻瑙堝櫒鐨勬渶鏂扮増鏈垯鐩存帴浣跨敤璇ユ祻瑙堝櫒璁块棶鍗冲彲銆

+ +
+ + \ No newline at end of file diff --git a/vapeshop-ui/public/index.html b/vapeshop-ui/public/index.html new file mode 100644 index 0000000..925455c --- /dev/null +++ b/vapeshop-ui/public/index.html @@ -0,0 +1,208 @@ + + + + + + + + + <%= webpackConfig.name %> + + + + +
+
+
+
+
+
姝e湪鍔犺浇绯荤粺璧勬簮锛岃鑰愬績绛夊緟
+
+
+ + diff --git a/vapeshop-ui/public/robots.txt b/vapeshop-ui/public/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/vapeshop-ui/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/vapeshop-ui/src/App.vue b/vapeshop-ui/src/App.vue new file mode 100644 index 0000000..391d951 --- /dev/null +++ b/vapeshop-ui/src/App.vue @@ -0,0 +1,19 @@ + + + diff --git a/vapeshop-ui/src/api/login.js b/vapeshop-ui/src/api/login.js new file mode 100644 index 0000000..649f59c --- /dev/null +++ b/vapeshop-ui/src/api/login.js @@ -0,0 +1,59 @@ +import request from '@/utils/request' + +// 鐧诲綍鏂规硶 +export function login(username, password, code, uuid) { + const data = { + username, + password, + code, + uuid + } + return request({ + url: '/login', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 娉ㄥ唽鏂规硶 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 鑾峰彇鐢ㄦ埛璇︾粏淇℃伅 +export function getInfo() { + return request({ + url: '/getInfo', + method: 'get' + }) +} + +// 閫鍑烘柟娉 +export function logout() { + return request({ + url: '/logout', + method: 'post' + }) +} + +// 鑾峰彇楠岃瘉鐮 +export function getCodeImg() { + return request({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/menu.js b/vapeshop-ui/src/api/menu.js new file mode 100644 index 0000000..faef101 --- /dev/null +++ b/vapeshop-ui/src/api/menu.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 鑾峰彇璺敱 +export const getRouters = () => { + return request({ + url: '/getRouters', + method: 'get' + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/monitor/cache.js b/vapeshop-ui/src/api/monitor/cache.js new file mode 100644 index 0000000..72c5f6a --- /dev/null +++ b/vapeshop-ui/src/api/monitor/cache.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 鏌ヨ缂撳瓨璇︾粏 +export function getCache() { + return request({ + url: '/monitor/cache', + method: 'get' + }) +} + +// 鏌ヨ缂撳瓨鍚嶇О鍒楄〃 +export function listCacheName() { + return request({ + url: '/monitor/cache/getNames', + method: 'get' + }) +} + +// 鏌ヨ缂撳瓨閿悕鍒楄〃 +export function listCacheKey(cacheName) { + return request({ + url: '/monitor/cache/getKeys/' + cacheName, + method: 'get' + }) +} + +// 鏌ヨ缂撳瓨鍐呭 +export function getCacheValue(cacheName, cacheKey) { + return request({ + url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, + method: 'get' + }) +} + +// 娓呯悊鎸囧畾鍚嶇О缂撳瓨 +export function clearCacheName(cacheName) { + return request({ + url: '/monitor/cache/clearCacheName/' + cacheName, + method: 'delete' + }) +} + +// 娓呯悊鎸囧畾閿悕缂撳瓨 +export function clearCacheKey(cacheKey) { + return request({ + url: '/monitor/cache/clearCacheKey/' + cacheKey, + method: 'delete' + }) +} + +// 娓呯悊鍏ㄩ儴缂撳瓨 +export function clearCacheAll() { + return request({ + url: '/monitor/cache/clearCacheAll', + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/monitor/job.js b/vapeshop-ui/src/api/monitor/job.js new file mode 100644 index 0000000..3815569 --- /dev/null +++ b/vapeshop-ui/src/api/monitor/job.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 鏌ヨ瀹氭椂浠诲姟璋冨害鍒楄〃 +export function listJob(query) { + return request({ + url: '/monitor/job/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ瀹氭椂浠诲姟璋冨害璇︾粏 +export function getJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'get' + }) +} + +// 鏂板瀹氭椂浠诲姟璋冨害 +export function addJob(data) { + return request({ + url: '/monitor/job', + method: 'post', + data: data + }) +} + +// 淇敼瀹氭椂浠诲姟璋冨害 +export function updateJob(data) { + return request({ + url: '/monitor/job', + method: 'put', + data: data + }) +} + +// 鍒犻櫎瀹氭椂浠诲姟璋冨害 +export function delJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'delete' + }) +} + +// 浠诲姟鐘舵佷慨鏀 +export function changeJobStatus(jobId, status) { + const data = { + jobId, + status + } + return request({ + url: '/monitor/job/changeStatus', + method: 'put', + data: data + }) +} + + +// 瀹氭椂浠诲姟绔嬪嵆鎵ц涓娆 +export function runJob(jobId, jobGroup) { + const data = { + jobId, + jobGroup + } + return request({ + url: '/monitor/job/run', + method: 'put', + data: data + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/monitor/jobLog.js b/vapeshop-ui/src/api/monitor/jobLog.js new file mode 100644 index 0000000..6e0be61 --- /dev/null +++ b/vapeshop-ui/src/api/monitor/jobLog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 鏌ヨ璋冨害鏃ュ織鍒楄〃 +export function listJobLog(query) { + return request({ + url: '/monitor/jobLog/list', + method: 'get', + params: query + }) +} + +// 鍒犻櫎璋冨害鏃ュ織 +export function delJobLog(jobLogId) { + return request({ + url: '/monitor/jobLog/' + jobLogId, + method: 'delete' + }) +} + +// 娓呯┖璋冨害鏃ュ織 +export function cleanJobLog() { + return request({ + url: '/monitor/jobLog/clean', + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/monitor/logininfor.js b/vapeshop-ui/src/api/monitor/logininfor.js new file mode 100644 index 0000000..26a46eb --- /dev/null +++ b/vapeshop-ui/src/api/monitor/logininfor.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 鏌ヨ鐧诲綍鏃ュ織鍒楄〃 +export function list(query) { + return request({ + url: '/monitor/logininfor/list', + method: 'get', + params: query + }) +} + +// 鍒犻櫎鐧诲綍鏃ュ織 +export function delLogininfor(infoId) { + return request({ + url: '/monitor/logininfor/' + infoId, + method: 'delete' + }) +} + +// 娓呯┖鐧诲綍鏃ュ織 +export function cleanLogininfor() { + return request({ + url: '/monitor/logininfor/clean', + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/monitor/online.js b/vapeshop-ui/src/api/monitor/online.js new file mode 100644 index 0000000..bd22137 --- /dev/null +++ b/vapeshop-ui/src/api/monitor/online.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 鏌ヨ鍦ㄧ嚎鐢ㄦ埛鍒楄〃 +export function list(query) { + return request({ + url: '/monitor/online/list', + method: 'get', + params: query + }) +} + +// 寮洪鐢ㄦ埛 +export function forceLogout(tokenId) { + return request({ + url: '/monitor/online/' + tokenId, + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/monitor/operlog.js b/vapeshop-ui/src/api/monitor/operlog.js new file mode 100644 index 0000000..a04bca8 --- /dev/null +++ b/vapeshop-ui/src/api/monitor/operlog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 鏌ヨ鎿嶄綔鏃ュ織鍒楄〃 +export function list(query) { + return request({ + url: '/monitor/operlog/list', + method: 'get', + params: query + }) +} + +// 鍒犻櫎鎿嶄綔鏃ュ織 +export function delOperlog(operId) { + return request({ + url: '/monitor/operlog/' + operId, + method: 'delete' + }) +} + +// 娓呯┖鎿嶄綔鏃ュ織 +export function cleanOperlog() { + return request({ + url: '/monitor/operlog/clean', + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/monitor/server.js b/vapeshop-ui/src/api/monitor/server.js new file mode 100644 index 0000000..e1f9ca2 --- /dev/null +++ b/vapeshop-ui/src/api/monitor/server.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 鑾峰彇鏈嶅姟淇℃伅 +export function getServer() { + return request({ + url: '/monitor/server', + method: 'get' + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/system/config.js b/vapeshop-ui/src/api/system/config.js new file mode 100644 index 0000000..a404d82 --- /dev/null +++ b/vapeshop-ui/src/api/system/config.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 鏌ヨ鍙傛暟鍒楄〃 +export function listConfig(query) { + return request({ + url: '/system/config/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ鍙傛暟璇︾粏 +export function getConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'get' + }) +} + +// 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊 +export function getConfigKey(configKey) { + return request({ + url: '/system/config/configKey/' + configKey, + method: 'get' + }) +} + +// 鏂板鍙傛暟閰嶇疆 +export function addConfig(data) { + return request({ + url: '/system/config', + method: 'post', + data: data + }) +} + +// 淇敼鍙傛暟閰嶇疆 +export function updateConfig(data) { + return request({ + url: '/system/config', + method: 'put', + data: data + }) +} + +// 鍒犻櫎鍙傛暟閰嶇疆 +export function delConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'delete' + }) +} + +// 鍒锋柊鍙傛暟缂撳瓨 +export function refreshCache() { + return request({ + url: '/system/config/refreshCache', + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/system/dept.js b/vapeshop-ui/src/api/system/dept.js new file mode 100644 index 0000000..2804676 --- /dev/null +++ b/vapeshop-ui/src/api/system/dept.js @@ -0,0 +1,68 @@ +import request from '@/utils/request' + +// 鏌ヨ閮ㄩ棬鍒楄〃 +export function listDept(query) { + return request({ + url: '/system/dept/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級 +export function listDeptExcludeChild(deptId) { + return request({ + url: '/system/dept/list/exclude/' + deptId, + method: 'get' + }) +} + +// 鏌ヨ閮ㄩ棬璇︾粏 +export function getDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'get' + }) +} + +// 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋 +export function treeselect() { + return request({ + url: '/system/dept/treeselect', + method: 'get' + }) +} + +// 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戠粨鏋 +export function roleDeptTreeselect(roleId) { + return request({ + url: '/system/dept/roleDeptTreeselect/' + roleId, + method: 'get' + }) +} + +// 鏂板閮ㄩ棬 +export function addDept(data) { + return request({ + url: '/system/dept', + method: 'post', + data: data + }) +} + +// 淇敼閮ㄩ棬 +export function updateDept(data) { + return request({ + url: '/system/dept', + method: 'put', + data: data + }) +} + +// 鍒犻櫎閮ㄩ棬 +export function delDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/system/dict/data.js b/vapeshop-ui/src/api/system/dict/data.js new file mode 100644 index 0000000..6c9eb79 --- /dev/null +++ b/vapeshop-ui/src/api/system/dict/data.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 鏌ヨ瀛楀吀鏁版嵁鍒楄〃 +export function listData(query) { + return request({ + url: '/system/dict/data/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ瀛楀吀鏁版嵁璇︾粏 +export function getData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'get' + }) +} + +// 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅 +export function getDicts(dictType) { + return request({ + url: '/system/dict/data/type/' + dictType, + method: 'get' + }) +} + +// 鏂板瀛楀吀鏁版嵁 +export function addData(data) { + return request({ + url: '/system/dict/data', + method: 'post', + data: data + }) +} + +// 淇敼瀛楀吀鏁版嵁 +export function updateData(data) { + return request({ + url: '/system/dict/data', + method: 'put', + data: data + }) +} + +// 鍒犻櫎瀛楀吀鏁版嵁 +export function delData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/system/dict/type.js b/vapeshop-ui/src/api/system/dict/type.js new file mode 100644 index 0000000..a7a6e01 --- /dev/null +++ b/vapeshop-ui/src/api/system/dict/type.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 +export function listType(query) { + return request({ + url: '/system/dict/type/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ瀛楀吀绫诲瀷璇︾粏 +export function getType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'get' + }) +} + +// 鏂板瀛楀吀绫诲瀷 +export function addType(data) { + return request({ + url: '/system/dict/type', + method: 'post', + data: data + }) +} + +// 淇敼瀛楀吀绫诲瀷 +export function updateType(data) { + return request({ + url: '/system/dict/type', + method: 'put', + data: data + }) +} + +// 鍒犻櫎瀛楀吀绫诲瀷 +export function delType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'delete' + }) +} + +// 鍒锋柊瀛楀吀缂撳瓨 +export function refreshCache() { + return request({ + url: '/system/dict/type/refreshCache', + method: 'delete' + }) +} + +// 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛 +export function optionselect() { + return request({ + url: '/system/dict/type/optionselect', + method: 'get' + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/system/menu.js b/vapeshop-ui/src/api/system/menu.js new file mode 100644 index 0000000..f6415c6 --- /dev/null +++ b/vapeshop-ui/src/api/system/menu.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 鏌ヨ鑿滃崟鍒楄〃 +export function listMenu(query) { + return request({ + url: '/system/menu/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ鑿滃崟璇︾粏 +export function getMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'get' + }) +} + +// 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋 +export function treeselect() { + return request({ + url: '/system/menu/treeselect', + method: 'get' + }) +} + +// 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋 +export function roleMenuTreeselect(roleId) { + return request({ + url: '/system/menu/roleMenuTreeselect/' + roleId, + method: 'get' + }) +} + +// 鏂板鑿滃崟 +export function addMenu(data) { + return request({ + url: '/system/menu', + method: 'post', + data: data + }) +} + +// 淇敼鑿滃崟 +export function updateMenu(data) { + return request({ + url: '/system/menu', + method: 'put', + data: data + }) +} + +// 鍒犻櫎鑿滃崟 +export function delMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/system/notice.js b/vapeshop-ui/src/api/system/notice.js new file mode 100644 index 0000000..c274ea5 --- /dev/null +++ b/vapeshop-ui/src/api/system/notice.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 鏌ヨ鍏憡鍒楄〃 +export function listNotice(query) { + return request({ + url: '/system/notice/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ鍏憡璇︾粏 +export function getNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'get' + }) +} + +// 鏂板鍏憡 +export function addNotice(data) { + return request({ + url: '/system/notice', + method: 'post', + data: data + }) +} + +// 淇敼鍏憡 +export function updateNotice(data) { + return request({ + url: '/system/notice', + method: 'put', + data: data + }) +} + +// 鍒犻櫎鍏憡 +export function delNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/system/post.js b/vapeshop-ui/src/api/system/post.js new file mode 100644 index 0000000..1a8e9ca --- /dev/null +++ b/vapeshop-ui/src/api/system/post.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 鏌ヨ宀椾綅鍒楄〃 +export function listPost(query) { + return request({ + url: '/system/post/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ宀椾綅璇︾粏 +export function getPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'get' + }) +} + +// 鏂板宀椾綅 +export function addPost(data) { + return request({ + url: '/system/post', + method: 'post', + data: data + }) +} + +// 淇敼宀椾綅 +export function updatePost(data) { + return request({ + url: '/system/post', + method: 'put', + data: data + }) +} + +// 鍒犻櫎宀椾綅 +export function delPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'delete' + }) +} diff --git a/vapeshop-ui/src/api/system/role.js b/vapeshop-ui/src/api/system/role.js new file mode 100644 index 0000000..4b455e1 --- /dev/null +++ b/vapeshop-ui/src/api/system/role.js @@ -0,0 +1,111 @@ +import request from '@/utils/request' + +// 鏌ヨ瑙掕壊鍒楄〃 +export function listRole(query) { + return request({ + url: '/system/role/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ瑙掕壊璇︾粏 +export function getRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'get' + }) +} + +// 鏂板瑙掕壊 +export function addRole(data) { + return request({ + url: '/system/role', + method: 'post', + data: data + }) +} + +// 淇敼瑙掕壊 +export function updateRole(data) { + return request({ + url: '/system/role', + method: 'put', + data: data + }) +} + +// 瑙掕壊鏁版嵁鏉冮檺 +export function dataScope(data) { + return request({ + url: '/system/role/dataScope', + method: 'put', + data: data + }) +} + +// 瑙掕壊鐘舵佷慨鏀 +export function changeRoleStatus(roleId, status) { + const data = { + roleId, + status + } + return request({ + url: '/system/role/changeStatus', + method: 'put', + data: data + }) +} + +// 鍒犻櫎瑙掕壊 +export function delRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'delete' + }) +} + +// 鏌ヨ瑙掕壊宸叉巿鏉冪敤鎴峰垪琛 +export function allocatedUserList(query) { + return request({ + url: '/system/role/authUser/allocatedList', + method: 'get', + params: query + }) +} + +// 鏌ヨ瑙掕壊鏈巿鏉冪敤鎴峰垪琛 +export function unallocatedUserList(query) { + return request({ + url: '/system/role/authUser/unallocatedList', + method: 'get', + params: query + }) +} + +// 鍙栨秷鐢ㄦ埛鎺堟潈瑙掕壊 +export function authUserCancel(data) { + return request({ + url: '/system/role/authUser/cancel', + method: 'put', + data: data + }) +} + +// 鎵归噺鍙栨秷鐢ㄦ埛鎺堟潈瑙掕壊 +export function authUserCancelAll(data) { + return request({ + url: '/system/role/authUser/cancelAll', + method: 'put', + params: data + }) +} + +// 鎺堟潈鐢ㄦ埛閫夋嫨 +export function authUserSelectAll(data) { + return request({ + url: '/system/role/authUser/selectAll', + method: 'put', + params: data + }) +} \ No newline at end of file diff --git a/vapeshop-ui/src/api/system/user.js b/vapeshop-ui/src/api/system/user.js new file mode 100644 index 0000000..4fd752b --- /dev/null +++ b/vapeshop-ui/src/api/system/user.js @@ -0,0 +1,127 @@ +import request from '@/utils/request' +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 鏌ヨ鐢ㄦ埛鍒楄〃 +export function listUser(query) { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ鐢ㄦ埛璇︾粏 +export function getUser(userId) { + return request({ + url: '/system/user/' + parseStrEmpty(userId), + method: 'get' + }) +} + +// 鏂板鐢ㄦ埛 +export function addUser(data) { + return request({ + url: '/system/user', + method: 'post', + data: data + }) +} + +// 淇敼鐢ㄦ埛 +export function updateUser(data) { + return request({ + url: '/system/user', + method: 'put', + data: data + }) +} + +// 鍒犻櫎鐢ㄦ埛 +export function delUser(userId) { + return request({ + url: '/system/user/' + userId, + method: 'delete' + }) +} + +// 鐢ㄦ埛瀵嗙爜閲嶇疆 +export function resetUserPwd(userId, password) { + const data = { + userId, + password + } + return request({ + url: '/system/user/resetPwd', + method: 'put', + data: data + }) +} + +// 鐢ㄦ埛鐘舵佷慨鏀 +export function changeUserStatus(userId, status) { + const data = { + userId, + status + } + return request({ + url: '/system/user/changeStatus', + method: 'put', + data: data + }) +} + +// 鏌ヨ鐢ㄦ埛涓汉淇℃伅 +export function getUserProfile() { + return request({ + url: '/system/user/profile', + method: 'get' + }) +} + +// 淇敼鐢ㄦ埛涓汉淇℃伅 +export function updateUserProfile(data) { + return request({ + url: '/system/user/profile', + method: 'put', + data: data + }) +} + +// 鐢ㄦ埛瀵嗙爜閲嶇疆 +export function updateUserPwd(oldPassword, newPassword) { + const data = { + oldPassword, + newPassword + } + return request({ + url: '/system/user/profile/updatePwd', + method: 'put', + params: data + }) +} + +// 鐢ㄦ埛澶村儚涓婁紶 +export function uploadAvatar(data) { + return request({ + url: '/system/user/profile/avatar', + method: 'post', + data: data + }) +} + +// 鏌ヨ鎺堟潈瑙掕壊 +export function getAuthRole(userId) { + return request({ + url: '/system/user/authRole/' + userId, + method: 'get' + }) +} + +// 淇濆瓨鎺堟潈瑙掕壊 +export function updateAuthRole(data) { + return request({ + url: '/system/user/authRole', + method: 'put', + params: data + }) +} diff --git a/vapeshop-ui/src/api/tool/gen.js b/vapeshop-ui/src/api/tool/gen.js new file mode 100644 index 0000000..4506927 --- /dev/null +++ b/vapeshop-ui/src/api/tool/gen.js @@ -0,0 +1,76 @@ +import request from '@/utils/request' + +// 鏌ヨ鐢熸垚琛ㄦ暟鎹 +export function listTable(query) { + return request({ + url: '/tool/gen/list', + method: 'get', + params: query + }) +} +// 鏌ヨdb鏁版嵁搴撳垪琛 +export function listDbTable(query) { + return request({ + url: '/tool/gen/db/list', + method: 'get', + params: query + }) +} + +// 鏌ヨ琛ㄨ缁嗕俊鎭 +export function getGenTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'get' + }) +} + +// 淇敼浠g爜鐢熸垚淇℃伅 +export function updateGenTable(data) { + return request({ + url: '/tool/gen', + method: 'put', + data: data + }) +} + +// 瀵煎叆琛 +export function importTable(data) { + return request({ + url: '/tool/gen/importTable', + method: 'post', + params: data + }) +} + +// 棰勮鐢熸垚浠g爜 +export function previewTable(tableId) { + return request({ + url: '/tool/gen/preview/' + tableId, + method: 'get' + }) +} + +// 鍒犻櫎琛ㄦ暟鎹 +export function delTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'delete' + }) +} + +// 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛 +export function genCode(tableName) { + return request({ + url: '/tool/gen/genCode/' + tableName, + method: 'get' + }) +} + +// 鍚屾鏁版嵁搴 +export function synchDb(tableName) { + return request({ + url: '/tool/gen/synchDb/' + tableName, + method: 'get' + }) +} diff --git a/vapeshop-ui/src/assets/401_images/401.gif b/vapeshop-ui/src/assets/401_images/401.gif new file mode 100644 index 0000000..cd6e0d9 Binary files /dev/null and b/vapeshop-ui/src/assets/401_images/401.gif differ diff --git a/vapeshop-ui/src/assets/404_images/404.png b/vapeshop-ui/src/assets/404_images/404.png new file mode 100644 index 0000000..3d8e230 Binary files /dev/null and b/vapeshop-ui/src/assets/404_images/404.png differ diff --git a/vapeshop-ui/src/assets/404_images/404_cloud.png b/vapeshop-ui/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000..c6281d0 Binary files /dev/null and b/vapeshop-ui/src/assets/404_images/404_cloud.png differ diff --git a/vapeshop-ui/src/assets/icons/index.js b/vapeshop-ui/src/assets/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/vapeshop-ui/src/assets/icons/svg/404.svg b/vapeshop-ui/src/assets/icons/svg/404.svg new file mode 100644 index 0000000..6df5019 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/bug.svg b/vapeshop-ui/src/assets/icons/svg/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/build.svg b/vapeshop-ui/src/assets/icons/svg/build.svg new file mode 100644 index 0000000..97c4688 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/build.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/button.svg b/vapeshop-ui/src/assets/icons/svg/button.svg new file mode 100644 index 0000000..904fddc --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/cascader.svg b/vapeshop-ui/src/assets/icons/svg/cascader.svg new file mode 100644 index 0000000..e256024 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/chart.svg b/vapeshop-ui/src/assets/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/checkbox.svg b/vapeshop-ui/src/assets/icons/svg/checkbox.svg new file mode 100644 index 0000000..013fd3a --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/checkbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/clipboard.svg b/vapeshop-ui/src/assets/icons/svg/clipboard.svg new file mode 100644 index 0000000..90923ff --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/code.svg b/vapeshop-ui/src/assets/icons/svg/code.svg new file mode 100644 index 0000000..ed4d23c --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/color.svg b/vapeshop-ui/src/assets/icons/svg/color.svg new file mode 100644 index 0000000..44a81aa --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/component.svg b/vapeshop-ui/src/assets/icons/svg/component.svg new file mode 100644 index 0000000..29c3458 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/dashboard.svg b/vapeshop-ui/src/assets/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/date-range.svg b/vapeshop-ui/src/assets/icons/svg/date-range.svg new file mode 100644 index 0000000..fda571e --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/date-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/date.svg b/vapeshop-ui/src/assets/icons/svg/date.svg new file mode 100644 index 0000000..52dc73e --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/dict.svg b/vapeshop-ui/src/assets/icons/svg/dict.svg new file mode 100644 index 0000000..4849377 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/dict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/documentation.svg b/vapeshop-ui/src/assets/icons/svg/documentation.svg new file mode 100644 index 0000000..7043122 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/download.svg b/vapeshop-ui/src/assets/icons/svg/download.svg new file mode 100644 index 0000000..c896951 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/drag.svg b/vapeshop-ui/src/assets/icons/svg/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/druid.svg b/vapeshop-ui/src/assets/icons/svg/druid.svg new file mode 100644 index 0000000..a2b4b4e --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/druid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/edit.svg b/vapeshop-ui/src/assets/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/education.svg b/vapeshop-ui/src/assets/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/email.svg b/vapeshop-ui/src/assets/icons/svg/email.svg new file mode 100644 index 0000000..74d25e2 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/example.svg b/vapeshop-ui/src/assets/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/excel.svg b/vapeshop-ui/src/assets/icons/svg/excel.svg new file mode 100644 index 0000000..74d97b8 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/exit-fullscreen.svg b/vapeshop-ui/src/assets/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/eye-open.svg b/vapeshop-ui/src/assets/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/eye.svg b/vapeshop-ui/src/assets/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/form.svg b/vapeshop-ui/src/assets/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/fullscreen.svg b/vapeshop-ui/src/assets/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/github.svg b/vapeshop-ui/src/assets/icons/svg/github.svg new file mode 100644 index 0000000..db0a0d4 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/guide.svg b/vapeshop-ui/src/assets/icons/svg/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/icon.svg b/vapeshop-ui/src/assets/icons/svg/icon.svg new file mode 100644 index 0000000..82be8ee --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/input.svg b/vapeshop-ui/src/assets/icons/svg/input.svg new file mode 100644 index 0000000..ab91381 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/input.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/international.svg b/vapeshop-ui/src/assets/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/job.svg b/vapeshop-ui/src/assets/icons/svg/job.svg new file mode 100644 index 0000000..2a93a25 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/job.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/language.svg b/vapeshop-ui/src/assets/icons/svg/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/link.svg b/vapeshop-ui/src/assets/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/list.svg b/vapeshop-ui/src/assets/icons/svg/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/lock.svg b/vapeshop-ui/src/assets/icons/svg/lock.svg new file mode 100644 index 0000000..74fee54 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/log.svg b/vapeshop-ui/src/assets/icons/svg/log.svg new file mode 100644 index 0000000..d879d33 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/logininfor.svg b/vapeshop-ui/src/assets/icons/svg/logininfor.svg new file mode 100644 index 0000000..267f844 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/logininfor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/message.svg b/vapeshop-ui/src/assets/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/money.svg b/vapeshop-ui/src/assets/icons/svg/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/monitor.svg b/vapeshop-ui/src/assets/icons/svg/monitor.svg new file mode 100644 index 0000000..bc308cb --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/monitor.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/nested.svg b/vapeshop-ui/src/assets/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/number.svg b/vapeshop-ui/src/assets/icons/svg/number.svg new file mode 100644 index 0000000..ad5ce9a --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/number.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/online.svg b/vapeshop-ui/src/assets/icons/svg/online.svg new file mode 100644 index 0000000..330a202 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/online.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/password.svg b/vapeshop-ui/src/assets/icons/svg/password.svg new file mode 100644 index 0000000..6c64def --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/pdf.svg b/vapeshop-ui/src/assets/icons/svg/pdf.svg new file mode 100644 index 0000000..957aa0c --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/people.svg b/vapeshop-ui/src/assets/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/peoples.svg b/vapeshop-ui/src/assets/icons/svg/peoples.svg new file mode 100644 index 0000000..aab852e --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/phone.svg b/vapeshop-ui/src/assets/icons/svg/phone.svg new file mode 100644 index 0000000..ab8e8c4 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/post.svg b/vapeshop-ui/src/assets/icons/svg/post.svg new file mode 100644 index 0000000..2922c61 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/post.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/qq.svg b/vapeshop-ui/src/assets/icons/svg/qq.svg new file mode 100644 index 0000000..ee13d4e --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/question.svg b/vapeshop-ui/src/assets/icons/svg/question.svg new file mode 100644 index 0000000..cf75bd4 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/radio.svg b/vapeshop-ui/src/assets/icons/svg/radio.svg new file mode 100644 index 0000000..0cde345 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/radio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/rate.svg b/vapeshop-ui/src/assets/icons/svg/rate.svg new file mode 100644 index 0000000..aa3b14d --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/rate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/redis-list.svg b/vapeshop-ui/src/assets/icons/svg/redis-list.svg new file mode 100644 index 0000000..98a15b2 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/redis-list.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/redis.svg b/vapeshop-ui/src/assets/icons/svg/redis.svg new file mode 100644 index 0000000..2f1d62d --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/row.svg b/vapeshop-ui/src/assets/icons/svg/row.svg new file mode 100644 index 0000000..0780992 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/search.svg b/vapeshop-ui/src/assets/icons/svg/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/select.svg b/vapeshop-ui/src/assets/icons/svg/select.svg new file mode 100644 index 0000000..d628382 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/select.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/server.svg b/vapeshop-ui/src/assets/icons/svg/server.svg new file mode 100644 index 0000000..ca37b00 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/shopping.svg b/vapeshop-ui/src/assets/icons/svg/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/size.svg b/vapeshop-ui/src/assets/icons/svg/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/skill.svg b/vapeshop-ui/src/assets/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/slider.svg b/vapeshop-ui/src/assets/icons/svg/slider.svg new file mode 100644 index 0000000..fbe4f39 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/slider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/star.svg b/vapeshop-ui/src/assets/icons/svg/star.svg new file mode 100644 index 0000000..6cf86e6 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/swagger.svg b/vapeshop-ui/src/assets/icons/svg/swagger.svg new file mode 100644 index 0000000..05d4e7b --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/swagger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/switch.svg b/vapeshop-ui/src/assets/icons/svg/switch.svg new file mode 100644 index 0000000..0ba61e3 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/switch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/system.svg b/vapeshop-ui/src/assets/icons/svg/system.svg new file mode 100644 index 0000000..dba28cf --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/system.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/tab.svg b/vapeshop-ui/src/assets/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/table.svg b/vapeshop-ui/src/assets/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/textarea.svg b/vapeshop-ui/src/assets/icons/svg/textarea.svg new file mode 100644 index 0000000..2709f29 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/textarea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/theme.svg b/vapeshop-ui/src/assets/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/time-range.svg b/vapeshop-ui/src/assets/icons/svg/time-range.svg new file mode 100644 index 0000000..13c1202 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/time-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/time.svg b/vapeshop-ui/src/assets/icons/svg/time.svg new file mode 100644 index 0000000..b376e32 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/time.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/tool.svg b/vapeshop-ui/src/assets/icons/svg/tool.svg new file mode 100644 index 0000000..c813067 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/tool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/tree-table.svg b/vapeshop-ui/src/assets/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/tree.svg b/vapeshop-ui/src/assets/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/upload.svg b/vapeshop-ui/src/assets/icons/svg/upload.svg new file mode 100644 index 0000000..bae49c0 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/user.svg b/vapeshop-ui/src/assets/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/validCode.svg b/vapeshop-ui/src/assets/icons/svg/validCode.svg new file mode 100644 index 0000000..cfb1021 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/validCode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/wechat.svg b/vapeshop-ui/src/assets/icons/svg/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svg/zip.svg b/vapeshop-ui/src/assets/icons/svg/zip.svg new file mode 100644 index 0000000..f806fc4 --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/icons/svgo.yml b/vapeshop-ui/src/assets/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/vapeshop-ui/src/assets/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/vapeshop-ui/src/assets/images/dark.svg b/vapeshop-ui/src/assets/images/dark.svg new file mode 100644 index 0000000..f646bd7 --- /dev/null +++ b/vapeshop-ui/src/assets/images/dark.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/images/light.svg b/vapeshop-ui/src/assets/images/light.svg new file mode 100644 index 0000000..ab7cc08 --- /dev/null +++ b/vapeshop-ui/src/assets/images/light.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vapeshop-ui/src/assets/images/login-background.jpg b/vapeshop-ui/src/assets/images/login-background.jpg new file mode 100644 index 0000000..8a89eb8 Binary files /dev/null and b/vapeshop-ui/src/assets/images/login-background.jpg differ diff --git a/vapeshop-ui/src/assets/images/profile.jpg b/vapeshop-ui/src/assets/images/profile.jpg new file mode 100644 index 0000000..b3a940b Binary files /dev/null and b/vapeshop-ui/src/assets/images/profile.jpg differ diff --git a/vapeshop-ui/src/assets/logo/logo.png b/vapeshop-ui/src/assets/logo/logo.png new file mode 100644 index 0000000..e263760 Binary files /dev/null and b/vapeshop-ui/src/assets/logo/logo.png differ diff --git a/vapeshop-ui/src/assets/styles/btn.scss b/vapeshop-ui/src/assets/styles/btn.scss new file mode 100644 index 0000000..e6ba1a8 --- /dev/null +++ b/vapeshop-ui/src/assets/styles/btn.scss @@ -0,0 +1,99 @@ +@import './variables.scss'; + +@mixin colorBtn($color) { + background: $color; + + &:hover { + color: $color; + + &:before, + &:after { + background: $color; + } + } +} + +.blue-btn { + @include colorBtn($blue) +} + +.light-blue-btn { + @include colorBtn($light-blue) +} + +.red-btn { + @include colorBtn($red) +} + +.pink-btn { + @include colorBtn($pink) +} + +.green-btn { + @include colorBtn($green) +} + +.tiffany-btn { + @include colorBtn($tiffany) +} + +.yellow-btn { + @include colorBtn($yellow) +} + +.pan-btn { + font-size: 14px; + color: #fff; + padding: 14px 36px; + border-radius: 8px; + border: none; + outline: none; + transition: 600ms ease all; + position: relative; + display: inline-block; + + &:hover { + background: #fff; + + &:before, + &:after { + width: 100%; + transition: 600ms ease all; + } + } + + &:before, + &:after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 2px; + width: 0; + transition: 400ms ease all; + } + + &::after { + right: inherit; + top: inherit; + left: 0; + bottom: 0; + } +} + +.custom-button { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + color: #fff; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: 0; + margin: 0; + padding: 10px 15px; + font-size: 14px; + border-radius: 4px; +} diff --git a/vapeshop-ui/src/assets/styles/element-ui.scss b/vapeshop-ui/src/assets/styles/element-ui.scss new file mode 100644 index 0000000..363092a --- /dev/null +++ b/vapeshop-ui/src/assets/styles/element-ui.scss @@ -0,0 +1,92 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + +.cell { + .el-tag { + margin-right: 0px; + } +} + +.small-padding { + .cell { + padding-left: 5px; + padding-right: 5px; + } +} + +.fixed-width { + .el-button--mini { + padding: 7px 10px; + width: 60px; + } +} + +.status-col { + .cell { + padding: 0 10px; + text-align: center; + + .el-tag { + margin-right: 0px; + } + } +} + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// fix date-picker ui bug in filter-item +.el-range-editor.el-input__inner { + display: inline-flex !important; +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} + +.el-menu--collapse + > div + > .el-submenu + > .el-submenu__title + .el-submenu__icon-arrow { + display: none; +} \ No newline at end of file diff --git a/vapeshop-ui/src/assets/styles/element-variables.scss b/vapeshop-ui/src/assets/styles/element-variables.scss new file mode 100644 index 0000000..1615ff2 --- /dev/null +++ b/vapeshop-ui/src/assets/styles/element-variables.scss @@ -0,0 +1,31 @@ +/** +* I think element-ui's default theme color is too light for long-term use. +* So I modified the default color and you can modify it to your liking. +**/ + +/* theme color */ +$--color-primary: #1890ff; +$--color-success: #13ce66; +$--color-warning: #ffba00; +$--color-danger: #ff4949; +// $--color-info: #1E1E1E; + +$--button-font-weight: 400; + +// $--color-text-regular: #1f2d3d; + +$--border-color-light: #dfe4ed; +$--border-color-lighter: #e6ebf5; + +$--table-border: 1px solid #dfe6ec; + +/* icon font path, required */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + theme: $--color-primary; +} diff --git a/vapeshop-ui/src/assets/styles/index.scss b/vapeshop-ui/src/assets/styles/index.scss new file mode 100644 index 0000000..96095ef --- /dev/null +++ b/vapeshop-ui/src/assets/styles/index.scss @@ -0,0 +1,191 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; +@import './btn.scss'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0px !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } + } +} + +//main-container鍏ㄥ眬鏍峰紡 +.app-container { + padding: 20px; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.pagination-container { + margin-top: 30px; +} + +.text-center { + text-align: center +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } +} + +.filter-container { + padding-bottom: 10px; + + .filter-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + } +} + +//refine vue-multiselect plugin +.multiselect { + line-height: 16px; +} + +.multiselect--active { + z-index: 1000 !important; +} diff --git a/vapeshop-ui/src/assets/styles/mixin.scss b/vapeshop-ui/src/assets/styles/mixin.scss new file mode 100644 index 0000000..06fa061 --- /dev/null +++ b/vapeshop-ui/src/assets/styles/mixin.scss @@ -0,0 +1,66 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } + + @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/vapeshop-ui/src/assets/styles/ruoyi.scss b/vapeshop-ui/src/assets/styles/ruoyi.scss new file mode 100644 index 0000000..34c9e84 --- /dev/null +++ b/vapeshop-ui/src/assets/styles/ruoyi.scss @@ -0,0 +1,273 @@ + /** + * 閫氱敤css鏍峰紡甯冨眬澶勭悊 + * Copyright (c) 2019 ruoyi + */ + + /** 鍩虹閫氱敤 **/ +.pt5 { + padding-top: 5px; +} +.pr5 { + padding-right: 5px; +} +.pb5 { + padding-bottom: 5px; +} +.mt5 { + margin-top: 5px; +} +.mr5 { + margin-right: 5px; +} +.mb5 { + margin-bottom: 5px; +} +.mb8 { + margin-bottom: 8px; +} +.ml5 { + margin-left: 5px; +} +.mt10 { + margin-top: 10px; +} +.mr10 { + margin-right: 10px; +} +.mb10 { + margin-bottom: 10px; +} +.ml10 { + margin-left: 10px; +} +.mt20 { + margin-top: 20px; +} +.mr20 { + margin-right: 20px; +} +.mb20 { + margin-bottom: 20px; +} +.ml20 { + margin-left: 20px; +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; +} + +.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; +} + +.el-table { + .el-table__header-wrapper, .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9; + color: #515a6e; + height: 40px; + font-size: 13px; + } + } + .el-table__body-wrapper { + .el-button [class*="el-icon-"] + span { + margin-left: 1px; + } + } +} + +/** 琛ㄥ崟甯冨眬 **/ +.form-header { + font-size:15px; + color:#6379bb; + border-bottom:1px solid #ddd; + margin:8px 10px 25px 10px; + padding-bottom:5px +} + +/** 琛ㄦ牸甯冨眬 **/ +.pagination-container { + position: relative; + height: 25px; + margin-bottom: 10px; + margin-top: 15px; + padding: 10px 20px !important; +} + +/* tree border */ +.tree-border { + margin-top: 5px; + border: 1px solid #e5e6e7; + background: #FFFFFF none; + border-radius:4px; +} + +.pagination-container .el-pagination { + right: 0; + position: absolute; +} + +@media ( max-width : 768px) { + .pagination-container .el-pagination > .el-pagination__jump { + display: none !important; + } + .pagination-container .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-table .fixed-width .el-button--mini { + padding-left: 0; + padding-right: 0; + width: inherit; +} + +/** 琛ㄦ牸鏇村鎿嶄綔涓嬫媺鏍峰紡 */ +.el-table .el-dropdown-link { + cursor: pointer; + color: #409EFF; + margin-left: 5px; +} + +.el-table .el-dropdown, .el-icon-arrow-down { + font-size: 12px; +} + +.el-tree-node__content > .el-checkbox { + margin-right: 8px; +} + +.list-group-striped > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} + +.list-group { + padding-left: 0px; + list-style: none; +} + +.list-group-item { + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; +} + +.pull-right { + float: right !important; +} + +.el-card__header { + padding: 14px 15px 7px; + min-height: 40px; +} + +.el-card__body { + padding: 15px 20px 20px 20px; +} + +.card-box { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 10px; +} + +/* button color */ +.el-button--cyan.is-active, +.el-button--cyan:active { + background: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +.el-button--cyan:focus, +.el-button--cyan:hover { + background: #48D1CC; + border-color: #48D1CC; + color: #FFFFFF; +} + +.el-button--cyan { + background-color: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +/* text color */ +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +/* image */ +.img-circle { + border-radius: 50%; +} + +.img-lg { + width: 120px; + height: 120px; +} + +.avatar-upload-preview { + position: absolute; + top: 50%; + transform: translate(50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; +} + +/* 鎷栨嫿鍒楁牱寮 */ +.sortable-ghost{ + opacity: .8; + color: #fff!important; + background: #42b983!important; +} + +.top-right-btn { + position: relative; + float: right; +} diff --git a/vapeshop-ui/src/assets/styles/sidebar.scss b/vapeshop-ui/src/assets/styles/sidebar.scss new file mode 100644 index 0000000..ed308b8 --- /dev/null +++ b/vapeshop-ui/src/assets/styles/sidebar.scss @@ -0,0 +1,227 @@ +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: $base-sidebar-width; + position: relative; + } + + .sidebarHide { + margin-left: 0!important; + } + + .sidebar-container { + -webkit-transition: width .28s; + transition: width 0.28s; + width: $base-sidebar-width !important; + background-color: $base-menu-background; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); + box-shadow: 2px 0 6px rgba(0,21,41,.35); + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + .el-menu-item, .el-submenu__title { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .is-active > .el-submenu__title { + color: $base-menu-color-active !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $base-sidebar-width !important; + + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .nest-menu .el-submenu>.el-submenu__title, + & .theme-dark .el-submenu .el-menu-item { + background-color: $base-sub-menu-background !important; + + &:hover { + background-color: $base-sub-menu-hover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $base-sidebar-width !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $base-sidebar-width !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$base-sidebar-width, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/vapeshop-ui/src/assets/styles/transition.scss b/vapeshop-ui/src/assets/styles/transition.scss new file mode 100644 index 0000000..4cb27cc --- /dev/null +++ b/vapeshop-ui/src/assets/styles/transition.scss @@ -0,0 +1,48 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/vapeshop-ui/src/assets/styles/variables.scss b/vapeshop-ui/src/assets/styles/variables.scss new file mode 100644 index 0000000..34484d4 --- /dev/null +++ b/vapeshop-ui/src/assets/styles/variables.scss @@ -0,0 +1,54 @@ +// base color +$blue:#324157; +$light-blue:#3A71A8; +$red:#C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow:#FEC171; +$panGreen: #30B08F; + +// 榛樿鑿滃崟涓婚椋庢牸 +$base-menu-color:#bfcbd9; +$base-menu-color-active:#f4f4f5; +$base-menu-background:#304156; +$base-logo-title-color: #ffffff; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#1f2d3d; +$base-sub-menu-hover:#001528; + +// 鑷畾涔夋殫鑹茶彍鍗曢鏍 +/** +$base-menu-color:hsla(0,0%,100%,.65); +$base-menu-color-active:#fff; +$base-menu-background:#001529; +$base-logo-title-color: #ffffff; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#000c17; +$base-sub-menu-hover:#001528; +*/ + +$base-sidebar-width: 200px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuColor: $base-menu-color; + menuLightColor: $base-menu-light-color; + menuColorActive: $base-menu-color-active; + menuBackground: $base-menu-background; + menuLightBackground: $base-menu-light-background; + subMenuBackground: $base-sub-menu-background; + subMenuHover: $base-sub-menu-hover; + sideBarWidth: $base-sidebar-width; + logoTitleColor: $base-logo-title-color; + logoLightTitleColor: $base-logo-light-title-color +} diff --git a/vapeshop-ui/src/b.json b/vapeshop-ui/src/b.json new file mode 100644 index 0000000..69f7df9 --- /dev/null +++ b/vapeshop-ui/src/b.json @@ -0,0 +1,410 @@ +[ + { + name: "涓婃捣瀹濆北鍖", + value: [ + 121.48, + 31.4 + ], + params: [ + { + "name": "涓婃捣閾勭泩瀹炰笟鏈夐檺鍏徃", + "address": "涓婃捣甯傚疂灞卞尯鍙嬭皧璺1588寮勭殑3鍙602" + }, + { + "name": "涓婃捣浜胯僵鍥介檯璐告槗鍏徃", + "address": "瀹濆北鍖哄弸璋婅矾鍥介檯閽㈤搧鏈嶅姟涓績11鍙锋ゼ7妤" + } + ] + }, + { + name: "涓婃捣鏉炬睙鍖", + value: [ + 121.48, + 31.03 + ], + params: [ + { + "name": "璐电爺涓笇锛堜笂娴凤級鏂版潗鏂欒偂浠芥湁闄愬叕鍙", + "address": "涓婃捣甯傛澗姹熷尯" + } + ] + }, + { + name: "涓婃捣娴︿笢鏂板尯", + value: [ + 121.53, + 31.22 + ], + params: [ + { + "name": "绉戞濆垱鑱氬悎鐗╋紙涓浗锛夋湁闄愬叕鍙", + "address": "涓婃捣娴︿笢鏂板尯骞冲妗ヨ矾36鍙锋櫠鑰鍟嗗姟骞垮満5鍙锋ゼ21灞" + } + ] + }, + { + name: "鑻忓窞鍚翠腑鍖", + value: [ + 120.63211, + 31.27226 + ], + params: [ + { + "name": "鑻忓窞閾剁Η绉戞妧鏈夐檺鍏徃", + "address": "鑻忓窞甯傚惔涓尯鍠勪赴璺9鍙" + }, + { + "name": "鑻忓窞甯傚箍鍛婂僵鍗板巶鏈夐檺鍏徃", + "address": "鑻忓窞宸ヤ笟鍥垱鎶曞伐涓氬潑涓冨尯57鍙峰巶鎴" + } + ] + }, + { + name: "鑻忓窞鏄嗗北", + value: [ + 120.63211, + 31.27226 + ], + params: [ + { + "name": "鏄嗗北鍗囨捣鍖呰鏈夐檺鍏徃", + "address": "鑻忓窞鏄嗗北甯傚紶娴﹂晣鎸柊涓滆矾165鍙5鍙锋埧" + } + ] + }, + { + name: "甯稿窞", + value: [ + 119.946973, + 31.772752 + ], + params: [ + { + "name": "甯稿窞鑹剧編鐜繚绉戞妧鏈夐檺鍏徃", + "address": "甯稿窞甯傛杩涘尯娼炲煄琛楅亾瀵屾皯璺209鍙" + } + ] + }, + { + name: "鍗椾含姹熷畞鍖", + value: [ + 118.8399, + 31.95263 + ], + params: [ + { + "name": "鍗椾含鑻遍懌娉戒簲閲戝埗鍝佹湁闄愬叕鍙", + "address": "鍗椾含甯傛睙瀹佸尯姹熷畞琛楅亾娓呬慨宸ヤ笟鍥編浜哄北璺1鍙" + } + ] + }, + { + name: "鍚堣偉缁忔祹寮鍙戝尯", + value: [ + 117.197482, + 31.78518 + ], + params: [ + { + "name": "鍚堣偉鏉颁簨鏉版柊鏉愭枡鑲′唤鏈夐檺鍏徃", + "address": "鍚堣偉缁忔祹寮鍙戝尯鑾茶姳璺2388鍙" + } + ] + }, + { + name: "瀹佹尝", + value: [ + 121.35, + 29.42 + ], + params: [ + { + "name": "瀹佹尝榧庢旦鏂版潗鏂欑鎶鏈夐檺鍏徃", + "address": "瀹佹尝閯炲窞鍖烘棩涓戒腑璺555鍙" + }, + { + "name": "瀹佹尝閲戠敯閾滀笟锛堥泦鍥級鑲′唤鏈夐檺鍏徃", + "address": "娴欐睙瀹佹尝甯傛睙鍖楀尯鎱堝煄闀囧煄瑗胯タ璺1鍙" + } + ] + }, + { + name: "涓滆帪濉樺帵", + value: [ + 118.0814, + 22.76 + ], + params: [ + { + "name": "涓滆帪甯傚畨鏅跺厜鐢电鎶鏈夐檺鍏徃", + "address": "涓滆帪甯傚鍘﹂晣鏋楁潙榫欏ご宀敯蹇10鍙6妤" + } + ] + }, + { + name: "浣涘北椤哄痉", + value: [ + 113.2488, + 22.85 + ], + params: [ + { + "name": "浣涘北甯傜閼嘲閲戝睘鏉愭枡鏈夐檺鍏徃", + "address": "骞夸笢鐪佷經灞卞競椤哄痉鍖洪檲鏉戦晣娼潙宸ヤ笟鍖轰簩璺28鍙" + } + ] + }, + { + name: "骞垮窞鐣鍖", + value: [ + 113.4082, + 22.9465 + ], + params: [ + { + "name": "骞垮窞鐣涓扮洓鐢靛瓙鏈夐檺鍏徃", + "address": "骞垮窞鐣鍖轰笢娑岄晣瀹樺潶鏉戝姳涓氳矾" + } + ] + }, + { + name: "棣欐腐婀句粩", + value: [ + 114.183, + 22.2764 + ], + params: [ + { + "name": "楂樿揪宸ョ▼濉戞枡锛堥娓級鏈夐檺鍏徃", + "address": "棣欐腐鐏d粩杌掑凹瑭╅亾302-308铏熼泦鎴愪腑蹇10妯1003瀹" + } + ] + }, + { + name: "鐟炲畨", + value: [ + 120.13, + 27.50 + ], + params: [ + { + "name": "鐟炲畨甯傛櫙楦跨數鍣ㄦ湁闄愬叕鍙", + "address": "鐟炲畨甯傚涓嬮晣涓婄伓鏉戣В鏀捐タ璺231鍙" + }, + { + "name": "鐟炲畨甯傜撼鐩涘鏂欐湁闄愬叕鍙", + "address": "鐟炲畨甯傞粠鏄庢潙" + }, + { + "name": "鐟炲畨涓俊涓嶉攬閽㈡湁闄愬叕鍙", + "address": "鐟炲畨甯傚悗閲屼笉閿堥挗鍗楀競鍦123鍙" + } + ] + }, + { + name: "榫欐腐", + value: [ + 120.548170, + 27.580800 + ], + params: [ + { + "name": "娓╁窞寰烽緳鍖呰鍒跺搧鏈夐檺鍏徃", + "address": "娓╁窞甯傞緳娓競娴疯タ璺9-99鍙风1鍙" + }, + { + "name": "娴欐睙涔濋緳濉戣兌鏈夐檺鍏徃", + "address": "娓╁窞甯傞緳娓競鍩噾绾夸笌闄堝钩绾夸氦鍙夎矾鍙e線涓滃崡绾100绫" + } + ] + }, + { + name: "榫欐咕鍖", + value: [ + 120.83053, + 27.91284 + ], + params: [ + { + "name": "涓箍鏍镐繆灏旓紙娴欐睙锛夋柊鏉愭枡鏈夐檺鍏徃", + "address": "娓╁窞榫欐咕鍖洪噾娴峰ぇ閬339鍙" + } + ] + }, + { + name: "鐡捣鍖", + value: [ + 120.567218, + 27.973539 + ], + params: [ + { + "name": "娓╁窞鑱氭槦绉戞妧鑲′唤鏈夐檺鍏徃", + "address": "娓╁窞甯傜摨娴峰尯浠欏博宸ヤ笟鍖烘娉拌矾42鍙" + } + ] + }, + { + name: "姘稿槈鍘跨摨鍖", + value: [ + 120.658813, + 28.040993 + ], + params: [ + { + "name": "姘稿槈鍘垮皧瀹濋搧涓濇湁闄愬叕鍙", + "address": "姘稿槈鍘跨摨鍖楀煄甯傛柊鍖洪粍鐢拌閬撶彔姹熸潙娲炴ˉ澶" + } + ] + }, + { + name: "鍖楃櫧璞¢晣", + value: [ + 120.86321, + 28.01901 + ], + params: [ + { + "name": "闃块緳鍗板姟", + "address": "涔愭竻甯傚寳鐧借薄闀囪嵎鑺辫矾201鍙" + }, + { + "name": "涔愭竻鍢夊僵棰滄枡鏈夐檺鍏徃", + "address": "涔愭竻鍖楃櫧璞¢晣鍓嶆槦鏉" + }, + { + "name": "涔愭竻鑱氬姏钖勮啘鍒跺搧鏈夐檺鍏徃", + "address": "涔愭竻甯傚寳鐧借薄闀囧箔瑗挎潙宀タ鍖楄矾9-12鍙" + }, + { + "name": "涔愭竻甯傚垱鏂扮揣鍥轰欢鍒堕犲巶", + "address": "涔愭竻鍖楃櫧璞′笅鐥掑伐涓氬尯" + }, + { + "name": "涔愭竻甯傚ぇ宸濊锤鏄撴湁闄愬叕鍙", + "address": "涔愭竻甯傚寳鐧借薄闀囧紑鍒涜矾490鍙" + }, + { + "name": "涔愭竻甯備笢鐡紑鍏冲巶", + "address": "涔愭竻甯傚寳鐧借薄闀囪薄涓滆矾58鍙" + }, + { + "name": "涔愭竻甯傚悎浼楀寘瑁呮湁闄愬叕鍙", + "address": "娓╁窞甯備箰娓呭競鍑ゅ嚢宸ヤ笟鍥" + }, + { + "name": "涔愭竻甯備匠鑳界數瀛愭湁闄愬叕鍙", + "address": "涔愭竻鍖楃櫧璞¤枦瀹" + }, + { + "name": "涔愭竻甯傜簿鍗庣揣鍥轰欢鏈夐檺鍏徃", + "address": "涔愭竻鍖楃櫧璞℃婀惧伐涓氬尯" + }, + { + "name": "涔愭竻甯備箶鎷撶數姘旀湁闄愬叕鍙", + "address": "涔愭竻鍖楃櫧璞′竾鍗楁潙" + }, + { + "name": "涔愭竻甯傜粺鍔涘脊绨ф湁闄愬叕鍙", + "address": "涔愭竻鍖楃櫧璞℃按濉斿ご妗ヨ竟" + }, + { + "name": "涔愭竻甯傛磱楦垮鑳舵湁闄愬叕鍙", + "address": "涔愭竻鍖楃櫧璞″▌妗" + }, + { + "name": "涔愭竻甯傝绁炴爣鍑嗕欢鍘", + "address": "涔愭竻鍖楃櫧璞¢噾鐐夊伐涓氬尯寮鍒涜矾441鍙" + }, + { + "name": "涔愭竻甯備竴甯嗙墿璧勮锤鏄撴湁闄愬叕鍙", + "address": "涔愭竻甯傚寳鐧借薄浜ら氫笢璺616鍙" + }, + { + "name": "涔愭竻甯傝壓绋嬮搯閽夊巶锛堝惔绔嬪己/鐜嬩紵锛", + "address": "涔愭竻鍖楃櫧璞″皬娓" + }, + { + "name": "濞勬ˉ姗¤兌鍘傚啗鍝", + "address": "涔愭竻鍖楃櫧璞″▌妗" + }, + { + "name": "娓╁窞鑼傝瘹鍖呰鏈夐檺鍏徃", + "address": "涔愭竻甯傚寳鐧借薄闀囪档瀹剁鏉戝崡璺58鍙" + }, + { + "name": "娓╁窞姘镐赴濉戞枡鐗╄祫鏈夐檺鍏徃", + "address": "涔愭竻鍖楃櫧璞′氦閫氳矾" + }, + { + "name": "娴欐睙绮惧浐鏍囧噯浠舵湁闄愬叕鍙", + "address": "涔愭竻鍖楃櫧璞″ぇ妗ュ寳宸ヤ笟鍖" + }, + { + "name": "娴欐睙鏇欏厜绱у浐浠舵湁闄愬叕鍙", + "address": "涔愭竻甯傚寳鐧借薄闀囧悗宀告潙" + }, + { + "name": "涔愭竻甯傚崥婧愮數瀛愮嚎缂嗘湁闄愬叕鍙", + "address": "鍖楃櫧璞¢晣鏃烘灄鏉戞矙娲矾89鍙" + } + ] + }, + { + name: "鍖楃櫧璞¢晣", + value: [ + 120.898399, + 28.04610 + ], + params: [ + { + "name": "涔愭竻甯傛煶甯傚崕涔愯鐠滄潗鏂欑粡钀ラ儴", + "address": "娴欐睙涔愭竻鏌冲競涓滈璺68鍙" + }, + { + "name": "涔愭竻甯傛煶甯傜墰杩涙ā鍏峰巶", + "address": "娴欐睙涔愭竻鏌冲競闀囨煶鍗楁潙" + }, + { + "name": "涔愭竻甯傜憺宄板寘瑁呮湁闄愬叕鍙", + "address": "涔愭竻甯傛煶甯傞晣鍓嶆磱娲炴潙" + }, + { + "name": "涔愭竻甯傚北瀵屼簲閲戝巶", + "address": "娴欐睙涔愭竻鏌冲競涓婁簲瀹呮潙浜斿叴璺45鍙" + }, + { + "name": "涔愭竻甯傚疂淇$粷缂樻潗鏂欐湁闄愬叕鍙", + "address": "鏌冲競涓滈宸ヤ笟鍖轰箻椋庤矾11鍙" + }, + { + "name": "涔愭竻甯備箰閭﹂挗涓氭湁闄愬叕鍙", + "address": "鏌冲競闀囪溅绔欒矾752鍙" + }, + { + "name": "娓╁窞椤剁偣鐢垫皵鏈夐檺鍏徃", + "address": "娓╁窞甯備竷閲屾腐" + }, + { + "name": "娓╁窞鍗庣泩閾滀笟鏈夐檺鍏徃", + "address": "鏌冲競闀挎睙璺350鍙" + }, + { + "name": "寮犲皬涔", + "address": "娴欐睙涔愭竻鏌冲競闀囧悗琛楁潙涓滈璺70鍙" + }, + { + "name": "娓╁窞缁垮疂铚傜獫绾告澘鍖呰鏈夐檺鍏徃", + "address": "涔愭竻甯傝薄闃抽晣姹ゅ矙浣欐潙宕囩瀵烘梺" + }, + { + "name": "娓╁窞娣卞彂鍗板姟鏈夐檺鍏徃", + "address": "涔愭竻甯備腑蹇冨ぇ閬281鍙" + }, + { + "name": "娓╁窞甯傛娆h〃闈㈠鐞嗘湁闄愬叕鍙", + "address": "涔愭竻鐩愮洏鐢甸晙鍩哄湴A64妤" + } + ] + } +] diff --git a/vapeshop-ui/src/components/Breadcrumb/index.vue b/vapeshop-ui/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..1696f54 --- /dev/null +++ b/vapeshop-ui/src/components/Breadcrumb/index.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/vapeshop-ui/src/components/Crontab/day.vue b/vapeshop-ui/src/components/Crontab/day.vue new file mode 100644 index 0000000..fe3eaf0 --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/day.vue @@ -0,0 +1,161 @@ + + + diff --git a/vapeshop-ui/src/components/Crontab/hour.vue b/vapeshop-ui/src/components/Crontab/hour.vue new file mode 100644 index 0000000..4b1f1fc --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/hour.vue @@ -0,0 +1,114 @@ + + + diff --git a/vapeshop-ui/src/components/Crontab/index.vue b/vapeshop-ui/src/components/Crontab/index.vue new file mode 100644 index 0000000..3963df2 --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/index.vue @@ -0,0 +1,430 @@ + + + + diff --git a/vapeshop-ui/src/components/Crontab/min.vue b/vapeshop-ui/src/components/Crontab/min.vue new file mode 100644 index 0000000..43cab90 --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/min.vue @@ -0,0 +1,116 @@ + + + \ No newline at end of file diff --git a/vapeshop-ui/src/components/Crontab/month.vue b/vapeshop-ui/src/components/Crontab/month.vue new file mode 100644 index 0000000..fd0ac38 --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/month.vue @@ -0,0 +1,114 @@ + + + diff --git a/vapeshop-ui/src/components/Crontab/result.vue b/vapeshop-ui/src/components/Crontab/result.vue new file mode 100644 index 0000000..aea6e0e --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/result.vue @@ -0,0 +1,559 @@ + + + diff --git a/vapeshop-ui/src/components/Crontab/second.vue b/vapeshop-ui/src/components/Crontab/second.vue new file mode 100644 index 0000000..e7b7761 --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/second.vue @@ -0,0 +1,117 @@ + + + diff --git a/vapeshop-ui/src/components/Crontab/week.vue b/vapeshop-ui/src/components/Crontab/week.vue new file mode 100644 index 0000000..1cec700 --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/week.vue @@ -0,0 +1,202 @@ + + + diff --git a/vapeshop-ui/src/components/Crontab/year.vue b/vapeshop-ui/src/components/Crontab/year.vue new file mode 100644 index 0000000..5487a6c --- /dev/null +++ b/vapeshop-ui/src/components/Crontab/year.vue @@ -0,0 +1,131 @@ + + + diff --git a/vapeshop-ui/src/components/DictData/index.js b/vapeshop-ui/src/components/DictData/index.js new file mode 100644 index 0000000..c2a0359 --- /dev/null +++ b/vapeshop-ui/src/components/DictData/index.js @@ -0,0 +1,21 @@ +import Vue from 'vue' +import DataDict from '@/utils/dict' +import { getDicts as getDicts } from '@/api/system/dict/data' + +function install() { + Vue.use(DataDict, { + metas: { + '*': { + labelField: 'dictLabel', + valueField: 'dictValue', + request(dictMeta) { + return getDicts(dictMeta.type).then(res => res.data) + }, + }, + }, + }) +} + +export default { + install, +} \ No newline at end of file diff --git a/vapeshop-ui/src/components/DictTag/index.vue b/vapeshop-ui/src/components/DictTag/index.vue new file mode 100644 index 0000000..4c196c4 --- /dev/null +++ b/vapeshop-ui/src/components/DictTag/index.vue @@ -0,0 +1,52 @@ + + + + \ No newline at end of file diff --git a/vapeshop-ui/src/components/Editor/index.vue b/vapeshop-ui/src/components/Editor/index.vue new file mode 100644 index 0000000..6bb5a18 --- /dev/null +++ b/vapeshop-ui/src/components/Editor/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/vapeshop-ui/src/components/FileUpload/index.vue b/vapeshop-ui/src/components/FileUpload/index.vue new file mode 100644 index 0000000..aa2296b --- /dev/null +++ b/vapeshop-ui/src/components/FileUpload/index.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/vapeshop-ui/src/components/Hamburger/index.vue b/vapeshop-ui/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/vapeshop-ui/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/vapeshop-ui/src/components/HeaderSearch/index.vue b/vapeshop-ui/src/components/HeaderSearch/index.vue new file mode 100644 index 0000000..c44eff5 --- /dev/null +++ b/vapeshop-ui/src/components/HeaderSearch/index.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/vapeshop-ui/src/components/IconSelect/index.vue b/vapeshop-ui/src/components/IconSelect/index.vue new file mode 100644 index 0000000..b0ec9fa --- /dev/null +++ b/vapeshop-ui/src/components/IconSelect/index.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/vapeshop-ui/src/components/IconSelect/requireIcons.js b/vapeshop-ui/src/components/IconSelect/requireIcons.js new file mode 100644 index 0000000..99e5c54 --- /dev/null +++ b/vapeshop-ui/src/components/IconSelect/requireIcons.js @@ -0,0 +1,11 @@ + +const req = require.context('../../assets/icons/svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys() + +const re = /\.\/(.*)\.svg/ + +const icons = requireAll(req).map(i => { + return i.match(re)[1] +}) + +export default icons diff --git a/vapeshop-ui/src/components/ImagePreview/index.vue b/vapeshop-ui/src/components/ImagePreview/index.vue new file mode 100644 index 0000000..743d8d5 --- /dev/null +++ b/vapeshop-ui/src/components/ImagePreview/index.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/vapeshop-ui/src/components/ImageUpload/index.vue b/vapeshop-ui/src/components/ImageUpload/index.vue new file mode 100644 index 0000000..4068b67 --- /dev/null +++ b/vapeshop-ui/src/components/ImageUpload/index.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/vapeshop-ui/src/components/Pagination/index.vue b/vapeshop-ui/src/components/Pagination/index.vue new file mode 100644 index 0000000..56f5a6b --- /dev/null +++ b/vapeshop-ui/src/components/Pagination/index.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/vapeshop-ui/src/components/PanThumb/index.vue b/vapeshop-ui/src/components/PanThumb/index.vue new file mode 100644 index 0000000..1bcf417 --- /dev/null +++ b/vapeshop-ui/src/components/PanThumb/index.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/vapeshop-ui/src/components/ParentView/index.vue b/vapeshop-ui/src/components/ParentView/index.vue new file mode 100644 index 0000000..7bf6148 --- /dev/null +++ b/vapeshop-ui/src/components/ParentView/index.vue @@ -0,0 +1,3 @@ + diff --git a/vapeshop-ui/src/components/RightPanel/index.vue b/vapeshop-ui/src/components/RightPanel/index.vue new file mode 100644 index 0000000..fbf27eb --- /dev/null +++ b/vapeshop-ui/src/components/RightPanel/index.vue @@ -0,0 +1,149 @@ + + + + + + + diff --git a/vapeshop-ui/src/components/RightToolbar/index.vue b/vapeshop-ui/src/components/RightToolbar/index.vue new file mode 100644 index 0000000..f7663a3 --- /dev/null +++ b/vapeshop-ui/src/components/RightToolbar/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/vapeshop-ui/src/components/RuoYi/Doc/index.vue b/vapeshop-ui/src/components/RuoYi/Doc/index.vue new file mode 100644 index 0000000..75fa864 --- /dev/null +++ b/vapeshop-ui/src/components/RuoYi/Doc/index.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/vapeshop-ui/src/components/RuoYi/Git/index.vue b/vapeshop-ui/src/components/RuoYi/Git/index.vue new file mode 100644 index 0000000..bdafbae --- /dev/null +++ b/vapeshop-ui/src/components/RuoYi/Git/index.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/vapeshop-ui/src/components/Screenfull/index.vue b/vapeshop-ui/src/components/Screenfull/index.vue new file mode 100644 index 0000000..d4e539c --- /dev/null +++ b/vapeshop-ui/src/components/Screenfull/index.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/vapeshop-ui/src/components/SizeSelect/index.vue b/vapeshop-ui/src/components/SizeSelect/index.vue new file mode 100644 index 0000000..069b5de --- /dev/null +++ b/vapeshop-ui/src/components/SizeSelect/index.vue @@ -0,0 +1,56 @@ + + + diff --git a/vapeshop-ui/src/components/SvgIcon/index.vue b/vapeshop-ui/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..e4bf5ad --- /dev/null +++ b/vapeshop-ui/src/components/SvgIcon/index.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/vapeshop-ui/src/components/ThemePicker/index.vue b/vapeshop-ui/src/components/ThemePicker/index.vue new file mode 100644 index 0000000..1714e1f --- /dev/null +++ b/vapeshop-ui/src/components/ThemePicker/index.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/vapeshop-ui/src/components/TopNav/index.vue b/vapeshop-ui/src/components/TopNav/index.vue new file mode 100644 index 0000000..0cc24db --- /dev/null +++ b/vapeshop-ui/src/components/TopNav/index.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/vapeshop-ui/src/components/iFrame/index.vue b/vapeshop-ui/src/components/iFrame/index.vue new file mode 100644 index 0000000..426857f --- /dev/null +++ b/vapeshop-ui/src/components/iFrame/index.vue @@ -0,0 +1,36 @@ +