diff --git a/Projects/README.md b/Projects/README.md
index 55c6da00..c6103360 100644
--- a/Projects/README.md
+++ b/Projects/README.md
@@ -1 +1,119 @@
-## 请在此创建个人作品目录,最终提交 Pull Request 至官方仓库。
+> ## 你说的都对:**Klive-exer**
+
+## 项目介绍
+
+### 项目背景
+
+ 随着人们生活水平的高速发展,智能交互已经不断的进入人们的生活。酒店服务业作为人们休闲娱乐的重要载体,对生活水平提高的实际应用和发展提供了温床。而且随着人工智能技术的提高,《智慧酒店的现状和发展趋势》一文中指出:发展智慧酒店可谓是酒店业发展的必然趋势,智慧酒店的发展除了是酒店自身更久的生存下去,更是和旅游业、城市的飞速发展相辅相成。
+
+### 项目内容
+
+- 本系统为提高酒店对客户的服务,聚焦于智慧酒店中的健身诉求,着重以私人虚拟健身教练为主,具体研究开发如下:
+
+ 1.系统计划应用CMU所提出的新型人体姿态估计算法——OpenPose 姿态识别来改善现有酒店智能化模式,从健身方面提升客户体验。
+
+ 2.系统为 Web 应用,基于传统 SSM 框架和 Flask 微型 Web 服务集成功能,并仅依赖单一摄像头实现对人体姿态点的检测,力求降低对硬件设备的依赖。
+
+ 3.系统用户可以通过选择不同健身课程来查看相关具体信息,并通过深度学习算法将标准姿态与用户动作相匹配,给以相应的检测反馈,同时还包括健身后圈子交流共享等服务。
+
+> 部分数据来源为keep,仅供个人学习,非商用
+
+### 所用技术
+- Mockplus摹客原型设计工具
+- PowerDesigner数据库设计工具
+- IDEA和PyCharm开发工具
+- SSM组合框架&Flask微型Web框架
+- OpenPose人体姿态识别开源库
+- 流加载、SHA1加密
+- 融云IM即时通讯SDK
+
+### 模块简介与视图
+
+- 用户登录和注册
+
+
+
+- 用户数据收集
+
+
+
+
+
+
+- 课程模块
+
+
+
+- 姿态检测和训练矫正
+
+
+
+- 数据统计
+
+
+
+
+
+- 圈子交流
+
+
+
+- 个人信息
+
+
+
+
+
+
+### SDK使用
+
+在圈子交流模块,使用了融云IM即时通讯SDK实现了对每个课程创建讨论组,用户可随心交流。
+
+## 商业价值
+
+ 本系统研究既具有理论研究价值,也具有重要的实际应用价值和现实指导意义。系统实际上就是为解决“酒店智能化低”、“硬件设备昂贵”、“重建设,轻应用”等一系列问题而立意。在市场应用方面,本课题具有相对完整的系统和管理方案,调研并结合了当地多种类型酒店对于人工智能的需求和意见,由于私人虚拟健身教练这一市场空白,系统能够为现有的高端酒店提供低成本高回报的使用价值,对丰富酒店健身模块具有极其重要的指导作用。同时系统实现了人体姿态识别技术的应用落地,通过深度学习算法将识别结果同功能相衔接,也具有参考价值。
+
+## 不足与展望
+
+ 系统目前仍具有一些不足,主要表现在算法应用方面。在姿态检测模块,由于系统需要不间断的向算法服务器发送http请求,并且后台算法需要启动模型处理,反馈给前端的画面展示不太流畅,但仍在用户接受范围之内。而对于课程的添加方面,本系统由于设计原因未给出相应功能接口。
+
+## 如何安装和启动
+
+- 项目为Springboot项目,需要提前有maven环境安装,并且导入项目后使用pom导入依赖包
+- 在sql文件中导入数据库
+- 启动springboot后,浏览器输入 http://localhost:8088/Klive/main 进入主界面
+
+## Q&A
+
+### 1.为何我无法启动项目
+
+答:项目本身拥有众多jar包,并且使用Mybatis与后台数据库相连接,需要在导入pom所有依赖后,在properties文件中修改数据库连接信息等。
+
+### 2.为何我启动项目后,无法登陆
+
+答:系统本身具有注册功能,为真实的网站项目,需要先进行注册成功后才能登陆,**需要真实手机号**。
+
+### 3.为何我登录成功后,系统大部分显示没有内容
+
+答:为防止数据泄露,数据库文件中仅包含有数据结构,不含数据,需要在表**class_info**中添加数据
+
+### 4.为何我无法使用项目姿态识别功能
+
+答:项目算法端部署于flask上,由于算法模型巨大无法上传github,所以该演示项目中不包含实际算法处理。
diff --git a/Projects/images/gr1.png b/Projects/images/gr1.png
new file mode 100644
index 00000000..ce7ddac4
Binary files /dev/null and b/Projects/images/gr1.png differ
diff --git a/Projects/images/gr2.png b/Projects/images/gr2.png
new file mode 100644
index 00000000..879c90d7
Binary files /dev/null and b/Projects/images/gr2.png differ
diff --git a/Projects/images/jc1.png b/Projects/images/jc1.png
new file mode 100644
index 00000000..dbc3dbe5
Binary files /dev/null and b/Projects/images/jc1.png differ
diff --git a/Projects/images/jc2.png b/Projects/images/jc2.png
new file mode 100644
index 00000000..f1d72430
Binary files /dev/null and b/Projects/images/jc2.png differ
diff --git a/Projects/images/jc3.png b/Projects/images/jc3.png
new file mode 100644
index 00000000..f2b0a8f4
Binary files /dev/null and b/Projects/images/jc3.png differ
diff --git a/Projects/images/jc4.png b/Projects/images/jc4.png
new file mode 100644
index 00000000..03a92383
Binary files /dev/null and b/Projects/images/jc4.png differ
diff --git a/Projects/images/jl1.png b/Projects/images/jl1.png
new file mode 100644
index 00000000..66b3760a
Binary files /dev/null and b/Projects/images/jl1.png differ
diff --git a/Projects/images/jl2.png b/Projects/images/jl2.png
new file mode 100644
index 00000000..129069bb
Binary files /dev/null and b/Projects/images/jl2.png differ
diff --git a/Projects/images/jl3.png b/Projects/images/jl3.png
new file mode 100644
index 00000000..96cdc50c
Binary files /dev/null and b/Projects/images/jl3.png differ
diff --git a/Projects/images/js1.png b/Projects/images/js1.png
new file mode 100644
index 00000000..57a9590a
Binary files /dev/null and b/Projects/images/js1.png differ
diff --git a/Projects/images/js2.png b/Projects/images/js2.png
new file mode 100644
index 00000000..3097bc5b
Binary files /dev/null and b/Projects/images/js2.png differ
diff --git a/Projects/images/js3.png b/Projects/images/js3.png
new file mode 100644
index 00000000..2956c574
Binary files /dev/null and b/Projects/images/js3.png differ
diff --git a/Projects/images/k1.png b/Projects/images/k1.png
new file mode 100644
index 00000000..66199678
Binary files /dev/null and b/Projects/images/k1.png differ
diff --git a/Projects/images/k2.png b/Projects/images/k2.png
new file mode 100644
index 00000000..9132ff59
Binary files /dev/null and b/Projects/images/k2.png differ
diff --git a/Projects/images/k3.png b/Projects/images/k3.png
new file mode 100644
index 00000000..b3325893
Binary files /dev/null and b/Projects/images/k3.png differ
diff --git a/Projects/images/k4.png b/Projects/images/k4.png
new file mode 100644
index 00000000..ff96a2ff
Binary files /dev/null and b/Projects/images/k4.png differ
diff --git a/Projects/images/k5.png b/Projects/images/k5.png
new file mode 100644
index 00000000..824d6d28
Binary files /dev/null and b/Projects/images/k5.png differ
diff --git a/Projects/images/readme.md b/Projects/images/readme.md
new file mode 100644
index 00000000..ff3ef51a
--- /dev/null
+++ b/Projects/images/readme.md
@@ -0,0 +1 @@
+这里存放了介绍中的各种图片
diff --git a/Projects/images/tj1.png b/Projects/images/tj1.png
new file mode 100644
index 00000000..bbc02e0b
Binary files /dev/null and b/Projects/images/tj1.png differ
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.gitignore" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.gitignore"
new file mode 100644
index 00000000..a2a3040a
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.gitignore"
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/MavenWrapperDownloader.java" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/MavenWrapperDownloader.java"
new file mode 100644
index 00000000..a45eb6ba
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/MavenWrapperDownloader.java"
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed 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.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ private static final String WRAPPER_VERSION = "0.5.6";
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if (mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if (mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if (!outputFile.getParentFile().exists()) {
+ if (!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+ String username = System.getenv("MVNW_USERNAME");
+ char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password);
+ }
+ });
+ }
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/maven-wrapper.jar" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/maven-wrapper.jar"
new file mode 100644
index 00000000..2cc7d4a5
Binary files /dev/null and "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/maven-wrapper.jar" differ
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/maven-wrapper.properties" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/maven-wrapper.properties"
new file mode 100644
index 00000000..642d572c
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/.mvn/wrapper/maven-wrapper.properties"
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/mvnw" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/mvnw"
new file mode 100644
index 00000000..a16b5431
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/mvnw"
@@ -0,0 +1,310 @@
+#!/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 /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="`which 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/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.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"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$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 \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/mvnw.cmd" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/mvnw.cmd"
new file mode 100644
index 00000000..c8d43372
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/mvnw.cmd"
@@ -0,0 +1,182 @@
+@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 "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\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/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "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%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.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 "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\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%
+
+exit /B %ERROR_CODE%
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/pom.xml" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/pom.xml"
new file mode 100644
index 00000000..432a5053
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/pom.xml"
@@ -0,0 +1,191 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.5.RELEASE
+
+
+ com.AiHome
+ aihomesys
+ 0.0.1-SNAPSHOT
+ aihomesys
+ Demo project for Spring Boot
+
+
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.session
+ spring-session-core
+
+
+
+ cn.rongcloud.im
+ server-sdk-java
+ 3.1.6
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ com.zhenzikj
+ zhenzisms
+ 1.0.4
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+ org.mybatis
+ mybatis
+ 3.5.3
+
+
+
+ commons-fileupload
+ commons-fileupload
+ 1.3.3
+
+
+ org.apache.poi
+ poi-ooxml
+ 3.17
+
+
+ com.alibaba
+ fastjson
+ 1.2.32
+
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 1.3.2
+
+
+
+
+ org.python
+ jython-standalone
+ 2.7.1
+
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.13
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-jasper
+ provided
+ 9.0.27
+
+
+
+ javax.servlet
+ jstl
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+
+
+
+
+ com.google.code.gson
+ gson
+ 2.8.5
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.8.1
+
+
+
+
+ org.apache.taglibs
+ taglibs-standard-impl
+ 1.2.5
+
+
+
+
+
+ AiHome
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 1.4.2.RELEASE
+
+
+ com.KlivexerApplication
+
+
+
+
+
+
+ src/main/java
+
+ **/**
+
+
+
+ src/main/resources
+
+ **/**
+
+ false
+
+
+ src/main/webapp
+
+ **/**
+
+ META-INF/resources
+ false
+
+
+
+
+
+
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/readme.md" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/readme.md"
new file mode 100644
index 00000000..0e917eee
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/readme.md"
@@ -0,0 +1,119 @@
+> ## 你说的都对:**Klive-exer**
+
+## 项目介绍
+
+### 项目背景
+
+ 随着人们生活水平的高速发展,智能交互已经不断的进入人们的生活。酒店服务业作为人们休闲娱乐的重要载体,对生活水平提高的实际应用和发展提供了温床。而且随着人工智能技术的提高,《智慧酒店的现状和发展趋势》一文中指出:发展智慧酒店可谓是酒店业发展的必然趋势,智慧酒店的发展除了是酒店自身更久的生存下去,更是和旅游业、城市的飞速发展相辅相成。
+
+### 项目内容
+
+- 本系统为提高酒店对客户的服务,聚焦于智慧酒店中的健身诉求,着重以私人虚拟健身教练为主,具体研究开发如下:
+
+ 1.系统计划应用CMU所提出的新型人体姿态估计算法——OpenPose 姿态识别来改善现有酒店智能化模式,从健身方面提升客户体验。
+
+ 2.系统为 Web 应用,基于传统 SSM 框架和 Flask 微型 Web 服务集成功能,并仅依赖单一摄像头实现对人体姿态点的检测,力求降低对硬件设备的依赖。
+
+ 3.系统用户可以通过选择不同健身课程来查看相关具体信息,并通过深度学习算法将标准姿态与用户动作相匹配,给以相应的检测反馈,同时还包括健身后圈子交流共享等服务。
+
+> 部分数据来源为keep,仅供个人学习,非商用
+
+### 所用技术
+- Mockplus摹客原型设计工具
+- PowerDesigner数据库设计工具
+- IDEA和PyCharm开发工具
+- SSM组合框架&Flask微型Web框架
+- OpenPose人体姿态识别开源库
+- 流加载、SHA1加密
+- 融云IM即时通讯SDK
+
+### 模块简介与视图
+
+- 用户登录和注册
+
+
+
+- 用户数据收集
+
+
+
+
+
+
+- 课程模块
+
+
+
+- 姿态检测和训练矫正
+
+
+
+- 数据统计
+
+
+
+
+
+- 圈子交流
+
+
+
+- 个人信息
+
+
+
+
+
+
+### SDK使用
+
+在圈子交流模块,使用了融云IM即时通讯SDK实现了对每个课程创建讨论组,用户可随心交流。
+
+## 商业价值
+
+ 本系统研究既具有理论研究价值,也具有重要的实际应用价值和现实指导意义。系统实际上就是为解决“酒店智能化低”、“硬件设备昂贵”、“重建设,轻应用”等一系列问题而立意。在市场应用方面,本课题具有相对完整的系统和管理方案,调研并结合了当地多种类型酒店对于人工智能的需求和意见,由于私人虚拟健身教练这一市场空白,系统能够为现有的高端酒店提供低成本高回报的使用价值,对丰富酒店健身模块具有极其重要的指导作用。同时系统实现了人体姿态识别技术的应用落地,通过深度学习算法将识别结果同功能相衔接,也具有参考价值。
+
+## 不足与展望
+
+ 系统目前仍具有一些不足,主要表现在算法应用方面。在姿态检测模块,由于系统需要不间断的向算法服务器发送http请求,并且后台算法需要启动模型处理,反馈给前端的画面展示不太流畅,但仍在用户接受范围之内。而对于课程的添加方面,本系统由于设计原因未给出相应功能接口。
+
+## 如何安装和启动
+
+- 项目为Springboot项目,需要提前有maven环境安装,并且导入项目后使用pom导入依赖包
+- 在sql文件中导入数据库
+- 启动springboot后,浏览器输入 http://localhost:8088/Klive/main 进入主界面
+
+## Q&A
+
+### 1.为何我无法启动项目
+
+答:项目本身拥有众多jar包,并且使用Mybatis与后台数据库相连接,需要在导入pom所有依赖后,在properties文件中修改数据库连接信息等。
+
+### 2.为何我启动项目后,无法登陆
+
+答:系统本身具有注册功能,为真实的网站项目,需要先进行注册成功后才能登陆,**需要真实手机号**。
+
+### 3.为何我登录成功后,系统大部分显示没有内容
+
+答:为防止数据泄露,数据库文件中仅包含有数据结构,不含数据,需要在表**class_info**中添加数据
+
+### 4.为何我无法使用项目姿态识别功能
+
+答:项目算法端部署于flask上,由于算法模型巨大无法上传github,所以该演示项目中不包含实际算法处理。
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/sql/aihome.sql" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/sql/aihome.sql"
new file mode 100644
index 00000000..ac0b4f74
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/sql/aihome.sql"
@@ -0,0 +1,274 @@
+/*
+Navicat MySQL Data Transfer
+
+Source Server : aihome
+Source Server Version : 80013
+Source Host : localhost:3306
+Source Database : aihome
+
+Target Server Type : MYSQL
+Target Server Version : 80013
+File Encoding : 65001
+
+Date: 2020-10-10 20:20:08
+*/
+
+SET FOREIGN_KEY_CHECKS=0;
+
+-- ----------------------------
+-- Table structure for action_info
+-- ----------------------------
+DROP TABLE IF EXISTS `action_info`;
+CREATE TABLE `action_info` (
+ `actionId` int(11) NOT NULL AUTO_INCREMENT,
+ `classId` int(11) NOT NULL,
+ `actionName` varchar(255) DEFAULT NULL,
+ `actionImg` varchar(255) DEFAULT NULL,
+ `actionUrl` varchar(255) DEFAULT NULL,
+ `actionTime` varchar(255) DEFAULT NULL,
+ `actionPoints` varchar(255) DEFAULT NULL,
+ `actionSteps` varchar(255) DEFAULT NULL,
+ `actionBreak` varchar(255) DEFAULT NULL,
+ `actionFeel` varchar(255) DEFAULT NULL,
+ `actionError` varchar(255) DEFAULT NULL,
+ `actionValid` int(11) DEFAULT '0',
+ PRIMARY KEY (`actionId`)
+) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for circle_content
+-- ----------------------------
+DROP TABLE IF EXISTS `circle_content`;
+CREATE TABLE `circle_content` (
+ `conId` int(11) NOT NULL AUTO_INCREMENT,
+ `userId` varchar(11) NOT NULL COMMENT '用户id',
+ `fkId` int(11) DEFAULT NULL COMMENT '父id',
+ `fkType` int(1) NOT NULL DEFAULT '0' COMMENT '评论类型,0无父id,1课程id,2父评论id',
+ `conTime` varchar(25) DEFAULT NULL,
+ `conImg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `conCont` varchar(255) DEFAULT NULL,
+ `conGood` int(11) NOT NULL DEFAULT '0',
+ `conContNum` int(11) NOT NULL DEFAULT '0',
+ `conValid` int(1) NOT NULL DEFAULT '0' COMMENT '0为有效,1为违法',
+ PRIMARY KEY (`conId`),
+ KEY `circle_content_ibfk_1` (`userId`)
+) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for class_info
+-- ----------------------------
+DROP TABLE IF EXISTS `class_info`;
+CREATE TABLE `class_info` (
+ `classId` int(11) NOT NULL AUTO_INCREMENT,
+ `className` varchar(255) NOT NULL,
+ `classImg` varchar(255) NOT NULL,
+ `classUrl` varchar(255) NOT NULL,
+ `classFatB` varchar(25) NOT NULL,
+ `classTime` varchar(25) DEFAULT NULL,
+ `classLevel` varchar(25) DEFAULT NULL,
+ `createTime` varchar(25) DEFAULT NULL,
+ `classPeriod` varchar(25) DEFAULT NULL,
+ `classValid` int(1) NOT NULL DEFAULT '0',
+ `classTitle` varchar(255) DEFAULT NULL,
+ `classLabel` varchar(255) DEFAULT NULL,
+ `classIntro` varchar(255) DEFAULT NULL,
+ `classType` varchar(255) DEFAULT NULL,
+ `classIntended` varchar(255) DEFAULT NULL,
+ `classTaboo` varchar(255) DEFAULT NULL,
+ `classReady` varchar(255) DEFAULT NULL,
+ `classBodyreac` varchar(255) DEFAULT NULL,
+ `classSug` varchar(255) DEFAULT NULL,
+ `classTrainnumber` int(11) DEFAULT '0',
+ PRIMARY KEY (`classId`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for fitness_record
+-- ----------------------------
+DROP TABLE IF EXISTS `fitness_record`;
+CREATE TABLE `fitness_record` (
+ `frId` int(11) NOT NULL AUTO_INCREMENT,
+ `userId` varchar(11) NOT NULL,
+ `recordTime` varchar(25) DEFAULT '',
+ `fitnessTime` int(11) DEFAULT '0' COMMENT '运动时长(second)',
+ `cumFatB` int(11) unsigned zerofill DEFAULT '00000000000' COMMENT '当次运动消耗',
+ `fkId` int(11) NOT NULL,
+ `fkType` int(1) NOT NULL DEFAULT '0' COMMENT '0为课程,1为动作',
+ `score` double(11,2) DEFAULT '0.00',
+ PRIMARY KEY (`frId`)
+) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for food_ku
+-- ----------------------------
+DROP TABLE IF EXISTS `food_ku`;
+CREATE TABLE `food_ku` (
+ `foodId` int(11) NOT NULL AUTO_INCREMENT,
+ `hotelId` int(8) NOT NULL,
+ `foodName` varchar(25) NOT NULL,
+ `foodType` varchar(25) DEFAULT NULL,
+ `foodCacul` varchar(25) DEFAULT NULL,
+ `foodContent` varchar(25) DEFAULT NULL,
+ `foodFatB` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`foodId`)
+) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for hotel_info
+-- ----------------------------
+DROP TABLE IF EXISTS `hotel_info`;
+CREATE TABLE `hotel_info` (
+ `hotelId` int(8) NOT NULL,
+ `hotelName` varchar(25) DEFAULT NULL,
+ `hotelNotice` varchar(255) DEFAULT NULL,
+ `hotelLocation` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`hotelId`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for label_type
+-- ----------------------------
+DROP TABLE IF EXISTS `label_type`;
+CREATE TABLE `label_type` (
+ `typeId` int(11) NOT NULL AUTO_INCREMENT,
+ `typeName` varchar(25) NOT NULL,
+ `typeCount` int(11) DEFAULT '0' COMMENT '记录选择类型的人数',
+ `isValid` int(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`typeId`)
+) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for meal_info
+-- ----------------------------
+DROP TABLE IF EXISTS `meal_info`;
+CREATE TABLE `meal_info` (
+ `mealId` int(11) NOT NULL AUTO_INCREMENT,
+ `stapleId` int(11) NOT NULL COMMENT '主食',
+ `MEMId` int(11) NOT NULL COMMENT '肉蛋奶',
+ `VFId` int(11) NOT NULL COMMENT '蔬果',
+ `GreaseId` int(11) NOT NULL COMMENT '油脂',
+ `OtherId` int(11) DEFAULT NULL COMMENT '其他',
+ `hotelId` int(8) NOT NULL,
+ `mealType` int(1) NOT NULL DEFAULT '0' COMMENT '0-早餐,1-午餐,2-晚餐',
+ PRIMARY KEY (`mealId`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for user_enroll
+-- ----------------------------
+DROP TABLE IF EXISTS `user_enroll`;
+CREATE TABLE `user_enroll` (
+ `userId` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `passWord` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `userName` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
+ `userImg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
+ `hotelId` int(8) DEFAULT NULL,
+ `userType` int(1) NOT NULL,
+ `loginTime` varchar(25) DEFAULT NULL,
+ `enrollTime` varchar(25) DEFAULT NULL,
+ `enableInfoco` int(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`userId`),
+ KEY `userId` (`userId`,`userName`),
+ KEY `userId_2` (`userId`),
+ KEY `userId_3` (`userId`,`userName`,`userImg`),
+ KEY `userName` (`userName`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for user_follow
+-- ----------------------------
+DROP TABLE IF EXISTS `user_follow`;
+CREATE TABLE `user_follow` (
+ `followId` int(11) NOT NULL AUTO_INCREMENT,
+ `fuserId` varchar(11) NOT NULL,
+ `fuseredId` varchar(11) NOT NULL,
+ `followTime` varchar(25) DEFAULT NULL,
+ `followValid` int(1) NOT NULL DEFAULT '0' COMMENT '0为有效,1为违法',
+ PRIMARY KEY (`followId`),
+ KEY `fuserId` (`fuserId`),
+ KEY `fuseredId` (`fuseredId`)
+) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for user_good
+-- ----------------------------
+DROP TABLE IF EXISTS `user_good`;
+CREATE TABLE `user_good` (
+ `goodId` int(11) NOT NULL AUTO_INCREMENT,
+ `userId` varchar(11) NOT NULL,
+ `conId` int(11) NOT NULL,
+ `goodTime` varchar(25) DEFAULT NULL,
+ `goodValid` int(1) NOT NULL DEFAULT '0' COMMENT '0为有效,1为违法',
+ PRIMARY KEY (`goodId`),
+ KEY `userId` (`userId`)
+) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for user_info
+-- ----------------------------
+DROP TABLE IF EXISTS `user_info`;
+CREATE TABLE `user_info` (
+ `infoId` int(11) NOT NULL AUTO_INCREMENT,
+ `userId` varchar(11) NOT NULL,
+ `sex` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '',
+ `age` varchar(25) DEFAULT NULL,
+ `height` double(11,2) DEFAULT '0.00' COMMENT 'cm',
+ `weight` double(11,2) DEFAULT '0.00' COMMENT 'kg',
+ `bust` double(11,2) DEFAULT '0.00' COMMENT 'cm',
+ `waist` double(11,2) DEFAULT '0.00' COMMENT 'cm',
+ `hipline` double(11,2) DEFAULT '0.00' COMMENT '臀围cm',
+ `BMI` double(11,2) DEFAULT '0.00',
+ `RHR` int(11) DEFAULT '0' COMMENT '每分钟心跳次数',
+ `MHR` int(11) DEFAULT '0' COMMENT '每分钟最大心跳次数',
+ `modifyTime` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0',
+ `trainDay` int(11) DEFAULT '0',
+ `todayIsTrain` int(1) DEFAULT '0',
+ PRIMARY KEY (`infoId`)
+) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for user_label
+-- ----------------------------
+DROP TABLE IF EXISTS `user_label`;
+CREATE TABLE `user_label` (
+ `ulId` int(11) NOT NULL AUTO_INCREMENT,
+ `userId` varchar(11) NOT NULL,
+ `typeId` int(11) NOT NULL,
+ `typeName` varchar(25) NOT NULL,
+ PRIMARY KEY (`ulId`)
+) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Table structure for user_plan
+-- ----------------------------
+DROP TABLE IF EXISTS `user_plan`;
+CREATE TABLE `user_plan` (
+ `planId` int(11) NOT NULL AUTO_INCREMENT,
+ `userId` varchar(11) NOT NULL,
+ `classId` int(11) NOT NULL,
+ `comTime` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '0' COMMENT '用户已经完成的课时',
+ `todayComplete` int(1) NOT NULL DEFAULT '0' COMMENT '该课程今日是否完成',
+ `isComplete` int(1) NOT NULL DEFAULT '0' COMMENT '是否完成整个课时',
+ `subTime` varchar(25) NOT NULL COMMENT '用户订阅课程时间',
+ `todayTime` varchar(25) DEFAULT NULL COMMENT '今日完成时间(每日更新',
+ `totalFatB` int(25) DEFAULT '0',
+ PRIMARY KEY (`planId`)
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+-- ----------------------------
+-- Event structure for updateUserInfo
+-- ----------------------------
+DROP EVENT IF EXISTS `updateUserInfo`;
+DELIMITER ;;
+CREATE DEFINER=`root`@`localhost` EVENT `updateUserInfo` ON SCHEDULE EVERY 1 DAY STARTS '2020-04-12 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO UPDATE user_info SET todayIsTrain = 0
+;;
+DELIMITER ;
+
+-- ----------------------------
+-- Event structure for updateUserPlan
+-- ----------------------------
+DROP EVENT IF EXISTS `updateUserPlan`;
+DELIMITER ;;
+CREATE DEFINER=`root`@`localhost` EVENT `updateUserPlan` ON SCHEDULE EVERY 1 DAY STARTS '2020-04-12 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO UPDATE user_plan SET todayComplete = 0 , todayTime = NULL WHERE isComplete = 0
+;;
+DELIMITER ;
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/KlivexerApplication.java" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/KlivexerApplication.java"
new file mode 100644
index 00000000..3e102dd7
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/KlivexerApplication.java"
@@ -0,0 +1,44 @@
+package com;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+@MapperScan("com.aihome.aihomesys.dao")
+@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
+public class KlivexerApplication extends SpringBootServletInitializer {
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+ return builder.sources(KlivexerApplication.class);
+ }
+ public static void main(String[] args) {
+ SpringApplication.run(KlivexerApplication.class, args);
+ }
+ @Bean
+ public CorsFilter corsFilter() {
+ final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ final CorsConfiguration config = new CorsConfiguration();
+ config.setAllowCredentials(true); // 允许cookies跨域
+ config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
+ config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
+ config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
+ config.addAllowedMethod("OPTIONS");// 允许提交请求的方法,*表示全部允许
+ config.addAllowedMethod("HEAD");
+ config.addAllowedMethod("GET");// 允许Get的请求方法
+ config.addAllowedMethod("PUT");
+ config.addAllowedMethod("POST");
+ config.addAllowedMethod("DELETE");
+ config.addAllowedMethod("PATCH");
+ source.registerCorsConfiguration("/**", config);
+ return new CorsFilter(source);
+ }
+
+}
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/base/IBaseDao.java" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/base/IBaseDao.java"
new file mode 100644
index 00000000..d466e398
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/base/IBaseDao.java"
@@ -0,0 +1,48 @@
+package com.aihome.aihomesys.base;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+public interface IBaseDao {
+ /**
+ * 获取所有对象列表
+ */
+ List findAll();
+
+ /**
+ * 根据条件Map集合获取对象列表
+ */
+ List listByConditions(Map map);
+
+ /**
+ * 根据条件Map集合获取总数量
+ */
+ Long countByConditions(Map map);
+
+ /**
+ * 根据主键获取对象
+ */
+ T findById(PK id);
+
+ /**
+ * 插入对象
+ */
+ int insert(T object);
+
+ /**
+ * 插入List集合对象
+ */
+ int insertList(List object);
+
+ /**
+ * 修改对象
+ */
+ int update(T object);
+
+ /**
+ * 根据主键ID删除一条数据
+ */
+ int deleteById(PK id);
+
+}
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/AdminController.java" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/AdminController.java"
new file mode 100644
index 00000000..0cfff921
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/AdminController.java"
@@ -0,0 +1,193 @@
+package com.aihome.aihomesys.controller;
+
+import com.aihome.aihomesys.service.FoodKuServices;
+import com.aihome.aihomesys.service.HotelInfoServices;
+import com.aihome.aihomesys.service.MealInfoServices;
+import com.aihome.aihomesys.service.UserEnrollService;
+import com.aihome.aihomesys.vo.FoodKu;
+import com.aihome.aihomesys.vo.HotelInfo;
+import com.aihome.aihomesys.vo.MealInfo;
+import com.aihome.aihomesys.vo.UserEnroll;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.Null;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping(value = "/admin")
+public class AdminController {
+
+ @Autowired
+ UserEnrollService userEnrollService = new UserEnrollService();
+ @Autowired
+ HotelInfoServices hotelInfoServices = new HotelInfoServices();
+ @Autowired
+ MealInfoServices mealInfoServices = new MealInfoServices();
+ @Autowired
+ FoodKuServices foodKuServices = new FoodKuServices();
+
+ @RequestMapping("/getUserList")
+ @ResponseBody
+ public Object userRefind(@RequestBody Map result) {
+ Map mapper = new HashMap<>();
+ try {
+ List listuser = this.userEnrollService.selectAll();
+ mapper.put("code","0");
+ mapper.put("msg","查询成功");
+ mapper.put("count",listuser.size());
+ mapper.put("data",listuser);
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错");
+ }
+ return mapper;
+ }
+
+ @RequestMapping("/getMealList")
+ @ResponseBody
+ public Object getMealList(@RequestBody Map result) {
+ Map mapper = new HashMap<>();
+ try {
+ List listmeal = this.mealInfoServices.getMealList(result);
+ if(listmeal.size()>0){
+ for(int i=0;i result) {
+ Map mapper = new HashMap<>();
+ try {
+ HotelInfo hotelInfo = this.hotelInfoServices.getHotelInfo(result);
+ mapper.put("code","0");
+ mapper.put("msg","获取酒店信息成功");
+ mapper.put("hotelInfo",hotelInfo);
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错");
+ }
+ return mapper;
+ }
+
+ @RequestMapping("/setHotelInfo")
+ @ResponseBody
+ public Object setHotelInfo(@RequestBody Map result) {
+ Map mapper = new HashMap<>();
+ try {
+ this.hotelInfoServices.setHotelInfo(result);
+ mapper.put("code","0");
+ mapper.put("msg","公告已更新...");
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错");
+ }
+ return mapper;
+ }
+
+ @RequestMapping("/getHotelFoodKu")
+ @ResponseBody
+ public Object getHotelFoodKu(@RequestBody Map result) {
+ Map mapper = new HashMap<>();
+ try {
+ int hotelId = Integer.valueOf(result.get("hotelId").toString());
+ List listfood = this.foodKuServices.selectFoodListByHotel(hotelId);
+ mapper.put("code","0");
+ mapper.put("msg","查询成功");
+ mapper.put("count",listfood.size());
+ mapper.put("data",listfood);
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错");
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "/statistics")
+ public String statics(){
+ return "admin/statistics";
+ }
+
+ @RequestMapping(value = "/foodku")
+ public String foodku(String userId,Map mapper){
+ Map result = new HashMap<>();
+ result.put("userId",userId);
+ try {
+ HotelInfo hotelInfo = this.hotelInfoServices.getHotelInfo(result);
+ mapper.put("code","0");
+ mapper.put("hotelInfo",hotelInfo);
+ return "admin/foodku";
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "error/error";
+ }
+ }
+
+ @RequestMapping(value = "/foodService")
+ public String foodService(String userId,Map mapper){
+ Map result = new HashMap<>();
+ result.put("userId",userId);
+ try {
+ HotelInfo hotelInfo = this.hotelInfoServices.getHotelInfo(result);
+ mapper.put("code","0");
+ mapper.put("hotelInfo",hotelInfo);
+ return "admin/foodService";
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "error/error";
+ }
+ }
+
+ @RequestMapping(value = "/foodre")
+ public String foodre(){
+ return "admin/foodRecom";
+ }
+}
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/CircleController.java" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/CircleController.java"
new file mode 100644
index 00000000..ce039cad
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/CircleController.java"
@@ -0,0 +1,428 @@
+package com.aihome.aihomesys.controller;
+
+import com.aihome.aihomesys.service.*;
+import com.aihome.aihomesys.vo.*;
+import com.aihome.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping(value = "/circle")
+public class CircleController {
+
+ @Autowired
+ UserEnrollService userEnrollService = new UserEnrollService();
+
+ @Autowired
+ CircleContentServices circleContentServices = new CircleContentServices();
+
+ @Autowired
+ UserFollowServices userFollowServices = new UserFollowServices();
+
+ @Autowired
+ UserPlanService userPlanService = new UserPlanService();
+
+ @Autowired
+ UserGoodServices userGoodServices = new UserGoodServices();
+
+ @GetMapping
+ public String circle(String userId,Map mapper){
+ if(userId!=null){
+ try {
+ //统计数值
+ int myfollow = this.userFollowServices.countMyFollow(userId);
+ int followme = this.userFollowServices.countFollowMe(userId);
+ int planclass = this.userPlanService.countMyClassNum(userId);
+ //个人情况
+ UserEnroll myinfo = this.userEnrollService.findById(userId);
+ {
+ mapper.put("myfollow",myfollow);
+ mapper.put("followme",followme);
+ mapper.put("planclass",planclass);
+ mapper.put("myinfo",myinfo);
+ }
+ return "comm/userfram/circle";
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "error/error";
+ }
+ }else {
+ return "error/error";
+ }
+ }
+
+ @RequestMapping(value = "/getContent",produces = { "application/json;charset=UTF-8" })
+ @ResponseBody
+ public Object getContent(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")==null||result.get("type")==null){
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }else {
+ //分页处理
+ int page = Integer.valueOf(result.get("page").toString());
+ int number = Integer.valueOf(result.get("number").toString());
+ result.put("page",(page-1)*number);
+ result.put("number",number);
+ try {
+ int type = Integer.valueOf(result.get("type").toString());
+ if(type==0){ //热门
+ List circleContents = this.circleContentServices.getHot(result);
+ //是否点赞
+ for(int i=0;i temp = new HashMap<>();
+ temp.put("userId",result.get("userId"));
+ temp.put("conId",circleContents.get(i).getConId());
+ circleContents.get(i).setIsGood(this.userGoodServices.isGood(temp));
+ }
+ //分页处理
+ int pagesAll = this.circleContentServices.countHot(result);
+ int pages = pagesAll%number==0?(pagesAll/number):(pagesAll/number)+1;
+ mapper.put("pages",pages);
+ mapper.put("code","0");
+ mapper.put("msg","查询成功");
+ mapper.put("circleContents",circleContents);
+ }else if (type==1){ //关注
+ List circleContents = this.circleContentServices.getFollow(result);
+ for(int i=0;i temp = new HashMap<>();
+ temp.put("userId",result.get("userId"));
+ temp.put("conId",circleContents.get(i).getConId());
+ circleContents.get(i).setIsGood(this.userGoodServices.isGood(temp));
+ }
+ //分页处理
+ int pagesAll = this.circleContentServices.countFollow(result);
+ int pages = pagesAll%number==0?(pagesAll/number):(pagesAll/number)+1;
+ mapper.put("pages",pages);
+ mapper.put("code","0");
+ mapper.put("msg","查询成功");
+ mapper.put("circleContents",circleContents);
+ }else if (type==2){ //我的
+ List circleContents = this.circleContentServices.getMycont(result);
+ for(int i=0;i temp = new HashMap<>();
+ temp.put("userId",result.get("userId"));
+ temp.put("conId",circleContents.get(i).getConId());
+ circleContents.get(i).setIsGood(this.userGoodServices.isGood(temp));
+ }
+ //分页处理
+ int pagesAll = this.circleContentServices.countMycont(result);
+ int pages = pagesAll%number==0?(pagesAll/number):(pagesAll/number)+1;
+ mapper.put("pages",pages);
+ mapper.put("code","0");
+ mapper.put("msg","查询成功");
+ mapper.put("circleContents",circleContents);
+ }else if(type==3){ //搜索
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }else {
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错啦");
+ }
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "/getSearchContent",produces = { "application/json;charset=UTF-8" })
+ @ResponseBody
+ public Object getSearchContent(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")==null||result.get("val")==null){
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }else {
+ try {
+ List circleContents = this.circleContentServices.getSearchItems(result);
+ for(int i=0;i temp = new HashMap<>();
+ temp.put("userId",result.get("userId"));
+ temp.put("conId",circleContents.get(i).getConId());
+ circleContents.get(i).setIsGood(this.userGoodServices.isGood(temp));
+ }
+ mapper.put("code","0");
+ mapper.put("msg","查询成功");
+ mapper.put("circleContents",circleContents);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错啦");
+ }
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "/getFollow",produces = { "application/json;charset=UTF-8" })
+ @ResponseBody
+ public Object getFollow(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")==null&&result.get("type")==null){
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }else {
+ try {
+ int type = Integer.valueOf(result.get("type").toString());
+ String userId = result.get("userId").toString();
+ if(type==0){ //我关注的
+ List myFollows = this.userFollowServices.selectMyFollow(userId);
+ for(int i=0;i followme = this.userFollowServices.selectFollowMe(userId);
+ for(int i=0;i result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")==null||result.get("type")==null||result.get("otherId")==null){
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }else {
+ try {
+ int type = Integer.valueOf(result.get("type").toString());
+ String userId = result.get("userId").toString();
+ String otherId = result.get("otherId").toString();
+ if(type==0){ //ta关注的
+ List myFollows = this.userFollowServices.selectMyFollow(otherId);
+ //我是否关注
+ for(int i=0;i followme = this.userFollowServices.selectFollowMe(otherId);
+ //我是否关注
+ for(int i=0;i mapper = new HashMap<>();
+ MultipartFile img = file;
+ if(img.isEmpty()||userId.isEmpty()){
+ mapper.put("code", "1");
+ mapper.put("msg", "服务器出错");
+ }else{
+ String fileName = userId+"_"+DateUtils.getCurTime2Number();
+ File dest = new File(new File(realPath).getAbsolutePath()+ "/../../resources/static/images/contentImgs/" + fileName+".png");
+ if (!dest.getParentFile().exists()) {
+ dest.getParentFile().mkdirs();
+ }
+ try {
+ file.transferTo(dest); // 保存文件
+ mapper.put("code", "0");
+ mapper.put("msg", "上传成功");
+ mapper.put("filename",fileName+".png");
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code", "1");
+ mapper.put("msg", "服务器出错");
+ }
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "/setContent",produces = { "application/json;charset=UTF-8" })
+ @ResponseBody
+ public Object setContent(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")==null){
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }else {
+ //获取用户信息
+ try {
+ UserEnroll userEnroll = this.userEnrollService.findById(result.get("userId").toString());
+ if(userEnroll==null){
+ mapper.put("code","1");
+ mapper.put("msg","违法用户");
+ }else {
+ result.put("userName",userEnroll.getUserName());
+ result.put("userImg",userEnroll.getUserAva());
+ result.put("conTime",DateUtils.getCurTime());
+ this.circleContentServices.insert(result);
+ if(Integer.valueOf(result.get("fkType").toString())==2){ //更新评论数据库
+ this.circleContentServices.contAdd(result);
+ }
+ mapper.put("code","0");
+ mapper.put("msg","发布成功");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错啦...");
+ }
+ }
+ return mapper;
+ }
+
+
+ @RequestMapping(value = "/details")
+ public String circledetails(String userId,String conId,Map mapper){
+ if(userId!=null&&conId!=null){
+ try {
+ //统计数值
+ int myfollow = 0;
+ int followme = 0;
+ int planclass = 0;
+ //圈子内容
+ CircleContent circleContent = this.circleContentServices.getUserCont(Integer.valueOf(conId));
+ UserEnroll myinfo = new UserEnroll();
+ if(circleContent!=null){
+ myfollow = this.userFollowServices.countMyFollow(circleContent.getUserId());
+ followme = this.userFollowServices.countFollowMe(circleContent.getUserId());
+ planclass = this.userPlanService.countMyClassNum(circleContent.getUserId());
+ //个人情况
+ myinfo = this.userEnrollService.findById(circleContent.getUserId());
+ //是否点赞
+ Map temp = new HashMap<>();
+ temp.put("userId",userId);
+ temp.put("conId",conId);
+ circleContent.setIsGood(this.userGoodServices.isGood(temp));
+ }else {
+ return "error/error";
+ }
+ //获取图片list
+ String[] imglist = circleContent.getConImg().split(",");
+ //获取评论内容
+ List contents = this.circleContentServices.getUsers2Contents(Integer.valueOf(conId));
+ //判断是否获赞
+ for(int i =0;i temp2 = new HashMap<>();
+ temp2.put("userId",userId);
+ temp2.put("conId",contents.get(i).getConId());
+ contents.get(i).setIsGood(this.userGoodServices.isGood(temp2));
+ }
+ mapper.put("myfollow",myfollow);
+ mapper.put("followme",followme);
+ mapper.put("planclass",planclass);
+ mapper.put("myinfo",myinfo);
+ mapper.put("cc",circleContent);
+ mapper.put("imglist",imglist);
+ mapper.put("contents",contents);
+ return "comm/userfram/circledetails";
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "error/error";
+ }
+ }else {
+ return "error/error";
+ }
+ }
+
+ @RequestMapping(value = "/goodAction",produces = { "application/json;charset=UTF-8" })
+ @ResponseBody
+ public Object goodAction(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")==null||result.get("conId")==null||result.get("flag")==null){
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }else {
+ //获取用户信息
+ String userId = result.get("userId").toString();
+ UserEnroll myinfo = this.userEnrollService.findById(userId);
+ //获取文章信息
+ int conId = Integer.valueOf(result.get("conId").toString());
+ CircleContent circleContent = this.circleContentServices.getUserCont(conId);
+ if(myinfo!=null&&circleContent!=null){
+ int flag=Integer.valueOf(result.get("flag").toString());
+ Map temp = new HashMap<>();
+ temp.put("userId",myinfo.getUserId());
+ temp.put("userName",myinfo.getUserName());
+ temp.put("userImg",myinfo.getUserAva());
+ temp.put("conId",circleContent.getConId());
+ temp.put("conCont",circleContent.getConCont());
+ temp.put("goodTime",DateUtils.getCurTime());
+ if(flag==0){ //加点赞
+ this.userGoodServices.insertGood(temp);
+ this.circleContentServices.goodAdd(temp);
+ mapper.put("code","0");
+ mapper.put("msg","点赞成功");
+ }else if(flag==1){ //减点赞
+ this.userGoodServices.deleteGood(temp);
+ this.circleContentServices.goodSub(temp);
+ mapper.put("code","0");
+ mapper.put("msg","取消成功");
+ }else {
+ mapper.put("code","1");
+ mapper.put("msg","参数异常");
+ }
+ }else{
+ mapper.put("code","1");
+ mapper.put("msg","用户信息获取错误");
+ }
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "/upload")
+ public String circleupload(){
+ return "comm/userfram/circleform";
+ }
+
+ @RequestMapping(value = "/classCircle")
+ public String classCircle(){
+ return "comm/userfram/classCircle";
+ }
+
+ @RequestMapping(value = "/chatRoom")
+ public String chatRoom(){
+ return "comm/userfram/chatroom";
+ }
+
+}
diff --git "a/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/CourseRecmmoController.java" "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/CourseRecmmoController.java"
new file mode 100644
index 00000000..974f2939
--- /dev/null
+++ "b/Projects/\344\275\240\350\257\264\347\232\204\351\203\275\345\257\271/src/main/java/com/aihome/aihomesys/controller/CourseRecmmoController.java"
@@ -0,0 +1,318 @@
+package com.aihome.aihomesys.controller;
+
+import com.aihome.aihomesys.service.*;
+import com.aihome.aihomesys.vo.*;
+import com.aihome.component.ComputingUnit;
+import com.aihome.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping(value = "courses")
+public class CourseRecmmoController {
+
+ @Autowired
+ UserInfoService userInfoService = new UserInfoService();
+ @Autowired
+ UserEnrollService userEnrollService = new UserEnrollService();
+ @Autowired
+ LabelTypeService labelTypeService = new LabelTypeService();
+ @Autowired
+ UserLabelServices userLabelServices = new UserLabelServices();
+ @Autowired
+ ClassInfoService classInfoService = new ClassInfoService();
+ @Autowired
+ ActionInfoServices actionInfoServices = new ActionInfoServices();
+ @Autowired
+ CircleContentServices circleContentServices = new CircleContentServices();
+ @Autowired
+ UserGoodServices userGoodServices = new UserGoodServices();
+
+ ComputingUnit computingUnit = new ComputingUnit();
+
+ @RequestMapping(value = "skipInsert")
+ @ResponseBody
+ public Object skipInsert(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")!=""&&result.get("userId")!=null){
+ //先判断是否存在
+ try {
+ int isIn = this.userInfoService.counById(result);
+ if(isIn==0){
+ result.put("modifyTime", DateUtils.getCurTime());
+ int re = this.userInfoService.skipinsert(result);
+ mapper.put("code","0");
+ mapper.put("msg","数据存取成功");
+ }else{ //存在就update
+ result.put("modifyTime", DateUtils.getCurTime());
+ this.userInfoService.skipUpdate(result);
+ mapper.put("code","0");
+ mapper.put("msg","数据存取成功");
+ }
+ this.userEnrollService.eableUpdate(result);
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错");
+ }
+ }else {
+ mapper.put("code","1");
+ mapper.put("msg","有异常数值");
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "infoInsert")
+ @ResponseBody
+ public Object infoInsert(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ if(result.get("userId")!=""&&result.get("userId")!=null){
+ result.put("modifyTime", DateUtils.getCurTime());
+ result.put("BMI",computingUnit.BMICom(result.get("height"),result.get("weight")));
+ //先判断是否存在
+ try {
+ int isIn = this.userInfoService.counById(result);
+ if(isIn==0){
+ int re = this.userInfoService.infoinsert(result);
+ }else{ //存在就update
+ this.userInfoService.infoUpdate(result);
+ }
+ this.userEnrollService.eableUpdate(result);
+ mapper.put("code","0");
+ mapper.put("msg","数据存取成功");
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器出错");
+ }
+ }else {
+ mapper.put("code","1");
+ mapper.put("msg","有异常数值");
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "getLabelList")
+ @ResponseBody
+ public Object getLabelList(){
+ Map mapper = new HashMap<>();
+ try {
+ List list = this.labelTypeService.getAll();
+ mapper.put("code","0");
+ mapper.put("list",list);
+ mapper.put("msg","列表拉取成功");
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器异常");
+ }
+ return mapper;
+ }
+
+ @RequestMapping(value = "setUserLabel")
+ @ResponseBody
+ public Object setUserLabel(@RequestBody Map result){
+ Map mapper = new HashMap<>();
+ try {
+ List list = (List)result.get("list");
+ this.userLabelServices.insertBeach(list);
+ mapper.put("code","0");
+ mapper.put("msg","数据存取成功");
+ } catch (Exception e) {
+ e.printStackTrace();
+ mapper.put("code","1");
+ mapper.put("msg","服务器异常");
+ }
+ return mapper;
+ }
+
+
+// @RequestMapping(value = "info-user")
+// public String getUser(){
+// return "comm/getinfo/info-user";
+// }
+
+ @RequestMapping(value = "info-fav")
+ public String getUserage(){
+ return "comm/getinfo/info-fav";
+ }
+
+ @RequestMapping(value = "inner-recomm")
+ public String innerrecomm(String userId,Map mapper){
+ //取用户label
+ List userLabel = this.userLabelServices.getAll(userId);
+ //获取用户推荐课程list
+ List