diff --git a/czsj-admin/src/main/assembly/package.xml b/czsj-admin/src/main/assembly/package.xml
new file mode 100644
index 0000000..b9018cc
--- /dev/null
+++ b/czsj-admin/src/main/assembly/package.xml
@@ -0,0 +1,49 @@
+
+ dist
+
+ dir
+
+ false
+
+
+ ${basedir}/src/main/bin
+ unix
+ service
+
+ *.service
+
+
+
+ ${basedir}/src/main/bin
+ unix
+
+ 755
+
+ *.sh
+
+
+
+ ${basedir}/src/main/bin
+ windows
+
+
+ *.bat
+
+
+
+ target/classes
+ config
+
+ **/*.yml
+ **/*.xml
+
+
+
+
+
+ lib
+ false
+
+
+
+
\ No newline at end of file
diff --git a/czsj-admin/src/main/java/com/czsj/assembly/deploy.xml b/czsj-admin/src/main/java/com/czsj/assembly/deploy.xml
new file mode 100644
index 0000000..94b370d
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/assembly/deploy.xml
@@ -0,0 +1,47 @@
+
+
+ dist
+
+ tar.gz
+
+ false
+
+
+ true
+ admin/lib
+ runtime
+
+
+
+
+ unix
+ ./src/main/bin
+ admin/bin
+
+ **/*
+
+ 0755
+
+
+ ./src/main/logs
+ admin/logs
+
+
+ ./src/main/resources
+
+ *.properties
+ logback.xml
+ application.yml
+ mapper/**/**
+ i18n/**
+ static/**
+
+ admin/conf
+
+
+ src/main/lib
+ admin/lib
+
+
+
diff --git a/czsj-admin/src/main/java/com/czsj/bin/admin.bat b/czsj-admin/src/main/java/com/czsj/bin/admin.bat
new file mode 100644
index 0000000..a1d6505
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/admin.bat
@@ -0,0 +1,9 @@
+@echo off
+set home=%~dp0
+
+set conf_dir=%home%..\conf
+set lib_dir=%home%..\lib\*
+set log_dir=%home%..\logs
+
+java -Dspring.profiles.active=standalone -Dlogging.file=%log_dir%\dbApi.log -classpath %conf_dir%;%lib_dir% com.larkmidtable.admin.AdminApplication
+pause
\ No newline at end of file
diff --git a/czsj-admin/src/main/java/com/czsj/bin/admin.sh b/czsj-admin/src/main/java/com/czsj/bin/admin.sh
new file mode 100644
index 0000000..066b472
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/admin.sh
@@ -0,0 +1,266 @@
+#!/bin/bash
+#
+
+FRIEND_NAME=ADMIN
+MAIN_CLASS=com.larkmidtable.admin.AdminApplication
+if [ ! ${ENV_FILE} ]; then
+ ENV_FILE="env.properties"
+fi
+SLEEP_TIMEREVAL_S=2
+
+abs_path(){
+ SOURCE="${BASH_SOURCE[0]}"
+ while [ -h "${SOURCE}" ]; do
+ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+ SOURCE="$(readlink "${SOURCE}")"
+ [[ ${SOURCE} != /* ]] && SOURCE="${DIR}/${SOURCE}"
+ done
+ echo "$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
+}
+
+function LOG(){
+ currentTime=`date "+%Y-%m-%d %H:%M:%S.%3N"`
+ echo -e "$currentTime [${1}] ($$) $2" | tee -a ${SHELL_LOG}
+}
+
+verify_java_env(){
+ if [ "x${JAVA_HOME}" != "x" ]; then
+ ${JAVA_HOME}/bin/java -version >/dev/null 2>&1
+ else
+ java -version >/dev/null 2>&1
+ fi
+ if [ $? -ne 0 ]; then
+ cat 1>&2 </dev/null`
+ if [ "x"${pid_in_file} != "x" ]; then
+ p=`${JPS} -q | grep ${pid_in_file} | awk '{print $1}'`
+ fi
+ fi
+ else
+ p=`${JPS} -l | grep "$2" | awk '{print $1}'`
+ fi
+ if [ -n "$p" ]; then
+ # echo "$1 ($2) is still running with pid $p"
+ return 0
+ else
+ # echo "$1 ($2) does not appear in the java process table"
+ return 1
+ fi
+}
+
+wait_for_startup(){
+ local now_s=`date '+%s'`
+ local stop_s=$((${now_s} + $1))
+ while [ ${now_s} -le ${stop_s} ];do
+ status_class ${FRIEND_NAME} ${MAIN_CLASS}
+ if [ $? -eq 0 ]; then
+ return 0
+ fi
+ sleep ${SLEEP_TIMEREVAL_S}
+ now_s=`date '+%s'`
+ done
+ exit 1
+}
+
+wait_for_stop(){
+ local now_s=`date '+%s'`
+ local stop_s=$((${now_s} + $1))
+ while [ ${now_s} -le ${stop_s} ];do
+ status_class ${FRIEND_NAME} ${MAIN_CLASS}
+ if [ $? -eq 1 ]; then
+ return 0
+ fi
+ sleep ${SLEEP_TIMEREVAL_S}
+ now_s=`date '+%s'`
+ done
+ return 1
+}
+
+start_m(){
+ status_class ${FRIEND_NAME} ${MAIN_CLASS}
+ if [ $? -eq 0 ]; then
+ LOG INFO "${FRIEND_NAME} has been started in process"
+ exit 0
+ fi
+ LOG INFO ${EXE_JAVA}
+ nohup ${EXE_JAVA} >${SHELL_LOG} 2>&1 &
+ LOG INFO "Waiting ${FRIEND_NAME} to start complete ..."
+ wait_for_startup 20
+ if [ $? -eq 0 ]; then
+ LOG INFO "${FRIEND_NAME} start success"
+ return 0
+ else
+ LOG ERROR "${FRIEND_NAME} start exceeded over 20s" >&2
+ return 1
+ fi
+}
+
+stop_m(){
+ local p=""
+ if [ "x"${PID_FILE_PATH} != "x" ]; then
+ if [ -f ${PID_FILE_PATH} ]; then
+ local pid_in_file=`cat ${PID_FILE_PATH} 2>/dev/null`
+ if [ "x"${pid_in_file} != "x" ]; then
+ p=`${JPS} -q | grep ${pid_in_file} | awk '{print $1}'`
+ fi
+ fi
+ else
+ p=`${JPS} -l | grep "${MAIN_CLASS}" | awk '{print $1}'`
+ fi
+ if [ -z "${p}" ]; then
+ LOG INFO "${FRIEND_NAME} didn't start successfully, not found in the java process table"
+ return 0
+ fi
+ LOG INFO "Killing ${FRIEND_NAME} (pid ${p}) ..."
+ kill -9 ${p}
+ LOG INFO "Stop successful..."
+}
+
+shutdown_m(){
+ local p=""
+ if [ "x"${PID_FILE_PATH} != "x" ]; then
+ if [ -f ${PID_FILE_PATH} ]; then
+ local pid_in_file=`cat ${PID_FILE_PATH} 2>/dev/null`
+ if [ "x"${pid_in_file} != "x" ]; then
+ p=`${JPS} -q | grep ${pid_in_file} | awk '{print $1}'`
+ fi
+ fi
+ else
+ p=`${JPS} -l | grep "${MAIN_CLASS}" | awk '{print $1}'`
+ fi
+ if [ -z "${p}" ]; then
+ LOG INFO "${FRIEND_NAME} didn't start successfully, not found in the java process table"
+ return 0
+ fi
+ LOG INFO "Killing ${FRIEND_NAME} (pid ${p}) ..."
+ case "`uname`" in
+ CYCGWIN*) taskkill /F /PID "${p}" ;;
+ *) kill -9 "${p}" ;;
+ esac
+}
+
+restart_m(){
+ stop_m
+ if [ $? -eq 0 ]; then
+ start_m
+ exit $?
+ else
+ LOG ERROR "${FRIEND_NAME} restart fail" >&2
+ exit 1
+ fi
+}
+if [ ! $1 ]; then
+ usage
+ exit 1;
+fi
+case $1 in
+ start) start_m;;
+ stop) stop_m;;
+ shutdown) shutdown_m;;
+ restart) restart_m;;
+ *)
+ usage
+ exit 1
+ ;;
+esac
+exit $?
diff --git a/czsj-admin/src/main/java/com/czsj/bin/configure.sh b/czsj-admin/src/main/java/com/czsj/bin/configure.sh
new file mode 100644
index 0000000..28038a6
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/configure.sh
@@ -0,0 +1,202 @@
+#!/bin/bash
+
+DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+SHELL_LOG="${DIR}/console.out"
+SERVER_NAME="admin"
+USER=`whoami`
+SAFE_MODE=true
+SUDO_USER=false
+ENV_FILE_PATH="${DIR}/env.properties"
+
+usage(){
+ printf "Configure usage:\n"
+ printf "\t%-10s %-10s %-2s \n" --server "server-name" "Name of admin server"
+ printf "\t%-10s %-10s %-2s \n" --unsafe "unsafe mode" "Will clean the directory existed"
+ printf "\t%-10s %-10s %-2s \n" --safe "safe mode" "Will not modify the directory existed (Default)"
+ printf "\t%-10s %-10s %-2s \n" "-h|--help" "usage" "List help document"
+}
+
+LOG(){
+ currentTime=`date "+%Y-%m-%d %H:%M:%S.%3N"`
+ echo -e "$currentTime [${1}] ($$) $2" | tee -a ${SHELL_LOG}
+}
+
+interact_echo(){
+ while [ 1 ]; do
+ read -p "$1 (Y/N)" yn
+ if [ "${yn}x" == "Yx" ] || [ "${yn}x" == "yx" ]; then
+ return 0
+ elif [ "${yn}x" == "Nx" ] || [ "${yn}x" == "nx" ]; then
+ return 1
+ else
+ echo "Unknown choise: [$yn], please choose again."
+ fi
+ done
+}
+
+is_sudo_user(){
+ sudo -v >/dev/null 2>&1
+}
+
+abs_path(){
+ SOURCE="${BASH_SOURCE[0]}"
+ while [ -h "${SOURCE}" ]; do
+ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+ SOURCE="$(readlink "${SOURCE}")"
+ [[ ${SOURCE} != /* ]] && SOURCE="${DIR}/${SOURCE}"
+ done
+ echo "$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
+}
+
+check_exist(){
+ if test -e "$1"; then
+ LOG INFO "Directory or file: [$1] has been exist"
+ if [ $2 == true ]; then
+ LOG INFO "Configure program will shutdown..."
+ exit 0
+ fi
+ fi
+}
+
+copy_replace(){
+ file_name=$1
+ if test -e "${CONF_PATH}/${file_name}";then
+ if [ ${SAFE_MODE} == true ]; then
+ check_exist "${CONF_PATH}/${file_name}" true
+ fi
+ LOG INFO "Delete file or directory: [${CONF_PATH}/${file_name}]"
+ rm -rf ${CONF_PATH}/${file_name}
+ fi
+ if test -e "${DIR}/../conf/${file_name}";then
+ LOG INFO "Copy from ${DIR}/../conf/${file_name}"
+ cp -R ${DIR}/../conf/${file_name} ${CONF_PATH}/
+ fi
+}
+
+mkdir_p(){
+ if [ ${SAFE_MODE} == true ]; then
+ check_exist $1 false
+ fi
+ if [ ! -d $1 ]; then
+ LOG INFO "Creating directory: ["$1"]."
+ #mkdir -p $1
+ if [ ${SUDO_USER} == true ]; then
+ sudo mkdir -p $1 && sudo chown -R ${USER} $1
+ else
+ mkdir -p $1
+ fi
+ fi
+}
+
+while [ 1 ]; do
+ case ${!OPTIND} in
+ --server)
+ SERVER_NAME=$2
+ shift 2
+ ;;
+ --unsafe)
+ SAFE_MODE=false
+ shift 1
+ ;;
+ --safe)
+ SAFE_MODE=true
+ shift 1
+ ;;
+ --help|-h)
+ usage
+ exit 0
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+is_sudo_user
+if [ $? == 0 ]; then
+ SUDO_USER=true
+fi
+
+BIN=`abs_path`
+SERVER_NAME_SIMPLE=${SERVER_NAME/flinkx-/}
+
+LOG_PATH=${BIN}/../logs
+if [ "x${BASE_LOG_DIR}" != "x" ]; then
+ LOG_PATH=${BASE_LOG_DIR}/${SERVER_NAME_SIMPLE}
+ sed -ri "s![#]?(WEB_LOG_PATH=)\S*!\1${LOG_PATH}!g" ${ENV_FILE_PATH}
+fi
+
+CONF_PATH=${BIN}/../conf
+if [ "x${BASE_CONF_DIR}" != "x" ]; then
+ CONF_PATH=${BASE_CONF_DIR}/${SERVER_NAME_SIMPLE}
+ sed -ri "s![#]?(WEB_CONF_PATH=)\S*!\1${CONF_PATH}!g" ${ENV_FILE_PATH}
+fi
+
+DATA_PATH=${BIN}/../data
+if [ "x${BASE_DATA_DIR}" != "x" ]; then
+ DATA_PATH=${BASE_DATA_DIR}/${SERVER_NAME_SIMPLE}
+ sed -ri "s![#]?(DATA_PATH=)\S*!\1${DATA_PATH}!g" ${ENV_FILE_PATH}
+fi
+
+echo "Start to make directory"
+# Start to make directory
+LOG INFO "\033[1m Start to build directory\033[0m"
+mkdir_p ${LOG_PATH}
+mkdir_p ${CONF_PATH}
+mkdir_p ${DATA_PATH}
+if [ "x${BASE_CONF_DIR}" != "x" ]; then
+ LOG INFO "\033[1m Start to copy configuration file/directory\033[0m"
+ # Copy the configuration file
+ copy_replace bootstrap.properties
+ copy_replace application.yml
+ copy_replace logback.xml
+ copy_replace i18n
+ copy_replace mybatis-mapper
+ copy_replace static
+fi
+echo "end to make directory"
+
+
+BOOTSTRAP_PROP_FILE="${CONF_PATH}/bootstrap.properties"
+# Start to initalize database
+echo "Start to initalize database"
+if [ "x${SQL_SOURCE_PATH}" != "x" ] && [ -f "${SQL_SOURCE_PATH}" ]; then
+ `mysql --version >/dev/null 2>&1`
+ if [ $? == 0 ]; then
+ LOG INFO "\033[1m Scan out mysql command, so begin to initalize the database\033[0m"
+ interact_echo "Do you want to initalize database with sql: [${SQL_SOURCE_PATH}]?"
+ if [ $? == 0 ]; then
+ read -p "Please input the db host(default: 127.0.0.1): " HOST
+ if [ "x${HOST}" == "x" ]; then
+ HOST="127.0.0.1"
+ fi
+ while [ 1 ]; do
+ read -p "Please input the db port(default: 3306): " PORT
+ if [ "x${PORT}" == "x" ]; then
+ PORT=3306
+ break
+ elif [ ${PORT} -gt 0 ] 2>/dev/null; then
+ break
+ else
+ echo "${PORT} is not a number, please input again"
+ fi
+ done
+ read -p "Please input the db username(default: root): " USERNAME
+ if [ "x${USERNAME}" == "x" ]; then
+ USERNAME="root"
+ fi
+ read -p "Please input the db password(default: ""): " PASSWORD
+ read -p "Please input the db name(default: flinkxweb)" DATABASE
+ if [ "x${DATABASE}" == "x" ]; then
+ DATABASE="flinkxweb"
+ fi
+ mysql -h ${HOST} -P ${PORT} -u ${USERNAME} -p${PASSWORD} --default-character-set=utf8 -e \
+ "CREATE DATABASE IF NOT EXISTS ${DATABASE}; USE ${DATABASE}; source ${SQL_SOURCE_PATH};"
+ sed -ri "s![#]?(DB_HOST=)\S*!\1${HOST}!g" ${BOOTSTRAP_PROP_FILE}
+ sed -ri "s![#]?(DB_PORT=)\S*!\1${PORT}!g" ${BOOTSTRAP_PROP_FILE}
+ sed -ri "s![#]?(DB_USERNAME=)\S*!\1${USERNAME}!g" ${BOOTSTRAP_PROP_FILE}
+ sed -ri "s![#]?(DB_PASSWORD=)\S*!\1${PASSWORD}!g" ${BOOTSTRAP_PROP_FILE}
+ sed -ri "s![#]?(DB_DATABASE=)\S*!\1${DATABASE}!g" ${BOOTSTRAP_PROP_FILE}
+ fi
+ fi
+fi
diff --git a/czsj-admin/src/main/java/com/czsj/bin/datax.py b/czsj-admin/src/main/java/com/czsj/bin/datax.py
new file mode 100644
index 0000000..d09c968
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/datax.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+
+import sys
+import os
+import signal
+import subprocess
+import time
+import re
+import socket
+import json
+from optparse import OptionParser
+from optparse import OptionGroup
+from string import Template
+import codecs
+import platform
+
+def printCopyright():
+ print '''
+LarkMidTable (%s), From LarkMidTable !
+LarkMidTable All Rights Reserved.
+
+'''
+ sys.stdout.flush()
+
+if __name__ == "__main__":
+ printCopyright()
+ abs_file=sys.path[0]
+ json_file=sys.argv[1]
+ log_name=sys.argv[2]
+ startCommand = "java -server -Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\datax/log -Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\datax/log -Dloglevel=info -Dfile.encoding=UTF-8 -Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener -Djava.security.egd=file:///dev/urandom -Ddatax.home=E:\datax -Dlogback.configurationFile=E:\datax/conf/logback.xml -classpath E:\datax/lib/* -Dlog.file.name=8e8e5f7d4cd0fd5_json com.alibaba.datax.core.Engine -mode standalone -jobid -1 -job %s > %s" %(json_file,log_name)
+ print startCommand
+ child_process = subprocess.Popen(startCommand, shell=True)
+ (stdout, stderr) = child_process.communicate()
+
+ sys.exit(child_process.returncode)
\ No newline at end of file
diff --git a/czsj-admin/src/main/java/com/czsj/bin/env.properties b/czsj-admin/src/main/java/com/czsj/bin/env.properties
new file mode 100644
index 0000000..688c864
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/env.properties
@@ -0,0 +1,21 @@
+# environment variables
+
+#JAVA_HOME=""
+
+WEB_LOG_PATH=${BIN}/../logs
+WEB_CONF_PATH=${BIN}/../conf
+
+DATA_PATH=${BIN}/../data
+SERVER_PORT=8080
+
+#PID_FILE_PATH=${BIN}/flinkxadmin.pid
+
+
+# mail account
+MAIL_USERNAME=""
+MAIL_PASSWORD=""
+
+
+#debug
+#REMOTE_DEBUG_SWITCH=true
+#REMOTE_DEBUG_PORT=7003
\ No newline at end of file
diff --git a/czsj-admin/src/main/java/com/czsj/bin/flinkx-local.sh b/czsj-admin/src/main/java/com/czsj/bin/flinkx-local.sh
new file mode 100644
index 0000000..94e30b1
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/flinkx-local.sh
@@ -0,0 +1 @@
+sh ./bin/flinkx -mode local -jobType sync -job ./job/stream.json -flinkxDistDir ./flinkx-dist -flinkConfDir ./flinkconf
diff --git a/czsj-admin/src/main/java/com/czsj/bin/flinkx-python3x.py b/czsj-admin/src/main/java/com/czsj/bin/flinkx-python3x.py
new file mode 100644
index 0000000..6562229
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/flinkx-python3x.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+
+import sys
+import os
+import signal
+import subprocess
+import time
+import re
+import socket
+import json
+from optparse import OptionParser
+from optparse import OptionGroup
+from string import Template
+import codecs
+import platform
+
+def printCopyright():
+ print ('''
+LarkMidTable (%s), From LarkMidTable !
+LarkMidTable All Rights Reserved.
+
+''')
+ sys.stdout.flush()
+
+if __name__ == "__main__":
+ printCopyright()
+ abs_file=sys.path[0]
+ json_file=sys.argv[1]
+ log_name=sys.argv[2]
+ startCommand = "java -cp %s/lib/* com.dtstack.flinkx.client.Launcher -mode local -jobType sync -job %s -flinkxDistDir %s/flinkx-dist -flinkConfDir %s/flinkconf > %s/%s" %(abs_file,json_file,abs_file,abs_file,abs_file,log_name)
+ print(startCommand)
+ child_process = subprocess.Popen(startCommand, shell=True)
+ (stdout, stderr) = child_process.communicate()
+
+ sys.exit(child_process.returncode)
diff --git a/czsj-admin/src/main/java/com/czsj/bin/flinkx.py b/czsj-admin/src/main/java/com/czsj/bin/flinkx.py
new file mode 100644
index 0000000..8ce8f45
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/bin/flinkx.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# -*- coding:utf-8 -*-
+
+import sys
+import os
+import signal
+import subprocess
+import time
+import re
+import socket
+import json
+from optparse import OptionParser
+from optparse import OptionGroup
+from string import Template
+import codecs
+import platform
+
+def printCopyright():
+ print '''
+LarkMidTable (%s), From LarkMidTable !
+LarkMidTable All Rights Reserved.
+
+'''
+ sys.stdout.flush()
+
+if __name__ == "__main__":
+ printCopyright()
+ abs_file=sys.path[0]
+ json_file=sys.argv[1]
+ log_name=sys.argv[2]
+ startCommand = "java -cp %s/lib/* com.dtstack.flinkx.client.Launcher -mode local -jobType sync -job %s -flinkxDistDir %s/flinkx-dist -flinkConfDir %s/flinkconf > %s" %(abs_file,json_file,abs_file,abs_file,log_name)
+ print startCommand
+ child_process = subprocess.Popen(startCommand, shell=True)
+ (stdout, stderr) = child_process.communicate()
+
+ sys.exit(child_process.returncode)
diff --git a/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseController.java b/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseController.java
new file mode 100644
index 0000000..d945ba4
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseController.java
@@ -0,0 +1,148 @@
+package com.czsj.web.controller.bigdata;
+
+import com.baomidou.mybatisplus.extension.api.ApiController;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ruoshui.common.constant.HttpStatus;
+import com.ruoshui.common.core.domain.AjaxResult;
+import com.ruoshui.common.core.domain.model.LoginUser;
+import com.ruoshui.common.core.page.PageDomain;
+import com.ruoshui.common.core.page.TableDataInfo;
+import com.ruoshui.common.core.page.TableSupport;
+import com.ruoshui.common.utils.DateUtils;
+import com.ruoshui.common.utils.PageUtils;
+import com.ruoshui.common.utils.SecurityUtils;
+import com.ruoshui.common.utils.StringUtils;
+import com.ruoshui.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 ruoshui
+ */
+public class BaseController extends ApiController
+{
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ /**
+ * 将前台传递过来的日期格式的字符串,自动转化为Date类型
+ */
+ @InitBinder
+ public void initBinder(WebDataBinder binder)
+ {
+ // Date 类型转换
+ binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
+ {
+ @Override
+ public void setAsText(String text)
+ {
+ setValue(DateUtils.parseDate(text));
+ }
+ });
+ }
+
+ /**
+ * 设置请求分页数据
+ */
+ protected void startPage()
+ {
+ PageUtils.startPage();
+ }
+
+ /**
+ * 设置请求排序数据
+ */
+ protected void startOrderBy()
+ {
+ PageDomain pageDomain = TableSupport.buildPageRequest();
+ if (StringUtils.isNotEmpty(pageDomain.getOrderBy()))
+ {
+ String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
+ PageHelper.orderBy(orderBy);
+ }
+ }
+
+ /**
+ * 清理分页的线程变量
+ */
+ protected void clearPage()
+ {
+ PageUtils.clearPage();
+ }
+
+ /**
+ * 响应请求分页数据
+ */
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ protected 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;
+ }
+
+
+
+ /**
+ * 响应返回结果
+ *
+ * @param rows 影响行数
+ * @return 操作结果
+ */
+ protected AjaxResult toAjax(int rows)
+ {
+ return rows > 0 ? AjaxResult.success() : AjaxResult.error();
+ }
+
+
+ /**
+ * 页面跳转
+ */
+ public String redirect(String url)
+ {
+ return StringUtils.format("redirect:{}", url);
+ }
+
+ /**
+ * 获取用户缓存信息
+ */
+ public LoginUser getLoginUser()
+ {
+ return SecurityUtils.getLoginUser();
+ }
+
+ /**
+ * 获取登录用户id
+ */
+ public Long getUserId()
+ {
+ return getLoginUser().getUserId();
+ }
+
+ /**
+ * 获取登录部门id
+ */
+ public Long getDeptId()
+ {
+ return getLoginUser().getDeptId();
+ }
+
+ /**
+ * 获取登录用户名
+ */
+ public String getUsername()
+ {
+ return getLoginUser().getUsername();
+ }
+}
diff --git a/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseForm.java b/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseForm.java
new file mode 100644
index 0000000..13e7f39
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseForm.java
@@ -0,0 +1,253 @@
+package com.czsj.web.controller.bigdata;
+
+import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoshui.bigdata.util.PageUtils;
+import com.ruoshui.bigdata.util.ServletUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.URLDecoder;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 基础参数辅助类
+ *
+ * @author zhouhongfa@gz-yibo.com
+ * @version 1.0
+ * @since 2019/5/15
+ */
+@Slf4j
+public class BaseForm {
+ /**
+ * 查询参数对象
+ */
+ protected Map values = new LinkedHashMap<>();
+
+ /**
+ * 当前页码
+ */
+ private Long current = 1L;
+
+ /**
+ * 页大小
+ */
+ private Long size = 10L;
+
+ /**
+ * 构造方法
+ */
+ public BaseForm() {
+ try {
+ HttpServletRequest request = ServletUtils.getRequest();
+ Enumeration params = request.getParameterNames();
+ while (params.hasMoreElements()) {
+ String name = params.nextElement();
+ String value = StrUtil.trim(request.getParameter(name));
+ this.set(name, URLDecoder.decode(value, "UTF-8"));
+ }
+ this.parsePagingQueryParams();
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("BaseControlForm initialize parameters setting error:" + e);
+ }
+ }
+
+ /**
+ * 获取页码
+ *
+ * @return
+ */
+ public Long getPageNo() {
+ String pageNum = StrUtil.toString(this.get("current"));
+ if (!StrUtil.isEmpty(pageNum) && NumberUtil.isNumber(pageNum)) {
+ this.current = Long.parseLong(pageNum);
+ }
+ return this.current;
+ }
+
+ /**
+ * 获取页大小
+ *
+ * @return
+ */
+ public Long getPageSize() {
+ String pageSize = StrUtil.toString(this.get("size"));
+
+ if (StrUtil.isNotEmpty(pageSize) && NumberUtil.isNumber(pageSize) && !"null".equalsIgnoreCase(pageSize)) {
+ this.size = Long.parseLong(pageSize);
+ }
+ return this.size;
+ }
+
+ /**
+ * 获得参数信息对象
+ *
+ * @return
+ */
+ public Map getParameters() {
+ return values;
+ }
+
+ /**
+ * 根据key获取values中的值
+ *
+ * @param name
+ * @return
+ */
+ public Object get(String name) {
+ if (values == null) {
+ values = new LinkedHashMap<>();
+ return null;
+ }
+ return this.values.get(name);
+ }
+
+ /**
+ * 根据key获取values中String类型值
+ *
+ * @param key
+ * @return String
+ */
+ public String getString(String key) {
+ return StrUtil.toString(get(key));
+ }
+
+ /**
+ * 获取排序字段
+ *
+ * @return
+ */
+ public String getSort() {
+ return StrUtil.toString(this.values.get("sort"));
+ }
+
+ /**
+ * 获取排序
+ *
+ * @return
+ */
+ public String getOrder() {
+ return StrUtil.toString(this.values.get("order"));
+ }
+
+ /**
+ * 获取排序
+ *
+ * @return
+ */
+ public String getOrderby() {
+ return StrUtil.toString(this.values.get("orderby"));
+ }
+
+ /**
+ * 解析出mybatis plus分页查询参数
+ */
+ public Page getPlusPagingQueryEntity() {
+ Page page = new Page();
+ //如果无current,默认返回1000条数据
+ page.setCurrent(this.getPageNo());
+ page.setSize(this.getPageSize());
+ if (ObjectUtil.isNotNull(this.get("ifCount"))) {
+ page.setSearchCount(BooleanUtil.toBoolean(this.getString("ifCount")));
+ } else {
+ //默认给true
+ page.setSearchCount(true);
+ }
+ return page;
+ }
+
+ /**
+ * 解析分页排序参数(pageHelper)
+ */
+ public void parsePagingQueryParams() {
+ // 排序字段解析
+ String orderBy = StrUtil.toString(this.get("orderby")).trim();
+ String sortName = StrUtil.toString(this.get("sort")).trim();
+ String sortOrder = StrUtil.toString(this.get("order")).trim().toLowerCase();
+
+ if (StrUtil.isEmpty(orderBy) && !StrUtil.isEmpty(sortName)) {
+ if (!sortOrder.equals("asc") && !sortOrder.equals("desc")) {
+ sortOrder = "asc";
+ }
+ this.set("orderby", sortName + " " + sortOrder);
+ }
+ }
+
+
+ /**
+ * 设置参数
+ *
+ * @param name 参数名称
+ * @param value 参数值
+ */
+ public void set(String name, Object value) {
+ if (ObjectUtil.isNotNull(value)) {
+ this.values.put(name, value);
+ }
+ }
+
+ /**
+ * 移除参数
+ *
+ * @param name
+ */
+ public void remove(String name) {
+ this.values.remove(name);
+ }
+
+ /**
+ * 清除所有参数
+ */
+ public void clear() {
+ if (values != null) {
+ values.clear();
+ }
+ }
+
+
+ /**
+ * 自定义查询组装
+ *
+ * @param map
+ * @return
+ */
+ protected QueryWrapper> pageQueryWrapperCustom(Map map, QueryWrapper> queryWrapper) {
+ // mybatis plus 分页相关的参数
+ Map pageParams = PageUtils.filterPageParams(map);
+ //过滤空值,分页查询相关的参数
+ Map colQueryMap = PageUtils.filterColumnQueryParams(map);
+ //排序 操作
+ pageParams.forEach((k, v) -> {
+ switch (k) {
+ case "ascs":
+ queryWrapper.orderByAsc(StrUtil.toUnderlineCase(StrUtil.toString(v)));
+ break;
+ case "descs":
+ queryWrapper.orderByDesc(StrUtil.toUnderlineCase(StrUtil.toString(v)));
+ break;
+ }
+ });
+
+ //遍历进行字段查询条件组装
+ colQueryMap.forEach((k, v) -> {
+ switch (k) {
+ case "pluginName":
+ case "datasourceName":
+ queryWrapper.like(StrUtil.toUnderlineCase(k), v);
+ break;
+ default:
+ queryWrapper.eq(StrUtil.toUnderlineCase(k), v);
+ }
+ });
+
+ return queryWrapper;
+ }
+
+}
\ No newline at end of file
diff --git a/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseResourceController.java b/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseResourceController.java
new file mode 100644
index 0000000..262056b
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/web/controller/bigdata/BaseResourceController.java
@@ -0,0 +1,94 @@
+package com.czsj.web.controller.bigdata;
+
+import com.ruoshui.bigdata.entity.BaseResource;
+import com.ruoshui.bigdata.mapper.BaseResourceMapper;
+import com.ruoshui.bigdata.util.AESUtil;
+import com.ruoshui.core.biz.model.ReturnT;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/base/resource")
+@Api(tags = "基础建设-资源管理")
+public class BaseResourceController {
+
+ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ @Autowired
+ private BaseResourceMapper baseResourceMapper;
+
+ @ApiOperation("获取所有数据")
+ @GetMapping("/list")
+ @PreAuthorize("@ss.hasPermi('datax:resource:list')")
+ public ReturnT