commit 03d1baaac78656d956254b7f688d96fdfa56d0cd Author: depp_yan Date: Sat Apr 20 16:05:10 2024 +0800 . diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..999dedb --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# ---> Java +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # + +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +target +classes +.idea diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7971930 --- /dev/null +++ b/LICENSE @@ -0,0 +1,83 @@ +アトリビューション—シェアアライク 2.1 +(帰属—同一条件許諾) +クリエイティブ・コモンズ及びクリエイティブ・コモンズ・ジャパンは法律事務所ではありません。この利用許諾条項の頒布は法的アドバイスその他の法律業務を行うものではありません。クリエイティブ・コモンズ及びクリエイティブ・コモンズ・ジャパンは、この利用許諾の当事者ではなく、ここに提供する情報及び本作品に関しいかなる保証も行いません。クリエイティブ・コモンズ及びクリエイティブ・コモンズ・ジャパンは、いかなる法令に基づこうとも、あなた又はいかなる第三者の損害(この利用許諾に関連する通常損害、特別損害を含みますがこれらに限られません)について責任を負いません。 + +利用許諾 + +本作品(下記に定義する)は、このクリエイティブ・コモンズ・パブリック・ライセンス日本版(以下「この利用許諾」という)の条項の下で提供される。本作品は、著作権法及び/又は他の適用法によって保護される。本作品をこの利用許諾又は著作権法の下で授権された以外の方法で使用することを禁止する。 + +許諾者は、かかる条項をあなたが承諾することとひきかえに、ここに規定される権利をあなたに付与する。本作品に関し、この利用許諾の下で認められるいずれかの利用を行うことにより、あなたは、この利用許諾(条項)に拘束されることを承諾し同意したこととなる。 + +第1条 定義 + +この利用許諾中の用語を以下のように定義する。その他の用語は、著作権法その他の法令で定める意味を持つものとする。 + + a. 「二次的著作物」とは、著作物を翻訳し、編曲し、若しくは変形し、または脚色し、映画化し、その他翻案することにより創作した著作物をいう。ただし、編集著作物又はデータベースの著作物(以下、この二つを併せて「編集著作物等」という。)を構成する著作物は、二次的著作物とみなされない。また、原著作者及び実演家の名誉又は声望を害する方法で原著作物を改作、変形もしくは翻案して生じる著作物は、この利用許諾の目的においては、二次的著作物に含まれない。 + b. 「許諾者」とは、この利用許諾の条項の下で本作品を提供する個人又は団体をいう。 + c. 「あなた」とは、この利用許諾に基づく権利を行使する個人又は団体をいう。 + d. 「原著作者」とは、本作品に含まれる著作物を創作した個人又は団体をいう。 + e. 「本作品」とは、この利用許諾の条項に基づいて利用する権利が付与される対象たる無体物をいい、著作物、実演、レコード、放送にかかる音又は影像、もしくは有線放送にかかる音又は影像をすべて含むものとする。 + f. 「ライセンス要素」とは、許諾者が選択し、この利用許諾に表示されている、以下のライセンス属性をいう:帰属・同一条件許諾 + +第2条 著作権等に対する制限 + +この利用許諾に含まれるいかなる条項によっても、許諾者は、あなたが著作権の制限(著作権法第30条〜49条)、著作者人格権に対する制限(著作権法第18条2項〜4項、第19条2項〜4項、第20条2項)、著作隣接権に対する制限(著作権法第102条)その他、著作権法又はその他の適用法に基づいて認められることとなる本作品の利用を禁止しない。 + +第3条 ライセンスの付与 + +この利用許諾の条項に従い、許諾者はあなたに、本作品に関し、すべての国で、ロイヤリティ・フリー、非排他的で、(第7条bに定める期間)継続的な以下のライセンスを付与する。ただし、あなたが以前に本作品に関するこの利用許諾の条項に違反したことがないか、あるいは、以前にこの利用許諾の条項に違反したがこの利用許諾に基づく権利を行使するために許諾者から明示的な許可を得ている場合に限る。 + + a. 本作品に含まれる著作物(以下「本著作物」という。)を複製すること(編集著作物等に組み込み複製することを含む。以下、同じ。)、 + b. 本著作物を翻案して二次的著作物を創作し、複製すること、 + c. 本著作物又はその二次的著作物の複製物を頒布すること(譲渡または貸与により公衆に提供することを含む。以下同じ。)、上演すること、演奏すること、上映すること、公衆送信を行うこと(送信可能化を含む。以下、同じ。)、公に口述すること、公に展示すること、 + d. 本作品に含まれる実演を、録音・録画すること(録音・録画物を増製することを含む)、録音・録画物により頒布すること、公衆送信を行うこと、 + e. 本作品に含まれるレコードを、複製すること、頒布すること、公衆送信を行うこと、 + f. 本作品に含まれる、放送に係る音又は影像を、複製すること、その放送を受信して再放送すること又は有線放送すること、その放送又はこれを受信して行う有線放送を受信して送信可能化すること、そのテレビジョン放送又はこれを受信して行う有線放送を受信して、影像を拡大する特別の装置を用いて公に伝達すること、 + g. 本作品に含まれる、有線放送に係る音又は影像を、複製すること、その有線放送を受信して放送し、又は再有線放送すること、その有線放送を受信して送信可能化すること、その有線テレビジョン放送を受信して、影像を拡大する特別の装置を用いて公に伝達すること、 + +上記に定められた本作品又はその二次的著作物の利用は、現在及び将来のすべての媒体・形式で行うことができる。あなたは、他の媒体及び形式で本作品又はその二次的著作物を利用するのに技術的に必要な変更を行うことができる。許諾者は本作品又はその二次的著作物に関して、この利用許諾に従った利用については自己が有する著作者人格権及び実演家人格権を行使しない。許諾者によって明示的に付与されない全ての権利は、留保される。 + +第4条 受領者へのライセンス提供 + +あなたが本作品をこの利用許諾に基づいて利用する度毎に、許諾者は本作品又は本作品の二次的著作物の受領者に対して、直接、この利用許諾の下であなたに許可された利用許諾と同じ条件の本作品のライセンスを提供する。 + +第5条 制限 + +上記第3条及び第4条により付与されたライセンスは、以下の制限に明示的に従い、制約される。 + + a. あなたは、この利用許諾の条項に基づいてのみ、本作品を利用することができる。 + b. あなたは、この利用許諾又はこの利用許諾と同一のライセンス要素を含むほかのクリエイティブ・コモンズ・ライセンス(例えば、この利用許諾の新しいバージョン、又はこの利用許諾と同一のライセンス要素の他国籍ライセンスなど)に基づいてのみ、本作品の二次的著作物を利用することができる。 + c. あなたは、本作品を利用するときは、この利用許諾の写し又はURI(Uniform Resource Identifier)を本作品の複製物に添付又は表示しなければならない。 + d. あなたは、本作品の二次的著作物を利用するときは、この利用許諾又はこの利用許諾と同一のライセンス要素を含むほかのクリエイティブ・コモンズ・ライセンスの写し又はURIを本作品の二次的著作物の複製物に添付または表示しなければならない。 + e. あなたは、この利用許諾条項及びこの利用許諾によって付与される利用許諾受領者の権利の行使を変更又は制限するような、本作品又はその二次的著作物に係る条件を提案したり課したりしてはならない。 + f. あなたは、本作品を再利用許諾することができない。 + g. あなたは、本作品又はその二次的著作物の利用にあたって、この利用許諾及びその免責条項に関する注意書きの内容を変更せず、見やすい態様でそのまま掲載しなければならない。 + h. あなたは、この利用許諾条項と矛盾する方法で本著作物へのアクセス又は使用をコントロールするような技術的保護手段を用いて、本作品又はその二次的著作物を利用してはならない。 + i. 本条の制限は、本作品又はその二次的著作物が編集著作物等に組み込まれた場合にも、その組み込まれた作品に関しては適用される。しかし、本作品又はその二次的著作物が組み込まれた編集著作物等そのものは、この利用許諾の条項に従う必要はない。 + j. あなたは、本作品、その二次的著作物又は本作品を組み込んだ編集著作物等を利用する場合には、(1)本作品に係るすべての著作権表示をそのままにしておかなければならず、(2)原著作者及び実演家のクレジットを、合理的な方式で、(もし示されていれば原著作者及び実演家の名前又は変名を伝えることにより、)表示しなければならず、(3)本作品のタイトルが示されている場合には、そのタイトルを表示しなければならず、(4)許諾者が本作品に添付するよう指定したURIがあれば、合理的に実行可能な範囲で、そのURIを表示しなければならず(ただし、そのURIが本作品の著作権表示またはライセンス情報を参照するものでないときはこの限りでない。)(5)二次的著作物の場合には、当該二次的著作物中の原著作物の利用を示すクレジットを表示しなければならない。これらのクレジットは、合理的であればどんな方法でも行うことができる。しかしながら、二次的著作物又は編集著作物等の場合には、少なくとも他の同様の著作者のクレジットが表示される箇所で当該クレジットを表示し、少なくとも他の同様の著作者のクレジットと同程度に目立つ方法であることを要する。 + k. もし、あなたが、本作品の二次的著作物、又は本作品もしくはその二次的著作物を組み込んだ編集著作物等を創作した場合、あなたは、許諾者からの通知があれば、実行可能な範囲で、要求に応じて、二次的著作物又は編集著作物等から、許諾者又は原著作者への言及をすべて除去しなければならない。 + +第6条 責任制限 + +この利用許諾の両当事者が書面にて別途合意しない限り、許諾者は本作品を現状のまま提供するものとし、明示・黙示を問わず、本作品に関していかなる保証(特定の利用目的への適合性、第三者の権利の非侵害、欠陥の不存在を含むが、これに限られない。)もしない。 + +この利用許諾又はこの利用許諾に基づく本作品の利用から発生する、いかなる損害(許諾者が、本作品にかかる著作権、著作隣接権、著作者人格権、実演家人格権、商標権、パブリシティ権、不正競争防止法その他関連法規上保護される利益を有する者からの許諾を得ることなく本作品の利用許諾を行ったことにより発生する損害、プライバシー侵害又は名誉毀損から発生する損害等の通常損害、及び特別損害を含むが、これに限らない。)についても、許諾者に故意又は重大な過失がある場合を除き、許諾者がそのような損害発生の可能性を知らされたか否かを問わず、許諾者は、あなたに対し、これを賠償する責任を負わない。 + +第7条 終了 + + a. この利用許諾は、あなたがこの利用許諾の条項に違反すると自動的に終了する。しかし、本作品、その二次的著作物又は編集著作物等をあなたからこの利用許諾に基づき受領した第三者に対しては、その受領者がこの利用許諾を遵守している限り、この利用許諾は終了しない。第1条、第2条、第4条から第9条は、この利用許諾が終了してもなお有効に存続する。 + b. 上記aに定める場合を除き、この利用許諾に基づくライセンスは、本作品に含まれる著作権法上の権利が存続するかぎり継続する。 + c. 許諾者は、上記aおよびbに関わらず、いつでも、本作品をこの利用許諾に基づいて頒布することを将来に向かって中止することができる。ただし、許諾者がこの利用許諾に基づく頒布を将来に向かって中止した場合でも、この利用許諾に基づいてすでに本作品を受領した利用者に対しては、この利用許諾に基づいて過去及び将来に与えられるいかなるライセンスも終了することはない。また、上記によって終了しない限り、この利用許諾は、全面的に有効なものとして継続する。 + +第8条 その他 + + a. この利用許諾のいずれかの規定が、適用法の下で無効及び/又は執行不能の場合であっても、この利用許諾の他の条項の有効性及び執行可能性には影響しない。 + b. この利用許諾の条項の全部又は一部の放棄又はその違反に関する承諾は、これが書面にされ、当該放棄又は承諾に責任を負う当事者による署名又は記名押印がなされない限り、行うことができない。 + c. この利用許諾は、当事者が本作品に関して行った最終かつ唯一の合意の内容である。この利用許諾は、許諾者とあなたとの相互の書面による合意なく修正されない。 + d. この利用許諾は日本語により提供される。この利用許諾の英語その他の言語への翻訳は参照のためのものに過ぎず、この利用許諾の日本語版と翻訳との間に何らかの齟齬がある場合には日本語版が優先する。 + +第9条 準拠法 + +この利用許諾は、日本法に基づき解釈される。 + +本作品がクリエイティブ・コモンズ・ライセンスに基づき利用許諾されたことを公衆に示すという限定された目的の場合を除き、許諾者も被許諾者もクリエイティブ・コモンズの事前の書面による同意なしに「クリエイティブ・コモンズ」の商標若しくは関連商標又はクリエイティブ・コモンズのロゴを使用しないものとします。使用が許可された場合はクリエイティブ・コモンズおよびクリエイティブ・コモンズ・ジャパンのウェブサイト上に公表される、又はその他随時要求に従い利用可能となる、クリエイティブ・コモンズの当該時点における商標使用指針を遵守するものとします。クリエイティブ・コモンズは https://creativecommons.org/から、クリエイティブ・コモンズ・ジャパンはhttp://www.creativecommons.jp/から連絡することができます。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..dcfc380 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# usersvc-open + +usersvc-open \ No newline at end of file diff --git a/login.html b/login.html new file mode 100644 index 0000000..aefc4cf --- /dev/null +++ b/login.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + diff --git a/mhhy_framwork.iml b/mhhy_framwork.iml new file mode 100644 index 0000000..611538f --- /dev/null +++ b/mhhy_framwork.iml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/ospnBase.jar b/ospnBase.jar new file mode 100644 index 0000000..eb6eab1 Binary files /dev/null and b/ospnBase.jar differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..066f1dc --- /dev/null +++ b/pom.xml @@ -0,0 +1,153 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + com.test + usersvc + 0.0.3-SNAPSHOT + usersvc + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-cache + + + + org.apache.commons + commons-pool2 + + + org.springframework.boot + spring-boot-starter-data-redis + + + com.auth0 + java-jwt + 3.3.0 + + + + com.baomidou + mybatis-plus-boot-starter + 3.3.2 + + + + ospn-old + ospn-old + 1.7 + + + + mysql + mysql-connector-java + runtime + + + + io.springfox + springfox-swagger2 + 2.7.0 + + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.9.6 + + + + org.apache.commons + commons-lang3 + 3.8.1 + + + + com.alibaba + fastjson + 1.2.70 + + + + org.bouncycastle + bcprov-jdk15on + 1.69 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + + + + + dev + + true + + + dev + + + + test + + test + + + + prod + + prod + + + + diff --git a/src/main/java/com/mhhy/MhhyFramworkApplication.java b/src/main/java/com/mhhy/MhhyFramworkApplication.java new file mode 100644 index 0000000..a92b99d --- /dev/null +++ b/src/main/java/com/mhhy/MhhyFramworkApplication.java @@ -0,0 +1,15 @@ +package com.mhhy; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan("com.mhhy.mapper") +public class MhhyFramworkApplication { + + public static void main(String[] args) { + SpringApplication.run(MhhyFramworkApplication.class, args); + } + +} diff --git a/src/main/java/com/mhhy/SpringContextHolder.java b/src/main/java/com/mhhy/SpringContextHolder.java new file mode 100644 index 0000000..04ffea2 --- /dev/null +++ b/src/main/java/com/mhhy/SpringContextHolder.java @@ -0,0 +1,64 @@ +package com.mhhy; + +import org.springframework.beans.factory.DisposableBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +@Component +@Lazy(false) +public class SpringContextHolder implements ApplicationContextAware, DisposableBean { + + private static ApplicationContext applicationContext = null; + + + /** + * 取得存储在静态变量中的ApplicationContext. + */ + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) { + return (T) applicationContext.getBean(name); + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(Class requiredType) { + return applicationContext.getBean(requiredType); + } + + public static T getBean(String name, Class clazz) { + return getApplicationContext().getBean(name, clazz); + } + + /** + * 清除SpringContextHolder中的ApplicationContext为Null. + */ + public static void clearHolder() { + applicationContext = null; + } + + /** + * 实现ApplicationContextAware接口, 注入Context到静态变量中. + */ + @Override + public void setApplicationContext(ApplicationContext appContext) { + applicationContext = appContext; + } + + /** + * 实现DisposableBean接口, 在Context关闭时清理静态变量. + */ + @Override + public void destroy() { + SpringContextHolder.clearHolder(); + } +} \ No newline at end of file diff --git a/src/main/java/com/mhhy/annotation/Login.java b/src/main/java/com/mhhy/annotation/Login.java new file mode 100644 index 0000000..62c6b61 --- /dev/null +++ b/src/main/java/com/mhhy/annotation/Login.java @@ -0,0 +1,18 @@ +package com.mhhy.annotation; + +import java.lang.annotation.*; + +/** + * 用于标记接口登录、参数解密,标记的非加密接口必须登录 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Login { + + //该接口是否加密 + boolean encrypted() default false; + + //AES解密密钥,在encrypted为true时有效,若不指定,则从当前token中获取 + String key() default ""; +} diff --git a/src/main/java/com/mhhy/common/BasePageReq.java b/src/main/java/com/mhhy/common/BasePageReq.java new file mode 100644 index 0000000..cbd910e --- /dev/null +++ b/src/main/java/com/mhhy/common/BasePageReq.java @@ -0,0 +1,31 @@ +package com.mhhy.common; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class BasePageReq { + + //最后一条数据的id + //private int lastId; + + //分页页码,从1开始 + @ApiModelProperty(value = "分页页码,从1开始") + private int page = 1; + + //分页大小,默认10 + @ApiModelProperty(value = "分页大小,默认10") + private int size = 10; + + //获取page对象,用于mybatis-plus + public IPage getIPage() { + return new Page<>(page, size).setSearchCount(false); + } + + //获取offset,用于手动处理sql + public int getOffset() { + return page > 1 ? page * size - size : 0; + } +} diff --git a/src/main/java/com/mhhy/common/BaseResult.java b/src/main/java/com/mhhy/common/BaseResult.java new file mode 100644 index 0000000..3865f01 --- /dev/null +++ b/src/main/java/com/mhhy/common/BaseResult.java @@ -0,0 +1,85 @@ +package com.mhhy.common; + +import com.mhhy.util.Aes128Util; +import com.mhhy.util.PasswordUtil; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.RequestUtil; +import com.ospn.common.OsnUtils; +import lombok.Data; + +import static com.mhhy.service.impl.LoginServiceImpl.conversationFlag; + +@Data +//@Builder +public class BaseResult { + + private int code = 200; + + private String msg = "Success"; + + private long timeMillis = System.currentTimeMillis(); + + private Object data; + + public BaseResult() { + } + + public BaseResult(Object data) { + int mainUserId = RequestUtil.getMainUserId(); + String conversationId = RedisUtil.get(conversationFlag + mainUserId); + byte[] sha256Str = PasswordUtil.getSHA256Str(conversationId); + data = Aes128Util.AESEncode(data.toString(), sha256Str); + this.data = data; + } + + public BaseResult(String data, String key) { + //byte[] sha256Str = PasswordUtil.decodeBase64(key); + System.out.println("[BaseResult success] key:" + key); + this.data = OsnUtils.aesEncrypt(data, key); + //this.data = Aes128Util.AESEncode(data.toString(), sha256Str); + } + + public BaseResult(Object data, String key, int type) { + if (type == 1){ + byte[] sha256Str = PasswordUtil.getSHA256Str(key); + this.data = Aes128Util.AESEncode(data.toString(), sha256Str); + } else if (type == 0) { + byte[] sha256Str = PasswordUtil.decodeBase64(key); + this.data = Aes128Util.AESEncode(data.toString(), sha256Str); + } + } + + public BaseResult(int code, Object data) { + this.code = code; + this.data = data; + } + + + + public BaseResult(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public static BaseResult success(String msg) { + return new BaseResult<>(200, msg); + } + + public static BaseResult success(int code, Object msg) { + return new BaseResult<>(200, msg); + } + + + + + + public static BaseResult success() { + return new BaseResult<>(200, "success"); + } + + + public static BaseResult err(String msg) { + return new BaseResult<>(500, msg); + } + +} diff --git a/src/main/java/com/mhhy/config/jwt/JwtConfig.java b/src/main/java/com/mhhy/config/jwt/JwtConfig.java new file mode 100644 index 0000000..05be1f7 --- /dev/null +++ b/src/main/java/com/mhhy/config/jwt/JwtConfig.java @@ -0,0 +1,18 @@ +package com.mhhy.config.jwt; + +import com.auth0.jwt.algorithms.Algorithm; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.UnsupportedEncodingException; + +@Configuration +public class JwtConfig { + + public static final String JWT_SECRET = "mhhy2022"; + + @Bean + public Algorithm algorithm() throws UnsupportedEncodingException { + return Algorithm.HMAC256(JWT_SECRET); + } +} diff --git a/src/main/java/com/mhhy/config/redis/CacheKeyGenerator.java b/src/main/java/com/mhhy/config/redis/CacheKeyGenerator.java new file mode 100644 index 0000000..fc69128 --- /dev/null +++ b/src/main/java/com/mhhy/config/redis/CacheKeyGenerator.java @@ -0,0 +1,25 @@ +package com.mhhy.config.redis; + +import com.mhhy.util.Md5Util; +import org.springframework.cache.interceptor.KeyGenerator; + +import java.lang.reflect.Method; + +public class CacheKeyGenerator implements KeyGenerator { + + @Override + public Object generate(Object target, Method method, Object... params) { + String className = target.getClass().getName(); + String methodName = method.getName(); + StringBuilder builder = new StringBuilder(); + //builder.append(className).append("&"); + //builder.append(methodName).append("&"); + if (params.length > 0) { + int i = 0; + while (i < params.length) { + builder.append(params[i++].toString()).append("&"); + } + } + return className + ":" + methodName + ":" + Md5Util.md5(builder.toString()); + } +} diff --git a/src/main/java/com/mhhy/config/redis/OdcCacheManager.java b/src/main/java/com/mhhy/config/redis/OdcCacheManager.java new file mode 100644 index 0000000..bb00db5 --- /dev/null +++ b/src/main/java/com/mhhy/config/redis/OdcCacheManager.java @@ -0,0 +1,27 @@ +package com.mhhy.config.redis; + +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; + +import java.time.Duration; + +public class OdcCacheManager extends RedisCacheManager { + + private static final String SEPARATOR = "#"; + + public OdcCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration config) { + super(cacheWriter, config); + } + + @Override + protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { + String[] values = name.split(SEPARATOR); + if (values.length > 1) { + long second = Long.parseLong(values[1]); + cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(second)); + } + return super.createRedisCache(name, cacheConfig); + } +} diff --git a/src/main/java/com/mhhy/config/redis/RedisConfig.java b/src/main/java/com/mhhy/config/redis/RedisConfig.java new file mode 100644 index 0000000..815732a --- /dev/null +++ b/src/main/java/com/mhhy/config/redis/RedisConfig.java @@ -0,0 +1,44 @@ +package com.mhhy.config.redis; + +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +import java.time.Duration; + +@EnableCaching +@Configuration +public class RedisConfig { + + //默认过期时间,1 min + private final static int EXPIRATION_SECOND = 20; + + public final static String KEY_GENERATOR_NAME = "odcKeyGenerator"; + + public final static String CACHE_KEY = "vexCache"; + + @Bean + public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) { + RedisSerializationContext.SerializationPair valuePair = + RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()); + + RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofSeconds(EXPIRATION_SECOND)) + .serializeValuesWith(valuePair) + .disableCachingNullValues(); + return new OdcCacheManager(redisCacheWriter, config); + } + + @Bean(value = KEY_GENERATOR_NAME) + public KeyGenerator keyGenerator() { + return new CacheKeyGenerator(); + } +} diff --git a/src/main/java/com/mhhy/config/redis/RedisListenerConfig.java b/src/main/java/com/mhhy/config/redis/RedisListenerConfig.java new file mode 100644 index 0000000..41e657a --- /dev/null +++ b/src/main/java/com/mhhy/config/redis/RedisListenerConfig.java @@ -0,0 +1,16 @@ +package com.mhhy.config.redis; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +@Configuration +public class RedisListenerConfig { + @Bean + RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + return container; + } +} \ No newline at end of file diff --git a/src/main/java/com/mhhy/config/web/LocaleConfig.java b/src/main/java/com/mhhy/config/web/LocaleConfig.java new file mode 100644 index 0000000..b76f17d --- /dev/null +++ b/src/main/java/com/mhhy/config/web/LocaleConfig.java @@ -0,0 +1,30 @@ +package com.mhhy.config.web; + +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; + +import java.util.Locale; + +@Configuration +public class LocaleConfig { + + @Bean + public LocaleResolver localeResolver() { + AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver(); + localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE); + return localeResolver; + } + + @Bean + public MessageSource messageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.setBasename("classpath:/i18n/messages"); + messageSource.setDefaultEncoding("UTF-8"); + messageSource.setCacheSeconds(60); + return messageSource; + } +} diff --git a/src/main/java/com/mhhy/config/web/OdcResponseBodyAdvice.java b/src/main/java/com/mhhy/config/web/OdcResponseBodyAdvice.java new file mode 100644 index 0000000..3cec271 --- /dev/null +++ b/src/main/java/com/mhhy/config/web/OdcResponseBodyAdvice.java @@ -0,0 +1,29 @@ +package com.mhhy.config.web; + +import com.mhhy.common.BaseResult; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +import java.lang.reflect.Method; + +//@Configuration +//@RestControllerAdvice +public class OdcResponseBodyAdvice implements ResponseBodyAdvice { + @Override + public boolean supports(MethodParameter methodParameter, Class aClass) { + Method method = methodParameter.getMethod(); + return method != null + && !method.getDeclaringClass().getPackage().getName().startsWith("springfox"); + } + + @Override + public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { + if (body instanceof BaseResult) { + return body; + } + return new BaseResult<>(body); + } +} diff --git a/src/main/java/com/mhhy/config/web/RestTemplateConfig.java b/src/main/java/com/mhhy/config/web/RestTemplateConfig.java new file mode 100644 index 0000000..68e25bc --- /dev/null +++ b/src/main/java/com/mhhy/config/web/RestTemplateConfig.java @@ -0,0 +1,28 @@ +package com.mhhy.config.web; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.util.Arrays; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { + MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); + jacksonConverter.setSupportedMediaTypes( + Arrays.asList( + MediaType.APPLICATION_JSON, + MediaType.TEXT_HTML + )); + + RestTemplate restTemplate = restTemplateBuilder.build(); + restTemplate.getMessageConverters().add(jacksonConverter); + return restTemplate; + } +} diff --git a/src/main/java/com/mhhy/config/web/WebConfig.java b/src/main/java/com/mhhy/config/web/WebConfig.java new file mode 100644 index 0000000..9f29e22 --- /dev/null +++ b/src/main/java/com/mhhy/config/web/WebConfig.java @@ -0,0 +1,76 @@ +package com.mhhy.config.web; + + + +import com.mhhy.interceptor.AuthInterceptor; +import com.mhhy.resolver.DecodeArgumentResolver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.List; + +@Configuration +public class WebConfig extends WebMvcConfigurationSupport { + + @Autowired + private AuthInterceptor authInterceptor; + + @Autowired + private DecodeArgumentResolver decodeArgumentResolver; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authInterceptor).addPathPatterns("/api/**"); + } + + @Bean + public HttpMessageConverters httpMessageConverters() { + return new HttpMessageConverters( + Arrays.asList( + new StringHttpMessageConverter(Charset.forName("UTF-8")), + //new FastJsonHttpMessageConverter(), + new MappingJackson2HttpMessageConverter()) + ); + } + +// //不可用 +// @Bean +// public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { +// return m -> { +// m.serializerByType(BaseEnum.class, BaseEnumSerializer.getInstance()); +// m.serializerByType(BigDecimal.class, CoinNumSerializer.getInstance()); +// }; +// } + + @Override + public void addArgumentResolvers(List argumentResolvers) { + argumentResolvers.add(decodeArgumentResolver); + } + + //@Override + //protected void addFormatters(FormatterRegistry registry) { + // //super.addFormatters(registry); + // registry.addConverterFactory(new EnumTypeConverterFactory()); + //} + + @Override + protected void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/static/**") + .addResourceLocations("classpath:/static/"); + registry.addResourceHandler("doc.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + super.addResourceHandlers(registry); + } +} diff --git a/src/main/java/com/mhhy/controller/AdminController.java b/src/main/java/com/mhhy/controller/AdminController.java new file mode 100644 index 0000000..9a50f52 --- /dev/null +++ b/src/main/java/com/mhhy/controller/AdminController.java @@ -0,0 +1,315 @@ +package com.mhhy.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mhhy.common.BaseResult; +import com.mhhy.enums.UserStateEnum; +import com.mhhy.enums.UserTypeEnum; +import com.mhhy.model.entity.AdminEntity; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.model.req.*; +import com.mhhy.model.resp.LoginResp; +import com.mhhy.model.struct.LoginResult; +import com.mhhy.service.*; +import com.mhhy.util.RandomUtil; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.RequestUtil; +import com.mhhy.util.token.JwtUtil; +import com.ospn.command.CmdReDappLogin; +import com.ospn.data.DappData; +import io.swagger.annotations.ApiOperation; +import lombok.AccessLevel; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("api/admin") +@CrossOrigin(origins = "*") +@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class AdminController { + + + @Autowired + UserService userService; + + @Autowired + AdminService adminService; + + @Autowired + LoginService loginService; + + @Autowired + LtpServer ltpServer; + + + @PostMapping("/register") + @CrossOrigin(origins = "*") + @ApiOperation(value = "注册", response = RegisterReq.class) + public BaseResult register(@RequestBody RegisterReq req) { + + + String username = req.getUsername(); + String password = req.getPassword(); + int level = req.getLevel(); + + UserEntity userEntity = userService.findAdmin(username); + + if (userEntity != null) { + return BaseResult.err("user existed."); + } + + userEntity = new UserEntity(); + userEntity.setState(level); + userEntity.setUsername(username); + userEntity.setPassword(password); + + // 存入db + boolean result = false; + + /*if (level == 1) { + result = adminService.createAdmin(username, password); + } else if (level == 2) { + result = adminService.createCustomer(username, password); + }*/ + result = userService.save(userEntity); + + if (result) { + return BaseResult.success(200, "success."); + } else { + return BaseResult.err("register error."); + } + } + + + @PostMapping("/login") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult login(@RequestBody LoginReq req) { + + //RequestUtil.getMainUser(); + + String username = req.getUsername(); + + UserEntity userEntity = userService.getOne( + new LambdaQueryWrapper() + .eq(UserEntity::getUsername, username)); + if (userEntity == null) { + return BaseResult.err("no user"); + } + + if (!userEntity.getPassword().equalsIgnoreCase(req.getPassword())) { + return BaseResult.err("password error."); + } + + //LoginResult result = new LoginResult(userEntity, loginService.getConfig(), ltpServer.getAppId()); + JSONObject result = new JSONObject(); + result.put("level", userEntity.getState()); + return BaseResult.success(200, result); + } + + + @PostMapping("/modifyAdminPwd") + @CrossOrigin(origins = "*") + @ApiOperation(value = "modify admin password", response = RegisterReq.class) + public BaseResult modifyAdminPwd(@RequestBody RegisterReq req) { + + String username = req.getUsername(); + String password = req.getPassword(); + + UserEntity adminEntity = userService.findAdmin(username); + if (adminEntity == null) { + return BaseResult.err("user not exist."); + } + adminEntity.setPassword(password); + + if (!userService.updateById(adminEntity)) { + return BaseResult.err("update password failed."); + } + + return BaseResult.success(200, "success."); + } + + + @PostMapping("/listAdmin") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult listAdmin(@RequestBody FindUserReq req) { + + int page = req.getPage(); + int limit = req.getLimit(); + + + List list = userService.listAdmin(page, limit); + JSONObject result = new JSONObject(); + result.put("list", list); + + int count = userService.count(new LambdaQueryWrapper().eq(UserEntity::getState, 2)); + result.put("count", count); + /*int fixPage = 0; + if (count%limit > 0) { + fixPage ++; + } + result.put("page", count/limit + fixPage);*/ + result.put("page", page); + + return BaseResult.success(200, result); + } + + + @PostMapping("/listUser") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult listUser(@RequestBody FindUserReq req) { + + int page = req.getPage(); + int limit = req.getLimit(); + String project = req.getProject(); + + List list = userService.listUser(page, limit, project); + JSONObject result = new JSONObject(); + result.put("list", list); + + int count = userService.count(new LambdaQueryWrapper().eq(UserEntity::getProject, project)); + result.put("count", count); + /*int fixPage = 0; + if (count%limit > 0) { + fixPage ++; + } + result.put("page", count/limit + fixPage);*/ + result.put("page", page); + + return BaseResult.success(200, result); + } + + @PostMapping("/disableUser") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult disableUser(@RequestBody FindUserReq req) { + + String username = req.getOsnId(); + + if (loginService.disableOrEnableUser(username, false)) { + UserEntity userEntity = userService.getUser(username); + if (userEntity != null) { + userEntity.setState(0); + userService.updateById(userEntity); + } + return BaseResult.success(200, "success."); + } + + return BaseResult.err("failed."); + } + + @PostMapping("/enableUser") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult enableUser(@RequestBody FindUserReq req) { + + String username = req.getOsnId(); + + if (loginService.disableOrEnableUser(username, true)) { + UserEntity userEntity = userService.getUser(username); + if (userEntity != null) { + userEntity.setState(1); + userService.updateById(userEntity); + } + return BaseResult.success(200, "success."); + } + + return BaseResult.err("failed."); + } + + @PostMapping("/query") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult query(@RequestBody FindUserReq req) { + + String username = req.getOsnId(); + JSONObject result = new JSONObject(); + UserEntity userEntity = userService.getUser(username); + if (userEntity != null) { + List list = new ArrayList<>(); + list.add(userEntity); + + result.put("list", list); + result.put("count", 1); + result.put("page", 1); + + return BaseResult.success(200, result); + } + + return BaseResult.err("failed."); + } + + + @PostMapping("/genDappInfo") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult genDappInfo(@RequestBody ReqBase req) { + + + DappData dappData = new DappData(); + dappData.url = req.getUrl(); + dappData.name = ltpServer.ltpData.dappInfo.name; + dappData.portrait = ltpServer.ltpData.dappInfo.portrait; + dappData.theme = ltpServer.ltpData.dappInfo.theme; + dappData.osnID = ltpServer.ltpData.apps.osnID; + + JSONObject result = dappData.toClientJsonNoParam(ltpServer.ltpData.apps.osnKey); + + return BaseResult.success(200, result); + } + + + @PostMapping("/flushUser") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult flushUser(@RequestBody FindUserReq req) { + + String osnId = req.getOsnId(); + if (osnId == null) { + return BaseResult.err("failed."); + } + + ltpServer.getUserInfo(osnId); + + return BaseResult.success(); + + } + + @PostMapping("/flushGroup") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult flushGroup(@RequestBody FindUserReq req) { + + String osnId = req.getOsnId(); + if (osnId == null) { + return BaseResult.err("failed."); + } + + ltpServer.getGroupInfo(osnId); + + return BaseResult.success(); + + } + + @PostMapping("/delete-user") + @CrossOrigin(origins = "*") + @ApiOperation(value = "代理商删除", response = LoginResp.class) + public BaseResult deleteUser(@RequestBody UserEntity user) { + UserEntity userEntity = userService.getOne(new LambdaQueryWrapper().eq(UserEntity::getUsername, user.getUsername())); + if (userEntity != null) { + if (!userService.removeById(userEntity.getId())) { + return BaseResult.err("delete failed."); + } + } + return BaseResult.success(); + } +} diff --git a/src/main/java/com/mhhy/controller/AppVersionEntityController.java b/src/main/java/com/mhhy/controller/AppVersionEntityController.java new file mode 100644 index 0000000..69b229c --- /dev/null +++ b/src/main/java/com/mhhy/controller/AppVersionEntityController.java @@ -0,0 +1,132 @@ +package com.mhhy.controller; + +import com.alibaba.fastjson.JSONObject; +import com.mhhy.common.BaseResult; +import com.mhhy.model.entity.AppVersionEntity; +import com.mhhy.model.req.FindAppVersionReq; +import com.mhhy.model.resp.LoginResp; +import com.mhhy.service.AppVersionEntityService; +import io.swagger.annotations.ApiOperation; +import lombok.AccessLevel; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +@RestController +@RequestMapping("api/im") +@CrossOrigin(origins = "*") +@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class AppVersionEntityController { + + AppVersionEntityService appVersionEntityService; + + @PostMapping("/list") + @CrossOrigin(origins = "*") + @ApiOperation(value = "版本信息分页查询", response = LoginResp.class) + public BaseResult list(@RequestBody FindAppVersionReq req) { + + int page = req.getPage(); + int limit = req.getLimit(); + + + List list = appVersionEntityService.listAppVersion(page, limit); + JSONObject result = new JSONObject(); + result.put("list", list); + + int count = appVersionEntityService.count(); + result.put("count", count); + result.put("page", page); + + return BaseResult.success(200, result); + } + + @PostMapping("/list-version") + @CrossOrigin(origins = "*") + @ApiOperation(value = "版本信息条件分页查询", response = LoginResp.class) + public BaseResult listVersion(@RequestBody FindAppVersionReq req) { + + int page = req.getPage(); + int limit = req.getLimit(); + + + List list = appVersionEntityService.listAppVersionUser(page, limit, req.getUser()); + JSONObject result = new JSONObject(); + result.put("list", list); + + int count = appVersionEntityService.count(); + result.put("count", count); + result.put("page", page); + + return BaseResult.success(200, result); + } + + + @GetMapping("/all") + @CrossOrigin(origins = "*") + @ApiOperation(value = "查询全部版本信息", response = LoginResp.class) + public BaseResult allVersion() { + + List list = appVersionEntityService.listAppVersionAll(); + JSONObject result = new JSONObject(); + result.put("data", list); + + return BaseResult.success(200, result); + } + + @PostMapping("/get-app-version") + @CrossOrigin(origins = "*") + @ApiOperation(value = "查询user版本信息", response = LoginResp.class) + public BaseResult getVersionUser() { + + AppVersionEntity list = appVersionEntityService.getUser(); + JSONObject result = new JSONObject(); + result.put("data", list); + + return BaseResult.success(200, result); + } + + + @PostMapping("/delete") + @CrossOrigin(origins = "*") + @ApiOperation(value = "删除user版本信息", response = LoginResp.class) + public BaseResult delete(@RequestBody FindAppVersionReq req) { + + AppVersionEntity appVersionEntity = appVersionEntityService.getById(req.getId()); + appVersionEntity.setIsShow(1); + appVersionEntityService.save(appVersionEntity); + return BaseResult.success(); + } + + + @PostMapping("/update") + @CrossOrigin(origins = "*") + @ApiOperation(value = "更新user版本信息", response = LoginResp.class) + public BaseResult update(@RequestBody AppVersionEntity req) { + + AppVersionEntity appVersionEntity = appVersionEntityService.getById(req.getId()); + appVersionEntity.setIsShow(1); + req.setUpdateTime(new Date()); + appVersionEntityService.save(appVersionEntity); + return BaseResult.success(); + } + + + @PostMapping("/add") + @CrossOrigin(origins = "*") + @ApiOperation(value = "新增user版本信息", response = LoginResp.class) + public BaseResult add(@RequestBody AppVersionEntity req) { + + req.setCreateTime(new Date()); + req.setUpdateTime(new Date()); + req.setState(2); + req.setIsShow(0); + if (!appVersionEntityService.save(req)){ + return BaseResult.err("add failed."); + } + return BaseResult.success(); + } + +} diff --git a/src/main/java/com/mhhy/controller/CustomerController.java b/src/main/java/com/mhhy/controller/CustomerController.java new file mode 100644 index 0000000..a8c9d26 --- /dev/null +++ b/src/main/java/com/mhhy/controller/CustomerController.java @@ -0,0 +1,62 @@ +package com.mhhy.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhhy.common.BaseResult; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.model.req.CustomerReq; +import com.mhhy.model.req.LoginReq; +import com.mhhy.model.resp.LoginResp; +import com.mhhy.service.CustomerService; +import io.swagger.annotations.ApiOperation; +import lombok.AccessLevel; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("api/customer") +@CrossOrigin(origins = "*") +@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class CustomerController { + + @Autowired + CustomerService customerService; + + @PostMapping("/add") + @CrossOrigin(origins = "*") + @ApiOperation(value = "add", response = LoginResp.class) + public BaseResult add(@RequestBody CustomerReq req) { + + if (!customerService.addObj(req.getName(), req.getPortrait(), req.getOsnId(), req.getProject()) ) { + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "success."); + } + + @PostMapping("/list") + @CrossOrigin(origins = "*") + @ApiOperation(value = "list", response = LoginResp.class) + public BaseResult list(@RequestBody CustomerReq req) { + + List list = customerService.listByProject(req.getProject()); + + return BaseResult.success(200, list); + } + + @PostMapping("/del") + @CrossOrigin(origins = "*") + @ApiOperation(value = "del", response = LoginResp.class) + public BaseResult del(@RequestBody CustomerReq req) { + + if (!customerService.deleteObj(req.getOsnId(), req.getProject())){ + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "login success."); + } + + +} diff --git a/src/main/java/com/mhhy/controller/GroupController.java b/src/main/java/com/mhhy/controller/GroupController.java new file mode 100644 index 0000000..b610b1e --- /dev/null +++ b/src/main/java/com/mhhy/controller/GroupController.java @@ -0,0 +1,60 @@ +package com.mhhy.controller; + + +import com.mhhy.common.BaseResult; +import com.mhhy.model.req.CustomerReq; +import com.mhhy.model.resp.LoginResp; +import com.mhhy.service.GroupService; +import io.swagger.annotations.ApiOperation; +import lombok.AccessLevel; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("api/group") +@CrossOrigin(origins = "*") +@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class GroupController { + + @Autowired + GroupService groupService; + + @PostMapping("/add") + @CrossOrigin(origins = "*") + @ApiOperation(value = "add", response = LoginResp.class) + public BaseResult add(@RequestBody CustomerReq req) { + + if (!groupService.addObj(req.getName(), req.getPortrait(), req.getOsnId(), req.getProject()) ) { + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "success."); + } + + @PostMapping("/list") + @CrossOrigin(origins = "*") + @ApiOperation(value = "list", response = LoginResp.class) + public BaseResult list(@RequestBody CustomerReq req) { + + List list = groupService.listByProject(req.getProject()); + + return BaseResult.success(200, list); + } + + @PostMapping("/del") + @CrossOrigin(origins = "*") + @ApiOperation(value = "del", response = LoginResp.class) + public BaseResult del(@RequestBody CustomerReq req) { + + if (!groupService.deleteObj(req.getOsnId(), req.getProject())){ + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "login success."); + } + + +} diff --git a/src/main/java/com/mhhy/controller/ImController.java b/src/main/java/com/mhhy/controller/ImController.java new file mode 100644 index 0000000..274ddec --- /dev/null +++ b/src/main/java/com/mhhy/controller/ImController.java @@ -0,0 +1,17 @@ +package com.mhhy.controller; + +import lombok.AccessLevel; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("api/im") +@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class ImController { + + + + +} diff --git a/src/main/java/com/mhhy/controller/LoginController.java b/src/main/java/com/mhhy/controller/LoginController.java new file mode 100644 index 0000000..f31b5bb --- /dev/null +++ b/src/main/java/com/mhhy/controller/LoginController.java @@ -0,0 +1,465 @@ +package com.mhhy.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mhhy.common.BaseResult; +import com.mhhy.enums.UserStateEnum; +import com.mhhy.enums.UserTypeEnum; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.model.req.DappRequest; +import com.mhhy.model.req.LoginReq; +import com.mhhy.model.req.RegisterReq; +import com.mhhy.model.req.UpdatePasswdReq; +import com.mhhy.model.resp.LoginResp; +import com.mhhy.model.struct.LoginResult; +import com.mhhy.service.LoginService; +import com.mhhy.service.LtpServer; +import com.mhhy.service.ProjectConfigService; +import com.mhhy.service.UserService; +import com.mhhy.util.RandomUtil; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.token.JwtUtil; +import com.ospn.command.CmdReDappLogin; +import com.ospn.common.ECUtils; +import com.ospn.data.DappData; +import io.swagger.annotations.ApiOperation; +import lombok.AccessLevel; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; + +import java.util.Base64; +import java.util.Date; +import java.util.UUID; + +@RestController +@CrossOrigin(origins = "*") +@RequestMapping("api/login") +@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class LoginController { + + @Autowired + LoginService loginService; + + @Autowired + UserService userService; + + @Autowired + ProjectConfigService configService; + + + @Autowired + LtpServer ltpServer; + + + + @PostMapping("/login") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult login(@RequestBody LoginReq req){ + return loginService.login(req); + } + + + + + @ApiOperation("dapp login") + @CrossOrigin(origins = "*") + @PostMapping("/dappLogin") + public JSONObject dappLogin(@RequestBody DappRequest cmd) { + //log.info("传递的参数是:{}", cmd); + + JSONObject ret = null; + if (cmd.command.equalsIgnoreCase("GetServerInfo")) { + + // key: dapp_session_user + String session = RedisUtil.get("dapp_session_" + cmd.user); + + if (session != null) { + // 返回数据 + ret = ltpServer.ltpData.getServerInfo(cmd.getCmdGetServerInfo(session)); + } else { + ret = ltpServer.ltpData.getServerInfo(cmd.getCmdGetServerInfo()); + session = ret.getString("session"); + RedisUtil.setEx("dapp_session_" + cmd.user, session, 60); + } + + } else if (cmd.command.equalsIgnoreCase("Login")) { + + CmdReDappLogin cmdRe = null; + try { + + UserEntity userEntity = userService.getOne( + new QueryWrapper() + .eq("im_id", cmd.user) + ); + if (userEntity != null){ + cmdRe.setError("1007:no user"); + return cmdRe.toJson(); + } + + String session = RedisUtil.get("dapp_session_" + cmd.user); + if (session == null) { + // 没有session,返回错误信息 + cmdRe = new CmdReDappLogin(); + cmdRe.setError("1001:need session"); + return cmdRe.toJson(); + } + + + cmdRe = ltpServer.ltpData.login(cmd.getCmdDappLogin(session)); + + if (cmdRe.errCode.equalsIgnoreCase("0:success")) { + + // 增加sessionKey + // 生成jwtToken + + + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + String token = JwtUtil.createJwtToken(userEntity.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(userEntity.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(userEntity.getId(), token); + JSONObject tokenJson = new JSONObject(); + // TODO 生成通讯密钥拼接在token后面用中竖线隔开,小程序端需要用中划线分割出token + tokenJson.put("token", token); + tokenJson.put("communicationKey", randomToInviteCode); + // log.info("-------token-------" + tokenJson.get("token")); + //将通讯密钥存入redis + RedisUtil.set("Communicationkey:"+cmd.user, randomToInviteCode); + + cmdRe.addSessionKey(cmd.user, tokenJson.toString().getBytes()); + + return cmdRe.toJson(); + + } else { + ret = cmdRe.toJson(); + } + + + return cmdRe.toJson(); + + + } catch (Exception e) { + cmdRe.setError("1006:exception"); + } + } + + return ret; + } + + + + + + + + @PostMapping("/register2") + @CrossOrigin(origins = "*") + @ApiOperation(value = "注册", response = LoginResp.class) + public BaseResult register2(@RequestBody RegisterReq req){ + + String key = req.getKey(); + if (!loginService.getRegisterKey().equals(key)) { + return BaseResult.err("register key error."); + } + + + + String username = req.getAccount(); + String password = req.getPassword(); + + String osnId1 = userService.findUser(username); + + if (osnId1 != null) { + return BaseResult.err("user existed."); + } + + String[] keyPair =loginService.createAccount(); + String privateKey = "VER2-" + keyPair[1] + "-" + keyPair[2]; + + // 存入db + UserEntity userEntity = new UserEntity(); + userEntity.setUsername(username); + userEntity.setPassword(password); + userEntity.setType(UserTypeEnum.NORMAL.getCode()); + userEntity.setState(UserStateEnum.NORMAL.getCode()); + userEntity.setCreateTime(new Date()); + userEntity.setImNode(loginService.getHostIp()); + userEntity.setImId(keyPair[0]); + userEntity.setImUsername(keyPair[0]); + userEntity.setImPwd(privateKey); + userEntity.setProject(req.getProject()); + try { + userService.save(userEntity); + } catch (Exception e) { + e.printStackTrace(); + return BaseResult.err("exception."); + } + + // 返回成功 + return BaseResult.success(200,"success."); + + } + + + + @PostMapping("/getChallenge") + @CrossOrigin(origins = "*") + @ApiOperation(value = "获取登录的随机数", response = LoginResp.class) + public BaseResult getChallenge(@RequestBody RegisterReq req){ + return loginService.getChallenge(req.getUsername()); + } + + + + + + private JSONObject createAccount() { + + try { + String username = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + String password = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + + RegisterReq req1 = new RegisterReq(); + req1.setUsername(username); + req1.setPassword(password); + + JSONObject result = loginService.register3(req1); + if (result != null) { + result.put("username", username); + result.put("password", password); + return result; + } + + } catch (Exception e) { + System.out.println(e.getMessage()); + } + + return null; + } + + + + + @PostMapping("/login3") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult loginByMnemonic(@RequestBody LoginReq req){ + + try { + System.out.print("[loginByMnemonic] login begin.\n"); + System.out.print("[loginByMnemonic] req : " + req); + + String project = req.getInvite(); + if (project == null) { + return BaseResult.err("no project"); + } + JSONObject config = configService.getConfig(project); + if (config == null) { + return BaseResult.err("no config"); + } + + String user = req.getUser(); + + // 从user 表中查找 + UserEntity userEntity = userService.getUser(user); + if (userEntity == null) { + // 进入注册环节 + userEntity = loginService.register6(user, null, project); + } + + if (userEntity == null) { + System.out.print("[loginByMnemonic] login failed."); + return BaseResult.err("create user failed."); + } + + // 返回数据 + + + JSONObject result = new JSONObject(); + //result.put("osn_node", config.getString("HOST_IP")); + + String token = JwtUtil.createJwtToken(userEntity.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(userEntity.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(userEntity.getId(), token); + + result.put("token", token); + result.put("language", "en"); + // 新增修复 + config = configService.getConfig(userEntity.getProject()); + result.put("json", config); + result.put("osn_node", userEntity.getImNode()); + + + return BaseResult.success(200, result); + } catch (Exception e) { + e.printStackTrace(); + } + + return BaseResult.err("Exception."); + + } + + @PostMapping("/loginByMnemonic2") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult loginByMnemonic2(@RequestBody LoginReq req){ + + System.out.print("[loginByMnemonic2] login begin."); + + JSONObject config = loginService.getConfig(); + if (config == null) { + return BaseResult.err("no config"); + } + + String user = req.getUser(); + + // 从user 表中查找 + UserEntity userEntity = userService.getUser(user); + if (userEntity == null) { + // 进入注册环节 + userEntity = loginService.register6(user, null, null); + } + + if (userEntity == null) { + System.out.print("[loginByMnemonic] login failed."); + return BaseResult.err(""); + } + + // 返回数据 + + + JSONObject result = new JSONObject(); + result.put("osn_node", config.getString("HOST_IP")); + + String token = JwtUtil.createJwtToken(userEntity.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(userEntity.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(userEntity.getId(), token); + + result.put("token", token); + result.put("language", "en"); + result.put("json", config); + + + return BaseResult.success(200, result); + } + + @PostMapping("/login2") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult login2(@RequestBody LoginReq req){ + + String username = req.getAccount(); + + UserEntity userEntity = userService.getOne( + new LambdaQueryWrapper() + .eq(UserEntity::getUsername, username)); + if (userEntity == null) { + return BaseResult.err("no user"); + } + + if (!userEntity.getPassword().equalsIgnoreCase(req.getPassword())) { + return BaseResult.err("password error."); + } + + LoginResult result = new LoginResult(userEntity, loginService.getConfig(), ltpServer.getAppId()); + + return BaseResult.success(200, result); + } + + + + @GetMapping("/generateDappInfo") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public JSONObject generateDappInfo(@RequestBody LoginReq req){ + + String url = req.getUrl(); + return generateDappInfo(url, null, null); + } + + private JSONObject generateDappInfo(String url, String name, String portrait) { + + try { + String[] keyPair = ECUtils.createOsnID("service"); + + DappData dappData = new DappData(); + dappData.url = url; + dappData.osnID = keyPair[0]; + dappData.name = name; + dappData.portrait = portrait; + + return dappData.toClientJsonNoParam(keyPair[1]); + } catch (Exception e) { + + } + + return null; + } + + + @PostMapping("/createConfigInfo") + @CrossOrigin(origins = "*") + @ApiOperation(value = "登录", response = LoginResp.class) + public BaseResult createConfigInfo(@RequestBody LoginReq req){ + + String url = req.getUrl(); + String project = req.getProject(); + + /** + * config 格式 + * json + * HOST_IP: 8.219.11.57 + * ENDPOINT: https://oss-ap-southeast-1.aliyuncs.com + * AccessKeyId: LTAI5tE1VjrLkUhQisYmYJEc + * AccessKeySecret: FxAfo6vhJCcyQ4RHKz9hGG97RVL9Ta + * BUCKETNAME: imx1-default + * UserPortraitDirectory: portrait/ + * GroupPortraitDirectory: portrait/ + * TempDirectory: temp/ + * WEBRTCBASE: webrtc://103.163.46.118:1985/live/android/ + * WEBRTCHOST: http://103.163.46.118:1985 + * */ + + try { + JSONObject config = loginService.getConfig(); + + JSONObject mainDapp = generateDappInfo(url, null, null); + String base64Str = Base64.getEncoder().encodeToString(mainDapp.toJSONString().getBytes()); + config.put("MainDapp", base64Str); + + String configString = Base64.getEncoder().encodeToString(config.toJSONString().getBytes()); + + // 将config 存入数据库 + if (configService.getConfig(project) == null) { + configService.setConfig(project, configString); + } else { + // update + configService.updateConfig(project, configString); + } + return BaseResult.success(200, config); + } catch (Exception e) { + e.printStackTrace(); + } + + return BaseResult.err("error."); + } + + + + @PostMapping("/updatePass") + @CrossOrigin(origins = "*") + @ApiOperation(value = "修改密码", response = UpdatePasswdReq.class) + public BaseResult updatePass(@RequestBody UpdatePasswdReq req){ + return BaseResult.success(200, userService.updatePassword(req.getUsername(), req.getPassword(), req.getOldPassword())); + } + +} diff --git a/src/main/java/com/mhhy/controller/ProjectController.java b/src/main/java/com/mhhy/controller/ProjectController.java new file mode 100644 index 0000000..3c9b4e2 --- /dev/null +++ b/src/main/java/com/mhhy/controller/ProjectController.java @@ -0,0 +1,146 @@ +package com.mhhy.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhhy.common.BaseResult; +import com.mhhy.model.entity.ProjectConfigEntity; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.model.req.CustomerReq; +import com.mhhy.model.req.FindUserReq; +import com.mhhy.model.req.ProjectReq; +import com.mhhy.model.resp.LoginResp; +import com.mhhy.service.GroupService; +import com.mhhy.service.ProjectConfigService; +import io.swagger.annotations.ApiOperation; +import lombok.AccessLevel; +import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("api/project") +@CrossOrigin(origins = "*") +@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class ProjectController { + + @Autowired + ProjectConfigService projectService; + + @PostMapping("/add") + @CrossOrigin(origins = "*") + @ApiOperation(value = "add", response = LoginResp.class) + public BaseResult add(@RequestBody ProjectReq req) { + + if (!projectService.setConfig(req.getProject(), req.getConfig(), req.getConfig2()) ) { + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "success."); + } + +// @PostMapping("/list") +// @CrossOrigin(origins = "*") +// @ApiOperation(value = "list", response = LoginResp.class) +// public BaseResult list(@RequestBody ProjectReq req) { +// +// List list = projectService.listConfig(); +// +// return BaseResult.success(200, list); +// } + + @PostMapping("/list") + @CrossOrigin(origins = "*") + @ApiOperation(value = "list", response = LoginResp.class) + public BaseResult list(@RequestBody FindUserReq req) { + + int page = req.getPage(); + int limit = req.getLimit(); + + List list = projectService.listProject(page, limit); + JSONObject result = new JSONObject(); + result.put("list", list); + + int count = projectService.count(); + result.put("count", count); + /*int fixPage = 0; + if (count%limit > 0) { + fixPage ++; + } + result.put("page", count/limit + fixPage);*/ + result.put("page", page); + + return BaseResult.success(200, result); + } + + @PostMapping("/update1") + @CrossOrigin(origins = "*") + @ApiOperation(value = "del", response = LoginResp.class) + public BaseResult updateConfig1(@RequestBody ProjectReq req) { + + if (!projectService.updateConfig(req.getProject(), req.getConfig())){ + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "login success."); + } + + + @PostMapping("/update2") + @CrossOrigin(origins = "*") + @ApiOperation(value = "del", response = LoginResp.class) + public BaseResult updateConfig2(@RequestBody ProjectReq req) { + + if (!projectService.updateConfig2(req.getProject(), req.getConfig())){ + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "login success."); + } + + @PostMapping("/del") + @CrossOrigin(origins = "*") + @ApiOperation(value = "del", response = LoginResp.class) + public BaseResult deleteConfig(@RequestBody ProjectReq req) { + + if (!projectService.deleteConfig(req.getProject())) { + return BaseResult.err("failed."); + } + + return BaseResult.success(200, "delete success."); + } + + @PostMapping("/getDapp") + @CrossOrigin(origins = "*") + @ApiOperation(value = "getDapp", response = LoginResp.class) + public BaseResult getDapp(@RequestBody ProjectReq req) { + + String dappInfo = projectService.getDappInfo(req.getProject()); + if (dappInfo == null) { + return BaseResult.err("failed."); + } + + return BaseResult.success(200, dappInfo); + } + + @PostMapping("/query-config") + @CrossOrigin(origins = "*") + @ApiOperation(value = "queryConfig", response = LoginResp.class) + public BaseResult queryConfig(@RequestBody ProjectReq req) { + List projectConfigEntities; + if (!StringUtils.isEmpty(req.getProject())){ + projectConfigEntities = projectService.listProjectConfig(req.getProject()); + }else { + return BaseResult.err("project not exist."); + } + if (projectConfigEntities == null) { + return BaseResult.err("failed."); + } + + return BaseResult.success(200, projectConfigEntities); + } + +} diff --git a/src/main/java/com/mhhy/enums/BaseEnum.java b/src/main/java/com/mhhy/enums/BaseEnum.java new file mode 100644 index 0000000..1c7237c --- /dev/null +++ b/src/main/java/com/mhhy/enums/BaseEnum.java @@ -0,0 +1,12 @@ +package com.mhhy.enums; + +public interface BaseEnum { + + int getEnumCode(); + + //BaseEnum valueOf(int enumCode); + + default String i18nKey() { + return null; + } +} diff --git a/src/main/java/com/mhhy/enums/EnumTypeConverterFactory.java b/src/main/java/com/mhhy/enums/EnumTypeConverterFactory.java new file mode 100644 index 0000000..2fc524f --- /dev/null +++ b/src/main/java/com/mhhy/enums/EnumTypeConverterFactory.java @@ -0,0 +1,44 @@ +package com.mhhy.enums; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterFactory; + +import java.util.HashMap; +import java.util.Map; + +public class EnumTypeConverterFactory implements ConverterFactory { + + private static final Map converterMap = new HashMap<>(); + + @Override + public Converter getConverter(Class targetType) { + Converter result = converterMap.get(targetType); + if (result == null) { + result = new IntegerStrToEnum(targetType); + converterMap.put(targetType, result); + } + return result; + } + + private class IntegerStrToEnum implements Converter { + private final Class enumType; + private Map enumMap = new HashMap<>(); + + public IntegerStrToEnum(Class enumType) { + this.enumType = enumType; + T[] enums = enumType.getEnumConstants(); + for (T e : enums) { + enumMap.put(e.getEnumCode() + "", e); + } + } + + @Override + public T convert(String source) { + T result = enumMap.get(source); + if (result == null) { + //throw new IllegalArgumentException("No element matches " + source); + } + return result; + } + } +} diff --git a/src/main/java/com/mhhy/enums/ResultCodeEnum.java b/src/main/java/com/mhhy/enums/ResultCodeEnum.java new file mode 100644 index 0000000..632be3e --- /dev/null +++ b/src/main/java/com/mhhy/enums/ResultCodeEnum.java @@ -0,0 +1,39 @@ +package com.mhhy.enums; + +public enum ResultCodeEnum { + + SUCCESS(0, "success"),//请求成功 + BAD_REQUEST(400, "错误请求"),//错误请求 + UN_AUTHORIZATION(401, "请登录"),//该钱包已在其他设备登录 + NOT_REPEAT_SEND_SMS(402, "请勿重发短信"), + SERVER_EXCEPTION(500, "网络异常"),//网络异常 + BALANCE_NOT_ENOUGH(600, "余额不足"),//网络异常 + PAY_ORDER(700, "支付失败"),//网络异常 + DATA_ORDER(800, "数据异常"),//网络异常 + + ACCOUNT_ALREADY(1000, "user already exist"), + PASSWORD_ERROR(1001, "wrong password"), + ACCOUNT_NOT_EXIST(1002, "User not exist"), + IM_REGISTER_FAILED(1003, "register im account failed."), + DB_ERROR(1004, "db error."), + ; + + + + + private final int code; + private final String remark; + + ResultCodeEnum(int code, String remark) { + this.code = code; + this.remark = remark; + } + + public int getCode() { + return code; + } + + public String getRemark() { + return remark; + } +} diff --git a/src/main/java/com/mhhy/enums/UserStateEnum.java b/src/main/java/com/mhhy/enums/UserStateEnum.java new file mode 100644 index 0000000..04ded48 --- /dev/null +++ b/src/main/java/com/mhhy/enums/UserStateEnum.java @@ -0,0 +1,28 @@ +package com.mhhy.enums; + +public enum UserStateEnum { + + ENABLE(0, "未启用"), + NORMAL(1, "正常"), + DISABLE(2, "禁用") + ; + + + + + private final int code; + private final String remark; + + UserStateEnum(int code, String remark) { + this.code = code; + this.remark = remark; + } + + public int getCode() { + return code; + } + + public String getRemark() { + return remark; + } +} diff --git a/src/main/java/com/mhhy/enums/UserTypeEnum.java b/src/main/java/com/mhhy/enums/UserTypeEnum.java new file mode 100644 index 0000000..a1f49f9 --- /dev/null +++ b/src/main/java/com/mhhy/enums/UserTypeEnum.java @@ -0,0 +1,28 @@ +package com.mhhy.enums; + +public enum UserTypeEnum { + + ADMIN(1, "管理员"), + CUSTOMER(2, "客服"), + NORMAL(3, "普通用户") + ; + + + + + private final int code; + private final String remark; + + UserTypeEnum(int code, String remark) { + this.code = code; + this.remark = remark; + } + + public int getCode() { + return code; + } + + public String getRemark() { + return remark; + } +} diff --git a/src/main/java/com/mhhy/exception/CheckException.java b/src/main/java/com/mhhy/exception/CheckException.java new file mode 100644 index 0000000..edc49ef --- /dev/null +++ b/src/main/java/com/mhhy/exception/CheckException.java @@ -0,0 +1,22 @@ +package com.mhhy.exception; + +public class CheckException extends RuntimeException { + public CheckException() { + } + + public CheckException(String message) { + super(message); + } + + public CheckException(String message, Throwable cause) { + super(message, cause); + } + + public CheckException(Throwable cause) { + super(cause); + } + + public CheckException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/com/mhhy/exception/ErrorHandler.java b/src/main/java/com/mhhy/exception/ErrorHandler.java new file mode 100644 index 0000000..7b5ecbd --- /dev/null +++ b/src/main/java/com/mhhy/exception/ErrorHandler.java @@ -0,0 +1,52 @@ +package com.mhhy.exception; + + + +import com.mhhy.common.BaseResult; +import com.mhhy.enums.ResultCodeEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Map; + +@Slf4j +@ControllerAdvice +public class ErrorHandler { + + @ResponseBody + @ExceptionHandler(RuntimeException.class) + public BaseResult handleRuntimeException(RuntimeException e) { + e.printStackTrace(); + ResultCodeEnum resultCodeEnum = ResultCodeEnum.SERVER_EXCEPTION; + return new BaseResult<>(resultCodeEnum.getCode(), resultCodeEnum.getRemark()); + } + + @ResponseBody + @ExceptionHandler(OdcException.class) + public BaseResult handleException(OdcException e) { + //log.debug("{}: {}, {}", e.getCode(), e.getResultCodeEnum().getRemark(), e.getOtherInfo()); + //String resultEnumMsg = MessageUtil.getResultMsg(e.getCode()); + BaseResult> result = new BaseResult<>(e.getCode(), e.getMessage()); + result.setData(e.getOtherInfo()); + return result; + } + + @ResponseBody + @ExceptionHandler(IllegalArgumentException.class) + public BaseResult handleException(IllegalArgumentException e) { + e.printStackTrace(); + int code = ResultCodeEnum.BAD_REQUEST.getCode(); + return new BaseResult<>(code, e.getMessage()); + } + + @ResponseBody + @ExceptionHandler(MethodArgumentNotValidException.class) + public BaseResult handleException(MethodArgumentNotValidException e) { + e.printStackTrace(); + int code = ResultCodeEnum.BAD_REQUEST.getCode(); + return new BaseResult<>(code, e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + } +} diff --git a/src/main/java/com/mhhy/exception/OdcException.java b/src/main/java/com/mhhy/exception/OdcException.java new file mode 100644 index 0000000..a3eecb8 --- /dev/null +++ b/src/main/java/com/mhhy/exception/OdcException.java @@ -0,0 +1,36 @@ +package com.mhhy.exception; + +import com.mhhy.enums.ResultCodeEnum; +import lombok.Data; + +import java.util.Map; + +@Data +public class OdcException extends RuntimeException { + + private int code; + + private ResultCodeEnum resultCodeEnum; + + private Map otherInfo; + + public OdcException(ResultCodeEnum codeEnum) { + super(codeEnum.getRemark()); + code = codeEnum.getCode(); + resultCodeEnum = codeEnum; + } + + public OdcException(ResultCodeEnum codeEnum, Map otherInfo) { + super(codeEnum.getRemark()); + this.code = codeEnum.getCode(); + this.otherInfo = otherInfo; + } + + public int getCode() { + return code; + } + + public ResultCodeEnum getResultCodeEnum() { + return resultCodeEnum; + } +} \ No newline at end of file diff --git a/src/main/java/com/mhhy/interceptor/AuthInterceptor.java b/src/main/java/com/mhhy/interceptor/AuthInterceptor.java new file mode 100644 index 0000000..05fd29e --- /dev/null +++ b/src/main/java/com/mhhy/interceptor/AuthInterceptor.java @@ -0,0 +1,55 @@ +package com.mhhy.interceptor; + + + +import com.mhhy.annotation.Login; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.RequestUtil; +import lombok.extern.log4j.Log4j2; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author zcw + * @version 1.0 + * @date 2019/11/21 21:53 + * @description 授权认证 + */ +@Log4j2 +@Configuration +@Component(value = "authInterceptor") +public class AuthInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + if (!(handler instanceof HandlerMethod)) { + return true; + } + Login login = ((HandlerMethod) handler).getMethodAnnotation(Login.class); + if (login == null) { + return true; + } + if (login.encrypted()) { + return true; + } + //已登录的接口,限制同一个接口,每两秒最多只能调一次 + int userId = RequestUtil.getMainUserId(); + String path = request.getServletPath(); + String method = request.getMethod(); + if ("GET".equalsIgnoreCase(method)) { + return true; + } + String cacheKey = String.format("vex:apiLimit:%d-%s-%s", userId, method, path); + if (RedisUtil.setNx(cacheKey, "0")) { + RedisUtil.expire(cacheKey, 2); + return true; + } + throw new IllegalArgumentException("请勿重复点击");//请勿重复点击 Please do not click repeatedly + } +} diff --git a/src/main/java/com/mhhy/mapper/AdminMapper.java b/src/main/java/com/mhhy/mapper/AdminMapper.java new file mode 100644 index 0000000..0f93105 --- /dev/null +++ b/src/main/java/com/mhhy/mapper/AdminMapper.java @@ -0,0 +1,8 @@ +package com.mhhy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhhy.model.entity.AdminEntity; + + +public interface AdminMapper extends BaseMapper { +} diff --git a/src/main/java/com/mhhy/mapper/AppVersionEntityMapper.java b/src/main/java/com/mhhy/mapper/AppVersionEntityMapper.java new file mode 100644 index 0000000..6461152 --- /dev/null +++ b/src/main/java/com/mhhy/mapper/AppVersionEntityMapper.java @@ -0,0 +1,7 @@ +package com.mhhy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhhy.model.entity.AppVersionEntity; + +public interface AppVersionEntityMapper extends BaseMapper { +} diff --git a/src/main/java/com/mhhy/mapper/CustomerMapper.java b/src/main/java/com/mhhy/mapper/CustomerMapper.java new file mode 100644 index 0000000..e2e837e --- /dev/null +++ b/src/main/java/com/mhhy/mapper/CustomerMapper.java @@ -0,0 +1,8 @@ +package com.mhhy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhhy.model.entity.CustomerEntity; +import com.mhhy.model.entity.ProjectConfigEntity; + +public interface CustomerMapper extends BaseMapper { +} diff --git a/src/main/java/com/mhhy/mapper/GroupMapper.java b/src/main/java/com/mhhy/mapper/GroupMapper.java new file mode 100644 index 0000000..147ce82 --- /dev/null +++ b/src/main/java/com/mhhy/mapper/GroupMapper.java @@ -0,0 +1,8 @@ +package com.mhhy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhhy.model.entity.CustomerEntity; +import com.mhhy.model.entity.GroupEntity; + +public interface GroupMapper extends BaseMapper { +} diff --git a/src/main/java/com/mhhy/mapper/ProjectConfigMapper.java b/src/main/java/com/mhhy/mapper/ProjectConfigMapper.java new file mode 100644 index 0000000..33b66fe --- /dev/null +++ b/src/main/java/com/mhhy/mapper/ProjectConfigMapper.java @@ -0,0 +1,7 @@ +package com.mhhy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhhy.model.entity.ProjectConfigEntity; + +public interface ProjectConfigMapper extends BaseMapper { +} diff --git a/src/main/java/com/mhhy/mapper/UserMapper.java b/src/main/java/com/mhhy/mapper/UserMapper.java new file mode 100644 index 0000000..ca87cfb --- /dev/null +++ b/src/main/java/com/mhhy/mapper/UserMapper.java @@ -0,0 +1,7 @@ +package com.mhhy.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhhy.model.entity.UserEntity; + +public interface UserMapper extends BaseMapper { +} diff --git a/src/main/java/com/mhhy/model/entity/AdminEntity.java b/src/main/java/com/mhhy/model/entity/AdminEntity.java new file mode 100644 index 0000000..b2e0226 --- /dev/null +++ b/src/main/java/com/mhhy/model/entity/AdminEntity.java @@ -0,0 +1,23 @@ +package com.mhhy.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_admin") +public class AdminEntity { + + @TableId(type = IdType.AUTO) + private Integer id; + + private String username; + + private String password; + + private int level; + + private int state; + +} diff --git a/src/main/java/com/mhhy/model/entity/AppVersionEntity.java b/src/main/java/com/mhhy/model/entity/AppVersionEntity.java new file mode 100644 index 0000000..a4fc47c --- /dev/null +++ b/src/main/java/com/mhhy/model/entity/AppVersionEntity.java @@ -0,0 +1,58 @@ +package com.mhhy.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("t_app_version") +public class AppVersionEntity { + + @TableId(type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("apk下载链接") + private String apkUrl; + + @ApiModelProperty("是否强制更新e否1是") + private Integer updateVersion; + + @ApiModelProperty("安卓版本号") + private Integer androidCode; + + @ApiModelProperty("android版本号名称") + private String androidVersion; + + @ApiModelProperty("ios版本号") + private Integer iosCode; + + @ApiModelProperty("描述") + private String remark; + + @ApiModelProperty("ios版本号名称") + private String iosVersion; + + @ApiModelProperty("代理商用户==username") + private String user; + + @ApiModelProperty("1:管理员\\r\\n2:代理商\\r\\n3:普通用户") + private Integer state; + + @ApiModelProperty("0:正常\\r\\n1:禁用") + private Integer isShow; + + private Date createTime; + + private Date updateTime; + + @ApiModelProperty("ios下载链接") + private String iosUrl; + @ApiModelProperty("安卓是否显示更新") + private Integer androidShow; + + +} diff --git a/src/main/java/com/mhhy/model/entity/CustomerEntity.java b/src/main/java/com/mhhy/model/entity/CustomerEntity.java new file mode 100644 index 0000000..1ac139b --- /dev/null +++ b/src/main/java/com/mhhy/model/entity/CustomerEntity.java @@ -0,0 +1,23 @@ +package com.mhhy.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_customer") +public class CustomerEntity { + + @TableId(type = IdType.AUTO) + private Integer id; + + private String name; + + private String osnId; + + private String portrait; + + private String project; + +} diff --git a/src/main/java/com/mhhy/model/entity/GroupEntity.java b/src/main/java/com/mhhy/model/entity/GroupEntity.java new file mode 100644 index 0000000..04bff6c --- /dev/null +++ b/src/main/java/com/mhhy/model/entity/GroupEntity.java @@ -0,0 +1,22 @@ +package com.mhhy.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_group") +public class GroupEntity { + + @TableId(type = IdType.AUTO) + private Integer id; + + private String name; + + private String osnId; + + private String portrait; + + private String project; +} diff --git a/src/main/java/com/mhhy/model/entity/ProjectConfigEntity.java b/src/main/java/com/mhhy/model/entity/ProjectConfigEntity.java new file mode 100644 index 0000000..748cb26 --- /dev/null +++ b/src/main/java/com/mhhy/model/entity/ProjectConfigEntity.java @@ -0,0 +1,24 @@ +package com.mhhy.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("t_config") +public class ProjectConfigEntity { + + @TableId(type = IdType.AUTO) + private Integer id; + + private String project; + + private String config; + + private String config2; + +} diff --git a/src/main/java/com/mhhy/model/entity/UserEntity.java b/src/main/java/com/mhhy/model/entity/UserEntity.java new file mode 100644 index 0000000..437931b --- /dev/null +++ b/src/main/java/com/mhhy/model/entity/UserEntity.java @@ -0,0 +1,64 @@ +package com.mhhy.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("t_user") +public class UserEntity { + + @TableId(type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("用户名") + private String username; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("im id") + private String imId; + + @ApiModelProperty("im用户名") + private String imUsername; + + @ApiModelProperty("im密码") + private String imPwd; + + @ApiModelProperty("im node") + private String imNode; + + @ApiModelProperty("nick name") + private String nickName; + + @ApiModelProperty("1:管理员\\r\\n2:代理商\\r\\n3:普通用户") + private Integer state; + + @ApiModelProperty("0:未启用\\r\\n1:正常\\r\\n2:禁用") + private Integer type; + + private Date createTime; + + private String project; + + private String portrait; + + + public boolean isSetPassword() { + if (password == null) { + return false; + } + if (password.length() == 0) { + return false; + } + return true; + } + + + +} diff --git a/src/main/java/com/mhhy/model/req/CreateGroupReq.java b/src/main/java/com/mhhy/model/req/CreateGroupReq.java new file mode 100644 index 0000000..4f49705 --- /dev/null +++ b/src/main/java/com/mhhy/model/req/CreateGroupReq.java @@ -0,0 +1,9 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class CreateGroupReq { + String user; + String phoneOrEmail; +} diff --git a/src/main/java/com/mhhy/model/req/CustomerReq.java b/src/main/java/com/mhhy/model/req/CustomerReq.java new file mode 100644 index 0000000..ee8d553 --- /dev/null +++ b/src/main/java/com/mhhy/model/req/CustomerReq.java @@ -0,0 +1,17 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class CustomerReq { + + private String project; + + private String name; + + private String osnId; + + private String portrait; + + +} diff --git a/src/main/java/com/mhhy/model/req/DappRequest.java b/src/main/java/com/mhhy/model/req/DappRequest.java new file mode 100644 index 0000000..9b6396a --- /dev/null +++ b/src/main/java/com/mhhy/model/req/DappRequest.java @@ -0,0 +1,41 @@ +package com.mhhy.model.req; + +import com.ospn.command.CmdDappLogin; +import com.ospn.command.CmdGetServerInfo; +import lombok.Data; + +@Data +public class DappRequest { + public String command; + public String user; + public String sign; + public String hash; + public long random; + + public CmdDappLogin getCmdDappLogin(String session){ + CmdDappLogin cmd = new CmdDappLogin(); + cmd.command = command; + cmd.user = user; + cmd.sign = sign; + cmd.hash = hash; + cmd.session = session; + return cmd; + } + + public CmdGetServerInfo getCmdGetServerInfo(String session){ + CmdGetServerInfo cmd = new CmdGetServerInfo(); + cmd.command = command; + cmd.user = user; + cmd.random = random; + cmd.session = session; + return cmd; + } + public CmdGetServerInfo getCmdGetServerInfo(){ + CmdGetServerInfo cmd = new CmdGetServerInfo(); + cmd.command = command; + cmd.user = user; + cmd.random = random; + cmd.session = null; + return cmd; + } +} diff --git a/src/main/java/com/mhhy/model/req/FindAppVersionReq.java b/src/main/java/com/mhhy/model/req/FindAppVersionReq.java new file mode 100644 index 0000000..f643507 --- /dev/null +++ b/src/main/java/com/mhhy/model/req/FindAppVersionReq.java @@ -0,0 +1,16 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class FindAppVersionReq { + + private int page; + + private int limit; + + private String user; + + private Integer id; + +} diff --git a/src/main/java/com/mhhy/model/req/FindUserReq.java b/src/main/java/com/mhhy/model/req/FindUserReq.java new file mode 100644 index 0000000..f98f0c1 --- /dev/null +++ b/src/main/java/com/mhhy/model/req/FindUserReq.java @@ -0,0 +1,16 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class FindUserReq { + + private int page; + + private int limit; + + private String osnId; + + private String project; + +} diff --git a/src/main/java/com/mhhy/model/req/GroupReq.java b/src/main/java/com/mhhy/model/req/GroupReq.java new file mode 100644 index 0000000..6cfae5d --- /dev/null +++ b/src/main/java/com/mhhy/model/req/GroupReq.java @@ -0,0 +1,17 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class GroupReq { + + private String project; + + private String name; + + private String osnId; + + private String portrait; + + +} diff --git a/src/main/java/com/mhhy/model/req/LoginReq.java b/src/main/java/com/mhhy/model/req/LoginReq.java new file mode 100644 index 0000000..1c7fa14 --- /dev/null +++ b/src/main/java/com/mhhy/model/req/LoginReq.java @@ -0,0 +1,30 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class LoginReq { + + private String username; + + private String account; + + private String password; + + private String nickName; + + private String smsCode; + + private String picCode; + + private String data; + + private String user; + + private String project; + + private String invite; + + private String url; + +} diff --git a/src/main/java/com/mhhy/model/req/NodeRegisterReq.java b/src/main/java/com/mhhy/model/req/NodeRegisterReq.java new file mode 100644 index 0000000..98d8eac --- /dev/null +++ b/src/main/java/com/mhhy/model/req/NodeRegisterReq.java @@ -0,0 +1,10 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class NodeRegisterReq { + + private String data; + +} diff --git a/src/main/java/com/mhhy/model/req/ProjectReq.java b/src/main/java/com/mhhy/model/req/ProjectReq.java new file mode 100644 index 0000000..7b321ad --- /dev/null +++ b/src/main/java/com/mhhy/model/req/ProjectReq.java @@ -0,0 +1,17 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class ProjectReq { + + private String project; + + private String config; + + private String config2; + + private String portrait; + + +} diff --git a/src/main/java/com/mhhy/model/req/RegisterReq.java b/src/main/java/com/mhhy/model/req/RegisterReq.java new file mode 100644 index 0000000..e4862ae --- /dev/null +++ b/src/main/java/com/mhhy/model/req/RegisterReq.java @@ -0,0 +1,43 @@ +package com.mhhy.model.req; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +@Data +public class RegisterReq { + + private String username; + + private String account; + + private String password; + + private String nickName; + + private String smsCode; + + private String picCode; + + private String data; + + private String key; + + private int level; + private String project; + + public RegisterReq() { + + } + + public RegisterReq(String param) { + try { + JSONObject json = JSONObject.parseObject(param); + username = json.getString("username"); + password = json.getString("password"); + nickName = json.getString("nickName"); + } catch (Exception e) { + + } + + } +} diff --git a/src/main/java/com/mhhy/model/req/ReqBase.java b/src/main/java/com/mhhy/model/req/ReqBase.java new file mode 100644 index 0000000..3936de9 --- /dev/null +++ b/src/main/java/com/mhhy/model/req/ReqBase.java @@ -0,0 +1,9 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class ReqBase { + private String data; + private String url; +} diff --git a/src/main/java/com/mhhy/model/req/UpdatePasswdReq.java b/src/main/java/com/mhhy/model/req/UpdatePasswdReq.java new file mode 100644 index 0000000..033e799 --- /dev/null +++ b/src/main/java/com/mhhy/model/req/UpdatePasswdReq.java @@ -0,0 +1,11 @@ +package com.mhhy.model.req; + +import lombok.Data; + +@Data +public class UpdatePasswdReq { + private String username; + + private String password; + private String oldPassword; +} diff --git a/src/main/java/com/mhhy/model/resp/LoginResp.java b/src/main/java/com/mhhy/model/resp/LoginResp.java new file mode 100644 index 0000000..9b2b143 --- /dev/null +++ b/src/main/java/com/mhhy/model/resp/LoginResp.java @@ -0,0 +1,9 @@ +package com.mhhy.model.resp; + +import lombok.Data; + +@Data +public class LoginResp { + + private String token; +} diff --git a/src/main/java/com/mhhy/model/struct/ImInfoVer2.java b/src/main/java/com/mhhy/model/struct/ImInfoVer2.java new file mode 100644 index 0000000..976c166 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/ImInfoVer2.java @@ -0,0 +1,34 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import com.mhhy.model.entity.UserEntity; + +import java.util.ArrayList; +import java.util.List; + +public class ImInfoVer2 { + + public List osn_users; + public String service_id; + public boolean password = true; + public JSONObject json; + + public ImInfoVer2(UserEntity user, JSONObject jsonObject, String sid) { + json = jsonObject; + service_id = sid; + osn_users = new ArrayList<>(); + OsnUser osnUser = new OsnUser(user); + osn_users.add(osnUser); + } + +/*"Token": "b568c30a-7751-4d64-934a-2286ca1139b1", +"Expires": "1694164789", +"Refresh_Token": "OXiVGJp5eCQlZlb0kI6451Au3SMzVfXH", +"Refresh_Token_Expires": "1699348789", + + "UserInfo" + + "ImInfo":*/ + + +} diff --git a/src/main/java/com/mhhy/model/struct/LoginResult.java b/src/main/java/com/mhhy/model/struct/LoginResult.java new file mode 100644 index 0000000..abb84b7 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/LoginResult.java @@ -0,0 +1,31 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import com.mhhy.model.entity.UserEntity; + +public class LoginResult { + + public String Token = "b568c30a-7751-4d64-934a-2286ca1139b1"; + public String Expires = "1694164789"; + public String Refresh_Token = "OXiVGJp5eCQlZlb0kI6451Au3SMzVfXH"; + public String Refresh_Token_Expires = "1699348789"; + public UserInfoVer2 UserInfo; + public ImInfoVer2 ImInfo; + + public LoginResult(UserEntity user, JSONObject config, String sid) { + UserInfo = new UserInfoVer2(user); + ImInfo = new ImInfoVer2(user, config, sid); + } + + public JSONObject toJson() { + JSONObject json = new JSONObject(); + json.put("Token", Token); + json.put("Expires", Expires); + json.put("Refresh_Token", Refresh_Token); + json.put("Refresh_Token_Expires", Refresh_Token_Expires); + json.put("UserInfo", UserInfo); + json.put("ImInfo", ImInfo); + + return json; + } +} diff --git a/src/main/java/com/mhhy/model/struct/NodeGetUserData.java b/src/main/java/com/mhhy/model/struct/NodeGetUserData.java new file mode 100644 index 0000000..955abd5 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/NodeGetUserData.java @@ -0,0 +1,13 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +@Data +public class NodeGetUserData { + private String user; + + public NodeGetUserData(JSONObject json){ + user = json.getString("user"); + } +} diff --git a/src/main/java/com/mhhy/model/struct/NodeRegisterData.java b/src/main/java/com/mhhy/model/struct/NodeRegisterData.java new file mode 100644 index 0000000..073093c --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/NodeRegisterData.java @@ -0,0 +1,13 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; + +public class NodeRegisterData { + public String IP; + public String region; + + public NodeRegisterData(JSONObject json){ + IP = json.getString("IP"); + region = json.getString("region"); + } +} diff --git a/src/main/java/com/mhhy/model/struct/NodeSetUsingData.java b/src/main/java/com/mhhy/model/struct/NodeSetUsingData.java new file mode 100644 index 0000000..3f3d596 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/NodeSetUsingData.java @@ -0,0 +1,18 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + + +@Data +public class NodeSetUsingData { + private String user; + private String node; + private int state = 0; + + public NodeSetUsingData(JSONObject json){ + user = json.getString("user"); + node = json.getString("node"); + state = json.getIntValue("state"); + } +} diff --git a/src/main/java/com/mhhy/model/struct/OsnUser.java b/src/main/java/com/mhhy/model/struct/OsnUser.java new file mode 100644 index 0000000..41e244b --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/OsnUser.java @@ -0,0 +1,27 @@ +package com.mhhy.model.struct; + +import com.mhhy.model.entity.UserEntity; + +public class OsnUser { + public String osn_id; //: "OSNUiHLZ1XaDcV6MjarXvQUoo6hSzJYBFGUbJ6AXbW3vb8uNDL9LLtgk72c9cidF9V152q3BjwG4YN", + public String osn_username; //: "bd9a4aa9774220ad4c0c", + public String osn_password; //: "VER2-VK0MHcCAQEEIAABdS7Igb/rV9A+NiHujrpgl900yQ25SPGuYHDRqde/oAoGCCqGSM49AwEHoUQDQgAE1fPNCotCuh49lYrjHLqnMhx3d6f3IG+eM0WEIwNVrjszmG2ARcCPXOGt7PFXdZQdEwxQdfHbspIiYpNH86in+Q==-MHcCAQEEIE3B3LONlmxLjMy3ofwAo4qpcdCHzyMbL6+XndTEoBrMoAoGCCqGSM49AwEHoUQDQgAEKbtW4NBM64a68V48Jp9fR85WNzVebo7o3ldrV1hGRBoX4qO+DPulHxjKDKNbQOqHH+ihU/+yrFh1PQa+XcE5ng==", + public String userId; //: "f3739c0075e0d176bce405f017eec587", + public String corpName; //: null, + public boolean admin = false; //: false, + public String osn_node; //: "39.100.133.144", + public String nickName; //: null, + public String cornet; //: null, + public String headUrl; //": null, + public boolean def = true; //: true + + public OsnUser(UserEntity user) { + osn_id = user.getImId(); + osn_username = user.getUsername(); + osn_password = user.getImPwd(); + userId = user.getId().toString(); + osn_node = user.getImNode(); + } + + +} diff --git a/src/main/java/com/mhhy/model/struct/ServiceInfo.java b/src/main/java/com/mhhy/model/struct/ServiceInfo.java new file mode 100644 index 0000000..d329b57 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/ServiceInfo.java @@ -0,0 +1,23 @@ +package com.mhhy.model.struct; + +import lombok.Data; +import java.util.Date; + +@Data +public class ServiceInfo { + int id; + + String iconUrl; + + String serviceName; + + String url; + + String serviceRemark; + + String appRemark; + + String appIntroduction; + + String createTime; +} diff --git a/src/main/java/com/mhhy/model/struct/UserCreateOrderData.java b/src/main/java/com/mhhy/model/struct/UserCreateOrderData.java new file mode 100644 index 0000000..2f006dc --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/UserCreateOrderData.java @@ -0,0 +1,15 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +@Data +public class UserCreateOrderData { + int lifecycle; + String pay_id; + + public UserCreateOrderData(JSONObject json){ + lifecycle = json.getIntValue("lifecycle"); + pay_id = json.getString("payId"); + } +} diff --git a/src/main/java/com/mhhy/model/struct/UserInfoVer2.java b/src/main/java/com/mhhy/model/struct/UserInfoVer2.java new file mode 100644 index 0000000..8a41a26 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/UserInfoVer2.java @@ -0,0 +1,49 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import com.mhhy.model.entity.UserEntity; + +import java.util.ArrayList; +import java.util.List; + +public class UserInfoVer2 { + + public String F_UserId; + public String F_Account; + public String F_EnCode; //": null, + public String F_RealName; //": null, + public String F_HeadIcon; //": null, + public String F_Mobile = ""; // + public String F_Email; //": null, + public String F_WeChat; //": null, + public String F_Gender; //": null, + public String F_Description; //": null, + public String F_Company; //": null, + public List F_Department = new ArrayList<>(); //": [], + public List F_Role = new ArrayList<>(); //": [] + + public UserInfoVer2(UserEntity user) { + F_UserId = user.getId().toString(); + F_Account = user.getUsername(); + } + + public JSONObject toJson() { + + JSONObject json = new JSONObject(); + json.put("F_UserId", F_UserId); + json.put("F_Account", F_Account); + json.put("F_EnCode", F_EnCode); + json.put("F_RealName", F_RealName); + json.put("F_HeadIcon", F_HeadIcon); + json.put("F_Mobile", F_Mobile); + json.put("F_Email", F_Email); + json.put("F_WeChat", F_WeChat); + json.put("F_Gender", F_Gender); + json.put("F_Description", F_Description); + json.put("F_Company", F_Company); + json.put("F_Department", F_Department); + json.put("F_Role", F_Role); + + return json; + } +} diff --git a/src/main/java/com/mhhy/model/struct/UserQueryOrderData.java b/src/main/java/com/mhhy/model/struct/UserQueryOrderData.java new file mode 100644 index 0000000..dc077a1 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/UserQueryOrderData.java @@ -0,0 +1,16 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +@Data +public class UserQueryOrderData { + String orderNo; + String user; + + public UserQueryOrderData(JSONObject json) { + + orderNo = json.getString("orderNo"); + user = json.getString("user"); + } +} diff --git a/src/main/java/com/mhhy/model/struct/UserQueryProductData.java b/src/main/java/com/mhhy/model/struct/UserQueryProductData.java new file mode 100644 index 0000000..632c243 --- /dev/null +++ b/src/main/java/com/mhhy/model/struct/UserQueryProductData.java @@ -0,0 +1,14 @@ +package com.mhhy.model.struct; + +import com.alibaba.fastjson.JSONObject; +import lombok.Data; + +@Data +public class UserQueryProductData { + String user; + + public UserQueryProductData(JSONObject json) { + user = json.getString("user"); + } + +} diff --git a/src/main/java/com/mhhy/resolver/DecodeArgumentResolver.java b/src/main/java/com/mhhy/resolver/DecodeArgumentResolver.java new file mode 100644 index 0000000..c87f5ea --- /dev/null +++ b/src/main/java/com/mhhy/resolver/DecodeArgumentResolver.java @@ -0,0 +1,41 @@ +package com.mhhy.resolver; + + +import com.mhhy.annotation.Login; +import com.mhhy.util.CodecUtil; +import com.mhhy.util.JsonUtil; +import com.mhhy.util.StreamUtil; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.context.request.ServletWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +@Component +public class DecodeArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter parameter) { + Login login = parameter.getMethod().getAnnotation(Login.class); + return login != null && login.encrypted(); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + Class[] params = parameter.getMethod().getParameterTypes(); + if (params.length != 1) { + throw new RuntimeException("后台接口参数异常"); + } + Class targetClass = params[0]; + String body = CodecUtil.decodeURL(StreamUtil.getString(((ServletWebRequest) webRequest).getRequest().getInputStream())); + if (body == null || body.trim().length() == 0) { + return null; + } + + //todo aes解密 + return JsonUtil.fromJson(body, targetClass); + } +} diff --git a/src/main/java/com/mhhy/service/AdminService.java b/src/main/java/com/mhhy/service/AdminService.java new file mode 100644 index 0000000..aaa0451 --- /dev/null +++ b/src/main/java/com/mhhy/service/AdminService.java @@ -0,0 +1,20 @@ +package com.mhhy.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhhy.common.BaseResult; +import com.mhhy.model.entity.AdminEntity; +import com.mhhy.model.entity.UserEntity; + +public interface AdminService extends IService { + + boolean createAdmin(String username, String password); + + boolean createCustomer(String username, String password); + + AdminEntity findUser(String username); + + boolean updatePassword(String username, String password); + + boolean updateState(String username, int state); + +} diff --git a/src/main/java/com/mhhy/service/AppVersionEntityService.java b/src/main/java/com/mhhy/service/AppVersionEntityService.java new file mode 100644 index 0000000..f1683b9 --- /dev/null +++ b/src/main/java/com/mhhy/service/AppVersionEntityService.java @@ -0,0 +1,22 @@ +package com.mhhy.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhhy.model.entity.AppVersionEntity; +import com.mhhy.model.entity.UserEntity; + +import java.util.List; + +public interface AppVersionEntityService extends IService { + + + List listAppVersionAll(); + + AppVersionEntity getUser(); + + boolean updateAppVersion(AppVersionEntity appVersionEntity); + + List listAppVersion(int page, int limit); + + List listAppVersionUser(int page, int limit, String user); + +} diff --git a/src/main/java/com/mhhy/service/CustomerService.java b/src/main/java/com/mhhy/service/CustomerService.java new file mode 100644 index 0000000..97c6596 --- /dev/null +++ b/src/main/java/com/mhhy/service/CustomerService.java @@ -0,0 +1,25 @@ +package com.mhhy.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhhy.model.entity.CustomerEntity; +import com.mhhy.model.entity.ProjectConfigEntity; + +import java.util.List; + +public interface CustomerService extends IService { + + // 增 + boolean addObj(String name, String portrait, String osnId, String project); + + // 查 + List listAll(); + List listByProject(String project); + + // 改 + + // 删 + boolean deleteObj(String osnId, String project); + +} diff --git a/src/main/java/com/mhhy/service/GroupService.java b/src/main/java/com/mhhy/service/GroupService.java new file mode 100644 index 0000000..c14eb65 --- /dev/null +++ b/src/main/java/com/mhhy/service/GroupService.java @@ -0,0 +1,23 @@ +package com.mhhy.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhhy.model.entity.CustomerEntity; +import com.mhhy.model.entity.GroupEntity; + +import java.util.List; + +public interface GroupService extends IService { + + // 增 + boolean addObj(String name, String portrait, String osnId, String project); + + // 查 + List listAll(); + List listByProject(String project); + + // 改 + + // 删 + boolean deleteObj(String osnId, String project); + +} diff --git a/src/main/java/com/mhhy/service/LoginService.java b/src/main/java/com/mhhy/service/LoginService.java new file mode 100644 index 0000000..7caf14b --- /dev/null +++ b/src/main/java/com/mhhy/service/LoginService.java @@ -0,0 +1,35 @@ +package com.mhhy.service; + +import com.alibaba.fastjson.JSONObject; +import com.mhhy.common.BaseResult; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.model.req.LoginReq; +import com.mhhy.model.req.RegisterReq; +import com.mhhy.model.resp.LoginResp; + +public interface LoginService { + + BaseResult register(RegisterReq registerReq); + BaseResult register2(RegisterReq registerReq); + BaseResult register4(RegisterReq registerReq, String key); + BaseResult register5(RegisterReq registerReq, String key, String UserPwd, String owner2); + + String[] createAccount(); + + JSONObject register3(RegisterReq registerReq); + UserEntity register6(String imId, String owner2, String project); + + BaseResult login(LoginReq loginReq); + + BaseResult getChallenge(String userName); + + JSONObject getConfig(); + + String createGroup(String groupName, String owner); + + String getHostIp(); + + boolean disableOrEnableUser(String osnId, boolean enable); + + String getRegisterKey(); +} diff --git a/src/main/java/com/mhhy/service/LtpServer.java b/src/main/java/com/mhhy/service/LtpServer.java new file mode 100644 index 0000000..b107d76 --- /dev/null +++ b/src/main/java/com/mhhy/service/LtpServer.java @@ -0,0 +1,686 @@ +package com.mhhy.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhhy.model.entity.CustomerEntity; +import com.mhhy.model.entity.GroupEntity; +import com.mhhy.model.entity.UserEntity; +import com.ospn.command.CmdDappLogin; +import com.ospn.command.CmdReDappLogin; +import com.ospn.common.OsnServer; +import com.ospn.common.OsnUtils; +import com.ospn.core.ILTPEvent; +import com.ospn.core.LTPData; +import com.ospn.utils.CryptUtils; +import io.netty.channel.ChannelHandlerContext; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.security.MessageDigest; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; + +import static com.ospn.utils.CryptUtils.makeMessage; +import static com.ospn.utils.CryptUtils.takeMessage; + +@Service +public class LtpServer extends OsnServer implements ILTPEvent { + + //@Autowired + //public IDeviceService deviceService; + //@Autowired + //private MyJPushClient myJPushClient; + + @Autowired + UserService userService; + + @Autowired + GroupService groupService; + + @Autowired + CustomerService customerService; + + + public static LTPData ltpData; + + public static String custormer; + + static RunnerThread runner; + + private ConcurrentHashMap> pushDataMap = new ConcurrentHashMap<>(); + + static String password="password123"; + + + public LtpServer(){ + init(); + } + + void init(){ + + if (ltpData != null){ + return; + } + ltpData = new LTPData(); + + try { + + InputStream in = new FileInputStream("ospn.properties"); + Properties prop = new Properties(); + prop.load(in); + + custormer = prop.getProperty("customer"); + System.out.println("[custormer]" + custormer); + + ltpData.init(prop, password,this); + in.close(); + + prop.put("appID", ltpData.apps.osnID); + String encPrivateKey = OsnUtils.aesEncrypt(ltpData.apps.osnKey, password); + prop.put("appKey", encPrivateKey); + + FileOutputStream oFile = new FileOutputStream("ospn.properties", false); + prop.store(oFile, "Comments"); + + oFile.close(); + + }catch (Exception e){ + System.out.println(e.getMessage()); + } + + } + + public String getAppId(){ + if (ltpData == null){ + init(); + } + if (ltpData == null){ + return null; + } + return ltpData.apps.osnID; + } + + public JSONObject makeResult(String to, JSONObject data){ + + try { + JSONObject json = CryptUtils.makeMessage( + "Message", + ltpData.apps.osnID, + to, + data, + ltpData.apps.osnKey, + (JSONObject)null); + return json; + } catch (Exception e) { + + } + return new JSONObject(); + } + + public void sendCommand(String command, String groupID, JSONObject json){ + + // 先扔队列里 + if (command.equalsIgnoreCase("SystemNotify")) { + SendCommandInfo info = new SendCommandInfo(command, groupID, json); + push(info); + } else { + if (ltpData != null){ + ltpData.sendJson(command, groupID, json); + } + } + + } + + public void sendMessage(String to, JSONObject json){ + if (ltpData != null){ + ltpData.sendMessage(to, json); + } + } + + public void sendNotice2UserByAddBalance(String to, long balance, String txid, JSONObject json){ + + JSONObject content = new JSONObject(); + content.put("type", "text"); + float bal1 = balance; + bal1 = bal1 / 100; + + String coin = ""; + if (json != null) { + if (json.containsKey("coinType")) { + coin = json.getString("coinType") + " "; + } + } + + String text = "[DM wallet test system notice]\r\n" + + "Account balance changes, receive " + coin + + String.format("%.2f.\r\n", bal1) + + "txid:" + txid; + content.put("data", text); + + JSONObject data = new JSONObject(); + data.put("content", content); + + // 扔队列里去 + SendCommandInfo info = new SendCommandInfo("Message", to, data); + push(info); + + /*if (ltpData != null){ + ltpData.sendMessage(to, data); + }*/ + } + + public void sendNotice2UserBySubBalance(String to, long balance, String txid, JSONObject json){ + + JSONObject content = new JSONObject(); + content.put("type", "text"); + float bal1 = balance; + bal1 = bal1 / 100; + + String coin = ""; + if (json != null) { + if (json.containsKey("coinType")) { + coin = json.getString("coinType") + " "; + } + } + + String text = "[DM wallet test system notice]\r\n" + + "Account balance changes, send " + coin + + String.format("%.2f.\r\n", bal1) + + "txid:" + txid; + content.put("data", text); + + JSONObject data = new JSONObject(); + data.put("content", content); + + // 扔队列里去 + SendCommandInfo info = new SendCommandInfo("Message", to, data); + push(info); + + /*if (ltpData != null){ + ltpData.sendMessage(to, data); + }*/ + } + + public void sendNotice2UserByWithdrawal(String to){ + + JSONObject content = new JSONObject(); + content.put("type", "text"); + String text = "[J-Talking system notice]\r\n" + + "Withdrawal success."; + content.put("data", text); + + JSONObject data = new JSONObject(); + data.put("content", content); + + if (ltpData != null){ + ltpData.sendMessage(to, data); + } + } + + public void getUserInfo(String osnID) { + JSONObject json = new JSONObject(); + json.put("command", "GetUserInfo"); + json.put("from", this.ltpData.apps.osnID); + json.put("to", osnID); + //System.out.println(json.toString()+"JSONsend"); + + JSONObject data = new JSONObject(); + + // 扔队列里去 + SendCommandInfo info = new SendCommandInfo("GetUserInfo", osnID, data); + push(info); + + // ltpData.sendJson(json); + } + + public void getGroupInfo(String osnID) { + JSONObject json = new JSONObject(); + json.put("command", "GetUserInfo"); + json.put("from", this.ltpData.apps.osnID); + json.put("to", osnID); + + //System.out.println(json.toString()+"JSONsend"); + + JSONObject data = new JSONObject(); + + // 扔队列里去 + SendCommandInfo info = new SendCommandInfo("GetGroupInfo", osnID, data); + push(info); + + // ltpData.sendJson(json); + } + + public boolean login(CmdDappLogin cmd){ + CmdReDappLogin cmdRe = ltpData.login(cmd); + + if (cmdRe.errCode == null){ + return false; + } + if (!cmdRe.errCode.equalsIgnoreCase("0:success")){ + return false; + } + + return true; + } + + public String getDappInfo(){ + JSONObject content = ltpData.dappInfo.toClientJson(ltpData.apps.osnKey); + if (content == null){ + return ""; + } + return content.toString(); + } + + public void push(SendCommandInfo data){ + if (runner == null) { + runner = new RunnerThread(); + runner.start(); + } + runner.push(data); + } + + void sendNotice(JSONObject json){ + System.out.println("[sendNotice] send notice : " + json); + String groupId = json.getString("groupID"); + if (groupId == null){ + return; + } + System.out.println("[sendNotice] sendCommand"); + sendCommand("SystemNotify", groupId, json); + + } + + + @Override + public void handleMessage(ChannelHandlerContext channelHandlerContext, JSONObject jsonObject) { + + //System.out.println("[LtpServer::handleMessage] begin. " + jsonObject); + + System.out.println("----------------handleMessage---------------------:"+jsonObject); + // 处理收到的消息 + if (jsonObject == null){ + return; + } + + + String command = jsonObject.getString("command"); + String to = jsonObject.getString("to"); + if (command == null || to == null){ + return; + } + + if (!to.equalsIgnoreCase(ltpData.apps.osnID)){ + System.out.println("[LtpServer::handleMessage] error, to is " + to); + return; + } + + + //System.out.println("[handleMessage] begin!!!!!!"); + + if(command.equalsIgnoreCase("UserInfo")){ + + handleUserInfo(jsonObject); + + } else if(command.equalsIgnoreCase("GroupInfo")){ + + handleGroupInfo(jsonObject); + + } else if(command.equalsIgnoreCase("Message")){ + + JSONObject data = takeMessage(jsonObject); + if(data == null) { + return; + } + String command2 = data.getString("command"); + if (command2 != null) { + if (command2.equalsIgnoreCase("PushInfo")) { + + String user = data.getString("user"); + String type = data.getString("type"); + + List cmdList = pushDataMap.get(user); + if (cmdList == null) { + cmdList = new ArrayList<>(); + pushDataMap.put(user, cmdList); + } + cmdList.add(type); + + + + return; + } + } + + + String commandID = data.getString("commandID"); + if (commandID == null){ + return; + } + System.out.println("commandID : " + commandID); + String result = data.getString("result"); + if (result == null){ + return; + } + + + + } else if (command.equalsIgnoreCase("GetServiceInfo")){ + + String from = jsonObject.getString("from"); + if (from == null){ + return; + } + + JSONObject content = ltpData.dappInfo.toClientJson(ltpData.apps.osnKey); + + System.out.println("[LtpServer::HandleMessage] dapp content : " + content); + + JSONObject original = new JSONObject(); + original.put("id", jsonObject.getString("id")); + + System.out.println("[LtpServer::HandleMessage] original id : " + original); + + JSONObject returnData = makeMessage( + "ServiceInfo", + ltpData.apps.osnID, + from, + content, + ltpData.apps.osnKey, + original); + + ltpData.sendJson(returnData); + + } + + + } + + public void pushWorker(){ + + ConcurrentHashMap> tempPushMap = pushDataMap; + System.out.println("push data map size : " + tempPushMap.size()); + + pushDataMap = new ConcurrentHashMap<>(); + + System.out.println("push data map size : " + tempPushMap.size()); + Iterator>> iter = tempPushMap.entrySet().iterator(); + + while (iter.hasNext()) { + ConcurrentHashMap.Entry> entry = iter.next(); + // pushMessage(entry.getKey(), entry.getValue()); + } + + } + + public void handleUserInfo(JSONObject json){ + + try { + + System.out.println("[handleUserInfo] : "+json); + json = JSONObject.parseObject(json.getString("content")); + /** + * TODO : 这里处理接收到的user info 信息 + * "userID" : osn id + * "displayName" : 昵称 + * "describes" + * "portrait" : 头像url + * "urlSpace" : + * **/ + + String displayName = json.getString("displayName"); + String portrait = json.getString("portrait"); + String userId = json.getString("userID"); + + UserEntity user = userService.getUser(userId); + if (user != null) { + user.setNickName(displayName); + user.setPortrait(portrait); + + userService.updateById(user); + } + + CustomerEntity customerEntity = customerService.getOne(new LambdaQueryWrapper() + .eq(CustomerEntity::getOsnId, userId) + ); + if (customerEntity != null) { + customerEntity.setName( displayName ); + customerEntity.setPortrait(portrait); + customerService.updateById(customerEntity); + } + + + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void handleGroupInfo(JSONObject json){ + + try { + + System.out.println("[handleUserInfo] : "+json); + json = JSONObject.parseObject(json.getString("content")); + /** + * TODO : 这里处理接收到的user info 信息 + * "userID" : osn id + * "displayName" : 昵称 + * "describes" + * "portrait" : 头像url + * "urlSpace" : + * **/ + + String name = json.getString("name"); + String portrait = json.getString("portrait"); + String groupId = json.getString("groupID"); + + GroupEntity groupEntity = groupService.getOne(new LambdaQueryWrapper().eq(GroupEntity::getOsnId, groupId)); + if (groupEntity != null) { + groupEntity.setName(name); + groupEntity.setPortrait(portrait); + + groupService.updateById(groupEntity); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + // + //public void pushMessage(String user, List cmdList){ + // + // // 根据device表中的vendor决定使用什么推送 + // // iphone + // // Xiaomi 使用小米推送 + // // huawei + // // OPPO + // // vivo + // // FCM 使用极光 + // + // System.out.println("推送开始------"); + // + // String content = "You have " +cmdList.size()+ " new message."; + // String alias = genAlias(user); + // + // Device device = deviceService.getByOsnId(user); + // if (device != null) { + // String vendor = device.getVendor(); + // switch (vendor) { + // + // case "Xiaomi": + // pushToXiaomi(alias, "new message", content); + // break; + // + // case "apple": + // pushJiguangToId(device.getDevice(), "new message", content); + // break; + // + // //default: + // // pushJiguang(alias, "new message", content); + // // break; + // default: + // firebase(device.getDevice(), "new message", content); + // break; + // } + // + // } + // + // + // + //} + + //void firebase(String device, String title, String content){ + // myJPushClient.sendMsgFirebase(device, title, content); + //} + // + //void pushToXiaomi(String alias, String title, String content){ + // + // Constants.useOfficial(); + // Sender sender = new Sender("6jzbNMq0oMzsXQFCuSIeYA=="); + // String messagePayload = "This is a message"; + // String description = content; + // com.xiaomi.xmpush.server.Message message = new com.xiaomi.xmpush.server.Message.Builder() + // .title(title) + // .description(description).payload(messagePayload) + // .restrictedPackageName("cn.net.shuting.sns.weiliao") + // .notifyType(2) // 使用默认提示音提示 + // .extra(Constants.EXTRA_PARAM_NOTIFY_EFFECT, Constants.NOTIFY_LAUNCHER_ACTIVITY) + // .build(); + // + // + // try { + // Result result = sender.sendToAlias(message, alias, 3); + // /*Log.v("Server response: ", "MessageId: " + result.getMessageId() + // + " ErrorCode: " + result.getErrorCode().toString() + // + " Reason: " + result.getReason());*/ + // } catch (Exception e) { + // + // } + // + // + //} + // + //void pushJiguang(String alias, String title, String content){ + // // 推送数据 + // Message message = new Message(); + // + // System.out.println("push alias : " + alias); + // + // message.setUserId(alias); + // + // message.setMessageContent(content); + // + // myJPushClient.sendMsg(message); + //} + // + //void pushJiguangToId(String registerId, String title, String content){ + // // 推送数据 + // Message message = new Message(); + // + // System.out.println("push alias : " + registerId); + // + // message.setUserId(registerId); + // + // message.setMessageContent(content); + // + // myJPushClient.sendMsgToId(message); + //} + + static byte[] ToMD5(String str) { + // 加密后的16进制字符串 + String hexStr = ""; + try { + // 此 MessageDigest 类为应用程序提供信息摘要算法的功能 + MessageDigest md5 = MessageDigest.getInstance("MD5"); + // 转换为MD5码 + byte[] digest = md5.digest(str.getBytes("utf-8")); + return digest; + //hexStr = ByteUtils.toHexString(digest); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + static String genAlias(String user) { + String alias = Base64.getUrlEncoder().encodeToString(ToMD5(user)); + return alias; + } + + + + + @Data + class SendCommandInfo{ + String command; + String groupID; + JSONObject json; + long createTime; + + public SendCommandInfo(String command, String to, JSONObject json){ + this.command = command; + this.groupID = to; + this.json = json; + createTime = System.currentTimeMillis(); + } + + } + + class RunnerThread extends Thread { + + final ConcurrentLinkedQueue dataList = new ConcurrentLinkedQueue<>(); + + public RunnerThread(){ + } + + public void push(SendCommandInfo data) { + + dataList.offer(data); + synchronized (dataList){ + dataList.notify(); + } + } + + @Override + public void run(){ + + while(true){ + try{ + if(dataList.isEmpty()){ + synchronized (dataList){ + dataList.wait(); + } + } + SendCommandInfo data = dataList.poll(); + + try { + long createTime = data.getCreateTime(); + if (createTime + 5000 > System.currentTimeMillis()) { + Thread.sleep(5000); + } + + if (ltpData != null){ + ltpData.sendJson(data.getCommand(), data.getGroupID(), data.getJson()); + } + + } catch (Exception e) { + + } + + }catch (Exception e){ + //logError(e); + } + } + } + + } + +} diff --git a/src/main/java/com/mhhy/service/ProjectConfigService.java b/src/main/java/com/mhhy/service/ProjectConfigService.java new file mode 100644 index 0000000..5c11dd4 --- /dev/null +++ b/src/main/java/com/mhhy/service/ProjectConfigService.java @@ -0,0 +1,28 @@ +package com.mhhy.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhhy.common.BaseResult; +import com.mhhy.model.entity.ProjectConfigEntity; +import com.mhhy.model.entity.UserEntity; + +import java.util.List; + +public interface ProjectConfigService extends IService { + + JSONObject getConfig(String project); + String getDappInfo(String project); + + List listProjectConfig(String project); + boolean setConfig(String project, String config); + boolean setConfig(String project, String config, String config2); + + List listConfig(); + + boolean updateConfig(String project, String config); + boolean updateConfig2(String project, String config); + + boolean deleteConfig(String project); + + List listProject(int page, int limit); +} diff --git a/src/main/java/com/mhhy/service/UserService.java b/src/main/java/com/mhhy/service/UserService.java new file mode 100644 index 0000000..39e96ad --- /dev/null +++ b/src/main/java/com/mhhy/service/UserService.java @@ -0,0 +1,20 @@ +package com.mhhy.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhhy.common.BaseResult; +import com.mhhy.model.entity.UserEntity; + +import java.util.List; + +public interface UserService extends IService { + BaseResult updatePassword(String data); + boolean updatePassword(String username, String password, String oldPassword); + String findUser(String username); + UserEntity findAdmin(String username); + UserEntity getUser(String osnId); + + UserEntity getById(Integer id); + + List listAdmin(int page, int limit); + List listUser(int page, int limit, String project); +} diff --git a/src/main/java/com/mhhy/service/impl/AdminServiceImpl.java b/src/main/java/com/mhhy/service/impl/AdminServiceImpl.java new file mode 100644 index 0000000..2af5cbe --- /dev/null +++ b/src/main/java/com/mhhy/service/impl/AdminServiceImpl.java @@ -0,0 +1,93 @@ +package com.mhhy.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhhy.common.BaseResult; +import com.mhhy.mapper.AdminMapper; +import com.mhhy.mapper.UserMapper; +import com.mhhy.model.entity.AdminEntity; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.service.AdminService; +import com.mhhy.service.UserService; +import com.mhhy.util.PasswordUtil; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.RequestUtil; +import com.ospn.common.OsnUtils; +import org.springframework.stereotype.Service; + +@Service("adminServer") +public class AdminServiceImpl extends ServiceImpl implements AdminService { + + public boolean createAdmin(String username, String password) { + AdminEntity adminEntity = findUser(username) ; + if (adminEntity != null) { + return false; + } + + adminEntity = new AdminEntity(); + adminEntity.setUsername(username); + adminEntity.setPassword(password); + adminEntity.setState(1); + adminEntity.setLevel(1); + return this.save(adminEntity); + } + + public boolean createCustomer(String username, String password) { + AdminEntity adminEntity = findUser(username) ; + if (adminEntity != null) { + return false; + } + + adminEntity = new AdminEntity(); + adminEntity.setUsername(username); + adminEntity.setPassword(password); + adminEntity.setState(1); + adminEntity.setLevel(2); + return this.save(adminEntity); + } + + public AdminEntity findUser(String username) { + AdminEntity user = this.getOne(new LambdaQueryWrapper() + .eq(AdminEntity::getUsername, username)); + if (user != null) { + return user; + } + return null; + } + + public boolean updatePassword(String username, String password) { + try { + + AdminEntity adminEntity = findUser(username); + if (adminEntity == null) { + return false; + } + adminEntity.setPassword(password); + return this.updateById(adminEntity); + + + + } catch (Exception e) { + + } + return false; + } + + public boolean updateState(String username, int state) { + try { + + AdminEntity adminEntity = findUser(username); + if (adminEntity == null) { + return false; + } + adminEntity.setState(state); + return this.updateById(adminEntity); + + } catch (Exception e) { + + } + return false; + } + +} diff --git a/src/main/java/com/mhhy/service/impl/AppVersionEntityServiceImpl.java b/src/main/java/com/mhhy/service/impl/AppVersionEntityServiceImpl.java new file mode 100644 index 0000000..13f7c6f --- /dev/null +++ b/src/main/java/com/mhhy/service/impl/AppVersionEntityServiceImpl.java @@ -0,0 +1,54 @@ +package com.mhhy.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhhy.mapper.AppVersionEntityMapper; +import com.mhhy.model.entity.AppVersionEntity; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.service.AppVersionEntityService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AppVersionEntityServiceImpl extends ServiceImpl implements AppVersionEntityService { + + + public List listAppVersionAll() { + List list = this.list(); + return list; + } + + public AppVersionEntity getUser() { + String last = " ORDER BY id DESC LIMIT 1"; + List list = this.list(new LambdaQueryWrapper() + .last(last)); + AppVersionEntity appVersionEntity = new AppVersionEntity(); + if (list.size()>0){ + appVersionEntity = list.get(0); + } + return appVersionEntity; + } + + public boolean updateAppVersion(AppVersionEntity appVersionEntity) { + boolean save = this.save(appVersionEntity); + return save; + } + + public List listAppVersion(int page, int limit) { + String last = " limit " + (page - 1)*limit + "," + limit; + List list = this.list(new LambdaQueryWrapper() + .eq(AppVersionEntity::getState, 2) + .last(last)); + return list; + } + + public List listAppVersionUser(int page, int limit, String user) { + String last = " limit " + (page - 1)*limit + "," + limit; + List list = this.list(new LambdaQueryWrapper() + .eq(AppVersionEntity::getState, 2) + .eq(AppVersionEntity::getUser,user) + .last(last)); + return list; + } +} diff --git a/src/main/java/com/mhhy/service/impl/CustomerServiceImpl.java b/src/main/java/com/mhhy/service/impl/CustomerServiceImpl.java new file mode 100644 index 0000000..b10b80c --- /dev/null +++ b/src/main/java/com/mhhy/service/impl/CustomerServiceImpl.java @@ -0,0 +1,57 @@ +package com.mhhy.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhhy.mapper.CustomerMapper; +import com.mhhy.model.entity.CustomerEntity; +import com.mhhy.service.CustomerService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class CustomerServiceImpl + extends ServiceImpl + implements CustomerService{ + + // 增 + public boolean addObj(String name, String portrait, String osnId, String project) { + + CustomerEntity entity = new CustomerEntity(); + entity.setProject(project); + entity.setName(name); + entity.setOsnId(osnId); + entity.setPortrait(portrait); + return this.save(entity); + } + + // 查 + public List listAll() { + return this.list(); + } + + public List listByProject(String project) { + + try { + + return this.list(new LambdaQueryWrapper().eq(CustomerEntity::getProject, project)); + + } catch (Exception e) { + + } + + return new ArrayList<>(); + } + + // 改 + + // 删 + public boolean deleteObj(String osnId, String project) { + return this.remove(new LambdaQueryWrapper() + .eq(CustomerEntity::getOsnId, osnId) + .eq(CustomerEntity::getProject, project)); + } + +} diff --git a/src/main/java/com/mhhy/service/impl/GroupServiceImpl.java b/src/main/java/com/mhhy/service/impl/GroupServiceImpl.java new file mode 100644 index 0000000..8ee58ce --- /dev/null +++ b/src/main/java/com/mhhy/service/impl/GroupServiceImpl.java @@ -0,0 +1,60 @@ +package com.mhhy.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhhy.mapper.GroupMapper; +import com.mhhy.model.entity.CustomerEntity; +import com.mhhy.model.entity.GroupEntity; +import com.mhhy.service.GroupService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GroupServiceImpl + extends ServiceImpl + implements GroupService{ + + // 增 + public boolean addObj(String name, String portrait, String osnId, String project) { + + GroupEntity entity = new GroupEntity(); + entity.setProject(project); + entity.setName(name); + entity.setOsnId(osnId); + entity.setPortrait(portrait); + return this.save(entity); + } + + // 查 + public List listAll() { + return this.list(); + } + + public List listByProject(String project) { + + try { + + return this.list(new LambdaQueryWrapper().eq(GroupEntity::getProject, project)); + + } catch (Exception e) { + + } + + return new ArrayList<>(); + } + + // 改 + + // 删 + public boolean deleteObj(String osnId, String project) { + return this.remove(new LambdaQueryWrapper() + .eq(GroupEntity::getOsnId, osnId) + .eq(GroupEntity::getProject, project)); + } + + + + +} diff --git a/src/main/java/com/mhhy/service/impl/LoginServiceImpl.java b/src/main/java/com/mhhy/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..714d363 --- /dev/null +++ b/src/main/java/com/mhhy/service/impl/LoginServiceImpl.java @@ -0,0 +1,1170 @@ +package com.mhhy.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mhhy.common.BaseResult; +import com.mhhy.enums.ResultCodeEnum; +import com.mhhy.enums.UserStateEnum; +import com.mhhy.enums.UserTypeEnum; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.model.req.LoginReq; +import com.mhhy.model.req.RegisterReq; +import com.mhhy.service.LoginService; +import com.mhhy.service.LtpServer; +import com.mhhy.service.UserService; +import com.mhhy.util.Aes128Util; +import com.mhhy.util.PasswordUtil; +import com.mhhy.util.RandomUtil; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.token.JwtUtil; +import com.ospn.common.ECUtils; +import com.ospn.common.OsnUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.MessageDigest; +import java.util.Arrays; +import java.util.Base64; +import java.util.Date; +import java.util.UUID; + +@Service +//@Setter(value = AccessLevel.PRIVATE, onMethod_ = @Autowired) +public class LoginServiceImpl implements LoginService { + + @Autowired + private UserService userService; + + @Autowired + private LtpServer ltpServer; + + @Value("${IM.imUrl}") + private String mImUrl; + + @Value("${IM.imPwd}") + private String mImPwd; + + @Value("${IM.LOGIN_URL}") + private String LOGIN_URL;//: http://39.100.147.50:8300/admin + + @Value("${IM.HOST_IP}") + private String HOST_IP;//: 39.100.147.50 + + @Value("${IM.PEFIX_URL}") + private String PEFIX_URL;//: http://39.100.147.50:8334 + + @Value("${IM.APP_DEVICE}") + private String APP_DEVICE;//: http://39.100.147.50:8334/api/im/device + + @Value("${IM.SET_NAME}") + private String SET_NAME;//: http://39.100.147.50:8334/api/im/setName + + @Value("${IM.KEFU_LIST}") + private String KEFU_LIST;//: http://39.100.147.50:8334/api/im/custormer + + @Value("${IM.QueryAplets}") + private String QueryAplets;//: http://39.100.147.50:8334/api/im/findOne + + @Value("${IM.GroupList}") + private String GroupList;//: http://47.92.123.66:8882/program/list + + @Value("${IM.AddGroup}") + private String AddGroup;//: http://47.92.123.66:8882/groupProgram/add + + @Value("${IM.ENDPOINT}") + private String ENDPOINT;//: https://oss-ap-southeast-1.aliyuncs.com + + //@Value("${IM.RemoteTempFilePath}") + //private String RemoteTempFilePath;//: https://zolo-image1.oss-ap-southeast-1.aliyuncs.com/ + + @Value("${IM.AccessKeyId}") + private String AccessKeyId;//: LTAI5tQ2JnUwihLqmPSvHDkB + + @Value("${IM.AccessKeySecret}") + private String AccessKeySecret;//: DZB9JYIrlt6gJeJVtIwP9xlqZkWgT3 + + @Value("${IM.BUCKETNAME}") + private String BUCKETNAME;//: zolo-image1 + + @Value("${IM.UserPortraitDirectory}") + private String UserPortraitDirectory;//: userPortrait/ + + @Value("${IM.GroupPortraitDirectory}") + private String GroupPortraitDirectory;//: groupPortrait/ + + @Value("${IM.TempDirectory}") + private String TempDirectory;//: temp/ + + @Value("${IM.MainDapp}") + private String MainDapp; + + @Value("${IM.WEBRTCBASE}") + private String WEBRTCBASE; + + @Value("${IM.WEBRTCHOST}") + private String WEBRTCHOST; + + + @Value("${REGISTERKEY}") + private String registerKey; + + + /*@Value("${IM.MainDapp}") + private String MainDapp; + + @Value("${IM.Wallet}") + private String Wallet;*/ + + + + + + static String sessionFlag = "session_01:"; + public static String conversationFlag = "conversation01_id:"; + + + //private final static OdcProperties properties = SpringContextHolder.getBean("odcProperties", OdcProperties.class); + + @Override + public BaseResult register(RegisterReq registerReq) { + + UserEntity one = userService.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, registerReq.getUsername()) + .last("limit 1") + ); + + if (one != null){ + return BaseResult.err(ResultCodeEnum.ACCOUNT_ALREADY.getRemark()); + } + + + + String[] keys = ECUtils.createOsnID2("user", registerReq.getPassword()); + if (keys == null) { + return BaseResult.err("gen account error."); + } + String osnId = keys[0]; + if (osnId.length() < 20) { + return BaseResult.err("gen account error."); + } + + //String username2 = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + //String password2 = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + + //String osnId = keys[0]; //registerOsn(username2, password2); + + if (register2im(osnId, ltpServer.ltpData.apps.osnID, null) == null){ + return BaseResult.err("register to im error."); + } + + //对密码进行sha256加密 + byte[] sha256Str = PasswordUtil.getSHA256Str(registerReq.getPassword()); + //对加密的数据进行base64编码 + String password = PasswordUtil.encoderBase64(sha256Str); + one = new UserEntity(); + one.setUsername(registerReq.getUsername()); + one.setPassword(password); + one.setType(UserTypeEnum.NORMAL.getCode()); + one.setState(UserStateEnum.NORMAL.getCode()); + one.setCreateTime(new Date()); + one.setImNode(HOST_IP); + one.setImId(osnId); + one.setImUsername(osnId); + + + byte[] data = Base64.getDecoder().decode(keys[2]); + + String key2 = OsnUtils.aesEncrypt(data, sha256Str); + + String pwd2 = "VER2-" + keys[1] +"-"+ key2; + one.setImPwd(pwd2); + try { + userService.save(one); + } catch (Exception e) { + e.printStackTrace(); + //System.out.println(e); + } + + return BaseResult.success("register success"); + } + + public String[] createAccount(){ + // 创建账号 + byte[] key = null; + String[] keyPair = ECUtils.createOsnID2("user", key); + + + + String osnId = register2im(keyPair[0], null, null); + if (osnId == null) { + return null; + } + if (osnId.length() == 0) { + return null; + } + return keyPair; + } + + public String getHostIp() { + return HOST_IP; + } + + @Override + public BaseResult register2(RegisterReq registerReq) { + + UserEntity one = userService.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, registerReq.getUsername()) + .last("limit 1") + ); + + if (one != null){ + + JSONObject resultJson = new JSONObject(); + resultJson.put("osn_id", one.getImId()); + resultJson.put("osn_username", one.getImUsername()); + resultJson.put("osn_password", one.getImPwd()); + resultJson.put("osn_node", one.getImNode()); + resultJson.put("service_id", ltpServer.getAppId()); + + if (!one.isSetPassword()) { + resultJson.put("password", "null"); + } + + + + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + String token = JwtUtil.createJwtToken(one.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(one.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(one.getId(), token); + + // log.info("-------token-------" + tokenJson.get("token")); + //将通讯密钥存入redis + RedisUtil.set("Communicationkey:"+one.getImId(), randomToInviteCode); + + resultJson.put("token", token); + resultJson.put("communicationKey", randomToInviteCode); + + + + + + /*if (registerReq.getPassword() != null) { + System.out.println("req password : " + registerReq.getPassword()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getPassword())); + return new BaseResult(resultJson.toString(), temp); + } + + if (registerReq.getSmsCode() != null) { + System.out.println("req sms code : " + registerReq.getSmsCode()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getSmsCode())); + return new BaseResult(resultJson.toString(), temp); + }*/ + + resultJson.put("json", getConfig()); + + System.out.println("[register] result:" + resultJson); + return BaseResult.success(200, resultJson); + + //return BaseResult.err(ResultCodeEnum.ACCOUNT_ALREADY.getRemark()); + } + + + + + String username2 = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + String password2 = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + + String osnId = registerOsn(username2, password2); + if (osnId == null) { + return BaseResult.err(ResultCodeEnum.IM_REGISTER_FAILED.getRemark()); + } + if (osnId.length() == 0) { + return BaseResult.err(ResultCodeEnum.IM_REGISTER_FAILED.getRemark()); + } + + + one = new UserEntity(); + one.setUsername(registerReq.getUsername()); + if (registerReq.getPassword() != null) { + //对密码进行sha256加密 + byte[] sha256Str = PasswordUtil.getSHA256Str(registerReq.getPassword()); + //对加密的数据进行base64编码 + String password = PasswordUtil.encoderBase64(sha256Str); + one.setPassword(password); + } + + one.setType(UserTypeEnum.NORMAL.getCode()); + one.setState(UserStateEnum.NORMAL.getCode()); + one.setCreateTime(new Date()); + one.setImNode(HOST_IP); + one.setImId(osnId); + one.setImUsername(username2); + one.setImPwd(password2); + try { + userService.save(one); + } catch (Exception e) { + e.printStackTrace(); + //System.out.println(e); + return BaseResult.err(ResultCodeEnum.DB_ERROR.getRemark()); + } + + JSONObject resultJson = new JSONObject(); + resultJson.put("osn_id", one.getImId()); + resultJson.put("osn_username", one.getImUsername()); + resultJson.put("osn_password", one.getImPwd()); + resultJson.put("osn_node", one.getImNode()); + resultJson.put("service_id", ltpServer.getAppId()); + + if (!one.isSetPassword()) { + resultJson.put("password", "null"); + } + + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + String token = JwtUtil.createJwtToken(one.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(one.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(one.getId(), token); + + // log.info("-------token-------" + tokenJson.get("token")); + //将通讯密钥存入redis + RedisUtil.set("Communicationkey:"+one.getImId(), randomToInviteCode); + + resultJson.put("token", token); + resultJson.put("communicationKey", randomToInviteCode); + + /*if (registerReq.getPassword() != null) { + System.out.println("req password : " + registerReq.getPassword()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getPassword())); + return new BaseResult(resultJson.toString(), temp); + } + + if (registerReq.getSmsCode() != null) { + System.out.println("req sms code : " + registerReq.getSmsCode()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getSmsCode())); + return new BaseResult(resultJson.toString(), temp); + }*/ + resultJson.put("json", getConfig()); + System.out.println("[register] result:" + resultJson); + return BaseResult.success(200, resultJson); + } + + public BaseResult register4(RegisterReq registerReq, String key) { + + + UserEntity one = userService.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, registerReq.getUsername()) + .last("limit 1") + ); + + if (one != null){ + + JSONObject resultJson = new JSONObject(); + resultJson.put("osn_id", one.getImId()); + resultJson.put("osn_username", one.getImUsername()); + resultJson.put("osn_password", one.getImPwd()); + resultJson.put("osn_node", one.getImNode()); + resultJson.put("service_id", ltpServer.getAppId()); + + if (!one.isSetPassword()) { + resultJson.put("password", "null"); + } + + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + String token = JwtUtil.createJwtToken(one.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(one.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(one.getId(), token); + + // log.info("-------token-------" + tokenJson.get("token")); + //将通讯密钥存入redis + RedisUtil.set("Communicationkey:"+one.getImId(), randomToInviteCode); + + resultJson.put("token", token); + resultJson.put("communicationKey", randomToInviteCode); + + resultJson.put("json", getConfig()); + + return new BaseResult(resultJson.toString(), key); + + /*if (registerReq.getPassword() != null) { + System.out.println("req password : " + registerReq.getPassword()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getPassword())); + return new BaseResult(resultJson.toString(), temp); + } + + if (registerReq.getSmsCode() != null) { + System.out.println("req sms code : " + registerReq.getSmsCode()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getSmsCode())); + return new BaseResult(resultJson.toString(), temp); + }*/ + + //return BaseResult.success(200, resultJson); + + //return BaseResult.err(ResultCodeEnum.ACCOUNT_ALREADY.getRemark()); + } + + + + + String username2 = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + String password2 = UUID.randomUUID().toString().replace("-", "").substring(2, 22); + + String osnId = registerOsn(username2, password2); + if (osnId == null) { + return BaseResult.err(ResultCodeEnum.IM_REGISTER_FAILED.getRemark()); + } + if (osnId.length() == 0) { + return BaseResult.err(ResultCodeEnum.IM_REGISTER_FAILED.getRemark()); + } + + + one = new UserEntity(); + one.setUsername(registerReq.getUsername()); + if (registerReq.getPassword() != null) { + //对密码进行sha256加密 + byte[] sha256Str = PasswordUtil.getSHA256Str(registerReq.getPassword()); + //对加密的数据进行base64编码 + String password = PasswordUtil.encoderBase64(sha256Str); + one.setPassword(password); + } + + one.setType(UserTypeEnum.NORMAL.getCode()); + one.setState(UserStateEnum.NORMAL.getCode()); + one.setCreateTime(new Date()); + one.setImNode(HOST_IP); + one.setImId(osnId); + one.setImUsername(username2); + one.setImPwd(password2); + try { + userService.save(one); + } catch (Exception e) { + e.printStackTrace(); + //System.out.println(e); + return BaseResult.err(ResultCodeEnum.DB_ERROR.getRemark()); + } + + JSONObject resultJson = new JSONObject(); + resultJson.put("osn_id", one.getImId()); + resultJson.put("osn_username", one.getImUsername()); + resultJson.put("osn_password", one.getImPwd()); + resultJson.put("osn_node", one.getImNode()); + resultJson.put("service_id", ltpServer.getAppId()); + + if (!one.isSetPassword()) { + resultJson.put("password", "null"); + } + + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + String token = JwtUtil.createJwtToken(one.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(one.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(one.getId(), token); + + // log.info("-------token-------" + tokenJson.get("token")); + //将通讯密钥存入redis + RedisUtil.set("Communicationkey:"+one.getImId(), randomToInviteCode); + + resultJson.put("token", token); + resultJson.put("communicationKey", randomToInviteCode); + + /*if (registerReq.getPassword() != null) { + System.out.println("req password : " + registerReq.getPassword()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getPassword())); + return new BaseResult(resultJson.toString(), temp); + } + + if (registerReq.getSmsCode() != null) { + System.out.println("req sms code : " + registerReq.getSmsCode()); + String temp = PasswordUtil.encoderBase64(PasswordUtil.getSHA256Str(registerReq.getSmsCode())); + return new BaseResult(resultJson.toString(), temp); + }*/ + + return new BaseResult(resultJson.toString(), key); + } + + public BaseResult register5(RegisterReq registerReq, String key, String UserPwd, String owner2) { + + UserEntity one = userService.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, registerReq.getUsername()) + .last("limit 1") + ); + + if (one != null){ + + JSONObject resultJson = new JSONObject(); + resultJson.put("osn_id", one.getImId()); + resultJson.put("osn_username", one.getImUsername()); + resultJson.put("osn_password", one.getImPwd()); + resultJson.put("osn_node", one.getImNode()); + resultJson.put("service_id", ltpServer.getAppId()); + + if (!one.isSetPassword()) { + resultJson.put("password", "null"); + } + + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + String token = JwtUtil.createJwtToken(one.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(one.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(one.getId(), token); + + // log.info("-------token-------" + tokenJson.get("token")); + //将通讯密钥存入redis + RedisUtil.set("Communicationkey:"+one.getImId(), randomToInviteCode); + + resultJson.put("token", token); + resultJson.put("communicationKey", randomToInviteCode); + + resultJson.put("json", getConfig()); + + return new BaseResult(resultJson.toString(), key); + } + + + // 创建账号 + String[] keyPair = ECUtils.createOsnID2("user", UserPwd); + String privateKey = "VER2-" + keyPair[1] + "-" + keyPair[2]; + + + String osnId = register2im(keyPair[0], owner2, null); + if (osnId == null) { + return BaseResult.err(ResultCodeEnum.IM_REGISTER_FAILED.getRemark()); + } + if (osnId.length() == 0) { + return BaseResult.err(ResultCodeEnum.IM_REGISTER_FAILED.getRemark()); + } + + + one = new UserEntity(); + one.setUsername(registerReq.getUsername()); + if (registerReq.getPassword() != null) { + //对密码进行sha256加密 + byte[] sha256Str = PasswordUtil.getSHA256Str(registerReq.getPassword()); + //对加密的数据进行base64编码 + String password = PasswordUtil.encoderBase64(sha256Str); + one.setPassword(password); + } + + one.setType(UserTypeEnum.NORMAL.getCode()); + one.setState(UserStateEnum.NORMAL.getCode()); + one.setCreateTime(new Date()); + one.setImNode(HOST_IP); + one.setImId(osnId); + one.setImUsername(osnId); + one.setImPwd(privateKey); + try { + userService.save(one); + } catch (Exception e) { + e.printStackTrace(); + return BaseResult.err(ResultCodeEnum.DB_ERROR.getRemark()); + } + + JSONObject resultJson = new JSONObject(); + resultJson.put("osn_id", one.getImId()); + resultJson.put("osn_username", one.getImUsername()); + resultJson.put("osn_password", one.getImPwd()); + resultJson.put("osn_node", one.getImNode()); + resultJson.put("service_id", ltpServer.getAppId()); + + if (!one.isSetPassword()) { + resultJson.put("password", "null"); + } + + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + String token = JwtUtil.createJwtToken(one.getId(), 315360000L); + //把之前的token移除 + JwtUtil.removeTokenByUserId(one.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(one.getId(), token); + + // log.info("-------token-------" + tokenJson.get("token")); + //将通讯密钥存入redis + RedisUtil.set("Communicationkey:"+one.getImId(), randomToInviteCode); + + resultJson.put("token", token); + resultJson.put("communicationKey", randomToInviteCode); + + + return new BaseResult(resultJson.toString(), key); + } + + public UserEntity register6(String imId, String owner2, String project) { + + String osnId = register2im(imId, owner2, null); + if (osnId == null) { + return null; + } + if (osnId.length() == 0) { + return null; + } + + UserEntity userEntity = new UserEntity(); + userEntity.setUsername("U"+ System.currentTimeMillis()); + userEntity.setPassword(""); + userEntity.setType(UserTypeEnum.NORMAL.getCode()); + userEntity.setState(UserStateEnum.NORMAL.getCode()); + userEntity.setCreateTime(new Date()); + userEntity.setImNode(HOST_IP); + userEntity.setImId(osnId); + userEntity.setImUsername(osnId); + userEntity.setImPwd(""); + userEntity.setProject(project); + try { + userService.save(userEntity); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + return userEntity; + } + + @Override + public JSONObject register3(RegisterReq req) { + + String osnId = registerOsn(req.getUsername(), req.getPassword(), req.getNickName()); + if (osnId == null) { + return null; + } + if (osnId.length() == 0) { + return null; + } + + JSONObject result = new JSONObject(); + result.put("osnID", osnId); + result.put("IP", HOST_IP); + return result; + } + + + @Override + public BaseResult login(LoginReq loginReq) { + + UserEntity one = userService.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, loginReq.getUsername()) + .last("limit 1") + ); + + if (one == null) { + return BaseResult.err(ResultCodeEnum.ACCOUNT_NOT_EXIST.getRemark()); + } + + try { + //获取数据库里面的密码,进行base64解码 + byte[] bytes = PasswordUtil.decodeBase64(one.getPassword()); + //解码之后的数据为key,进行对前端传递过来的密文进行aes解密 + //String random = PasswordUtil.decrypt(loginReq.getPassword(), PasswordUtil.parseByte2HexStr(bytes)); + + //byte[] encrypted1 = Base64.getDecoder().decode(content); + byte[] decData = OsnUtils.aesDecrypt(loginReq.getPassword(), bytes); + String random = new String(decData); + //比对redis里面的随机数 + String result = RedisUtil.get(sessionFlag + loginReq.getUsername()); + if (result == null){ + return BaseResult.err(ResultCodeEnum.PASSWORD_ERROR.getRemark()); + } + System.out.println("[login] from user:" + random); + System.out.println("[login] from redis:" + result); + if (result.equals(random)){ + //密码正确---生成token + String token = JwtUtil.createJwtToken(one.getId(), 315360000L); + //清除之前的token + JwtUtil.removeTokenByUserId(one.getId()); + //把token存入redis + JwtUtil.putTokenToRedis(one.getId(), token); + + // 1. 生成会话aes 密钥 + // 2. 存到session 表里面 + // 3. 用password base64 decode以后,加密 token 和 会话密钥 + // String uuid = UUID.randomUUID().toString(); + String randomToInviteCode = RandomUtil.getRandomToInviteCode(16); + RedisUtil.set("Communicationkey:"+one.getImId(), randomToInviteCode); + + //RedisUtil.setEx(conversationFlag+one.getId(), uuid, 315360000L); + + //token 和会话密钥拼接 + //String tokenConversationId = token + ":" + uuid; + + //密码aes加密返回 + //String aesEncode = new String(OsnUtils.aesEncrypt(randomToInviteCode.getBytes(), bytes)); + + JSONObject json = new JSONObject(); + json.put("token", token); + //json.put("refreshToken", token); + json.put("communicationKey", randomToInviteCode); + + // + json.put("osn_id", one.getImId()); + json.put("osn_username", one.getImUsername()); + json.put("osn_password", one.getImPwd()); + json.put("osn_node", one.getImNode()); + + + // put "json" + json.put("json", getConfig()); + + if (loginReq.getSmsCode() != null) { + return new BaseResult(json.toString(), loginReq.getSmsCode()); + } + return new BaseResult(json.toString(), one.getPassword()); + + }else { + return BaseResult.err(ResultCodeEnum.PASSWORD_ERROR.getRemark()); + } + } catch (Exception e) { + e.printStackTrace(); + //System.out.println(e); + } + + return BaseResult.err("I do not know."); + + } + + public JSONObject getConfig() { + JSONObject json = new JSONObject(); + + /*json.put("LOGIN_URL", LOGIN_URL); + json.put("HOST_IP", HOST_IP); + json.put("PEFIX_URL", PEFIX_URL); + json.put("APP_DEVICE", APP_DEVICE); + json.put("SET_NAME", SET_NAME); + json.put("KEFU_LIST", KEFU_LIST); + json.put("QueryAplets", QueryAplets); + json.put("GroupList", GroupList); + json.put("AddGroup", AddGroup);*/ + + json.put("HOST_IP", HOST_IP); + json.put("ENDPOINT", ENDPOINT); + json.put("AccessKeyId", AccessKeyId); + json.put("AccessKeySecret", AccessKeySecret); + json.put("BUCKETNAME", BUCKETNAME); + json.put("UserPortraitDirectory", UserPortraitDirectory); + json.put("GroupPortraitDirectory", GroupPortraitDirectory); + json.put("TempDirectory", TempDirectory); + + if (WEBRTCBASE != null) { + if (WEBRTCBASE.trim().length() > 0) { + json.put("WEBRTCBASE", WEBRTCBASE); + } + } + if (WEBRTCHOST != null) { + if (WEBRTCHOST.trim().length() > 0) { + json.put("WEBRTCHOST", WEBRTCHOST); + } + } + + + //json.put("MainDapp", MainDapp); + + json.put("UserServiceId",ltpServer.getAppId()); + + + return json; + } + + /** + * 获取随机数 + * @param + * @return + */ + @Override + public BaseResult getChallenge(String username) { + + try { + + UserEntity one = userService.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, username) + .last("limit 1") + ); + if (one == null){ + return BaseResult.err(ResultCodeEnum.ACCOUNT_NOT_EXIST.getRemark()); + } + String random = RandomUtil.getRandom(); + System.out.println("gen random : " + username + + " + " + random); + RedisUtil.setEx(sessionFlag+username, random, 60); + + JSONObject json = new JSONObject(); + json.put("challenge", random); + return new BaseResult(json.toString(), one.getPassword()); + + } catch (Exception e) { + e.printStackTrace(); + } + + return BaseResult.err("I do not know."); + } + + public String createGroup(String groupName, String owner){ + String osnID = "" ; + try { + String imUrl = mImUrl; + System.out.println("[registerOsn] imUrl:" + imUrl); + String imPwd = mImPwd; + System.out.println("[registerOsn] imPwd:" + imPwd); + URL url = new URL(imUrl); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(5000); + httpURLConnection.setDoInput(true); + httpURLConnection.setDoOutput(true); + JSONObject json = new JSONObject(); + json.put("name", groupName); + json.put("owner", owner); + json.put("portrait", ""); + String body = aesEncrypt(json.toString(),imPwd); + json.clear(); + json.put("command", "createGroup"); + json.put("data", body); + OutputStream outputStream = httpURLConnection.getOutputStream(); + outputStream.write(json.toString().getBytes()); + outputStream.flush(); + outputStream.close(); + + if(httpURLConnection.getResponseCode() == 200){ + InputStream responseStream = httpURLConnection.getInputStream(); + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead = 0; + while ((bytesRead = responseStream.read(buffer)) > 0) { + byteStream.write(buffer, 0, bytesRead); + } + String responseBody = byteStream.toString("utf-8"); + System.out.println("[createGroup] response:" + responseBody); + JSONObject jsonObject = JSONObject.parseObject(responseBody); + if(!("0:success".equals(jsonObject.getString("errCode")))){ + return ""; + } + json = JSON.parseObject(responseBody); + body = json.getString("data"); + if(body != null){ + + body = aesDecrypt(body,imPwd); + //System.out.println(body); + jsonObject = JSONObject.parseObject(body); + osnID = jsonObject.getString("groupId"); + System.out.println(jsonObject.getString("osnID")); + } + } else { + System.out.println("error: "+httpURLConnection.getResponseCode()); + } + } + catch (Exception e){ + e.printStackTrace(); + } + return osnID; + } + + + + private String registerOsn(String username, String password){ + String osnID = "" ; + try { + String imUrl = mImUrl; + System.out.println("[registerOsn] imUrl:"); + System.out.println("[registerOsn] imUrl:" + imUrl); + String imPwd = mImPwd;//cfgMap.get("imPwd"); + System.out.println("[registerOsn] imPwd:"); + System.out.println("[registerOsn] imPwd:" + imPwd); + URL url = new URL(imUrl); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(5000); + httpURLConnection.setDoInput(true); + httpURLConnection.setDoOutput(true); + JSONObject json = new JSONObject(); + json.put("username", username); + json.put("password", password); + String body = aesEncrypt(json.toString(),imPwd); + json.clear(); + json.put("command", "register"); + json.put("data", body); + OutputStream outputStream = httpURLConnection.getOutputStream(); + outputStream.write(json.toString().getBytes()); + outputStream.flush(); + outputStream.close(); + + if(httpURLConnection.getResponseCode() == 200){ + InputStream responseStream = httpURLConnection.getInputStream(); + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead = 0; + while ((bytesRead = responseStream.read(buffer)) > 0) { + byteStream.write(buffer, 0, bytesRead); + } + String responseBody = byteStream.toString("utf-8"); + // System.out.println(responseBody); + JSONObject jsonObject = JSONObject.parseObject(responseBody); + if(!("0:success".equals(jsonObject.getString("errCode")))){ + return ""; + } + json = JSON.parseObject(responseBody); + body = json.getString("data"); + if(body != null){ + + body = aesDecrypt(body,imPwd); + //System.out.println(body); + jsonObject = JSONObject.parseObject(body); + osnID = jsonObject.getString("osnID"); + System.out.println(jsonObject.getString("osnID")); + } + } else { + System.out.println("error: "+httpURLConnection.getResponseCode()); + } + } + catch (Exception e){ + e.printStackTrace(); + } + return osnID; + } + + private String registerOsn(String username, String password, String nickName){ + String osnID = "" ; + try { + String imUrl = mImUrl; + System.out.println("[registerOsn] imUrl:"); + System.out.println("[registerOsn] imUrl:" + imUrl); + String imPwd = mImPwd;//cfgMap.get("imPwd"); + System.out.println("[registerOsn] imPwd:"); + System.out.println("[registerOsn] imPwd:" + imPwd); + URL url = new URL(imUrl); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(5000); + httpURLConnection.setDoInput(true); + httpURLConnection.setDoOutput(true); + JSONObject json = new JSONObject(); + json.put("username", username); + json.put("password", password); + json.put("nickName", nickName); + String body = aesEncrypt(json.toString(),imPwd); + json.clear(); + json.put("command", "register"); + json.put("data", body); + OutputStream outputStream = httpURLConnection.getOutputStream(); + outputStream.write(json.toString().getBytes()); + outputStream.flush(); + outputStream.close(); + + if(httpURLConnection.getResponseCode() == 200){ + InputStream responseStream = httpURLConnection.getInputStream(); + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead = 0; + while ((bytesRead = responseStream.read(buffer)) > 0) { + byteStream.write(buffer, 0, bytesRead); + } + String responseBody = byteStream.toString("utf-8"); + // System.out.println(responseBody); + JSONObject jsonObject = JSONObject.parseObject(responseBody); + if(!("0:success".equals(jsonObject.getString("errCode")))){ + return ""; + } + json = JSON.parseObject(responseBody); + body = json.getString("data"); + if(body != null){ + + body = aesDecrypt(body,imPwd); + //System.out.println(body); + jsonObject = JSONObject.parseObject(body); + osnID = jsonObject.getString("osnID"); + System.out.println(jsonObject.getString("osnID")); + } + } else { + System.out.println("error: "+httpURLConnection.getResponseCode()); + } + } + catch (Exception e){ + e.printStackTrace(); + } + return osnID; + } + + private String register2im(String osnId, String owner, String name) { + String osnID = "" ; + try { + String imUrl = mImUrl; + System.out.println("[registerOsn] imUrl:"); + System.out.println("[registerOsn] imUrl:" + imUrl); + String imPwd = mImPwd; + System.out.println("[registerOsn] imPwd:"); + System.out.println("[registerOsn] imPwd:" + imPwd); + URL url = new URL(imUrl); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(5000); + httpURLConnection.setDoInput(true); + httpURLConnection.setDoOutput(true); + JSONObject json = new JSONObject(); + json.put("osnID", osnId); + json.put("name", name); + json.put("owner2", owner); + String body = aesEncrypt(json.toString(),imPwd); + json.clear(); + json.put("command", "register2"); + json.put("data", body); + OutputStream outputStream = httpURLConnection.getOutputStream(); + outputStream.write(json.toString().getBytes()); + outputStream.flush(); + outputStream.close(); + + if(httpURLConnection.getResponseCode() == 200){ + InputStream responseStream = httpURLConnection.getInputStream(); + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead = 0; + while ((bytesRead = responseStream.read(buffer)) > 0) { + byteStream.write(buffer, 0, bytesRead); + } + String responseBody = byteStream.toString("utf-8"); + System.out.println("[registerOsn] register result:"); + System.out.println("[registerOsn] register result:"+responseBody); + JSONObject jsonObject = JSONObject.parseObject(responseBody); + if(!("0:success".equals(jsonObject.getString("errCode")))){ + return ""; + } + json = JSON.parseObject(responseBody); + body = json.getString("data"); + if(body != null){ + + body = aesDecrypt(body,imPwd); + //System.out.println(body); + jsonObject = JSONObject.parseObject(body); + osnID = jsonObject.getString("osnID"); + System.out.println(jsonObject.getString("osnID")); + } + } else { + System.out.println("error: "+httpURLConnection.getResponseCode()); + } + } + catch (Exception e){ + e.printStackTrace(); + } + return osnID; + } + + public boolean disableOrEnableUser(String osnId, boolean enable) { + String osnID = "" ; + try { + String imUrl = mImUrl; + System.out.println("[registerOsn] imUrl:"); + System.out.println("[registerOsn] imUrl:" + imUrl); + String imPwd = mImPwd; + System.out.println("[registerOsn] imPwd:"); + System.out.println("[registerOsn] imPwd:" + imPwd); + URL url = new URL(imUrl); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(5000); + httpURLConnection.setDoInput(true); + httpURLConnection.setDoOutput(true); + JSONObject json = new JSONObject(); + json.put("user", osnId); + String body = aesEncrypt(json.toString(),imPwd); + json.clear(); + if (enable) { + json.put("command", "enableUser"); + } else { + json.put("command", "disableUser"); + } + + json.put("data", body); + OutputStream outputStream = httpURLConnection.getOutputStream(); + outputStream.write(json.toString().getBytes()); + outputStream.flush(); + outputStream.close(); + + if(httpURLConnection.getResponseCode() == 200){ + InputStream responseStream = httpURLConnection.getInputStream(); + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int bytesRead = 0; + while ((bytesRead = responseStream.read(buffer)) > 0) { + byteStream.write(buffer, 0, bytesRead); + } + String responseBody = byteStream.toString("utf-8"); + System.out.println("[registerOsn] register result:"); + System.out.println("[registerOsn] register result:"+responseBody); + JSONObject jsonObject = JSONObject.parseObject(responseBody); + if(!("0:success".equals(jsonObject.getString("errCode")))){ + return false; + } + return true; + + } else { + System.out.println("error: "+httpURLConnection.getResponseCode()); + } + } + catch (Exception e){ + e.printStackTrace(); + } + return false; + } + + public byte[] sha256(byte[] data){ + MessageDigest messageDigest; + try { + messageDigest = MessageDigest.getInstance("SHA-256"); + messageDigest.update(data); + data = messageDigest.digest(); + } catch (Exception e){ + e.printStackTrace(); + } + return data; + } + + public String aesEncrypt(String data, String key){ + try { + byte[] iv = new byte[16]; + Arrays.fill(iv,(byte)0); + byte[] pwdHash = sha256(key.getBytes()); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(pwdHash, "AES"), new IvParameterSpec(iv)); + byte[] encData = cipher.doFinal(data.getBytes()); + return Base64.getEncoder().encodeToString(encData); + } + catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + public String aesDecrypt(String data, String key){ + try { + byte[] iv = new byte[16]; + Arrays.fill(iv,(byte)0); + byte[] rawData = Base64.getDecoder().decode(data); + byte[] pwdHash = sha256(key.getBytes()); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(pwdHash, "AES"), new IvParameterSpec(iv)); + rawData = cipher.doFinal(rawData); + return new String(rawData); + } + catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + public String getRegisterKey() { + return registerKey; + } + + +} diff --git a/src/main/java/com/mhhy/service/impl/ProjectConfigServiceImpl.java b/src/main/java/com/mhhy/service/impl/ProjectConfigServiceImpl.java new file mode 100644 index 0000000..ee77d2f --- /dev/null +++ b/src/main/java/com/mhhy/service/impl/ProjectConfigServiceImpl.java @@ -0,0 +1,149 @@ +package com.mhhy.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhhy.common.BaseResult; +import com.mhhy.enums.ResultCodeEnum; +import com.mhhy.enums.UserStateEnum; +import com.mhhy.enums.UserTypeEnum; +import com.mhhy.mapper.ProjectConfigMapper; +import com.mhhy.mapper.UserMapper; +import com.mhhy.model.entity.ProjectConfigEntity; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.model.req.LoginReq; +import com.mhhy.model.req.RegisterReq; +import com.mhhy.service.LoginService; +import com.mhhy.service.LtpServer; +import com.mhhy.service.ProjectConfigService; +import com.mhhy.service.UserService; +import com.mhhy.util.PasswordUtil; +import com.mhhy.util.RandomUtil; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.token.JwtUtil; +import com.mysql.cj.util.Base64Decoder; +import com.ospn.common.ECUtils; +import com.ospn.common.OsnUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.MessageDigest; +import java.util.*; + +@Service +public class ProjectConfigServiceImpl + extends ServiceImpl + implements ProjectConfigService{ + + public JSONObject getConfig(String project){ + + ProjectConfigEntity entity = this.getOne(new LambdaQueryWrapper() + .eq(ProjectConfigEntity::getProject, project)); + + if (entity == null) { + return null; + } + + try { + + String temp = new String(Base64.getDecoder().decode(entity.getConfig())); + if (temp == null) { + return null; + } + + JSONObject json = JSONObject.parseObject(temp); + return json; + + } catch (Exception e) { + + } + + return null; + } + + public List listProjectConfig(String project){ + List list = this.list(new LambdaQueryWrapper() + .eq(ProjectConfigEntity::getProject, project) + ); + return list; + } + + // 增 + public boolean setConfig(String project, String config) { + + ProjectConfigEntity entity = new ProjectConfigEntity(); + entity.setProject(project); + entity.setConfig(config); + + return this.save(entity); + } + + public boolean setConfig(String project, String config, String config2) { + + ProjectConfigEntity entity = new ProjectConfigEntity(); + entity.setProject(project); + entity.setConfig(config); + entity.setConfig2(config2); + + return this.save(entity); + } + + // 查 + public List listConfig() { + return this.list(); + } + + public String getDappInfo(String project) { + + ProjectConfigEntity entity = + this.getOne(new LambdaQueryWrapper() + .eq(ProjectConfigEntity::getProject, project) + ); + + if (entity == null) { + return null; + } + + return entity.getConfig2(); + } + + // 改 + public boolean updateConfig(String project, String config) { + return this.update(new LambdaUpdateWrapper() + .eq(ProjectConfigEntity::getProject,project) + .set(ProjectConfigEntity::getConfig, config)); + } + + public boolean updateConfig2(String project, String config) { + return this.update(new LambdaUpdateWrapper() + .eq(ProjectConfigEntity::getProject,project) + .set(ProjectConfigEntity::getConfig2, config)); + } + + // 删 + public boolean deleteConfig(String project) { + return this.remove(new LambdaQueryWrapper().eq(ProjectConfigEntity::getProject, project)); + } + + @Override + public List listProject(int page, int limit) { + String last = " limit " + (page - 1)*limit + "," + limit; + List list = this.list(new LambdaQueryWrapper() + .last(last)); + return list; + } + + +} diff --git a/src/main/java/com/mhhy/service/impl/UserServiceImpl.java b/src/main/java/com/mhhy/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..d18a315 --- /dev/null +++ b/src/main/java/com/mhhy/service/impl/UserServiceImpl.java @@ -0,0 +1,136 @@ +package com.mhhy.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhhy.common.BaseResult; +import com.mhhy.mapper.UserMapper; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.service.UserService; +import com.mhhy.util.*; +import com.ospn.common.OsnUtils; +import org.apache.catalina.User; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("userService") +public class UserServiceImpl extends ServiceImpl implements UserService { + @Override + public BaseResult updatePassword(String data) { + try { + UserEntity user = RequestUtil.getMainUser(); + if (user == null) { + return BaseResult.err("user not login."); + } + + // 获取解密key + // 解密data + String plaintext = getPlaintext(data, user); + if (plaintext == null) { + + return BaseResult.err("Communication key error."); + } + + JSONObject jsonObject = JSONObject.parseObject(plaintext); + if (user == null) { + return BaseResult.err("get password error."); + } + + // 如果有密码,还需要输入原始密码 + if (user.isSetPassword()) { + String oldPwd = jsonObject.getString("oldPassword"); + if (!user.getPassword().equalsIgnoreCase(oldPwd)) { + return BaseResult.err("old password error."); + } + } + + + String password = jsonObject.getString("password"); + + //对新密码进行加密 + byte[] sha256Str = PasswordUtil.getSHA256Str(password); + String newPassword = PasswordUtil.encoderBase64(sha256Str); + user.setPassword(newPassword); + this.updateById(user); + + return BaseResult.success(); + + } catch (Exception e) { + + } + return BaseResult.err("I do not known."); + } + + private String getPlaintext(String encData, UserEntity user) { + + try { + String key = RedisUtil.get("Communicationkey:"+user.getImId()); + System.out.println("[getPlaintext] encData:" + encData); + System.out.println("[getPlaintext] user:" + user.getImId()); + System.out.println("[getPlaintext] key:" + key); + String plaint = OsnUtils.aesDecrypt(encData, key); + System.out.println("[getPlaintext] plaint:" + plaint); + return plaint; + } catch (Exception e) { + + } + + return null; + } + + public String findUser(String username) { + UserEntity user = this.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, username)); + if (user != null) { + return user.getImId(); + } + return null; + } + + public UserEntity findAdmin(String username) { + UserEntity user = this.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getUsername, username) + .eq(UserEntity::getState, 2) + ); + + return user; + + } + + public UserEntity getUser(String osnId) { + UserEntity user = this.getOne(new LambdaQueryWrapper() + .eq(UserEntity::getImId, osnId)); + + return user; + } + + public UserEntity getById(Integer id) { + UserEntity userEntity = this.getById(id); + return userEntity; + } + + public List listUser(int page, int limit, String project) { + String last = " limit " + (page - 1)*limit + "," + limit; + List list = this.list(new LambdaQueryWrapper() + .eq(UserEntity::getProject, project) + .last(last)); + return list; + } + + public List listAdmin(int page, int limit) { + String last = " limit " + (page - 1)*limit + "," + limit; + List list = this.list(new LambdaQueryWrapper() + .eq(UserEntity::getState, 2) + .last(last)); + return list; + } + + @Override + public boolean updatePassword(String username, String password, String oldPassword) { + UserEntity userEntity = new UserEntity(); + userEntity.setPassword(password); + return this.update(userEntity, new LambdaQueryWrapper().eq(UserEntity::getUsername, username).eq(UserEntity::getPassword, oldPassword)); + } +} diff --git a/src/main/java/com/mhhy/util/Aes128Util.java b/src/main/java/com/mhhy/util/Aes128Util.java new file mode 100644 index 0000000..3941672 --- /dev/null +++ b/src/main/java/com/mhhy/util/Aes128Util.java @@ -0,0 +1,109 @@ +package com.mhhy.util; + +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.lang.reflect.Array; +import java.security.Key; +import java.security.Security; +import java.util.Arrays; +import java.util.Base64; + +@Slf4j +public class Aes128Util { + + /** + * 加密 模式:AES/CBC/PKCS7Padding + * @param content 明文 + * @return 密文 + */ + public static String AESEncode(String content, byte[] keyByte) { + + if (keyByte.length != 32){ + return null; + } + + byte[] salt = new byte[keyByte.length / 2]; + byte[] encryptKey = new byte[keyByte.length / 2]; + // keybyte 分成2个128字节的byte[] + // 前一个作为salt + // 后一个作为key + System.arraycopy(keyByte,0, salt, 0, keyByte.length / 2); + System.arraycopy(keyByte,keyByte.length / 2, encryptKey, 0, keyByte.length / 2); + + // 初始化 + Security.addProvider(new BouncyCastleProvider()); + // 转化成JAVA的密钥格式 + Key key = new SecretKeySpec(encryptKey, "AES"); + try { + // 初始化cipher + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); + cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(salt)); + byte[] encryptedText = cipher.doFinal(content.getBytes()); + + return Base64.getEncoder().encodeToString(encryptedText); + + //return new String(Hex.encodeHex(encryptedText)).replaceAll("\r\n", ""); + } catch (Exception e) { + log.info("AESEncode error", e); + } + return null; + } + + /** + * 解密 + * @param content 密文 + * @return 铭文 + */ + public static String AESDecode(String content, byte[] keyByte) { + + if (keyByte.length != 32){ + return null; + } + + byte[] salt = new byte[keyByte.length / 2]; + byte[] encryptKey = new byte[keyByte.length / 2]; + // keybyte 分成2个128字节的byte[] + // 前一个作为salt + // 后一个作为key + System.arraycopy(keyByte,0, salt, 0, keyByte.length / 2); + System.arraycopy(keyByte,keyByte.length / 2, encryptKey, 0, keyByte.length / 2); + try { + //byte[] raw = key.getBytes(StandardCharsets.UTF_8); + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + SecretKeySpec skeySpec = new SecretKeySpec(encryptKey, "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); + IvParameterSpec ivParameter = new IvParameterSpec(salt); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameter); + try { + //byte[] encrypted1 = Hex.decodeHex(content);// 先用base64解密 + byte[] encrypted1 = Base64.getDecoder().decode(content); + byte[] original = cipher.doFinal(encrypted1); + return new String(original); + } catch (Exception e) { + log.info(e.toString()); + return null; + } + } catch (Exception ex) { + log.info(ex.toString()); + return null; + } + } + + public static void main(String[] args) { + //sha256加密 + byte[] sha256Str = PasswordUtil.getSHA256Str("123456"); + //AES加密 + String encrypt = Aes128Util.AESEncode("9121184", sha256Str); + + System.out.println(encrypt); + + String s = Aes128Util.AESDecode(encrypt, sha256Str); + System.out.println(s); + } + +} + diff --git a/src/main/java/com/mhhy/util/CodecUtil.java b/src/main/java/com/mhhy/util/CodecUtil.java new file mode 100644 index 0000000..fcf800c --- /dev/null +++ b/src/main/java/com/mhhy/util/CodecUtil.java @@ -0,0 +1,30 @@ +package com.mhhy.util; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; + +public final class CodecUtil { + + /** + * 将url编码 + */ + public static String encodeURL(String source) { + try { + return URLEncoder.encode(source, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + /** + * 将url解码 + */ + public static String decodeURL(String source) { + try { + return URLDecoder.decode(source, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/mhhy/util/JsonUtil.java b/src/main/java/com/mhhy/util/JsonUtil.java new file mode 100644 index 0000000..5e86114 --- /dev/null +++ b/src/main/java/com/mhhy/util/JsonUtil.java @@ -0,0 +1,84 @@ +package com.mhhy.util; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; + +import static com.mhhy.service.impl.LoginServiceImpl.conversationFlag; + +public class JsonUtil { + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + /** + * 将 POJO 转为 JSON + */ + public static String toJson(T obj) { + String json; + try { + json = OBJECT_MAPPER.writeValueAsString(obj); + } catch (Exception e) { + throw new RuntimeException(e); + } + return json; + } + + /** + * 将 JSON 转为 POJO + */ + public static T fromJson(String json, Class type) { + T pojo; + try { + pojo = OBJECT_MAPPER.readValue(json, type); + } catch (Exception e) { + throw new RuntimeException(e); + } + return pojo; + } + + /** + * 解密并返回具体类型 + * @param data + * @param userId + * @param obj + * @param + * @return + */ + public static T getResult(String data, int userId, Class obj) { + T pojo = null; + try { + //获取会话密钥 + String conversationId = RedisUtil.get(conversationFlag + userId); + if (conversationId == null) { + System.out.println("conversationId is null."); + return null; + } + //对数据进行解密 + System.out.println("conversationId : " + conversationId); + System.out.println("data : " + data); + + byte[] bytes = PasswordUtil.getSHA256Str(conversationId); + String result = Aes128Util.AESDecode(data, bytes); + + System.out.println("result : " + result); + + pojo = JsonUtil.fromJson(result, obj); + } catch (Exception e) { + e.printStackTrace(); + } + return pojo; + } + + public static String genResult(JSONObject json, int userId) { + try { + //获取会话密钥 + String conversationId = RedisUtil.get(conversationFlag + userId); + //对数据进行解密 + byte[] bytes = PasswordUtil.getSHA256Str(conversationId); + String result = Aes128Util.AESEncode(json.toString(), bytes); + return result; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/mhhy/util/MD5.java b/src/main/java/com/mhhy/util/MD5.java new file mode 100644 index 0000000..37f578a --- /dev/null +++ b/src/main/java/com/mhhy/util/MD5.java @@ -0,0 +1,69 @@ +package com.mhhy.util; + +import java.security.MessageDigest; + +public class MD5 { + + //十六进制下数字到字符的映射数组 + private final static String[] hexDigits = {"0", "1", "2", "3", "4", + "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}; + + + + /** + * md5加密算法 + * @param originString + * @return + */ + public static String encodeByMD5(String originString){ + if (originString != null){ + try{ + //创建具有指定算法名称的信息摘要 + MessageDigest md = MessageDigest.getInstance("MD5"); + //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算 + byte[] results = md.digest(originString.getBytes()); + //将得到的字节数组变成字符串返回 + String resultString = byteArrayToHexString(results); + return resultString.toUpperCase(); + } catch(Exception ex){ + ex.printStackTrace(); + } + } + return null; + } + public static String encodeByMD5NoTUpperCase(String originString){ + StringBuffer sb = new StringBuffer(32); + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(originString.getBytes("utf-8")); + for (int i = 0; i < array.length; i++) { + sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toUpperCase().substring(1, 3)); + } + } catch (Exception e) { + return null; + } + return sb.toString(); + } + /** + * 转换字节数组为十六进制字符串 + * @param + * @return 十六进制字符串 + */ + private static String byteArrayToHexString(byte[] b){ + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++){ + resultSb.append(byteToHexString(b[i])); + } + return resultSb.toString(); + } + + /** 将一个字节转化成十六进制形式的字符串 */ + private static String byteToHexString(byte b){ + int n = b; + if (n < 0) + n = 256 + n; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } +} diff --git a/src/main/java/com/mhhy/util/Md5Util.java b/src/main/java/com/mhhy/util/Md5Util.java new file mode 100644 index 0000000..76d3344 --- /dev/null +++ b/src/main/java/com/mhhy/util/Md5Util.java @@ -0,0 +1,38 @@ + +package com.mhhy.util; + +import org.springframework.util.DigestUtils; + +import java.security.MessageDigest; + +/** + * @author zcw + * @version 1.0 + * @date 2020/1/6 17:03 + * @description md5工具类 + */ +public class Md5Util { + + public static String md5(String str) { + if (str == null) { + return null; + } + return DigestUtils.md5DigestAsHex(str.getBytes()); + } + + public static String MD5(String data) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(data.getBytes("UTF-8")); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString().toUpperCase(); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + +} diff --git a/src/main/java/com/mhhy/util/PasswordUtil.java b/src/main/java/com/mhhy/util/PasswordUtil.java new file mode 100644 index 0000000..955c486 --- /dev/null +++ b/src/main/java/com/mhhy/util/PasswordUtil.java @@ -0,0 +1,71 @@ +package com.mhhy.util; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.nio.file.Path; +import java.security.Key; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class PasswordUtil { + /**平台加密算法 + * //前端获取服务端随机数 + * //前端使用 用户密码+sha256加密 对随机数进行加密 + * //后端生成密文流程:用户登录密码+sha256+base64--入库 + * //后端解析前端密文:拿数据库数据进行base64反解密--对前端传递过来的密钥解密--结果是一个服务端生产的随机数。 + * //随机数去比对缓存里面的随机数 + * //随机数设置过期时间 5分钟 + */ + + //sha256加密 + public static byte[] getSHA256Str(String str){ + MessageDigest messageDigest; + String encdeStr = ""; + try { + messageDigest = MessageDigest.getInstance("SHA-256"); + byte[] hash = messageDigest.digest(str.getBytes("UTF-8")); + return hash; + //encdeStr = Hex.encodeHexString(hash); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return null; + } + + //base64编码 + public static String encoderBase64(byte[] sha256){ + return java.util.Base64.getEncoder().encodeToString(sha256); + } + + //base64 解码 + public static byte[] decodeBase64(String encoderBase64){ + return java.util.Base64.getDecoder().decode(encoderBase64); + } + + public static void main(String[] args) { + //sha256加密 + byte[] sha256Str = PasswordUtil.getSHA256Str("111111"); + //AES加密 + String encrypt = Aes128Util.AESEncode("10908325", sha256Str); + + System.out.println(encrypt); + String str = "bHCrPMT2MFqhbXdjh_fCRwNQkGruSOU2nk4ZHmRB02H4DLOxzIcpbVOJSZmMPpMMa5HLTPq7PGweInFL9p1YE5sSmlgpUWWl5Kfb_Cstay0Gb4U7HkcS5rNxpiFj45C1SsGxQhG7qEJ7qSxId3Ho_Qgs-T7XTfYM8b_9MM26Yz9-g5EXVoItwXWUlfGEf2dbruFH1jFn4_6wGYawb4SsehIPqmSoTx8oaVRABZcq9Xo="; + String s = Aes128Util.AESDecode(str, sha256Str); + String[] mhhy2022s = s.split("MHHY2022"); + System.out.println("token:" + mhhy2022s[0]); + System.out.println("会话id:" + mhhy2022s[1]); + + String data = "{\"password\": \"111111\"}"; + String result = Aes128Util.AESEncode(data, PasswordUtil.getSHA256Str(mhhy2022s[1])); + System.out.println(result); + } + +} diff --git a/src/main/java/com/mhhy/util/RandomUtil.java b/src/main/java/com/mhhy/util/RandomUtil.java new file mode 100644 index 0000000..8f34246 --- /dev/null +++ b/src/main/java/com/mhhy/util/RandomUtil.java @@ -0,0 +1,88 @@ +package com.mhhy.util; + +import java.util.List; +import java.util.Random; + +public class RandomUtil { + + //传入list数组后随机排列 + public static int[] getSequence(List list) { + int[] sequence = new int[list.size()]; + for(int i = 0; i < list.size(); i++){ + sequence[i] = list.get(i); + } + Random random = new Random(); + for(int i = 0; i < list.size(); i++){ + int p = random.nextInt(list.size()); + int tmp = sequence[i]; + sequence[i] = sequence[p]; + sequence[p] = tmp; + } + return sequence; + } + + //获取某个范围内的随机数 + public static int getRandomArea(int i){ + Random random = new Random(); + return random.nextInt(i); + } + + /** + * 获取随机数 + * @param j 随机数的位数 + * @return + */ + public static String getRandomToNum(int j){ + StringBuffer buffer = new StringBuffer(); + int str[] = {1,2,3,4,5,6,7,8,9,0}; + for (int i = 0; i < j; i ++){ + double num = Math.random(); + int a = (int) (num * 10); + buffer.append(a); + } + return buffer.toString(); + } + + //获取随机数 + public static String getRandom(){ + Random random = new Random(); + int rand = 1000000 + random.nextInt(10000000); + return "" + rand; + } + + //获取邀请码 6位数 + public static String getRandomToInviteCode(int number){ + StringBuffer buffer = new StringBuffer(); + String str[] = {"1","2","3","4","5","6","7","8","9","0","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}; + for (int i = 0; i < number; i ++){ + double num = Math.random(); + int a = (int) (num * str.length); + buffer.append(str[a]); + } + return buffer.toString(); + } + + /** + * 获取 邀请码 + * @param j 需要邀请码的位数 + * @return + */ + public static String getRandomToInviteCodeToNum(int j){ + StringBuffer buffer = new StringBuffer(); + String str[] = {"1","2","3","4","5","6","7","8","9","0","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}; + for (int i = 0; i < j; i ++){ + double num = Math.random(); + int a = (int) (num * str.length); + buffer.append(str[a]); + } + return buffer.toString(); + } + + public static String getRandomHeadUrl(){ + String str[] = {"https://www.cnqhcs.com/java/head/1.png", "https://www.cnqhcs.com/java/head/2.png"}; + double num = Math.random(); + Random random = new Random(); + int i = random.nextInt(str.length); + return str[i]; + } +} diff --git a/src/main/java/com/mhhy/util/RedisUtil.java b/src/main/java/com/mhhy/util/RedisUtil.java new file mode 100644 index 0000000..d8e1d9a --- /dev/null +++ b/src/main/java/com/mhhy/util/RedisUtil.java @@ -0,0 +1,395 @@ +package com.mhhy.util; + +import com.mhhy.SpringContextHolder; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.ListOperations; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; + +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * redis工具类 + */ +public class RedisUtil { + + private final static StringRedisTemplate stringRedisTemplate = SpringContextHolder.getBean("stringRedisTemplate"); + + /** + * 匹配key + */ + public static Set keys(String pattern) { + return stringRedisTemplate.keys(pattern); + } + + /** + * 删除一个key + */ + public static void del(String key) { + stringRedisTemplate.delete(key); + } + + /** + * 批量删除key + */ + public static void delByPattern(String pattern) { + Set keySet = keys(pattern); + stringRedisTemplate.delete(keySet); + } + + /** + * 设置过期时间,单位为秒 + */ + public static boolean expire(String key, long seconds) { + return stringRedisTemplate.expire(key, seconds, TimeUnit.SECONDS); + } + + /** + * 获取自动过期时间 + */ + public static long ttl(String key) { + return stringRedisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 移除过期时间 + */ + public static boolean persist(String key) { + return stringRedisTemplate.persist(key); + } + + /////// String 操作 + + /** + * 给key赋值 + */ + public static void set(String key, String value) { + ValueOperations op = stringRedisTemplate.opsForValue(); + op.set(key, value); + } + + /** + * 给key赋值,并设置过期时间,单位为秒 + */ + public static void setEx(String key, String value, long seconds) { + set(key, value); + expire(key, seconds); + } + + public static boolean setNewNx(String key,String value,long seconds ){ + ValueOperations op = stringRedisTemplate.opsForValue(); + return op.setIfAbsent(key, value,Duration.ofSeconds(seconds)); + } + public static boolean setNx(String key, String value) { + ValueOperations op = stringRedisTemplate.opsForValue(); + return op.setIfAbsent(key, value); + } + + public static void getLock(String key){ + getLock(key, 2L); + } + + public static void getLock(String key, long expireSecond) { + if (expireSecond > 10) { + expireSecond = 2; + } + String md5Key = "vexLock:" + key + ":" + Md5Util.md5(key); + String value = "0"; + while (!setNx(md5Key, value)) { + sleep(20); + } + expire(md5Key, expireSecond); + } + + public static void unLock(String key) { + String md5Key = "vexLock:" + key + ":" + Md5Util.md5(key); + del(md5Key); + } + + public static void sleep(int timeMills) { + try { + Thread.sleep(timeMills); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * 将key的值加num + */ + public static long incrBy(String key, long num) { + ValueOperations op = stringRedisTemplate.opsForValue(); + return op.increment(key, num); + } + + /** + * 获取key的值 + */ + public static String get(String key) { + ValueOperations op = stringRedisTemplate.opsForValue(); + return op.get(key); + } + + /////// list操作 + + /** + * 插入到表头 + */ + public static void lPush(String key, String... values) { + ListOperations listOp = stringRedisTemplate.opsForList(); + listOp.leftPushAll(key, values); + } + + /** + * 移除第一个 + */ + public static String rPop(String key) { + ListOperations listOp = stringRedisTemplate.opsForList(); + return listOp.rightPop(key); + } + + public static int lLen(String key) { + ListOperations opsForList = stringRedisTemplate.opsForList(); + return opsForList.size(key).intValue(); + } + + /** + * 获取list所有 + * + * @param key + * @param start + * @param end + * @return + */ + public static List lRange(String key, int start, int end) { + ListOperations opsForList = stringRedisTemplate.opsForList(); + return opsForList.range(key, start, end); + } + + /////// hash + + /* + * public static void hset(String key,String hashKey,String value){ + * HashOperations opsForHash = + * stringRedisTemplate.opsForHash(); opsForHash.put(key, hashKey, value); } + */ + /////// set + /////// sorted set + + /** + * 存放list + * @param key + * @param list + */ + public static void setList(String key, List list){ + ListOperations opsForList = stringRedisTemplate.opsForList(); + opsForList.leftPushAll(key, list); + } + + /** + * HashGet + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public static String hGet(String key, String item) { + HashOperations mapOp = stringRedisTemplate.opsForHash(); + return mapOp.get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * @param key 键 + * @return 对应的多个键值 + */ + public static Map hmGet(String key) { + HashOperations mapOp = stringRedisTemplate.opsForHash(); + return mapOp.entries(key); + } + + /** + * HashSet + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public static boolean hmSet(String key, Map map){ + try { + HashOperations mapOp = stringRedisTemplate.opsForHash(); + mapOp.putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public static boolean hmset(String key, Map map, long time) { + try { + HashOperations mapOp = stringRedisTemplate.opsForHash(); + mapOp.putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public static boolean hset(String key, String item, String value) { + try { + HashOperations mapOp = stringRedisTemplate.opsForHash(); + mapOp.put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public static boolean hset(String key,String item,Object value,long time) { + try { + HashOperations mapOp = stringRedisTemplate.opsForHash(); + mapOp.put(key, item, value); + if(time>0){ + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public static void hdel(String key, Object... item){ + HashOperations mapOp = stringRedisTemplate.opsForHash(); + + mapOp.delete(key,item); + } + + /** + * 判断hash表中是否有该项的值 + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public static boolean hHasKey(String key, String item){ + HashOperations mapOp = stringRedisTemplate.opsForHash(); + + return mapOp.hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public static double hincr(String key, String item,double by){ + HashOperations mapOp = stringRedisTemplate.opsForHash(); + + return mapOp.increment(key, item, by); + } + + /** + * hash递减 + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public static double hdecr(String key, String item,double by){ + HashOperations mapOp = stringRedisTemplate.opsForHash(); + + return mapOp.increment(key, item,-by); + } + + /** + * set中增加元素,支持一次增加多个元素,逗号分隔即可,结果返回添加的个数 + * + * @param key + * @param value + * @return + */ + public static Long addSet(String key, String... value) { + Long size = null; + try { + size = stringRedisTemplate.opsForSet().add(key, value); + } catch (Exception e) { + //log.error("[RedisUtils.addSet] [error]", e); + return size; + } + return size; + } + /** + * set中移除指定元素 + * + * @param key + * @param value + * @return + */ + public static Long removeSet(String key, Object value) { + Long size = null; + try { + size = stringRedisTemplate.opsForSet().remove(key, value); + } catch (Exception e) { + //log.error("[RedisUtils.removeSet] [error]", e); + return size; + } + return size; + } + + /** + * 获取key下的所有元素 + * + * @param key + * @return + */ + public static Set members(String key) { + Set result = null; + try { + result = stringRedisTemplate.opsForSet().members(key); + } catch (Exception e) { + //log.error("[RedisUtils.members] [error]", e); + } + return result; + } + + + + +} diff --git a/src/main/java/com/mhhy/util/RegexEnum.java b/src/main/java/com/mhhy/util/RegexEnum.java new file mode 100644 index 0000000..da6c03e --- /dev/null +++ b/src/main/java/com/mhhy/util/RegexEnum.java @@ -0,0 +1,28 @@ +package com.mhhy.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public enum RegexEnum { + + PHONE("^1\\d{10}$"), + EMAIL("^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$"), + // 密码长度8-20位且至少包含大写字母、小写字母、数字或特殊符号中的任意三种 + PASSWORD("^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,20}$"); + + private String regx; + + RegexEnum(String regx) { + this.regx = regx; + } + + public boolean isMatcher(String val){ + Pattern p = Pattern.compile(regx); + Matcher m = p.matcher(val); + return m.matches(); + } + + public String getRegx() { + return regx; + } +} diff --git a/src/main/java/com/mhhy/util/RequestUtil.java b/src/main/java/com/mhhy/util/RequestUtil.java new file mode 100644 index 0000000..c9aca22 --- /dev/null +++ b/src/main/java/com/mhhy/util/RequestUtil.java @@ -0,0 +1,149 @@ +package com.mhhy.util; + + + +import com.alibaba.fastjson.JSONObject; +import com.mhhy.SpringContextHolder; +import com.mhhy.model.entity.AdminEntity; +import com.mhhy.model.entity.UserEntity; +import com.mhhy.service.impl.AdminServiceImpl; +import com.mhhy.service.impl.UserServiceImpl; +import com.mhhy.util.token.JwtUtil; +import com.mhhy.util.token.OdcProperties; +import com.ospn.common.OsnUtils; +import lombok.extern.log4j.Log4j2; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author zcw + * @version 1.0 + * @date 2020/1/14 00:19 + * @description 请求工具 + */ +@Log4j2 +public class RequestUtil { + + private final static UserServiceImpl userService = SpringContextHolder.getBean("userService", UserServiceImpl.class); + + private final static AdminServiceImpl adminService = SpringContextHolder.getBean("adminService", AdminServiceImpl.class); + + private final static OdcProperties properties = SpringContextHolder.getBean("odcProperties"); + + private static HttpServletRequest getRequest() { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } + + public static String getIp() { + HttpServletRequest request = getRequest(); + String clientIp = request.getHeader("x-forwarded-for"); + if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { + clientIp = request.getHeader("Proxy-Client-IP"); + } + if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { + clientIp = request.getHeader("WL-Proxy-Client-IP"); + } + if (clientIp == null || clientIp.length() == 0 || "unknown".equalsIgnoreCase(clientIp)) { + clientIp = request.getRemoteAddr(); + } + return clientIp; + } + + public static String getRequestURI() { + HttpServletRequest request = getRequest(); + return request.getRequestURI(); + } + + public static String getHeader(String name) { + HttpServletRequest request = getRequest(); + return request.getHeader(name); + } + + public static String getParameter(String name) { + HttpServletRequest request = getRequest(); + return request.getParameter(name); + } + + public static String getDevice(){ + HttpServletRequest request = getRequest(); + return request.getHeader("device"); + } + + public static String getUserAgent() { + HttpServletRequest request = getRequest(); + return request.getHeader("User-Agent"); + } + + public static String getToken() { + String token = getHeader(properties.getConfig().getTokenHeader()); + if (token == null) { + token = getParameter("token"); + } + return token; + } + + public static boolean isLogined() { + String token = getToken(); + if (token == null || token.trim().length() == 0) { + return false; + } + try { + return getCurUserId() > 0; + } catch (Exception e) { + log.debug(e.getMessage()); + } + return false; + } + + //获取token中的用户id + public static int getMainUserId() { + int userId = JwtUtil.verifyToken(getToken()); + //int userId = 1; + //int userId = Integer.parseInt(RequestUtil.getHeader("userId")); + UserEntity userEntity = userService.getById(userId); + //AssertUtil.notNull(userEntity, ResultCodeEnum.DATA_ORDER); + //AssertUtil.isTrue(userEntity.getStatus() == 1, ResultCodeEnum.ACCOUNT_DISABLED); + return userId; + } + + @Deprecated + //获取请求头的用户id + public static int getCurUserId() { + int userId = JwtUtil.verifyToken(getToken()); + //int userId = Integer.parseInt(RequestUtil.getHeader("userId")); + UserEntity userEntity = userService.getById(userId); + //AssertUtil.notNull(userEntity, ResultCodeEnum.WALLET_BAD_PARAM); + //AssertUtil.isTrue(userEntity.getStatus() == 1, ResultCodeEnum.ACCOUNT_DISABLED); + return userId; + } + + public static UserEntity getCurUser() { + return userService.getById(getCurUserId()); + } + + //获取当前主账号 + public static UserEntity getMainUser() { + return userService.getById(getMainUserId()); + } + + //获取当前主账号 + public static AdminEntity getAdminUser() { + return adminService.getById(getMainUserId()); + } + + public static JSONObject getParam(String user, String data) { + + try { + String communicationKey = RedisUtil.get("Communicationkey:"+user); + System.out.println("Communicationkey:"+ communicationKey); + return JSONObject.parseObject(OsnUtils.aesDecrypt(data, communicationKey)); + } catch (Exception e) { + + } + + return null; + } + +} diff --git a/src/main/java/com/mhhy/util/ResponseUtil.java b/src/main/java/com/mhhy/util/ResponseUtil.java new file mode 100644 index 0000000..58d9865 --- /dev/null +++ b/src/main/java/com/mhhy/util/ResponseUtil.java @@ -0,0 +1,19 @@ +package com.mhhy.util; + +import com.ospn.common.OsnUtils; + +public class ResponseUtil { + + public static String createResponse(String user, String data) { + + try { + String communicationKey = RedisUtil.get("Communicationkey:"+user); + return OsnUtils.aesEncrypt(data, communicationKey); + } catch (Exception e) { + + } + + return null; + } + +} diff --git a/src/main/java/com/mhhy/util/StreamUtil.java b/src/main/java/com/mhhy/util/StreamUtil.java new file mode 100644 index 0000000..025007b --- /dev/null +++ b/src/main/java/com/mhhy/util/StreamUtil.java @@ -0,0 +1,48 @@ +package com.mhhy.util; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; + +public final class StreamUtil { + + /** + * 从输入流中获取字符串 + */ + public static String getString(InputStream is) { + StringBuilder sb = new StringBuilder(); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return sb.toString(); + } + + /** + * 将输入流复制到输出流 + */ + public static void copyStream(InputStream inputStream, OutputStream outputStream) { + try { + int length; + byte[] buffer = new byte[4 * 1024]; + while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) { + outputStream.write(buffer, 0, length); + } + outputStream.flush(); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + try { + inputStream.close(); + outputStream.close(); + } catch (Exception e) { + } + } + } +} diff --git a/src/main/java/com/mhhy/util/token/JwtUtil.java b/src/main/java/com/mhhy/util/token/JwtUtil.java new file mode 100644 index 0000000..d773e13 --- /dev/null +++ b/src/main/java/com/mhhy/util/token/JwtUtil.java @@ -0,0 +1,85 @@ +package com.mhhy.util.token; + + +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; + +import com.mhhy.SpringContextHolder; +import com.mhhy.enums.ResultCodeEnum; +import com.mhhy.exception.OdcException; +import com.mhhy.util.RedisUtil; +import com.mhhy.util.RequestUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.Date; +import java.util.Map; +import java.util.Set; + +/** + * @author zcw + * @version 1.0 + * @date 2019/11/23 11:06 + * @description jwt工具类 + */ +@Slf4j +public class JwtUtil { + + private final static Algorithm algorithm = SpringContextHolder.getBean("algorithm", Algorithm.class); + + private final static OdcProperties properties = SpringContextHolder.getBean("odcProperties", OdcProperties.class); + + /** + * 创建token + * + * @param userId; + * @param timeout; 单位是秒 + */ + public static String createJwtToken(int userId, long timeout) { + return JWT.create() + .withClaim("member", userId) + .withExpiresAt(new Date(System.currentTimeMillis() + timeout * 1000)) + .sign(algorithm); + } + + + /** + * token正确且有效,则返回userId + */ + public static int verifyToken(String token) { + Map extraMap = Collections.singletonMap("uri", RequestUtil.getRequestURI()); + if (token == null || token.trim().length() == 0) { + throw new OdcException(ResultCodeEnum.UN_AUTHORIZATION); + } + try { + String noBearerToken = token.replaceFirst("Bearer ", ""); + Integer userId = JWT.require(algorithm) + .build() + .verify(noBearerToken) + .getClaim("member") + .asInt(); + if (RedisUtil.get(getRedisKey(userId, noBearerToken)) != null) { + return userId; + } + } catch (Exception e) { + throw new OdcException(ResultCodeEnum.UN_AUTHORIZATION, extraMap); + } + throw new OdcException(ResultCodeEnum.UN_AUTHORIZATION, extraMap); + } + + public static String getRedisKey(Integer userId, String token) { + return String.format(properties.getConfig().getTokenRedisKeyFormat(), userId, token); + } + + public static void putTokenToRedis(Integer userId, String token) { + RedisUtil.setEx(getRedisKey(userId, token), "0", properties.getConfig().getTokenExpireSeconds()); + } + + public static void removeTokenByUserId(Integer userId) { + Set tokenSet = RedisUtil.keys(getRedisKey(userId, "*")); + for (String key : tokenSet) { + log.info("删除token, {}, {}", userId, key); + RedisUtil.del(key); + } + } +} diff --git a/src/main/java/com/mhhy/util/token/OdcProperties.java b/src/main/java/com/mhhy/util/token/OdcProperties.java new file mode 100644 index 0000000..ba27f4a --- /dev/null +++ b/src/main/java/com/mhhy/util/token/OdcProperties.java @@ -0,0 +1,51 @@ +package com.mhhy.util.token; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "com.mhhy", ignoreUnknownFields = true) +public class OdcProperties { + + private Oss oss = new Oss(); + + private Async async = new Async(); + + private Config config = new Config(); + + @Data + public static class Oss { + private String endpoint; + private String accessKeyId; + private String accessKeySecret; + private String bucketName; + private String prefixUrl; + } + + @Data + public static class Async { + private int corePoolSize = 10; + private int maxPoolSize = 40; + private int queueCapacity = 20; + private int keepAliveSeconds = 30; + } + + @Data + public static class Config { + + private String tokenHeader = "Authorization"; + + //登录token,redis key格式 + private String tokenRedisKeyFormat = "mhhy:token:%d:%s"; + + //token有效期,10年 + private long tokenExpireSeconds = 315360000L; + + //限制只能登录一个 + private boolean limitLoginOneOnly = true; + + private String userPasswordKey = "mhhy2022"; + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..f4ae984 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/user?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowMultiQueries=true + username: app + password: Asd4356*$ + + redis: + host: 127.0.0.1 + database: 1 + password: pass1234 + lettuce: + pool: + max-active: 20 + max-idle: 16 + max-wait: 1000ms + min-idle: 10 + +logging: + level: + root: ERROR + com.mhhy: INFO + com.mhhy.mapper: DEBUG diff --git a/src/main/resources/application-dev2.yml b/src/main/resources/application-dev2.yml new file mode 100644 index 0000000..c7071bb --- /dev/null +++ b/src/main/resources/application-dev2.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/user?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowMultiQueries=true + username: root + password: + + redis: + host: 127.0.0.1 + database: 1 + password: + lettuce: + pool: + max-active: 20 + max-idle: 16 + max-wait: 1000ms + min-idle: 10 + +logging: + level: + root: ERROR + com.mhhy: INFO + com.mhhy.mapper: DEBUG diff --git a/src/main/resources/application-dev3.yml b/src/main/resources/application-dev3.yml new file mode 100644 index 0000000..af64a66 --- /dev/null +++ b/src/main/resources/application-dev3.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/user?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowMultiQueries=true + username: root + password: GaMz12-SZJF + + redis: + host: 127.0.0.1 + database: 1 + password: 258Red7@#$ + lettuce: + pool: + max-active: 20 + max-idle: 16 + max-wait: 1000ms + min-idle: 10 + +logging: + level: + root: ERROR + com.mhhy: INFO + com.mhhy.mapper: DEBUG diff --git a/src/main/resources/application-dev4.yml b/src/main/resources/application-dev4.yml new file mode 100644 index 0000000..eb45000 --- /dev/null +++ b/src/main/resources/application-dev4.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://39.100.133.144:3306/user144?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowMultiQueries=true + username: root + password: ap*ThR7q0 + + redis: + host: 127.0.0.1 + database: 1 + password: pass1234 + lettuce: + pool: + max-active: 20 + max-idle: 16 + max-wait: 1000ms + min-idle: 10 + +logging: + level: + root: ERROR + com.mhhy: INFO + com.mhhy.mapper: DEBUG diff --git a/src/main/resources/application-dev5.yml b/src/main/resources/application-dev5.yml new file mode 100644 index 0000000..af64a66 --- /dev/null +++ b/src/main/resources/application-dev5.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/user?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowMultiQueries=true + username: root + password: GaMz12-SZJF + + redis: + host: 127.0.0.1 + database: 1 + password: 258Red7@#$ + lettuce: + pool: + max-active: 20 + max-idle: 16 + max-wait: 1000ms + min-idle: 10 + +logging: + level: + root: ERROR + com.mhhy: INFO + com.mhhy.mapper: DEBUG diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..900be9b --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,50 @@ +server.port: 9314 +spring: + profiles: + active: @profilesActive@ + http: + encoding: + force: true + charset: UTF-8 + + application: + name: userServer-api + servlet: + multipart.maxFileSize: 15MB + multipart.maxRequestSize: 20MB + +IM: + imUrl: http://8.219.11.57:8300/admin + imPwd: password112 + LOGIN_URL: http://8.219.11.57:8300/admin + HOST_IP: 8.219.11.57 + PEFIX_URL: http://127.0.0.1:8334 + APP_DEVICE: http://127.0.0.1:8334/api/im/device + SET_NAME: http://127.0.0.1:8334/api/im/setName + KEFU_LIST: http://127.0.0.1:8334/api/im/custormer + QueryAplets: http://127.0.0.1:8334/api/im/findOne + GroupList: http://127.0.0.1:8334/program/list + AddGroup: http://127.0.0.1:8334/groupProgram/add + ENDPOINT: https://oss-ap-southeast-1.aliyuncs.com + RemoteTempFilePath: https://.oss-ap-southeast-1.aliyuncs.com/ + AccessKeyId: LTAI5tE1VjrLkUhQisYmYJEc + AccessKeySecret: FxAfo6vhJCcyQ4RHKz9hGG97RVL9Ta + BUCKETNAME: imx1-default + UserPortraitDirectory: portrait/ + GroupPortraitDirectory: portrait/ + TempDirectory: temp/ + MainDapp: eyJwYXJhbSI6IiIsIm5hbWUiOiJPU1BOLURBTyBDaGluZXNlIiwidXJsIjoiaHR0cDovL29wZW5zcG4uY29tL29zcG5kYW8vb3Nwbl9kYW8uaHRtbCIsInRhcmdldCI6Ik9TTlM2cUpNbjZzVHdQU3I3NEdBV3N1S1NtZnRFZGtVSlUycjhod3RQVnp5RXFlbzk2cSIsImluZm8iOnsic2lnbiI6Ik1FUUNJR01EU2JYaFBNU0lpenV0dWZQckphLzg4MmJoOWcrbEFmWWtnQmt1eGhKUkFpQWdib2M1RnJZWHU3SzZha3lGblI2UVh2OThiUmVaOHJlY0F6QW9FNjZIdXc9PSJ9fQ== + WEBRTCBASE: webrtc://103.163.46.118:1985/live/android/ + WEBRTCHOST: http://103.163.46.118:1985 +REGISTERKEY: 12345678 + +sms: + mei-tang: + content: 【微语】本次登录验证码为{code} + url: http://sms.meitangyun.com:8001/std/sms + password: + account: + + + +#logging:root \ No newline at end of file diff --git a/src/main/resources/application2.yml b/src/main/resources/application2.yml new file mode 100644 index 0000000..ba6f3a9 --- /dev/null +++ b/src/main/resources/application2.yml @@ -0,0 +1,49 @@ +server.port: 9314 +spring: + profiles: + active: @profilesActive@ + http: + encoding: + force: true + charset: UTF-8 + + application: + name: userServer-api + servlet: + multipart.maxFileSize: 15MB + multipart.maxRequestSize: 20MB + +IM: + imUrl: http://127.0.0.1:8300/admin + imPwd: password + LOGIN_URL: http://127.0.0.1:8300/admin + HOST_IP: 127.0.0.1 + PEFIX_URL: http://127.0.0.1:8334 + APP_DEVICE: http://127.0.0.1:8334/api/im/device + SET_NAME: http://127.0.0.1:8334/api/im/setName + KEFU_LIST: http://127.0.0.1:8334/api/im/custormer + QueryAplets: http://127.0.0.1:8334/api/im/findOne + GroupList: http://127.0.0.1:8334/program/list + AddGroup: http://127.0.0.1:8334/groupProgram/add + ENDPOINT: + RemoteTempFilePath: + AccessKeyId: + AccessKeySecret: + BUCKETNAME: imx-default + UserPortraitDirectory: portrait/ + GroupPortraitDirectory: portrait/ + TempDirectory: temp/ + MainDapp: + WEBRTCBASE: webrtc://127.0.0.1:1985/live/android/ + WEBRTCHOST: http://127.0.0.1:1985 + +sms: + mei-tang: + content: 本次登录验证码为{code} + url: http://sms.meitangyun.com:8001/std/sms + password: + account: + + + +#logging:root \ No newline at end of file diff --git a/src/main/resources/application3.yml b/src/main/resources/application3.yml new file mode 100644 index 0000000..5c1bde6 --- /dev/null +++ b/src/main/resources/application3.yml @@ -0,0 +1,49 @@ +server.port: 9314 +spring: + profiles: + active: @profilesActive@ + http: + encoding: + force: true + charset: UTF-8 + + application: + name: userServer-api + servlet: + multipart.maxFileSize: 15MB + multipart.maxRequestSize: 20MB + +IM: + imUrl: http://172.16.249.12:8300/admin + imPwd: password + LOGIN_URL: http://172.16.249.12:8300/admin + HOST_IP: 8.219.116.18 + PEFIX_URL: http://127.0.0.1:8334 + APP_DEVICE: http://127.0.0.1:8334/api/im/device + SET_NAME: http://127.0.0.1:8334/api/im/setName + KEFU_LIST: http://127.0.0.1:8334/api/im/custormer + QueryAplets: http://127.0.0.1:8334/api/im/findOne + GroupList: http://127.0.0.1:8334/program/list + AddGroup: http://127.0.0.1:8334/groupProgram/add + ENDPOINT: https://oss-ap-southeast-1.aliyuncs.com + RemoteTempFilePath: https://.oss-ap-southeast-1.aliyuncs.com/ + AccessKeyId: LTAI5tE1VjrLkUhQisYmYJEc + AccessKeySecret: FxAfo6vhJCcyQ4RHKz9hGG97RVL9Ta + BUCKETNAME: imx1-default + UserPortraitDirectory: portrait/ + GroupPortraitDirectory: portrait/ + TempDirectory: temp/ + MainDapp: eyJwYXJhbSI6IiIsIm5hbWUiOiJPU1BOLURBTyBDaGluZXNlIiwidXJsIjoiaHR0cDovL29wZW5zcG4uY29tL29zcG5kYW8vb3Nwbl9kYW8uaHRtbCIsInRhcmdldCI6Ik9TTlM2cUpNbjZzVHdQU3I3NEdBV3N1S1NtZnRFZGtVSlUycjhod3RQVnp5RXFlbzk2cSIsImluZm8iOnsic2lnbiI6Ik1FUUNJR01EU2JYaFBNU0lpenV0dWZQckphLzg4MmJoOWcrbEFmWWtnQmt1eGhKUkFpQWdib2M1RnJZWHU3SzZha3lGblI2UVh2OThiUmVaOHJlY0F6QW9FNjZIdXc9PSJ9fQ== + WEBRTCBASE: webrtc://103.163.46.118:1985/live/android/ + WEBRTCHOST: http://103.163.46.118:1985 + +sms: + mei-tang: + content: 【微语】本次登录验证码为{code} + url: http://sms.meitangyun.com:8001/std/sms + password: + account: + + + +#logging:root \ No newline at end of file diff --git a/src/main/resources/application4.yml b/src/main/resources/application4.yml new file mode 100644 index 0000000..55dd367 --- /dev/null +++ b/src/main/resources/application4.yml @@ -0,0 +1,49 @@ +server.port: 9314 +spring: + profiles: + active: @profilesActive@ + http: + encoding: + force: true + charset: UTF-8 + + application: + name: userServer-api + servlet: + multipart.maxFileSize: 15MB + multipart.maxRequestSize: 20MB + +IM: + imUrl: http://127.0.0.1:8300/admin + imPwd: password + LOGIN_URL: http://127.0.0.1:8300/admin + HOST_IP: 39.100.133.144 + PEFIX_URL: http://127.0.0.1:8334 + APP_DEVICE: http://127.0.0.1:8334/api/im/device + SET_NAME: http://127.0.0.1:8334/api/im/setName + KEFU_LIST: http://127.0.0.1:8334/api/im/custormer + QueryAplets: http://127.0.0.1:8334/api/im/findOne + GroupList: http://127.0.0.1:8334/program/list + AddGroup: http://127.0.0.1:8334/groupProgram/add + ENDPOINT: https://oss-ap-southeast-1.aliyuncs.com + RemoteTempFilePath: https://.oss-ap-southeast-1.aliyuncs.com/ + AccessKeyId: LTAI5tE1VjrLkUhQisYmYJEc + AccessKeySecret: FxAfo6vhJCcyQ4RHKz9hGG97RVL9Ta + BUCKETNAME: imx1-default + UserPortraitDirectory: portrait/ + GroupPortraitDirectory: portrait/ + TempDirectory: temp/ + MainDapp: eyJwYXJhbSI6IiIsIm5hbWUiOiJPU1BOLURBTyBDaGluZXNlIiwidXJsIjoiaHR0cDovL29wZW5zcG4uY29tL29zcG5kYW8vb3Nwbl9kYW8uaHRtbCIsInRhcmdldCI6Ik9TTlM2cUpNbjZzVHdQU3I3NEdBV3N1S1NtZnRFZGtVSlUycjhod3RQVnp5RXFlbzk2cSIsImluZm8iOnsic2lnbiI6Ik1FUUNJR01EU2JYaFBNU0lpenV0dWZQckphLzg4MmJoOWcrbEFmWWtnQmt1eGhKUkFpQWdib2M1RnJZWHU3SzZha3lGblI2UVh2OThiUmVaOHJlY0F6QW9FNjZIdXc9PSJ9fQ== + WEBRTCBASE: webrtc://103.163.46.118:1985/live/android/ + WEBRTCHOST: http://103.163.46.118:1985 + +sms: + mei-tang: + content: 【微语】本次登录验证码为{code} + url: http://sms.meitangyun.com:8001/std/sms + password: + account: + + + +#logging:root \ No newline at end of file diff --git a/src/main/resources/application5.yml b/src/main/resources/application5.yml new file mode 100644 index 0000000..eb1ac30 --- /dev/null +++ b/src/main/resources/application5.yml @@ -0,0 +1,49 @@ +server.port: 9314 +spring: + profiles: + active: @profilesActive@ + http: + encoding: + force: true + charset: UTF-8 + + application: + name: userServer-api + servlet: + multipart.maxFileSize: 15MB + multipart.maxRequestSize: 20MB + +IM: + imUrl: http://172.23.212.47:8300/admin + imPwd: password + LOGIN_URL: http://172.23.212.47:8300/admin + HOST_IP: 47.236.28.61 + PEFIX_URL: http://127.0.0.1:8334 + APP_DEVICE: http://127.0.0.1:8334/api/im/device + SET_NAME: http://127.0.0.1:8334/api/im/setName + KEFU_LIST: http://127.0.0.1:8334/api/im/custormer + QueryAplets: http://127.0.0.1:8334/api/im/findOne + GroupList: http://127.0.0.1:8334/program/list + AddGroup: http://127.0.0.1:8334/groupProgram/add + ENDPOINT: https://oss-ap-southeast-1.aliyuncs.com + RemoteTempFilePath: https://.oss-ap-southeast-1.aliyuncs.com/ + AccessKeyId: LTAI5tE1VjrLkUhQisYmYJEc + AccessKeySecret: FxAfo6vhJCcyQ4RHKz9hGG97RVL9Ta + BUCKETNAME: imx1-default + UserPortraitDirectory: portrait/ + GroupPortraitDirectory: portrait/ + TempDirectory: temp/ + MainDapp: eyJwYXJhbSI6IiIsIm5hbWUiOiJPU1BOLURBTyBDaGluZXNlIiwidXJsIjoiaHR0cDovL29wZW5zcG4uY29tL29zcG5kYW8vb3Nwbl9kYW8uaHRtbCIsInRhcmdldCI6Ik9TTlM2cUpNbjZzVHdQU3I3NEdBV3N1S1NtZnRFZGtVSlUycjhod3RQVnp5RXFlbzk2cSIsImluZm8iOnsic2lnbiI6Ik1FUUNJR01EU2JYaFBNU0lpenV0dWZQckphLzg4MmJoOWcrbEFmWWtnQmt1eGhKUkFpQWdib2M1RnJZWHU3SzZha3lGblI2UVh2OThiUmVaOHJlY0F6QW9FNjZIdXc9PSJ9fQ== + WEBRTCBASE: webrtc://103.163.46.118:1985/live/android/ + WEBRTCHOST: http://103.163.46.118:1985 + +sms: + mei-tang: + content: 【微语】本次登录验证码为{code} + url: http://sms.meitangyun.com:8001/std/sms + password: + account: + + + +#logging:root \ No newline at end of file diff --git a/src/test/java/com/mhhy/MhhyFramworkApplicationTests.java b/src/test/java/com/mhhy/MhhyFramworkApplicationTests.java new file mode 100644 index 0000000..6429aa8 --- /dev/null +++ b/src/test/java/com/mhhy/MhhyFramworkApplicationTests.java @@ -0,0 +1,13 @@ +package com.mhhy; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MhhyFramworkApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/userwy.sql b/userwy.sql new file mode 100644 index 0000000..7d62e58 --- /dev/null +++ b/userwy.sql @@ -0,0 +1,55 @@ +-- -------------------------------------------------------- +-- 主机: 39.100.133.144 +-- 服务器版本: 8.0.21 - Source distribution +-- 服务器操作系统: Linux +-- HeidiSQL 版本: 11.3.0.6295 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + + +-- 导出 usernew 的数据库结构 +CREATE DATABASE IF NOT EXISTS `user` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */; +USE `user`; + +-- 导出 表 usernew.t_config 结构 +CREATE TABLE IF NOT EXISTS `t_config` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `project` varchar(200) NOT NULL DEFAULT '0', + `config` text, + PRIMARY KEY (`id`), + UNIQUE KEY `project` (`project`) + ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- 数据导出被取消选择。 + +-- 导出 表 usernew.t_user 结构 +CREATE TABLE IF NOT EXISTS `t_user` ( + `id` int NOT NULL AUTO_INCREMENT, + `username` varchar(255) NOT NULL, + `password` varchar(255) DEFAULT NULL, + `im_username` varchar(255) DEFAULT NULL, + `im_pwd` text CHARACTER SET latin1 COLLATE latin1_swedish_ci, + `im_id` varchar(255) DEFAULT NULL, + `im_node` varchar(255) DEFAULT NULL, + `nick_name` varchar(255) DEFAULT NULL, + `state` tinyint DEFAULT NULL, + `type` tinyint DEFAULT NULL, + `create_time` datetime DEFAULT NULL, + `project` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`), + UNIQUE KEY `im_id` (`im_id`) + ) ENGINE=InnoDB AUTO_INCREMENT=98 DEFAULT CHARSET=latin1; + +-- 数据导出被取消选择。 + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;