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/jing-common/jing-common-core/src/main/java/com/jing/common/core/exception/PreAuthorizeException.java b/jing-common/jing-common-core/src/main/java/com/jing/common/core/exception/PreAuthorizeException.java
new file mode 100644
index 0000000..81610e5
--- /dev/null
+++ b/jing-common/jing-common-core/src/main/java/com/jing/common/core/exception/PreAuthorizeException.java
@@ -0,0 +1,15 @@
+package com.jing.common.core.exception;
+
+/**
+ * 鏉冮檺寮傚父
+ *
+ * @author ruoyi
+ */
+public class PreAuthorizeException extends RuntimeException
+{
+ private static final long serialVersionUID = 1L;
+
+ public PreAuthorizeException()
+ {
+ }
+}
diff --git a/jing-common/jing-common-core/src/main/java/com/jing/common/core/utils/PageUtils.java b/jing-common/jing-common-core/src/main/java/com/jing/common/core/utils/PageUtils.java
new file mode 100644
index 0000000..7e9197a
--- /dev/null
+++ b/jing-common/jing-common-core/src/main/java/com/jing/common/core/utils/PageUtils.java
@@ -0,0 +1,35 @@
+package com.jing.common.core.utils;
+
+import com.github.pagehelper.PageHelper;
+import com.jing.common.core.utils.sql.SqlUtil;
+import com.jing.common.core.web.page.PageDomain;
+import com.jing.common.core.web.page.TableSupport;
+
+/**
+ * 鍒嗛〉宸ュ叿绫
+ *
+ * @author ruoyi
+ */
+public class PageUtils extends PageHelper
+{
+ /**
+ * 璁剧疆璇锋眰鍒嗛〉鏁版嵁
+ */
+ public static void startPage()
+ {
+ PageDomain pageDomain = TableSupport.buildPageRequest();
+ Integer pageNum = pageDomain.getPageNum();
+ Integer pageSize = pageDomain.getPageSize();
+ String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
+ Boolean reasonable = pageDomain.getReasonable();
+ PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
+ }
+
+ /**
+ * 娓呯悊鍒嗛〉鐨勭嚎绋嬪彉閲
+ */
+ public static void clearPage()
+ {
+ PageHelper.clearPage();
+ }
+}
diff --git a/jing-common/jing-common-core/src/main/java/com/jing/common/core/web/page/PageDomain.java b/jing-common/jing-common-core/src/main/java/com/jing/common/core/web/page/PageDomain.java
new file mode 100644
index 0000000..556247a
--- /dev/null
+++ b/jing-common/jing-common-core/src/main/java/com/jing/common/core/web/page/PageDomain.java
@@ -0,0 +1,101 @@
+package com.jing.common.core.web.page;
+
+import com.jing.common.core.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/jing-common/jing-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/jing-common/jing-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 0000000..b88f79a
--- /dev/null
+++ b/jing-common/jing-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,3 @@
+# com.jing.common.swagger.config.SwaggerAutoConfiguration
+# com.jing.common.swagger.config.SwaggerWebConfiguration
+# com.jing.common.swagger.config.SwaggerBeanPostProcessor
diff --git a/jing-ui/bin/package.bat b/jing-ui/bin/package.bat
new file mode 100644
index 0000000..0e5bc0f
--- /dev/null
+++ b/jing-ui/bin/package.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 安装Web工程,生成node_modules文件。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm install --registry=https://registry.npmmirror.com
+
+pause
\ No newline at end of file
diff --git a/jing-ui/package.json b/jing-ui/package.json
new file mode 100644
index 0000000..40f1d13
--- /dev/null
+++ b/jing-ui/package.json
@@ -0,0 +1,90 @@
+{
+ "name": "ruoyi",
+ "version": "3.6.4",
+ "description": "jing绯荤粺",
+ "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-Cloud.git"
+ },
+ "dependencies": {
+ "@riophae/vue-treeselect": "0.4.0",
+ "axios": "0.24.0",
+ "clipboard": "2.0.8",
+ "core-js": "3.25.3",
+ "echarts": "5.4.0",
+ "element-ui": "2.15.14",
+ "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": "6.1.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/jing-ui/src/assets/icons/svg/password.svg b/jing-ui/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..6c64def
--- /dev/null
+++ b/jing-ui/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/jing-ui/src/assets/images/pay.png b/jing-ui/src/assets/images/pay.png
new file mode 100644
index 0000000..bb8b967
Binary files /dev/null and b/jing-ui/src/assets/images/pay.png differ
diff --git a/jing-ui/src/views/dashboard/PanelGroup.vue b/jing-ui/src/views/dashboard/PanelGroup.vue
new file mode 100644
index 0000000..1a1081f
--- /dev/null
+++ b/jing-ui/src/views/dashboard/PanelGroup.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+