''
31
HSLink-back/.gitignore
vendored
Normal file
@ -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/
|
118
HSLink-back/.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
@ -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();
|
||||
}
|
||||
|
||||
}
|
BIN
HSLink-back/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
2
HSLink-back/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@ -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
|
310
HSLink-back/mvnw
vendored
Normal file
@ -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 "$@"
|
182
HSLink-back/mvnw.cmd
vendored
Normal file
@ -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%
|
75
HSLink-back/pom.xml
Normal file
@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.2.6.RELEASE</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.qinxx</groupId>
|
||||
<artifactId>hslink</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>hslink</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||
<version>2.1.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-devtools</artifactId>
|
||||
<scope>runtime</scope>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<!--不然编译找不到xml-->
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
<includes>
|
||||
<include>**/*.properties</include>
|
||||
<include>**/*.xml</include>
|
||||
</includes>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
</project>
|
@ -0,0 +1,15 @@
|
||||
package com.qinxx.hslink;
|
||||
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@MapperScan(basePackages = {"com.qinxx.hslink.dao"})
|
||||
@SpringBootApplication
|
||||
public class HslinkApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(HslinkApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package com.qinxx.hslink.controller;
|
||||
|
||||
import com.qinxx.hslink.service.HSService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/hs")
|
||||
public class HSController {
|
||||
|
||||
@Autowired
|
||||
HSService hsService;
|
||||
|
||||
//登录验证
|
||||
@RequestMapping(value = "/login", method = {RequestMethod.POST, RequestMethod.GET})
|
||||
@ResponseBody
|
||||
public Map<String,Object> hello(@RequestBody Map<String,Object> param) {
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
result = hsService.login(param);
|
||||
return result;
|
||||
}
|
||||
|
||||
//注册
|
||||
@RequestMapping(value = "/register", method = {RequestMethod.POST,RequestMethod.GET})
|
||||
@ResponseBody
|
||||
public Map<String,Object> register(@RequestBody Map<String,Object> param) {
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
result = hsService.register(param);
|
||||
return result;
|
||||
}
|
||||
|
||||
//获取首页内容
|
||||
@RequestMapping(value = "/getAllContent", method = {RequestMethod.POST,RequestMethod.GET})
|
||||
@ResponseBody
|
||||
public Map<String,Object> getAllContent(@RequestBody Map<String,Object> param) {
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
result = hsService.getAllContent(param);
|
||||
return result;
|
||||
}
|
||||
|
||||
//获取一条数据具体内容
|
||||
@RequestMapping(value = "/getOneContent", method = {RequestMethod.POST,RequestMethod.GET})
|
||||
@ResponseBody
|
||||
public Map<String,Object> getOneContent(@RequestBody Map<String,Object> param) {
|
||||
Map<String,Object> result = hsService.getOneContent(param);
|
||||
return result;
|
||||
}
|
||||
|
||||
//新增留言
|
||||
@RequestMapping(value = "/addMessage", method = {RequestMethod.POST,RequestMethod.GET})
|
||||
@ResponseBody
|
||||
public Map<String,Object> addMessage(@RequestBody Map<String,Object> param) {
|
||||
Map<String,Object> result = hsService.addMessage(param);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package com.qinxx.hslink.dao;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Mapper
|
||||
public interface HSLinkMapper {
|
||||
/**
|
||||
*登录验证
|
||||
* @return
|
||||
*/
|
||||
Map<String,Object> login(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 注册
|
||||
*/
|
||||
int register(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 获取校园通知
|
||||
*/
|
||||
List<Map<String,Object>> getSchoolNotice(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 获取优秀建议
|
||||
*/
|
||||
List<Map<String,Object>> getParentAdvice(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 获取神奇想法
|
||||
*/
|
||||
List<Map<String,Object>> getStudentThinking(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 获取一条数据具体内容
|
||||
*/
|
||||
Map<String,Object> getOneContent(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 获取一条数据具体内容
|
||||
*/
|
||||
List<Map<String,Object>> getOneLeaveMessage(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 新增留言
|
||||
*/
|
||||
int addMessage(Map<String,Object> param);
|
||||
}
|
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.qinxx.hslink.dao.HSLinkMapper">
|
||||
|
||||
<!--登录验证-->
|
||||
<select id="login" resultType="map" parameterType="map">
|
||||
select * from hs_user where (real_name = #{username} and pass_word = #{password} and user_type = #{role})
|
||||
or (mobile = #{username} and pass_word = #{password} and user_type = #{role})
|
||||
</select>
|
||||
|
||||
<!--注册-->
|
||||
<insert id="register" parameterType="map">
|
||||
INSERT INTO hs_user ( user_id, pass_word,real_name, mobile, user_type, creat_time, frozen_state, error_times)
|
||||
VALUES
|
||||
(
|
||||
uuid(),
|
||||
#{password},
|
||||
#{realname},
|
||||
#{mobile},
|
||||
#{type},
|
||||
now(),
|
||||
'00',
|
||||
'0'
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!--获取校园通知-->
|
||||
<select id="getSchoolNotice" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
s.id,
|
||||
label,
|
||||
title,
|
||||
content,
|
||||
real_name,
|
||||
release_time
|
||||
FROM
|
||||
hs_notice s left join hs_user u on s.release_id = u.user_id
|
||||
where type = '校园通知'
|
||||
<if test="id != null and id != ''">
|
||||
and s.id = #{id}
|
||||
</if>
|
||||
<if test="type != null and type != ''">
|
||||
and label = #{label}
|
||||
</if>
|
||||
ORDER BY release_time desc
|
||||
</select>
|
||||
|
||||
<!--获取家长建议-->
|
||||
<select id="getParentAdvice" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
p.id,
|
||||
label,
|
||||
title,
|
||||
content,
|
||||
real_name,
|
||||
release_time
|
||||
FROM
|
||||
hs_notice p left join hs_user u on p.release_id = u.user_id
|
||||
where type = '家长建议'
|
||||
<if test="id != null and id != ''">
|
||||
and p.id = #{id}
|
||||
</if>
|
||||
<if test="type != null and type != ''">
|
||||
and label = #{label}
|
||||
</if>
|
||||
ORDER BY release_time desc
|
||||
</select>
|
||||
|
||||
<!--获取学生想法-->
|
||||
<select id="getStudentThinking" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
s.id,
|
||||
label,
|
||||
title,
|
||||
content,
|
||||
real_name,
|
||||
release_time
|
||||
FROM
|
||||
hs_notice s left join hs_user u on s.release_id = u.user_id
|
||||
where type = '学生想法'
|
||||
<if test="id != null and id != ''">
|
||||
and s.id = #{id}
|
||||
</if>
|
||||
<if test="type != null and type != ''">
|
||||
and label = #{label}
|
||||
</if>
|
||||
ORDER BY release_time desc
|
||||
</select>
|
||||
|
||||
<!--获取一条数据的具体内容-->
|
||||
<select id="getOneContent" resultType="map" parameterType="map">
|
||||
select
|
||||
id,
|
||||
release_id author_id,
|
||||
real_name author_name,
|
||||
create_time,
|
||||
label,
|
||||
title,
|
||||
content,
|
||||
integral,
|
||||
'' header_photo
|
||||
from hs_notice n left join hs_user u on n.release_id = u.user_id
|
||||
where id = #{id}
|
||||
</select>
|
||||
|
||||
<!--获取一条数据的留言-->
|
||||
<select id="getOneLeaveMessage" parameterType="map" resultType="map">
|
||||
select id,
|
||||
messager_id,
|
||||
content,
|
||||
hs_leave_message.create_time,
|
||||
real_name,
|
||||
'' header_photot from hs_leave_message left join hs_user on messager_id = user_id where notice_id = #{id} ORDER BY create_time desc
|
||||
</select>
|
||||
|
||||
<!--新增留言-->
|
||||
<insert id="addMessage" parameterType="map">
|
||||
insert into hs_leave_message(id,notice_id,messager_id,content,create_time) VALUES (uuid(),#{noticeId},#{userId},#{content},#{createTime})
|
||||
</insert>
|
||||
</mapper>
|
@ -0,0 +1,35 @@
|
||||
package com.qinxx.hslink.service;
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface HSService {
|
||||
|
||||
/**
|
||||
*登录验证
|
||||
* @return
|
||||
*/
|
||||
Map<String,Object> login(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 注册
|
||||
*/
|
||||
Map<String, Object> register(Map<String, Object> parameter);
|
||||
|
||||
/**
|
||||
* 获取首页内容
|
||||
*/
|
||||
Map<String,Object> getAllContent(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 获取一条数据具体内容
|
||||
*/
|
||||
Map<String,Object> getOneContent(Map<String,Object> param);
|
||||
|
||||
/**
|
||||
* 新增留言
|
||||
*/
|
||||
Map<String,Object> addMessage(Map<String,Object> param);
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
package com.qinxx.hslink.service.impl;
|
||||
|
||||
import com.qinxx.hslink.dao.HSLinkMapper;
|
||||
import com.qinxx.hslink.service.HSService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@Service
|
||||
public class HSServiceImpl implements HSService {
|
||||
|
||||
@Autowired
|
||||
HSLinkMapper hsLinkMapper;
|
||||
|
||||
@Override
|
||||
public Map<String, Object> login(Map<String, Object> param) {
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
Map<String,Object> res = hsLinkMapper.login(param);
|
||||
result.put("data",res);
|
||||
result.put("success",true);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> register(Map<String, Object> parameter) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
int res = 0;
|
||||
try {
|
||||
res = hsLinkMapper.register(parameter);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
res = 0;
|
||||
}
|
||||
result.put("data",res);
|
||||
result.put("success",true);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> getAllContent(Map<String, Object> param) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
List<Map<String,Object>> schoolNoticeList = hsLinkMapper.getSchoolNotice(param);
|
||||
res.put("schoolNoticeList",schoolNoticeList);
|
||||
List<Map<String,Object>> parentAdvice = hsLinkMapper.getParentAdvice(param);
|
||||
res.put("parentAdvice",parentAdvice);
|
||||
List<Map<String,Object>> studentThinking = hsLinkMapper.getStudentThinking(param);
|
||||
res.put("studentThinking",studentThinking);
|
||||
result.put("data",res);
|
||||
result.put("success",true);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> getOneContent(Map<String, Object> param) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
Map<String, Object> res = new HashMap<>();
|
||||
Map<String, Object> res1 = hsLinkMapper.getOneContent(param);
|
||||
List<Map<String, Object>> res2 = hsLinkMapper.getOneLeaveMessage(param);
|
||||
res.put("content",res1);
|
||||
res.put("message",res2);
|
||||
result.put("data",res);
|
||||
result.put("success",true);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> addMessage(Map<String, Object> param) {
|
||||
int res = 0;
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
try {
|
||||
res = hsLinkMapper.addMessage(param);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
res = 0;
|
||||
}
|
||||
result.put("data",res);
|
||||
result.put("success",true);
|
||||
return result;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.qinxx.hslink.util;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||
import org.springframework.web.filter.CorsFilter;
|
||||
|
||||
@Configuration
|
||||
public class CorsConfig {
|
||||
private CorsConfiguration buildConfig() {
|
||||
CorsConfiguration corsConfiguration = new CorsConfiguration();
|
||||
corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
|
||||
corsConfiguration.addAllowedHeader("*"); // 2允许任何头
|
||||
corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
|
||||
return corsConfiguration;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public CorsFilter corsFilter() {
|
||||
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||
source.registerCorsConfiguration("/**", buildConfig()); // 4
|
||||
return new CorsFilter(source);
|
||||
}
|
||||
}
|
21
HSLink-back/src/main/resources/application.yml
Normal file
@ -0,0 +1,21 @@
|
||||
##端口号
|
||||
server:
|
||||
port: 8048
|
||||
## mybatis配置
|
||||
mybatis:
|
||||
mapper-locations: classpath*:com/qinxx/hslink/dao/mapping/*.xml
|
||||
typeAliasesPackage: com.qinxx.hslink.model
|
||||
##日志等级
|
||||
logging:
|
||||
level:
|
||||
com.qinxx.hslink.dao : debug
|
||||
##数据源
|
||||
spring:
|
||||
datasource:
|
||||
# url: jdbc:mysql://123.57.22.91:3306/hslink?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf8
|
||||
url: jdbc:mysql://127.0.0.1:3306/hslink?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf8
|
||||
username: root
|
||||
password: 123456
|
||||
db-name: hslink
|
||||
filters: log4j,wall,mergeStat
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
@ -13,14 +13,14 @@ module.exports = {
|
||||
proxyTable: {},
|
||||
|
||||
// Various Dev Server settings
|
||||
host: 'localhost', // can be overwritten by process.env.HOST
|
||||
host: '192.168.10.29', // can be overwritten by process.env.HOST
|
||||
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
|
||||
autoOpenBrowser: false,
|
||||
errorOverlay: true,
|
||||
notifyOnErrors: true,
|
||||
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Source Maps
|
||||
*/
|
||||
|
90
HSLink-front/package-lock.json
generated
@ -262,6 +262,14 @@
|
||||
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
|
||||
"dev": true
|
||||
},
|
||||
"async-validator": {
|
||||
"version": "1.8.5",
|
||||
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
|
||||
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
|
||||
"requires": {
|
||||
"babel-runtime": "6.x"
|
||||
}
|
||||
},
|
||||
"atob": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
|
||||
@ -282,6 +290,32 @@
|
||||
"postcss-value-parser": "^3.2.3"
|
||||
}
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.19.2",
|
||||
"resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.2.tgz",
|
||||
"integrity": "sha1-PqNsXYgY0NX4qKl6bTa4bNwAyyc=",
|
||||
"requires": {
|
||||
"follow-redirects": "1.5.10"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
|
||||
"integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=",
|
||||
"requires": {
|
||||
"debug": "=3.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"babel-code-frame": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
|
||||
@ -532,8 +566,7 @@
|
||||
"babel-helper-vue-jsx-merge-props": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
|
||||
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
|
||||
},
|
||||
"babel-helpers": {
|
||||
"version": "6.24.1",
|
||||
@ -1061,7 +1094,6 @@
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
|
||||
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"core-js": "^2.4.0",
|
||||
"regenerator-runtime": "^0.11.0"
|
||||
@ -2000,8 +2032,7 @@
|
||||
"core-js": {
|
||||
"version": "2.6.11",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
|
||||
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
@ -3149,6 +3180,11 @@
|
||||
"regexp.prototype.flags": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"deepmerge": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
|
||||
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
|
||||
},
|
||||
"define-properties": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
|
||||
@ -3433,6 +3469,19 @@
|
||||
"integrity": "sha512-4RvbM5x+002gKI8sltkqWEk5pptn0UnzekUx8RTThAMPDSb8jjpm6SwGiSnEve7f85biyZl8DMXaipaCxDjXag==",
|
||||
"dev": true
|
||||
},
|
||||
"element-ui": {
|
||||
"version": "2.13.0",
|
||||
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.13.0.tgz",
|
||||
"integrity": "sha512-KYsHWsBXYbLELS8cdfvgJTOMSUby3UEjvsPV1V1VmgJ/DdkOAS4z3MiOrPxrT9w2Cc5lZ4eVSQiGhYFR5NVChw==",
|
||||
"requires": {
|
||||
"async-validator": "~1.8.1",
|
||||
"babel-helper-vue-jsx-merge-props": "^2.0.0",
|
||||
"deepmerge": "^1.2.0",
|
||||
"normalize-wheel": "^1.0.1",
|
||||
"resize-observer-polyfill": "^1.5.0",
|
||||
"throttle-debounce": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"elliptic": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
|
||||
@ -5894,6 +5943,11 @@
|
||||
"object-visit": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"marked": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npm.taobao.org/marked/download/marked-0.8.2.tgz?cache=0&sync_timestamp=1584894910023&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmarked%2Fdownload%2Fmarked-0.8.2.tgz",
|
||||
"integrity": "sha1-T6rSjSbt41Gnoaql/sZ5Fchp41U="
|
||||
},
|
||||
"math-expression-evaluator": {
|
||||
"version": "1.2.22",
|
||||
"resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz",
|
||||
@ -6220,8 +6274,7 @@
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||
"dev": true
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"multicast-dns": {
|
||||
"version": "6.2.3",
|
||||
@ -6400,6 +6453,11 @@
|
||||
"sort-keys": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"normalize-wheel": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
|
||||
"integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
|
||||
},
|
||||
"npm-run-path": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
|
||||
@ -9586,8 +9644,7 @@
|
||||
"regenerator-runtime": {
|
||||
"version": "0.11.1",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
|
||||
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
|
||||
},
|
||||
"regenerator-transform": {
|
||||
"version": "0.10.1",
|
||||
@ -9724,6 +9781,11 @@
|
||||
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
|
||||
"dev": true
|
||||
},
|
||||
"resize-observer-polyfill": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
|
||||
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.15.1",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
|
||||
@ -10660,6 +10722,11 @@
|
||||
"integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==",
|
||||
"dev": true
|
||||
},
|
||||
"throttle-debounce": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
|
||||
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
|
||||
},
|
||||
"through2": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
|
||||
@ -11248,6 +11315,11 @@
|
||||
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.6.tgz",
|
||||
"integrity": "sha512-GYhn2ynaZlysZMkFE5oCHRUTqE8BWs/a9YbKpNLi0i7xD6KG1EzDqpHQmv1F5gXjr8kL5iIVS8EOtRaVUEXTqA=="
|
||||
},
|
||||
"vue-scroll": {
|
||||
"version": "2.1.13",
|
||||
"resolved": "https://registry.npm.taobao.org/vue-scroll/download/vue-scroll-2.1.13.tgz",
|
||||
"integrity": "sha1-Q+KfQ/1k1S/yhWh3wtDFsPZDMYg="
|
||||
},
|
||||
"vue-style-loader": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.1.2.tgz",
|
||||
|
@ -10,9 +10,12 @@
|
||||
"build": "node build/build.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^0.19.2",
|
||||
"element-ui": "^2.13.0",
|
||||
"marked": "^0.8.2",
|
||||
"vue": "^2.5.2",
|
||||
"vue-router": "^3.0.1"
|
||||
"vue-router": "^3.0.1",
|
||||
"vue-scroll": "^2.1.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^7.1.2",
|
||||
@ -39,6 +42,8 @@
|
||||
"postcss-loader": "^2.0.8",
|
||||
"postcss-url": "^7.2.1",
|
||||
"rimraf": "^2.6.0",
|
||||
"sass": "^1.26.3",
|
||||
"sass-loader": "^7.3.1",
|
||||
"semver": "^5.3.0",
|
||||
"shelljs": "^0.7.6",
|
||||
"uglifyjs-webpack-plugin": "^1.1.1",
|
||||
|
88
HSLink-front/src/api/index.js
Normal file
@ -0,0 +1,88 @@
|
||||
// 配置API接口地址
|
||||
import de from "element-ui/src/locale/lang/de";
|
||||
|
||||
// let root = 'http://192.168.10.29:8008'
|
||||
// let root = 'http://123.57.22.91:8002'
|
||||
let root = 'http://127.0.0.1:8048'
|
||||
// 引用axios
|
||||
let axios = require('axios')
|
||||
// 自定义判断元素类型JS
|
||||
function toType (obj) {
|
||||
return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
|
||||
}
|
||||
// 参数过滤函数
|
||||
function filterNull (o) {
|
||||
for (let key in o) {
|
||||
if (o[key] === null) {
|
||||
delete o[key]
|
||||
}
|
||||
if (toType(o[key]) === 'string') {
|
||||
o[key] = o[key].trim()
|
||||
} else if (toType(o[key]) === 'object') {
|
||||
o[key] = filterNull(o[key])
|
||||
} else if (toType(o[key]) === 'array') {
|
||||
o[key] = filterNull(o[key])
|
||||
}
|
||||
}
|
||||
return o
|
||||
}
|
||||
|
||||
/*
|
||||
接口处理函数
|
||||
这个函数每个项目都是不一样的,我现在调整的是适用于
|
||||
https://cnodejs.org/api/v1 的接口,如果是其他接口
|
||||
需要根据接口的参数进行调整。参考说明文档地址:
|
||||
https://cnodejs.org/topic/5378720ed6e2d16149fa16bd
|
||||
主要是,不同的接口的成功标识和失败提示是不一致的。
|
||||
另外,不同的项目的处理方法也是不一致的,这里出错就是简单的alert
|
||||
*/
|
||||
function apiAxios (method, url, params, success, failure) {
|
||||
if (params) {
|
||||
params = filterNull(params)
|
||||
}
|
||||
axios({
|
||||
method: method,
|
||||
url: url,
|
||||
data: method === 'POST' || method === 'PUT' ? params : null,
|
||||
params: method === 'GET' || method === 'DELETE' ? params : null,
|
||||
baseURL: root,
|
||||
withCredentials: false
|
||||
})
|
||||
.then(function (res) {
|
||||
console.log("success",res)
|
||||
if (res.data.success === true) {
|
||||
if (success) {
|
||||
success(res.data.data)
|
||||
}
|
||||
} else {
|
||||
if (failure) {
|
||||
failure(res.data)
|
||||
} else {
|
||||
console.log('error: ' + JSON.stringify(res.data))
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(function (err) {
|
||||
console.log("error",err)
|
||||
let res = err.response
|
||||
if (err) {
|
||||
console.log('api error, HTTP CODE: ' + res)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 返回在vue模板中的调用接口
|
||||
export default {
|
||||
get: function (url, params, success, failure) {
|
||||
return apiAxios('GET', url, params, success, failure)
|
||||
},
|
||||
post: function (url, params, success, failure) {
|
||||
return apiAxios('POST', url, params, success, failure)
|
||||
},
|
||||
put: function (url, params, success, failure) {
|
||||
return apiAxios('PUT', url, params, success, failure)
|
||||
},
|
||||
delete: function (url, params, success, failure) {
|
||||
return apiAxios('DELETE', url, params, success, failure)
|
||||
}
|
||||
}
|
1
HSLink-front/src/assets/css/atom-one-dark.min.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
.hljs{display:block;overflow-x:auto;padding:0.5em;color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-keyword,.hljs-formula{color:#c678dd}.hljs-section,.hljs-name,.hljs-selector-tag,.hljs-deletion,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute,.hljs-meta-string{color:#98c379}.hljs-built_in,.hljs-class .hljs-title{color:#e6c07b}.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-type,.hljs-selector-class,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-number{color:#d19a66}.hljs-symbol,.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-title{color:#61aeee}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.hljs-link{text-decoration:underline}
|
681
HSLink-front/src/assets/css/github-markdown.css
Normal file
@ -0,0 +1,681 @@
|
||||
@font-face {
|
||||
font-family: octicons-link;
|
||||
src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff');
|
||||
}
|
||||
|
||||
.markdown-body {
|
||||
-ms-text-size-adjust: 100%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
line-height: 1.5;
|
||||
color: #333;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.markdown-body .pl-c {
|
||||
color: #969896;
|
||||
}
|
||||
|
||||
.markdown-body .pl-c1,
|
||||
.markdown-body .pl-s .pl-v {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.markdown-body .pl-e,
|
||||
.markdown-body .pl-en {
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.markdown-body .pl-smi,
|
||||
.markdown-body .pl-s .pl-s1 {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.markdown-body .pl-ent {
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.markdown-body .pl-k {
|
||||
color: #a71d5d;
|
||||
}
|
||||
|
||||
.markdown-body .pl-s,
|
||||
.markdown-body .pl-pds,
|
||||
.markdown-body .pl-s .pl-pse .pl-s1,
|
||||
.markdown-body .pl-sr,
|
||||
.markdown-body .pl-sr .pl-cce,
|
||||
.markdown-body .pl-sr .pl-sre,
|
||||
.markdown-body .pl-sr .pl-sra {
|
||||
color: #183691;
|
||||
}
|
||||
|
||||
.markdown-body .pl-v {
|
||||
color: #ed6a43;
|
||||
}
|
||||
|
||||
.markdown-body .pl-id {
|
||||
color: #b52a1d;
|
||||
}
|
||||
|
||||
.markdown-body .pl-ii {
|
||||
color: #f8f8f8;
|
||||
background-color: #b52a1d;
|
||||
}
|
||||
|
||||
.markdown-body .pl-sr .pl-cce {
|
||||
font-weight: bold;
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.markdown-body .pl-ml {
|
||||
color: #693a17;
|
||||
}
|
||||
|
||||
.markdown-body .pl-mh,
|
||||
.markdown-body .pl-mh .pl-en,
|
||||
.markdown-body .pl-ms {
|
||||
font-weight: bold;
|
||||
color: #1d3e81;
|
||||
}
|
||||
|
||||
.markdown-body .pl-mq {
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
.markdown-body .pl-mi {
|
||||
font-style: italic;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.markdown-body .pl-mb {
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.markdown-body .pl-md {
|
||||
color: #bd2c00;
|
||||
background-color: #ffecec;
|
||||
}
|
||||
|
||||
.markdown-body .pl-mi1 {
|
||||
color: #55a532;
|
||||
background-color: #eaffea;
|
||||
}
|
||||
|
||||
.markdown-body .pl-mdr {
|
||||
font-weight: bold;
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.markdown-body .pl-mo {
|
||||
color: #1d3e81;
|
||||
}
|
||||
|
||||
.markdown-body .octicon {
|
||||
display: inline-block;
|
||||
vertical-align: text-top;
|
||||
fill: currentColor;
|
||||
}
|
||||
|
||||
.markdown-body a {
|
||||
background-color: transparent;
|
||||
-webkit-text-decoration-skip: objects;
|
||||
}
|
||||
|
||||
.markdown-body a:active,
|
||||
.markdown-body a:hover {
|
||||
outline-width: 0;
|
||||
}
|
||||
|
||||
.markdown-body strong {
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
.markdown-body strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
.markdown-body h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
.markdown-body img {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
.markdown-body svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.markdown-body code,
|
||||
.markdown-body kbd,
|
||||
.markdown-body pre {
|
||||
font-family: monospace, monospace;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.markdown-body hr {
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.markdown-body input {
|
||||
font: inherit;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.markdown-body input {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.markdown-body [type="checkbox"] {
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.markdown-body * {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.markdown-body input {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
.markdown-body a {
|
||||
color: #4078c0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.markdown-body a:hover,
|
||||
.markdown-body a:active {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.markdown-body strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown-body hr {
|
||||
height: 0;
|
||||
margin: 15px 0;
|
||||
overflow: hidden;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.markdown-body hr::before {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
|
||||
.markdown-body hr::after {
|
||||
display: table;
|
||||
clear: both;
|
||||
content: "";
|
||||
}
|
||||
|
||||
.markdown-body table {
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.markdown-body td,
|
||||
.markdown-body th {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.markdown-body h1,
|
||||
.markdown-body h2,
|
||||
.markdown-body h3,
|
||||
.markdown-body h4,
|
||||
.markdown-body h5,
|
||||
.markdown-body h6 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.markdown-body h1 {
|
||||
font-size: 32px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown-body h2 {
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown-body h3 {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown-body h4 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown-body h5 {
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown-body h6 {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown-body p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.markdown-body blockquote {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.markdown-body ul,
|
||||
.markdown-body ol {
|
||||
padding-left: 0;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.markdown-body ol ol,
|
||||
.markdown-body ul ol {
|
||||
list-style-type: lower-roman;
|
||||
}
|
||||
|
||||
.markdown-body ul ul ol,
|
||||
.markdown-body ul ol ol,
|
||||
.markdown-body ol ul ol,
|
||||
.markdown-body ol ol ol {
|
||||
list-style-type: lower-alpha;
|
||||
}
|
||||
|
||||
.markdown-body dd {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.markdown-body code {
|
||||
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown-body pre {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||
}
|
||||
|
||||
.markdown-body .octicon {
|
||||
vertical-align: text-bottom;
|
||||
}
|
||||
|
||||
.markdown-body input {
|
||||
-webkit-font-feature-settings: "liga" 0;
|
||||
font-feature-settings: "liga" 0;
|
||||
}
|
||||
|
||||
.markdown-body::before {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
|
||||
.markdown-body::after {
|
||||
display: table;
|
||||
clear: both;
|
||||
content: "";
|
||||
}
|
||||
|
||||
.markdown-body>*:first-child {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
.markdown-body>*:last-child {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
|
||||
.markdown-body a:not([href]) {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.markdown-body .anchor {
|
||||
float: left;
|
||||
padding-right: 4px;
|
||||
margin-left: -20px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.markdown-body .anchor:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.markdown-body p,
|
||||
.markdown-body blockquote,
|
||||
.markdown-body ul,
|
||||
.markdown-body ol,
|
||||
.markdown-body dl,
|
||||
.markdown-body table,
|
||||
.markdown-body pre {
|
||||
margin-top: 0;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.markdown-body hr {
|
||||
height: 0.25em;
|
||||
padding: 0;
|
||||
margin: 24px 0;
|
||||
background-color: #e7e7e7;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.markdown-body blockquote {
|
||||
padding: 0 1em;
|
||||
color: #777;
|
||||
border-left: 0.25em solid #ddd;
|
||||
}
|
||||
|
||||
.markdown-body blockquote>:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.markdown-body blockquote>:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.markdown-body kbd {
|
||||
display: inline-block;
|
||||
padding: 3px 5px;
|
||||
font-size: 11px;
|
||||
line-height: 10px;
|
||||
color: #555;
|
||||
vertical-align: middle;
|
||||
background-color: #fcfcfc;
|
||||
border: solid 1px #ccc;
|
||||
border-bottom-color: #bbb;
|
||||
border-radius: 3px;
|
||||
box-shadow: inset 0 -1px 0 #bbb;
|
||||
}
|
||||
|
||||
.markdown-body h1,
|
||||
.markdown-body h2,
|
||||
.markdown-body h3,
|
||||
.markdown-body h4,
|
||||
.markdown-body h5,
|
||||
.markdown-body h6 {
|
||||
margin-top: 24px;
|
||||
margin-bottom: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.markdown-body h1 .octicon-link,
|
||||
.markdown-body h2 .octicon-link,
|
||||
.markdown-body h3 .octicon-link,
|
||||
.markdown-body h4 .octicon-link,
|
||||
.markdown-body h5 .octicon-link,
|
||||
.markdown-body h6 .octicon-link {
|
||||
color: #000;
|
||||
vertical-align: middle;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.markdown-body h1:hover .anchor,
|
||||
.markdown-body h2:hover .anchor,
|
||||
.markdown-body h3:hover .anchor,
|
||||
.markdown-body h4:hover .anchor,
|
||||
.markdown-body h5:hover .anchor,
|
||||
.markdown-body h6:hover .anchor {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.markdown-body h1:hover .anchor .octicon-link,
|
||||
.markdown-body h2:hover .anchor .octicon-link,
|
||||
.markdown-body h3:hover .anchor .octicon-link,
|
||||
.markdown-body h4:hover .anchor .octicon-link,
|
||||
.markdown-body h5:hover .anchor .octicon-link,
|
||||
.markdown-body h6:hover .anchor .octicon-link {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.markdown-body h1 {
|
||||
padding-bottom: 0.3em;
|
||||
font-size: 2em;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.markdown-body h2 {
|
||||
padding-bottom: 0.3em;
|
||||
font-size: 1.5em;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.markdown-body h3 {
|
||||
font-size: 1.25em;
|
||||
}
|
||||
|
||||
.markdown-body h4 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.markdown-body h5 {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
.markdown-body h6 {
|
||||
font-size: 0.85em;
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.markdown-body ul,
|
||||
.markdown-body ol {
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
.markdown-body ul ul,
|
||||
.markdown-body ul ol,
|
||||
.markdown-body ol ol,
|
||||
.markdown-body ol ul {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.markdown-body li>p {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.markdown-body li+li {
|
||||
margin-top: 0.25em;
|
||||
}
|
||||
|
||||
.markdown-body dl {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.markdown-body dl dt {
|
||||
padding: 0;
|
||||
margin-top: 16px;
|
||||
font-size: 1em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.markdown-body dl dd {
|
||||
padding: 0 16px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.markdown-body table {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.markdown-body table th {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.markdown-body table th,
|
||||
.markdown-body table td {
|
||||
padding: 6px 13px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.markdown-body table tr {
|
||||
background-color: #fff;
|
||||
border-top: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.markdown-body table tr:nth-child(2n) {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
.markdown-body img {
|
||||
max-width: 100%;
|
||||
box-sizing: content-box;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.markdown-body code {
|
||||
padding: 0;
|
||||
padding-top: 0.2em;
|
||||
padding-bottom: 0.2em;
|
||||
margin: 0;
|
||||
font-size: 85%;
|
||||
background-color: rgba(0,0,0,0.04);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.markdown-body code::before,
|
||||
.markdown-body code::after {
|
||||
letter-spacing: -0.2em;
|
||||
content: "\00a0";
|
||||
}
|
||||
|
||||
.markdown-body pre {
|
||||
word-wrap: normal;
|
||||
}
|
||||
|
||||
.markdown-body pre>code {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 100%;
|
||||
word-break: normal;
|
||||
white-space: pre;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.markdown-body .highlight {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.markdown-body .highlight pre {
|
||||
margin-bottom: 0;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
.markdown-body .highlight pre,
|
||||
.markdown-body pre {
|
||||
padding: 16px;
|
||||
overflow: auto;
|
||||
font-size: 85%;
|
||||
line-height: 1.45;
|
||||
background-color: #f7f7f7;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.markdown-body pre code {
|
||||
display: inline;
|
||||
max-width: auto;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
overflow: visible;
|
||||
line-height: inherit;
|
||||
word-wrap: normal;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.markdown-body pre code::before,
|
||||
.markdown-body pre code::after {
|
||||
content: normal;
|
||||
}
|
||||
|
||||
.markdown-body .pl-0 {
|
||||
padding-left: 0 !important;
|
||||
}
|
||||
|
||||
.markdown-body .pl-1 {
|
||||
padding-left: 3px !important;
|
||||
}
|
||||
|
||||
.markdown-body .pl-2 {
|
||||
padding-left: 6px !important;
|
||||
}
|
||||
|
||||
.markdown-body .pl-3 {
|
||||
padding-left: 12px !important;
|
||||
}
|
||||
|
||||
.markdown-body .pl-4 {
|
||||
padding-left: 24px !important;
|
||||
}
|
||||
|
||||
.markdown-body .pl-5 {
|
||||
padding-left: 36px !important;
|
||||
}
|
||||
|
||||
.markdown-body .pl-6 {
|
||||
padding-left: 48px !important;
|
||||
}
|
||||
|
||||
.markdown-body .full-commit .btn-outline:not(:disabled):hover {
|
||||
color: #4078c0;
|
||||
border: 1px solid #4078c0;
|
||||
}
|
||||
|
||||
.markdown-body kbd {
|
||||
display: inline-block;
|
||||
padding: 3px 5px;
|
||||
font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||
line-height: 10px;
|
||||
color: #555;
|
||||
vertical-align: middle;
|
||||
background-color: #fcfcfc;
|
||||
border: solid 1px #ccc;
|
||||
border-bottom-color: #bbb;
|
||||
border-radius: 3px;
|
||||
box-shadow: inset 0 -1px 0 #bbb;
|
||||
}
|
||||
|
||||
.markdown-body :checked+.radio-label {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
border-color: #4078c0;
|
||||
}
|
||||
|
||||
.markdown-body .task-list-item {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.markdown-body .task-list-item+.task-list-item {
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.markdown-body .task-list-item input {
|
||||
margin: 0 0.2em 0.25em -1.6em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.markdown-body hr {
|
||||
border-bottom-color: #eee;
|
||||
}
|
30
HSLink-front/src/assets/css/public.css
Normal file
@ -0,0 +1,30 @@
|
||||
html {
|
||||
overflow-y: overlay;
|
||||
}
|
||||
.default-color{
|
||||
color: #666!important;
|
||||
}
|
||||
.pointer{
|
||||
cursor: pointer!important;
|
||||
}
|
||||
.blue{
|
||||
color: #419EFF!important;
|
||||
}
|
||||
.special-font-blue:hover{
|
||||
color: #419EFF!important;
|
||||
}
|
||||
.white{
|
||||
color: #fff!important;
|
||||
}
|
||||
.text-underline:hover{
|
||||
text-decoration: underline;
|
||||
}
|
||||
.theme-font-blue{
|
||||
color: #1B94D4;
|
||||
}
|
||||
.body-background{
|
||||
background: #EEFCFE;
|
||||
}
|
||||
body{
|
||||
padding-right:0 !important
|
||||
}
|
436
HSLink-front/src/assets/css/reset.scss
Normal file
@ -0,0 +1,436 @@
|
||||
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
|
||||
|
||||
/**
|
||||
* 1. Set default font family to sans-serif.
|
||||
* 2. Prevent iOS and IE text size adjust after device orientation change,
|
||||
* without disabling user zoom.
|
||||
*/
|
||||
|
||||
*{
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
html {
|
||||
font-family: sans-serif; /* 1 */
|
||||
-ms-text-size-adjust: 100%; /* 2 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove default margin.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
height: 100%;
|
||||
|
||||
}
|
||||
|
||||
/* HTML5 display definitions
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Correct `block` display not defined for any HTML5 element in IE 8/9.
|
||||
* Correct `block` display not defined for `details` or `summary` in IE 10/11
|
||||
* and Firefox.
|
||||
* Correct `block` display not defined for `main` in IE 11.
|
||||
*/
|
||||
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
main,
|
||||
menu,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct `inline-block` display not defined in IE 8/9.
|
||||
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
|
||||
*/
|
||||
|
||||
audio,
|
||||
canvas,
|
||||
progress,
|
||||
video {
|
||||
display: inline-block; /* 1 */
|
||||
vertical-align: baseline; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent modern browsers from displaying `audio` without controls.
|
||||
* Remove excess height in iOS 5 devices.
|
||||
*/
|
||||
|
||||
audio:not([controls]) {
|
||||
display: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `[hidden]` styling not present in IE 8/9/10.
|
||||
* Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
|
||||
*/
|
||||
|
||||
[hidden],
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Links
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background color from active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability of focused elements when they are also in an
|
||||
* active/hover state.
|
||||
*/
|
||||
|
||||
a:active,
|
||||
a:hover {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* Text-level semantics
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: 1px dotted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in Safari and Chrome.
|
||||
*/
|
||||
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address variable `h1` font-size and margin within `section` and `article`
|
||||
* contexts in Firefox 4+, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9.
|
||||
*/
|
||||
|
||||
mark {
|
||||
background: #ff0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent and variable font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
/* Embedded content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove border when inside `a` element in IE 8/9/10.
|
||||
*/
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct overflow not hidden in IE 9/10/11.
|
||||
*/
|
||||
|
||||
svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Grouping content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address margin not present in IE 8/9 and Safari.
|
||||
*/
|
||||
|
||||
figure {
|
||||
margin: 1em 40px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address differences between Firefox and other browsers.
|
||||
*/
|
||||
|
||||
hr {
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Contain overflow in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address odd `em`-unit font size rendering in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: monospace, monospace;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
/* Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Known limitation: by default, Chrome and Safari on OS X allow very limited
|
||||
* styling of `select`, unless a `border` property is set.
|
||||
*/
|
||||
|
||||
/**
|
||||
* 1. Correct color not being inherited.
|
||||
* Known issue: affects color of disabled elements.
|
||||
* 2. Correct font properties not being inherited.
|
||||
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
color: inherit; /* 1 */
|
||||
font: inherit; /* 2 */
|
||||
margin: 0; /* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `overflow` set to `hidden` in IE 8/9/10/11.
|
||||
*/
|
||||
|
||||
button {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||
* All other form control elements do not inherit `text-transform` values.
|
||||
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
|
||||
* Correct `select` style inheritance in Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||
* and `video` controls.
|
||||
* 2. Correct inability to style clickable `input` types in iOS.
|
||||
* 3. Improve usability and consistency of cursor style between image-type
|
||||
* `input` and others.
|
||||
*/
|
||||
|
||||
button,
|
||||
html input[type="button"], /* 1 */
|
||||
input[type="reset"],
|
||||
input[type="submit"] {
|
||||
-webkit-appearance: button; /* 2 */
|
||||
cursor: pointer; /* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-set default cursor for disabled elements.
|
||||
*/
|
||||
|
||||
button[disabled],
|
||||
html input[disabled] {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and border in Firefox 4+.
|
||||
*/
|
||||
|
||||
button::-moz-focus-inner,
|
||||
input::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||
* the UA stylesheet.
|
||||
*/
|
||||
|
||||
input {
|
||||
line-height: normal;
|
||||
}
|
||||
|
||||
/**
|
||||
* It's recommended that you don't attempt to style these elements.
|
||||
* Firefox's implementation doesn't respect box-sizing, padding, or width.
|
||||
*
|
||||
* 1. Address box sizing set to `content-box` in IE 8/9/10.
|
||||
* 2. Remove excess padding in IE 8/9/10.
|
||||
*/
|
||||
|
||||
input[type="checkbox"],
|
||||
input[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
|
||||
* `font-size` values of the `input`, it causes the cursor style of the
|
||||
* decrement button to change from `default` to `text`.
|
||||
*/
|
||||
|
||||
input[type="number"]::-webkit-inner-spin-button,
|
||||
input[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
|
||||
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
|
||||
*/
|
||||
|
||||
input[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */
|
||||
box-sizing: content-box; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
|
||||
* Safari (but not Chrome) clips the cancel button when the search input has
|
||||
* padding (and `textfield` appearance).
|
||||
*/
|
||||
|
||||
input[type="search"]::-webkit-search-cancel-button,
|
||||
input[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define consistent border, margin, and padding.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #c0c0c0;
|
||||
margin: 0 2px;
|
||||
padding: 0.35em 0.625em 0.75em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct `color` not being inherited in IE 8/9/10/11.
|
||||
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||
*/
|
||||
|
||||
legend {
|
||||
border: 0; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove default vertical scrollbar in IE 8/9/10/11.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Don't inherit the `font-weight` (applied by a rule above).
|
||||
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
|
||||
*/
|
||||
|
||||
optgroup {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Tables
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove most spacing between table cells.
|
||||
*/
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
padding: 0;
|
||||
}
|
||||
.clearfix {
|
||||
overflow: hidden;
|
||||
_zoom: 1;
|
||||
}
|
BIN
HSLink-front/src/assets/img/carousel/carousel1.jpg
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
HSLink-front/src/assets/img/carousel/carousel2.jpg
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
HSLink-front/src/assets/img/carousel/carousel3.jpg
Normal file
After Width: | Height: | Size: 207 KiB |
BIN
HSLink-front/src/assets/img/carousel/carousel4.jpg
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
HSLink-front/src/assets/img/dh-002.gif
Normal file
After Width: | Height: | Size: 155 B |
BIN
HSLink-front/src/assets/img/header-background.jpg
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
HSLink-front/src/assets/img/left-1.gif
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
HSLink-front/src/assets/img/login.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
HSLink-front/src/assets/img/no-data.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
BIN
HSLink-front/src/assets/img/qq.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
HSLink-front/src/assets/img/register.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
HSLink-front/src/assets/img/title-background.jpg
Normal file
After Width: | Height: | Size: 835 B |
BIN
HSLink-front/src/assets/img/title.jpg
Normal file
After Width: | Height: | Size: 84 KiB |
3
HSLink-front/src/assets/js/highlight.min.js
vendored
Normal file
130
HSLink-front/src/assets/js/rangeFn.js
Normal file
@ -0,0 +1,130 @@
|
||||
// 获取光标位置
|
||||
function getCursortPosition(textDom) {
|
||||
var cursorPos = 0;
|
||||
if (document.selection) {
|
||||
// IE Support
|
||||
textDom.focus();
|
||||
var selectRange = document.selection.createRange();
|
||||
selectRange.moveStart('character', -textDom.value.length);
|
||||
cursorPos = selectRange.text.length;
|
||||
} else if (textDom.selectionStart || textDom.selectionStart == '0') {
|
||||
// Firefox support
|
||||
cursorPos = textDom.selectionStart;
|
||||
}
|
||||
return cursorPos;
|
||||
}
|
||||
|
||||
// 设置光标位置
|
||||
function setCaretPosition(textDom, pos) {
|
||||
if (textDom.setSelectionRange) {
|
||||
// IE Support
|
||||
textDom.focus();
|
||||
textDom.setSelectionRange(pos, pos);
|
||||
} else if (textDom.createTextRange) {
|
||||
// Firefox support
|
||||
var range = textDom.createTextRange();
|
||||
range.collapse(true);
|
||||
range.moveEnd('character', pos);
|
||||
range.moveStart('character', pos);
|
||||
range.select();
|
||||
}
|
||||
}
|
||||
// 获取选中文字
|
||||
function getSelectText() {
|
||||
var userSelection, text;
|
||||
if (window.getSelection) {
|
||||
// Firefox support
|
||||
userSelection = window.getSelection();
|
||||
} else if (document.selection) {
|
||||
// IE Support
|
||||
userSelection = document.selection.createRange();
|
||||
}
|
||||
if (!(text = userSelection.text)) {
|
||||
text = userSelection;
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
/**
|
||||
* 选中特定范围的文本
|
||||
* 参数:
|
||||
* textDom [JavaScript DOM String] 当前对象
|
||||
* startPos [Int] 起始位置
|
||||
* endPos [Int] 终点位置
|
||||
*/
|
||||
function setSelectText(textDom, startPos, endPos) {
|
||||
var startPos = parseInt(startPos),
|
||||
endPos = parseInt(endPos),
|
||||
textLength = textDom.value.length;
|
||||
if (textLength) {
|
||||
if (!startPos) {
|
||||
startPos = 0;
|
||||
}
|
||||
if (!endPos) {
|
||||
endPos = textLength;
|
||||
}
|
||||
if (startPos > textLength) {
|
||||
startPos = textLength;
|
||||
}
|
||||
if (endPos > textLength) {
|
||||
endPos = textLength;
|
||||
}
|
||||
if (startPos < 0) {
|
||||
startPos = textLength + startPos;
|
||||
}
|
||||
if (endPos < 0) {
|
||||
endPos = textLength + endPos;
|
||||
}
|
||||
if (textDom.createTextRange) {
|
||||
// IE Support
|
||||
var range = textDom.createTextRange();
|
||||
range.moveStart("character", -textLength);
|
||||
range.moveEnd("character", -textLength);
|
||||
range.moveStart("character", startPos);
|
||||
range.moveEnd("character", endPos);
|
||||
range.select();
|
||||
} else {
|
||||
// Firefox support
|
||||
textDom.setSelectionRange(startPos, endPos);
|
||||
textDom.focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 在光标后插入文本
|
||||
* 参数:
|
||||
* textDom [JavaScript DOM String] 当前对象
|
||||
* value [String] 要插入的文本
|
||||
*/
|
||||
function insertAfterText(textDom, value) {
|
||||
var selectRange;
|
||||
if (document.selection) {
|
||||
// IE Support
|
||||
textDom.focus();
|
||||
selectRange = document.selection.createRange();
|
||||
selectRange.text = value;
|
||||
textDom.focus();
|
||||
} else if (textDom.selectionStart || textDom.selectionStart == '0') {
|
||||
// Firefox support
|
||||
var startPos = textDom.selectionStart;
|
||||
var endPos = textDom.selectionEnd;
|
||||
var scrollTop = textDom.scrollTop;
|
||||
textDom.value = textDom.value.substring(0, startPos) + value + textDom.value.substring(endPos, textDom.value.length);
|
||||
textDom.focus();
|
||||
textDom.selectionStart = startPos + value.length;
|
||||
textDom.selectionEnd = startPos + value.length;
|
||||
textDom.scrollTop = scrollTop;
|
||||
} else {
|
||||
textDom.value += value;
|
||||
textDom.focus();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getCursortPosition,
|
||||
setCaretPosition,
|
||||
getSelectText,
|
||||
setSelectText,
|
||||
insertAfterText
|
||||
};
|
369
HSLink-front/src/components/Content.vue
Normal file
@ -0,0 +1,369 @@
|
||||
<template>
|
||||
<el-container>
|
||||
<el-main>
|
||||
<div class="content">
|
||||
<div class="header">
|
||||
<h1>{{all.title}}</h1>
|
||||
<span>作者:</span>
|
||||
<span class="blue pointer authorspan">{{all.author_name}}</span>
|
||||
<span>发布时间:{{all.creat_time}}</span>
|
||||
<div class="label">
|
||||
<span>文章标签:</span>
|
||||
<span class="special-text-yellow blue">{{all.label}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="middle">
|
||||
<div class="editorContainer">
|
||||
<markdown
|
||||
:mdValuesP="msg.mdValue"
|
||||
:fullPageStatusP="false"
|
||||
:editStatusP="true"
|
||||
:previewStatusP="true"
|
||||
:navStatusP="true"
|
||||
:icoStatusP="true"
|
||||
@childevent="childEventHandler"
|
||||
ref="markdown"
|
||||
></markdown>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<el-row>
|
||||
<el-button type="primary" icon="el-icon-thumb" plain>点赞</el-button>
|
||||
<el-button type="primary" icon="el-icon-share" plain>分享</el-button>
|
||||
</el-row>
|
||||
</div>
|
||||
</div>
|
||||
<div class="comment-area">
|
||||
<el-button class="message" type="primary" @click="messages">留言</el-button>
|
||||
<div class="comment-list">
|
||||
<div class="comment-one" v-for="item in message">
|
||||
<div class="comment-header">
|
||||
<div class="header-photo">{{item.header_photo}}</div>
|
||||
<div class="name">{{item.real_name}}</div>
|
||||
<div class="time">{{item.create_time}}</div>
|
||||
</div>
|
||||
<div class="comment-content">{{item.content}}</div>
|
||||
<hr>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-main>
|
||||
<el-aside>
|
||||
<div class="person-info">
|
||||
<div class="info">
|
||||
<div class="name">
|
||||
<div class="header-photo">{{all.header_photo}}</div>
|
||||
<div class="username">{{all.author_name}}</div>
|
||||
<div class="go-homepage pointer">TA的个人主页 ></div>
|
||||
</div>
|
||||
<div class="grades">
|
||||
<div class="grade">
|
||||
<span>等级:</span>
|
||||
<div class="number">
|
||||
<span>博客</span>
|
||||
<span>2</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="integral">
|
||||
<span>积分: </span>
|
||||
<span>{{all.integral}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="operation">
|
||||
<el-button type="primary" plain>关 注</el-button>
|
||||
<el-button type="primary" plain>私信</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<footers></footers>
|
||||
</el-aside>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import footers from './components/Footer'
|
||||
import markdown from "./components/Mdeditor";
|
||||
export default {
|
||||
name: "Content",
|
||||
data() {
|
||||
return {
|
||||
all: "",
|
||||
message: '',
|
||||
id:'',
|
||||
msgShow:'我要显示的内容',
|
||||
dilogStatus:false,
|
||||
msg: {
|
||||
mdValue:''
|
||||
},
|
||||
flag:false,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
},
|
||||
mounted() {
|
||||
this.$ajax.post("/hs/getOneContent", {
|
||||
id: sessionStorage.getItem("noticeId")
|
||||
}, r => {
|
||||
this.all = r.content;
|
||||
this.message = r.message;
|
||||
this.msg.mdValue = r.content.content;
|
||||
this.all.header_photo = this.all.author_name.substring(0, 1)
|
||||
for (let i = 0; i < this.message.length; i++) {
|
||||
this.message[i].header_photo = this.message[i].real_name.substring(0, 1)
|
||||
}
|
||||
setTimeout(()=>{this.$refs.markdown.addLine()},1)
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
messages() {
|
||||
this.$prompt('请输入留言', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
inputPattern: /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
|
||||
inputErrorMessage: '邮箱格式不正确'
|
||||
}).then(({ value }) => {
|
||||
let day2 = new Date();
|
||||
day2.setTime(day2.getTime());
|
||||
let date = day2.getFullYear()+"-" + (day2.getMonth()+1) + "-" + day2.getDate()+" "+day2.getHours()+"-"+day2.getMinutes()
|
||||
this.$ajax.post("/hs/addMessage",{noticeId:sessionStorage.getItem("noticeId"),content:value,
|
||||
createTime:date,userId:JSON.parse(sessionStorage.getItem("userInfo")).user_id},r=>{
|
||||
if (r == "1") {
|
||||
this.$message({
|
||||
type: 'success',
|
||||
message: '留言成功'
|
||||
});
|
||||
this.$ajax.post("/hs/getOneContent", {
|
||||
id: sessionStorage.getItem("noticeId")
|
||||
}, r => {this.message = r.message;})
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
this.$message({
|
||||
type: 'info',
|
||||
message: '取消输入'
|
||||
});
|
||||
});
|
||||
},
|
||||
childEventHandler:function(res){
|
||||
// res会传回一个data,包含属性mdValue和htmlValue,具体含义请自行翻译
|
||||
this.msg=res;
|
||||
},
|
||||
closeMaskFn:function(){
|
||||
this.msgShow='';
|
||||
this.dilogStatus=false;
|
||||
},
|
||||
handleChange(val) {
|
||||
console.log(val);
|
||||
},
|
||||
},
|
||||
components: {
|
||||
footers,
|
||||
markdown
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.message{
|
||||
margin: 1rem 1rem 0 0;
|
||||
float: right;
|
||||
}
|
||||
.mdContainer >>> .editContainer,.mdContainer >>> .navContainer{
|
||||
display: none!important;
|
||||
}
|
||||
.list{
|
||||
.title{
|
||||
padding-left: 1rem;
|
||||
height: 3rem;
|
||||
line-height: 3rem;
|
||||
background: #999;
|
||||
color: #fff;
|
||||
}
|
||||
background: #fff;
|
||||
ul{
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
li{
|
||||
padding: 0.5rem 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.aside-right{
|
||||
margin-left: 1rem;
|
||||
}
|
||||
.authorspan{
|
||||
/*float: right;*/
|
||||
/*margin-left: 2.5rem;*/
|
||||
}
|
||||
.navContainer{
|
||||
display: none!important;
|
||||
}
|
||||
.comment-content{
|
||||
margin: 0.5rem 0 0 2rem;
|
||||
}
|
||||
.reply{
|
||||
display: inline-block;
|
||||
float: right;
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
.comment-one{
|
||||
padding: 1rem 1rem 0 1rem;
|
||||
}
|
||||
.comment-header{
|
||||
display: flex;
|
||||
}
|
||||
.comment-header .name{
|
||||
font-weight: bold;
|
||||
}
|
||||
.comment-header .name, .comment-header .time{
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
.comment-one div{
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.comment-one .header-photo{
|
||||
height: 1.5rem;
|
||||
width: 1.5rem;
|
||||
line-height: 1.5rem;
|
||||
font-weight: bold;
|
||||
border-radius: 50%;
|
||||
background: #3399ea;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
float: left;
|
||||
font-size: 1rem;
|
||||
}
|
||||
.comment-area{
|
||||
margin-top: 1rem;
|
||||
background: #fff;
|
||||
min-height: 4.5rem;
|
||||
}
|
||||
.achievement{
|
||||
font-size: 0.9rem;
|
||||
margin-left: 3.5rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.content .middle{
|
||||
margin: 1rem 0;
|
||||
}
|
||||
.type span:nth-child(2){
|
||||
background: #F5F6F7;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.label span:nth-child(n+2){
|
||||
background: #F5F6F7;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.original1{
|
||||
position: absolute;
|
||||
color: #ca0c16;
|
||||
background: #f9ecec;
|
||||
font-size: 0.9rem;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
.reprint{
|
||||
color: #74cf59;
|
||||
background: #eaf9e3;
|
||||
font-size: 0.9rem;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
.header span:nth-child(-n+4){
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.content{
|
||||
padding: 1rem;
|
||||
background: #fff;
|
||||
}
|
||||
.content .header .label{
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.operation .el-button:nth-child(1){
|
||||
margin-left: 2rem;
|
||||
}
|
||||
.operation .el-button:nth-child(2){
|
||||
margin-right: 2rem;
|
||||
float: right;
|
||||
}
|
||||
.integral span:nth-child(2),.ranking span:nth-child(2){
|
||||
font-weight: bold;
|
||||
}
|
||||
.number{
|
||||
font-size: 0.8rem;
|
||||
color: #fff;
|
||||
border-radius: 5px;
|
||||
position: absolute;
|
||||
margin-left: 2.6rem;
|
||||
margin-top: -1.1rem!important;
|
||||
}
|
||||
.number span:nth-child(1){
|
||||
background: #9DC75F;
|
||||
float: left;
|
||||
}
|
||||
.number span:nth-child(2){
|
||||
background: #2D5315;
|
||||
float: left;
|
||||
min-width: 1rem;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
.grades{
|
||||
margin-top: 1rem;
|
||||
}
|
||||
.grades div{
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.read{
|
||||
margin: 0.5rem 0;
|
||||
}
|
||||
.read div{
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
width: 20%;
|
||||
}
|
||||
.read div p:nth-child(2){
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: bold;
|
||||
}
|
||||
.person-info{
|
||||
background: #fff;
|
||||
padding: 1rem;
|
||||
}
|
||||
.username{
|
||||
margin-left: 3.5rem;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.go-homepage{
|
||||
font-size: 0.9rem;
|
||||
color: #3399ea;
|
||||
margin-left: 3.5rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.header-photo{
|
||||
height: 3rem;
|
||||
width: 3rem;
|
||||
line-height: 3rem;
|
||||
font-weight: bold;
|
||||
border-radius: 50%;
|
||||
background: #3399ea;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
float: left;
|
||||
font-size: 1.5rem;
|
||||
margin-right: 2rem;
|
||||
}
|
||||
.el-container{
|
||||
padding: 0;
|
||||
}
|
||||
.el-aside{
|
||||
/*margin-top: 1rem;*/
|
||||
}
|
||||
.el-main{
|
||||
padding: 0;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
.read{
|
||||
display: flex;
|
||||
}
|
||||
</style>
|
60
HSLink-front/src/components/Help.vue
Normal file
@ -0,0 +1,60 @@
|
||||
<template>
|
||||
<el-main class="body-background">
|
||||
<div class="left">
|
||||
<div class="top">
|
||||
<img src="../assets/img/left-1.gif" height="83" width="142"/>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<el-menu
|
||||
default-active="2"
|
||||
class="el-menu-vertical-demo">
|
||||
<el-menu-item index="1">首页</el-menu-item>
|
||||
<el-menu-item index="2">校园通知</el-menu-item>
|
||||
<el-menu-item index="3">家长意见</el-menu-item>
|
||||
<el-menu-item index="4">学生想法</el-menu-item>
|
||||
<el-menu-item index="5">我的班级</el-menu-item>
|
||||
<el-menu-item index="6">常见问题</el-menu-item>
|
||||
</el-menu>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div>请联系管理员更新内容</div>
|
||||
<div>管理员联系方式:15006732580</div>
|
||||
<div>管理员QQ邮箱:617594538@qq.com</div>
|
||||
</div>
|
||||
</el-main>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "Help"
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.right{
|
||||
border: 1px solid #419EFF;
|
||||
border-radius: 5px;
|
||||
background: #fff;
|
||||
width: calc(85% - 1rem);
|
||||
margin-left: 1rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
.el-menu-item{
|
||||
text-align: center;
|
||||
}
|
||||
.left{
|
||||
border: 1px solid #419EFF;
|
||||
border-radius: 5px;
|
||||
background: #fff;
|
||||
width: 15%;
|
||||
}
|
||||
.left img{
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.el-main{
|
||||
padding: 1rem 0;
|
||||
display: flex;
|
||||
}
|
||||
</style>
|
@ -1,9 +1,377 @@
|
||||
<template>
|
||||
<p>hhh</p>
|
||||
<el-container>
|
||||
<div id="top">
|
||||
<div class="school-dynamic">
|
||||
<div id="title">
|
||||
校<br>园<br>动<br>态
|
||||
</div>
|
||||
<el-carousel indicator-position="outside">
|
||||
<el-carousel-item>
|
||||
<img src="../assets/img/carousel/carousel1.jpg" height="100%" width="100%"/>
|
||||
</el-carousel-item>
|
||||
<el-carousel-item>
|
||||
<img src="../assets/img/carousel/carousel2.jpg" height="100%" width="100%"/>
|
||||
</el-carousel-item>
|
||||
<el-carousel-item>
|
||||
<img src="../assets/img/carousel/carousel3.jpg" height="100%" width="100%"/>
|
||||
</el-carousel-item>
|
||||
<el-carousel-item>
|
||||
<img src="../assets/img/carousel/carousel4.jpg" height="100%" width="100%"/>
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
</div>
|
||||
</div>
|
||||
<div id="bottom">
|
||||
<div class="left">
|
||||
<el-tabs v-model="activeName" @tab-click="">
|
||||
<el-tab-pane label="校园通知" name="first">
|
||||
<div class="newest-notice module">
|
||||
<div class="title">
|
||||
<i class="el-icon-chat-dot-square"></i> 最 新 通 知
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="one theme-font-blue" v-for="item in newestNotice" :data-id="item.id" >
|
||||
<div class="type">
|
||||
[{{item.label}}]
|
||||
</div>
|
||||
<div class="text" @click="getContent(item.id)">{{item.title}}</div>
|
||||
<div class="release">{{item.real_name}}</div>
|
||||
<div class="release-time">{{item.release_time}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="家长意见" name="second">
|
||||
<div class="good-advice module">
|
||||
<div class="title">
|
||||
<i class="el-icon-chat-line-square"></i> 优 秀 建 议
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="one theme-font-blue" v-for="item in goodAdvice" :data-id="item.id">
|
||||
<div class="type">
|
||||
[{{item.label}}]
|
||||
</div>
|
||||
<div class="text">{{item.title}}</div>
|
||||
<div class="release">{{item.real_name}}</div>
|
||||
<div class="release-time">{{item.release_time}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="学生想法" name="third">
|
||||
<div class="magical-thinking module">
|
||||
<div class="title">
|
||||
<i class="el-icon-chat-square"></i> 神 奇 想 法
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="one theme-font-blue" v-for="item in magicalThinking" :data-id="item.id">
|
||||
<div class="type">
|
||||
[{{item.label}}]
|
||||
</div>
|
||||
<div class="text">{{item.title}}</div>
|
||||
<div class="release">{{item.real_name}}</div>
|
||||
<div class="release-time">{{item.release_time}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="prominent-teacher">
|
||||
<div class="header">
|
||||
<i class="el-icon-trophy"></i>
|
||||
优 秀 教 师
|
||||
</div>
|
||||
<div class="one" v-for="item in prominentTeacher">
|
||||
<div class="name theme-font-blue">{{item.name}}老师</div>
|
||||
<!-- <div class="subject theme-font-blue">数学</div>-->
|
||||
<!-- <div class="grade theme-font-blue">2016届</div>-->
|
||||
<div class="class theme-font-blue">{{item.class}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="merit-student">
|
||||
<div class="header">
|
||||
<i class="el-icon-trophy-1"></i>
|
||||
三 好 学 生
|
||||
</div>
|
||||
<div class="one" v-for="item in meritStudent">
|
||||
<div class="name theme-font-blue">{{item.name}}同学</div>
|
||||
<!-- <div class="grade theme-font-blue">2016届</div>-->
|
||||
<div class="subject theme-font-blue">{{item.class}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "Hompage",
|
||||
data() {
|
||||
return{
|
||||
newestNotice: '',
|
||||
goodAdvice: '',
|
||||
magicalThinking: '',
|
||||
activeName: 'first',
|
||||
prominentTeacher: [
|
||||
{
|
||||
id: '',
|
||||
name: '张伟',
|
||||
class: '2016届物联网一班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '吕小布',
|
||||
class: '2016届物联网二班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '李星',
|
||||
class: '大数据一班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '吴达',
|
||||
class: '软件外包一班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '田七',
|
||||
class: '机算计科学与技术一班',
|
||||
},
|
||||
],
|
||||
meritStudent: [
|
||||
{
|
||||
id: '',
|
||||
name: '王阔',
|
||||
class: '2016届物联网一班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '于洋',
|
||||
class: '2016届生物医学1班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '冯宇',
|
||||
class: '2016届大数据一班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '刘强',
|
||||
class: '2016届软件外包一班',
|
||||
},
|
||||
{
|
||||
id: '',
|
||||
name: '张智超',
|
||||
class: '2016届护理一班',
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$ajax.post("/hs/getAllContent",{},r=>{
|
||||
this.newestNotice = r.schoolNoticeList.slice(0,12);
|
||||
this.goodAdvice = r.parentAdvice.slice(0,12);
|
||||
this.magicalThinking = r.studentThinking.slice(0,12);
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
getContent(id) {
|
||||
this.$router.push({name: 'content'});
|
||||
sessionStorage.setItem("noticeId",id);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
<style scoped>
|
||||
.release-time{
|
||||
color: #999;
|
||||
text-decoration: none;
|
||||
cursor: default;
|
||||
}
|
||||
#top{
|
||||
background: #fff;
|
||||
border-radius: 5px;
|
||||
padding-bottom: 4rem;
|
||||
}
|
||||
#bottom{
|
||||
display: flex;
|
||||
background: #fff;
|
||||
margin-top: 1rem;
|
||||
border-radius: 5px;
|
||||
padding: 0 0 0 1rem;
|
||||
}
|
||||
#title{
|
||||
border-left: 1px solid #419EFF;
|
||||
cursor: default;
|
||||
}
|
||||
.merit-student, .prominent-teacher{
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.merit-student{
|
||||
border: 1px solid #419EFF;
|
||||
border-radius: 5px;
|
||||
background: #fff;
|
||||
margin-top: 1rem;
|
||||
width: 100%;
|
||||
height: 9.5rem;
|
||||
}
|
||||
.merit-student .header{
|
||||
cursor: default;
|
||||
height: 2rem;
|
||||
line-height: 2rem;
|
||||
padding: 0 1rem;
|
||||
font-weight: bold;
|
||||
color: #1B94D4;
|
||||
background: url("../assets/img/title-background.jpg");
|
||||
|
||||
}
|
||||
.merit-student .one{
|
||||
display: flex;
|
||||
height: 1.5rem;
|
||||
line-height: 1.5rem;
|
||||
padding: 0 2rem;
|
||||
}
|
||||
.merit-student .one div:nth-child(1){
|
||||
flex: 2;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.merit-student .one div:nth-child(2){
|
||||
flex: 3;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.prominent-teacher .one{
|
||||
display: flex;
|
||||
height: 1.5rem;
|
||||
line-height: 1.5rem;
|
||||
padding: 0 2rem;
|
||||
}
|
||||
.prominent-teacher .one .subject{
|
||||
flex: 1!important;
|
||||
}
|
||||
.prominent-teacher .one div:nth-child(1){
|
||||
flex: 2;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.prominent-teacher .one div:nth-child(2){
|
||||
flex: 3;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.prominent-teacher{
|
||||
margin-top: 2.4rem;
|
||||
border: 1px solid #419EFF;
|
||||
border-radius: 5px;
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
height: 9.5rem;
|
||||
}
|
||||
.prominent-teacher .header{
|
||||
cursor: default;
|
||||
height: 2rem;
|
||||
line-height: 2rem;
|
||||
padding: 0 1rem;
|
||||
font-weight: bold;
|
||||
color: #1B94D4;
|
||||
background: url("../assets/img/title-background.jpg");
|
||||
}
|
||||
.left{
|
||||
width: 70%;
|
||||
}
|
||||
.right{
|
||||
width: 30%;
|
||||
padding: 1rem;
|
||||
}
|
||||
.one div{
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.one div:hover{
|
||||
text-decoration: underline;
|
||||
}
|
||||
.content .one{
|
||||
display: flex;
|
||||
padding: 0 1rem;
|
||||
font-size: 0.9rem;
|
||||
height: 1.5rem;
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
.one .type{
|
||||
flex: 1;
|
||||
}
|
||||
.one .text{
|
||||
flex: 4;
|
||||
}
|
||||
.one .release{
|
||||
flex: 1;
|
||||
}
|
||||
.one .release-time{
|
||||
flex: 1;
|
||||
}
|
||||
.module{
|
||||
border: 1px solid #419EFF;
|
||||
border-radius: 5px;
|
||||
background: #fff;
|
||||
width: calc(100% - 1rem);
|
||||
height: 20.2rem;
|
||||
}
|
||||
.module .title{
|
||||
cursor: default;
|
||||
height: 2rem;
|
||||
line-height: 2rem;
|
||||
padding: 0 1rem;
|
||||
font-weight: bold;
|
||||
color: #1B94D4;
|
||||
background: url("../assets/img/title-background.jpg");
|
||||
}
|
||||
.school-dynamic{
|
||||
display: flex;
|
||||
width: 80%;
|
||||
padding: 0 10%;
|
||||
height: 24rem;
|
||||
}
|
||||
#title{
|
||||
color: #419EFF;
|
||||
padding: 1rem;
|
||||
font-size: 1.5rem;
|
||||
font-family: 楷体;
|
||||
}
|
||||
.el-carousel >>> .el-carousel__container{
|
||||
height: 90% !important;
|
||||
}
|
||||
.el-carousel >>> .el-carousel__indicators{
|
||||
height: 10%!important;
|
||||
}
|
||||
.el-carousel{
|
||||
margin-top: 1rem;
|
||||
padding: 1rem;
|
||||
width: calc(100% - 3.5rem);
|
||||
height: 100%;
|
||||
border: 1px solid #419EFF;
|
||||
border-radius: 5px;
|
||||
background: #fff;
|
||||
}
|
||||
.el-container{
|
||||
/*padding: 0 20%;*/
|
||||
background: #EEFCFE;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
|
207
HSLink-front/src/components/Index.vue
Normal file
@ -0,0 +1,207 @@
|
||||
<template>
|
||||
<el-container>
|
||||
<el-header>
|
||||
<div id="header">
|
||||
<div class="date default-color">{{date}}</div>
|
||||
<div class="function">
|
||||
<span class="pointer special-font-blue " v-if="!isLogin" @click="login">登录</span>
|
||||
<span class="pointer special-font-blue " v-if="isLogin">欢迎:{{userInfo.real_name}}({{userInfo.user_type}})</span>
|
||||
<span class="pointer special-font-blue " v-if="isLogin" @click="cancellation">注销</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer special-font-blue" @click="service">客服中心</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer special-font-blue" @click="opinion">用户意见</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer special-font-blue" v-if="!isLogin" @click="register">免费注册</span>
|
||||
<el-divider direction="vertical" v-if="!isLogin"></el-divider>
|
||||
<span class="pointer special-font-blue" v-if="isLogin" @click="forget">忘记密码</span>
|
||||
<el-divider direction="vertical" v-if="isLogin"></el-divider>
|
||||
<span class="pointer special-font-blue" @click="help">帮助中心</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-header>
|
||||
<el-container class="second">
|
||||
<el-aside>
|
||||
<el-menu
|
||||
default-active="1"
|
||||
class="el-menu-vertical-demo">
|
||||
<el-menu-item index="1" @click="goHomepage">首页</el-menu-item>
|
||||
<el-menu-item index="2" @click="goSchoolNotice">校园通知</el-menu-item>
|
||||
<el-menu-item index="3" @click="goMyClass">我的班级</el-menu-item>
|
||||
<el-menu-item index="4" @click="goParentsOpinion">家长意见</el-menu-item>
|
||||
<el-menu-item index="5" @click="goStudentThought">学生想法</el-menu-item>
|
||||
<el-menu-item index="6" @click="goMore">更多···</el-menu-item>
|
||||
</el-menu>
|
||||
</el-aside>
|
||||
<el-main>
|
||||
<!--<div id="tab">
|
||||
<span class="pointer white text-underline" @click="goHomepage">首页</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer white text-underline" @click="goSchoolNotice">校园通知</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer white text-underline" @click="goParentsOpinion">家长建议</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer white text-underline" @click="goStudentThought">学生想法</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer white text-underline" @click="goMyClass">我的班级</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span class="pointer white text-underline" @click="goMore">更多···</span>
|
||||
<span class="pointer white text-underline user-info" v-if="!isLogin" @click="login">登录</span>
|
||||
<span class="pointer white text-underline user-cancellation" v-if="isLogin" @click="cancellation">注销</span>
|
||||
<span class="pointer white text-underline user-info" v-if="isLogin">欢迎:{{userInfo.real_name}}({{userInfo.user_type}})</span>
|
||||
</div>-->
|
||||
<router-view></router-view>
|
||||
</el-main>
|
||||
</el-container>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return{
|
||||
isCollapse: true,
|
||||
isLogin: false,
|
||||
date: '',
|
||||
userInfo: '',
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
let userInfo = JSON.parse(sessionStorage.getItem("userInfo"));
|
||||
this.userInfo = userInfo;
|
||||
if (userInfo != '' || userInfo != null) {
|
||||
this.isLogin = true;
|
||||
}
|
||||
setInterval(()=>{
|
||||
let day2 = new Date();
|
||||
day2.setTime(day2.getTime());
|
||||
this.date = day2.getFullYear()+"年" + (day2.getMonth()+1) + "月" + day2.getDate()+'日 星期'+"日一二三四五六".charAt(new Date().getDay())
|
||||
+" | "+day2.getHours()+"时"+day2.getMinutes()+"分"+day2.getSeconds()+"秒";},1000)
|
||||
},
|
||||
methods:{
|
||||
goMore() {
|
||||
this.$message({
|
||||
message:"期待更多内容",
|
||||
})
|
||||
|
||||
},
|
||||
goMyClass() {
|
||||
this.$router.push({name: "myclass"})
|
||||
},
|
||||
goStudentThought() {
|
||||
this.$router.push({name: "studentthought"})
|
||||
},
|
||||
goParentsOpinion() {
|
||||
this.$router.push({name: "parentsproposal"})
|
||||
},
|
||||
goSchoolNotice() {
|
||||
this.$router.push({name: "schoolnotice"})
|
||||
},
|
||||
goHomepage() {
|
||||
this.$router.push({name: "homepage"})
|
||||
},
|
||||
help() {
|
||||
this.$router.push({
|
||||
name: "help",
|
||||
})
|
||||
},
|
||||
forget() {
|
||||
this.$message("请联系管理员重置密码")
|
||||
},
|
||||
register() {
|
||||
this.$router.push({
|
||||
name: "homepage",
|
||||
params: {
|
||||
type: "register"
|
||||
}
|
||||
})
|
||||
},
|
||||
opinion() {
|
||||
this.$message('用户意见请发邮箱至:617594538@qq.com')
|
||||
},
|
||||
service() {
|
||||
this.$message('客服中心请拨打:15006732580')
|
||||
},
|
||||
login() {
|
||||
this.$router.push({
|
||||
name: "login"
|
||||
})
|
||||
},
|
||||
cancellation() {
|
||||
this.$confirm('确认退出?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
sessionStorage.setItem("userInfo","");
|
||||
this.$router.push({
|
||||
name: "login"
|
||||
})
|
||||
// location.reload()
|
||||
}).catch(() => {
|
||||
this.$message({
|
||||
type: 'info',
|
||||
message: '已取消退出'
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-menu{
|
||||
border-radius: 5px;
|
||||
}
|
||||
.el-aside{
|
||||
background: #FFF;
|
||||
overflow-x: hidden;
|
||||
width: 10rem!important;
|
||||
margin-top: 1rem;
|
||||
text-align: center;
|
||||
}
|
||||
.el-radio-group{
|
||||
margin-bottom: 0!important;
|
||||
}
|
||||
.second{
|
||||
background: #EEFCFE;
|
||||
padding: 0 20%;
|
||||
}
|
||||
.user-cancellation{
|
||||
float: right;
|
||||
}
|
||||
.user-info{
|
||||
float: right;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
.el-main{
|
||||
padding: 1rem;
|
||||
}
|
||||
#tab{
|
||||
background-image: url("../assets/img/dh-002.gif");
|
||||
padding: 0 20%;
|
||||
height: 2rem;
|
||||
font-size: 0.9rem;
|
||||
line-height: 2rem;
|
||||
|
||||
}
|
||||
#header{
|
||||
font-size: 0.9rem;
|
||||
padding: 0.2rem 0 0.4rem 0;
|
||||
}
|
||||
#header .date{
|
||||
margin-left: 20%;
|
||||
float: left;
|
||||
}
|
||||
#header .function{
|
||||
float: right;
|
||||
margin-right: 20%;
|
||||
}
|
||||
.el-header{
|
||||
height: 7.8rem!important;
|
||||
background-image: url("../assets/img/title.jpg");
|
||||
background-size: 100%;
|
||||
background-position: 0 2rem;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
</style>
|
@ -1,33 +1,300 @@
|
||||
<template>
|
||||
<div id="login">
|
||||
<el-span>账号:</el-span>
|
||||
<el-col :span="8">
|
||||
<el-input placeholder = "请输入用户名"></el-input>
|
||||
</el-col>
|
||||
<el-span>密码:</el-span>
|
||||
<el-col :span="8">
|
||||
<el-input placeholder = "请输入密码" show-password></el-input>
|
||||
</el-col>
|
||||
<el-button type = "text">登录</el-button>
|
||||
<router-view/>
|
||||
</div>
|
||||
<el-container>
|
||||
<el-main>
|
||||
<div class="login-box" v-loading="loading">
|
||||
<el-tabs type="border-card" v-model="defaultTabs">
|
||||
<el-tab-pane name="login">
|
||||
<span slot="label"><i class="el-icon-user"></i> 登录</span>
|
||||
<el-form :model="form"
|
||||
:rules="rules"
|
||||
ref="form"
|
||||
label-width="80px"
|
||||
class="demo-ruleForm"
|
||||
close-on-click-modal=false
|
||||
label-position="left">
|
||||
<el-form-item label="角色" prop="role">
|
||||
<el-select v-model="form.role" placeholder="请选择">
|
||||
<el-option value="学生"></el-option>
|
||||
<el-option value="家长"></el-option>
|
||||
<el-option value="教师"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="账号" prop="username">
|
||||
<el-select
|
||||
v-if="isSelect"
|
||||
v-model="form.username"
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
placeholder="请输入手机号或姓名"
|
||||
@change="selectUsername">
|
||||
<el-option
|
||||
v-for="(item,index) in rememberList"
|
||||
:key="item.username"
|
||||
:label="item.username"
|
||||
:value="item.username">
|
||||
<span style="float: left">{{ item.username}}</span>
|
||||
<span style="float: right; color: #8492a6; font-size: 13px" @click="deleteUser(item.username,index)"><i class="el-icon-circle-close"></i></span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
<!-- <el-input v-model="form.username" type="text" placeholder="请输入手机号或姓名"></el-input>-->
|
||||
</el-form-item>
|
||||
<el-form-item label="密码" prop="password">
|
||||
<el-input v-model="form.password" type="password" placeholder="请输入密码" @keyup.enter.native="login"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div id="forget" @click="forget">忘记密码</div>
|
||||
<el-checkbox class="remember-password" v-model="rememberPassword">记住密码</el-checkbox>
|
||||
<el-button type="primary" @click="login">登 录</el-button>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane name="register">
|
||||
<span slot="label"><i class="el-icon-circle-plus-outline"></i>注册</span>
|
||||
<el-form :model="form1"
|
||||
:rules="rules1"
|
||||
ref="form1"
|
||||
label-width="80px"
|
||||
class="demo-ruleForm"
|
||||
close-on-click-modal=false
|
||||
label-position="left">
|
||||
<el-form-item label="角色" prop="role">
|
||||
<el-select v-model="form1.role" placeholder="请选择">
|
||||
<!-- <el-option value="学生"></el-option>-->
|
||||
<el-option value="家长"></el-option>
|
||||
<el-option value="教师"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="姓名" prop="realName">
|
||||
<el-input v-model="form1.realName" type="text"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号" prop="mobile">
|
||||
<el-input v-model="form1.mobile" type="text"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="密码" prop="password">
|
||||
<el-input v-model="form1.password" type="password"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="确认密码" prop="againPassword" @keyup.enter.native="register">
|
||||
<el-input v-model="form1.againPassword" type="password"></el-input>
|
||||
</el-form-item>
|
||||
<el-button type="primary" @click="register">提 交</el-button>
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</el-main>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default{
|
||||
data() {
|
||||
let againPassword = (rule, value, callback) => {
|
||||
if (value === '') {
|
||||
callback(new Error('请再次输入密码'));
|
||||
} else if (value !== this.form1.password) {
|
||||
callback(new Error('两次输入密码不一致!'));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
let type;
|
||||
if (this.$route.params.type == "login" || this.$route.params.type == "register") {
|
||||
type = this.$route.params.type
|
||||
} else {
|
||||
type = "login"
|
||||
}
|
||||
return{
|
||||
isSelect: true,
|
||||
rememberList: JSON.parse(sessionStorage.getItem("rememberList")),
|
||||
rememberPassword: false,
|
||||
defaultTabs: type,
|
||||
loading: false,
|
||||
form: {
|
||||
role: '',
|
||||
username: '',
|
||||
password: '',
|
||||
},
|
||||
rules: {
|
||||
role: [
|
||||
{ required: true, message: '请选择身份', trigger: 'blur' },
|
||||
{ min: 2, max: 2, message: '请选择身份', trigger: 'blur' }
|
||||
],
|
||||
username: [
|
||||
{ required: true, message: '请输入用户名', trigger: 'blur' },
|
||||
{ min: 6, max: 11, message: '长度在 6 到 11 个字符', trigger: 'blur' }
|
||||
],
|
||||
password: [
|
||||
{ required: true, message: '请输入密码', trigger: 'blur' },
|
||||
{ min: 6, max: 8, message: '长度在 6 到 8 个字符', trigger: 'blur' }
|
||||
],
|
||||
},
|
||||
form1: {
|
||||
role: '',
|
||||
realName: '',
|
||||
mobile: '',
|
||||
username: '',
|
||||
password: '',
|
||||
againPassword: '',
|
||||
},
|
||||
rules1: {
|
||||
role: [
|
||||
{ required: true, message: '请选择身份', trigger: 'blur' },
|
||||
{ min: 2, max: 2, message: '请选择身份', trigger: 'blur' }
|
||||
],
|
||||
realName: [
|
||||
{ required: true, message: '请输入真实姓名', trigger: 'blur' },
|
||||
{ min: 2, max: 10, message: '请输入正确的姓名', trigger: 'blur' }
|
||||
],
|
||||
mobile: [
|
||||
{ required: true, message: '请输入手机号', trigger: 'blur' },
|
||||
{ min: 11, max: 11, message: '手机号格式不正确', trigger: 'blur' }
|
||||
],
|
||||
password: [
|
||||
{ required: true, message: '请输入密码', trigger: 'blur' },
|
||||
{ min: 6, max: 8, message: '长度在 6 到 8 个字符', trigger: 'blur' }
|
||||
],
|
||||
againPassword: [
|
||||
{ required: true, message: '请确认密码', trigger: 'blur' },
|
||||
{ validator:againPassword, trigger: 'blur'},
|
||||
],
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods:{
|
||||
change() {
|
||||
// console.log(1)
|
||||
// this.$router.push({
|
||||
// name: 'box1',
|
||||
// params:{
|
||||
// id:1
|
||||
// }
|
||||
// })
|
||||
deleteUser(username,index) {
|
||||
if (this.rememberList != null) {
|
||||
this.rememberList.forEach((item)=>{
|
||||
if (item.username == username) {
|
||||
this.rememberList.splice(index,1);
|
||||
}
|
||||
})
|
||||
}
|
||||
sessionStorage.setItem("rememberList",JSON.stringify(this.rememberList));
|
||||
this.form.role = '';
|
||||
this.form.password = '';
|
||||
setTimeout(()=>{
|
||||
this.form.username = '';
|
||||
},10)
|
||||
console.log(this.form.username)
|
||||
},
|
||||
selectUsername(event) {
|
||||
if (this.rememberList != null) {
|
||||
this.rememberList.forEach((item)=>{
|
||||
if (item.username == event) {
|
||||
this.form = item
|
||||
}
|
||||
})
|
||||
}
|
||||
this.isSelect = false
|
||||
this.isSelect = true
|
||||
},
|
||||
forget() {
|
||||
this.$message("请联系管理员重置密码")
|
||||
},
|
||||
login() {
|
||||
this.loading = true;
|
||||
this.$ajax.post("/hs/login",{role:this.form.role,username: this.form.username,password:this.form.password},r=>{
|
||||
if (r == '' || r == null) {
|
||||
this.$message.error('用户名和密码不匹配');
|
||||
this.loading = false;
|
||||
} else {
|
||||
this.$message({
|
||||
message: "登录成功",
|
||||
type: "success"
|
||||
});
|
||||
if (this.rememberPassword == true) {
|
||||
let one = {
|
||||
role: this.form.role,
|
||||
username: this.form.username,
|
||||
password: this.form.password,
|
||||
}
|
||||
if (this.rememberList != null) {
|
||||
let flag = false;
|
||||
this.rememberList.forEach((item)=>{
|
||||
if (item.username == one.username) {
|
||||
flag = true;
|
||||
}
|
||||
})
|
||||
if (flag == false) {
|
||||
this.rememberList.push(one)
|
||||
sessionStorage.setItem("rememberList",JSON.stringify(this.rememberList));
|
||||
}
|
||||
} else {
|
||||
let rememberList = [];
|
||||
rememberList.push(one)
|
||||
sessionStorage.setItem("rememberList",JSON.stringify(rememberList));
|
||||
}
|
||||
}
|
||||
this.loading = false;
|
||||
this.$router.push({
|
||||
name: "homepage"
|
||||
})
|
||||
sessionStorage.setItem("userInfo",JSON.stringify(r));
|
||||
// location.reload();
|
||||
}
|
||||
})
|
||||
},
|
||||
register() {
|
||||
this.$ajax.post("/hs/register",{type:this.form1.role,realname:this.form1.realName,mobile:this.form1.mobile,password:this.form1.password},r=>{
|
||||
console.log(r)
|
||||
if (r == '0') {
|
||||
this.$message.error('该手机号已被注册');
|
||||
this.form1.password = '';
|
||||
this.form1.againPassword = '';
|
||||
} else {
|
||||
this.$message({
|
||||
message: "注册成功",
|
||||
type: "success"
|
||||
});
|
||||
this.form.role = this.form1.role;
|
||||
this.form.username = this.form1.realName;
|
||||
this.form.password = this.form1.password;
|
||||
this.form1.role = '';
|
||||
this.form1.realName = '';
|
||||
this.form1.mobile = '';
|
||||
this.form1.password = '';
|
||||
this.form1.againPassword = '';
|
||||
this.defaultTabs = 'login';
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
<style scoped>
|
||||
.remember-password{
|
||||
float: right;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
#forget{
|
||||
font-size: 0.9rem;
|
||||
float: right;
|
||||
cursor: pointer;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
#forget:hover{
|
||||
text-decoration: underline;
|
||||
color: #419EFF;
|
||||
}
|
||||
.login-box{
|
||||
width: 30rem;
|
||||
/*height: 20rem;*/
|
||||
margin: 8rem auto;
|
||||
/*color: #FAFAFA;*/
|
||||
/*border-radius: 5px;*/
|
||||
/*border: 1px solid #419EFF;*/
|
||||
/*padding: 2rem;*/
|
||||
}
|
||||
.el-button--primary{
|
||||
width: 6rem;
|
||||
margin-left: 11rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
.el-main{
|
||||
background: #EEFCFE;
|
||||
height: 55rem;
|
||||
}
|
||||
</style>
|
||||
|
19
HSLink-front/src/components/MyClass.vue
Normal file
@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<el-main>
|
||||
<h1>我的班级</h1>
|
||||
</el-main>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "MyClass"
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-main{
|
||||
padding: 0;
|
||||
background: #EEFCFE;
|
||||
}
|
||||
</style>
|
19
HSLink-front/src/components/ParentsProposal.vue
Normal file
@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<el-main>
|
||||
<h1>家长意见</h1>
|
||||
</el-main>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "ParentsOpinion"
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-main{
|
||||
padding: 0;
|
||||
background: #EEFCFE;
|
||||
}
|
||||
</style>
|
61
HSLink-front/src/components/SchoolNotice.vue
Normal file
@ -0,0 +1,61 @@
|
||||
<template>
|
||||
<el-main>
|
||||
<div class="search">
|
||||
<el-input class="searchinp" v-model="condition" placeholder="请输入内容"></el-input>
|
||||
<el-button type="primary" class="searchbtn">搜索</el-button>
|
||||
</div>
|
||||
<el-calendar>
|
||||
<!-- 这里使用的是 2.5 slot 语法,对于新项目请使用 2.6 slot 语法-->
|
||||
<template
|
||||
slot="dateCell"
|
||||
slot-scope="{date, data}">
|
||||
<p :class="data.isSelected ? 'is-selected' : ''">
|
||||
{{ data.day.split('-').slice(1).join('-') }} {{ data.isSelected ? '✔️' : ''}}
|
||||
</p>
|
||||
</template>
|
||||
</el-calendar>
|
||||
</el-main>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "Home",
|
||||
data() {
|
||||
return{
|
||||
condition: '',
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.search{
|
||||
margin: 0 0 3rem 0;
|
||||
}
|
||||
.el-main{
|
||||
padding: 0;
|
||||
}
|
||||
.searchinp{
|
||||
float: left;
|
||||
width: calc(100% - 6rem);
|
||||
|
||||
}
|
||||
.searchbtn{
|
||||
float: left;
|
||||
width: 6rem;
|
||||
}
|
||||
.el-calendar{
|
||||
margin: 0;
|
||||
}
|
||||
.el-calendar__body{
|
||||
background: #fff;
|
||||
}
|
||||
.el-container{
|
||||
background: #EEFCFE;
|
||||
height: 45rem;
|
||||
}
|
||||
.is-selected {
|
||||
color: #1989FA;
|
||||
}
|
||||
</style>
|
17
HSLink-front/src/components/StudentThought.vue
Normal file
@ -0,0 +1,17 @@
|
||||
<template>
|
||||
<el-main>
|
||||
<h1>学生想法</h1>
|
||||
</el-main>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "StudentThought"
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-main{
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
74
HSLink-front/src/components/components/Footer.vue
Normal file
@ -0,0 +1,74 @@
|
||||
<template>
|
||||
<div class="container">
|
||||
<el-main>
|
||||
<div class="list">
|
||||
<div class="one">
|
||||
<img src="../../assets/img/qq.png" />
|
||||
<span>QQ客服</span>
|
||||
</div>
|
||||
<div class="one">
|
||||
<i class="el-icon-s-promotion"></i>
|
||||
<span>{{emil}}</span>
|
||||
</div>
|
||||
<div class="one">
|
||||
<i class="el-icon-s-home"></i>
|
||||
<span>客服论坛</span>
|
||||
</div>
|
||||
<div class="one">
|
||||
<i class="el-icon-phone"></i>
|
||||
<span>150-0673-2580</span>
|
||||
</div>
|
||||
<p>工作时间 8:30-22:00</p>
|
||||
<a class="beian" rel="nofollow" href="http://www.beian.miit.gov.cn" target="_blank"><p>备案号:鲁ICP备19037910号-1</p></a>
|
||||
</div>
|
||||
</el-main>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "Footer",
|
||||
data() {
|
||||
return{
|
||||
emil: "617594538@qq.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.container{
|
||||
padding: 0;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
.el-main{
|
||||
background: #fff;
|
||||
}
|
||||
.list p{
|
||||
color: #8590A6;
|
||||
}
|
||||
.one{
|
||||
height: 2rem;
|
||||
color: #8590A6;
|
||||
cursor: pointer;
|
||||
}
|
||||
.one img{
|
||||
margin-top: 0.5rem;
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
.one i{
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
.one span{
|
||||
position: absolute;
|
||||
margin-top: 0.3rem;
|
||||
margin-left: 0.5rem;
|
||||
}
|
||||
.beian{
|
||||
text-decoration: none;
|
||||
}
|
||||
.beian p{
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
</style>
|
390
HSLink-front/src/components/components/Mdeditor.vue
Normal file
@ -0,0 +1,390 @@
|
||||
<template>
|
||||
<div class="mdContainer" :class="{ fullPage: fullPageStatus }">
|
||||
<div class="navContainer" v-if="navStatus">
|
||||
<!--<div class="nameContainer" v-if="icoStatusP" @click="happyDay">OVEN-mdEditor</div>-->
|
||||
<div class="markContainer">
|
||||
<ul class="markListGroup">
|
||||
<li class="markListItem" @click="addStrong" title="strong"><b>B</b></li>
|
||||
<li class="markListItem" @click="addItalic" title="italic"><i>I</i></li>
|
||||
<li class="markListItem" @click="addStrikethrough" title="strikethrough"><i class="fa fa-strikethrough" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="addHTitle(1)" title="H1-title">H1</li>
|
||||
<li class="markListItem" @click="addHTitle(2)" title="H2-title">H2</li>
|
||||
<li class="markListItem" @click="addHTitle(3)" title="H3-title">H3</li>
|
||||
<li class="markListItem" @click="addHTitle(4)" title="H4-title">H4</li>
|
||||
<li class="markListItem" @click="addHTitle(5)" title="H5-title">H5</li>
|
||||
<li class="markListItem" @click="addHTitle(6)" title="H6-title">H6</li>
|
||||
<li class="markListItem" @click="addLine" title="line">一</li>
|
||||
<li class="markListItem" @click="addQuote" title="quote"><i class="fa fa-quote-left" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="addCode"><i class="fa fa-code" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="addLink"><i class="fa fa-link" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="addImage"><i class="fa fa-picture-o" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="addTable" title="table"><i class="fa fa-table" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="addUl" title="ul-list"><i class="fa fa-list-ul" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="addOl" title="ol-list"><i class="fa fa-list-ol" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="fullPageFn" title="fullpage"><i class="fa fa-arrows-alt" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="previewFn" title="preview"><i class="fa fa-eye-slash" aria-hidden="true"></i></li>
|
||||
<li class="markListItem" @click="previewAllFn" title="previewAll"><i class="fa fa-eye" aria-hidden="true"></i></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="mdBodyContainer" :class="{ noMenu: !navStatus }">
|
||||
<div class="editContainer" v-if="editStatus">
|
||||
<textarea name="" class="mdEditor" @keydown.9="tabFn" v-scroll="editScroll" v-model="input">{{this.mdValuesP}}</textarea>
|
||||
</div>
|
||||
<div class="previewContainer markdown-body" v-scroll="previewScroll" v-html="compiledMarkdown" v-if="previewStatus">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from 'vue'
|
||||
import marked from 'marked'
|
||||
import scroll from 'vue-scroll'
|
||||
import hljs from '../../assets/js/highlight.min.js'
|
||||
import range from '../../assets/js/rangeFn.js'
|
||||
Vue.use(scroll)
|
||||
marked.setOptions({
|
||||
renderer: new marked.Renderer(),
|
||||
gfm: true,
|
||||
tables: true,
|
||||
breaks: false,
|
||||
pedantic: false,
|
||||
sanitize: false,
|
||||
smartLists: true,
|
||||
smartypants: false,
|
||||
highlight: function(code) {
|
||||
return hljs.highlightAuto(code).value
|
||||
}
|
||||
});
|
||||
|
||||
function insertContent(val, that) {
|
||||
let textareaDom = document.querySelector('.mdEditor');
|
||||
let value = textareaDom.value;
|
||||
let point = range.getCursortPosition(textareaDom);
|
||||
let lastChart = value.substring(point - 1, point);
|
||||
let lastFourCharts = value.substring(point - 4, point);
|
||||
if (lastChart != '\n' && value != '' && lastFourCharts != ' ') {
|
||||
val = '\n' + val;
|
||||
range.insertAfterText(textareaDom, val);
|
||||
} else {
|
||||
range.insertAfterText(textareaDom, val);
|
||||
}
|
||||
that.input = document.querySelector('.mdEditor').value;
|
||||
}
|
||||
export default {
|
||||
name: 'markdown',
|
||||
props: ['mdValuesP', 'fullPageStatusP', 'editStatusP', 'previewStatusP', 'navStatusP', 'icoStatusP'],
|
||||
data() {
|
||||
return {
|
||||
input: this.mdValuesP || '',
|
||||
editStatus: Boolean(this.editStatusP),
|
||||
previewStatus: Boolean(this.previewStatusP),
|
||||
fullPageStatus: Boolean(this.fullPageStatusP),
|
||||
navStatus: Boolean(this.navStatusP),
|
||||
icoStatus: Boolean(this.icoStatusP),
|
||||
maxEditScrollHeight: 0,
|
||||
maxPreviewScrollHeight: 0,
|
||||
htmlText: marked(this.mdValuesP, {
|
||||
sanitize: true
|
||||
})
|
||||
}
|
||||
},
|
||||
created: function() {
|
||||
if (!this.editStatus && !this.previewStatus) {
|
||||
this.editStatus = true;
|
||||
this.previewStatus = true;
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods: {
|
||||
tabFn: function(evt) {
|
||||
insertContent(" ", this);
|
||||
// 屏蔽屌tab切换事件
|
||||
if (evt.preventDefault) {
|
||||
evt.preventDefault();
|
||||
} else {
|
||||
evt.returnValue = false;
|
||||
}
|
||||
},
|
||||
addImage: function(evt) {
|
||||
insertContent("![Vue](https://cn.vuejs.org/images/logo.png)", this);
|
||||
},
|
||||
addHTitle: function(index) {
|
||||
let tmp = '';
|
||||
switch (index) {
|
||||
case 1:
|
||||
tmp = '# ';
|
||||
break;
|
||||
case 2:
|
||||
tmp = '## ';
|
||||
break;
|
||||
case 3:
|
||||
tmp = '### ';
|
||||
break;
|
||||
case 4:
|
||||
tmp = '#### ';
|
||||
break;
|
||||
case 5:
|
||||
tmp = '##### ';
|
||||
break;
|
||||
case 6:
|
||||
tmp = '###### ';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
insertContent(tmp, this);
|
||||
},
|
||||
addCode: function() {
|
||||
let textareaDom = document.querySelector('.mdEditor');
|
||||
let value = textareaDom.value;
|
||||
let point = range.getCursortPosition(textareaDom);
|
||||
let lastChart = value.substring(point - 1, point);
|
||||
insertContent('```\n\n```', this);
|
||||
if (lastChart != '\n' && value != '') {
|
||||
range.setCaretPosition(textareaDom, point + 5);
|
||||
} else {
|
||||
range.setCaretPosition(textareaDom, point + 4);
|
||||
}
|
||||
},
|
||||
addStrikethrough: function() {
|
||||
let textareaDom = document.querySelector('.mdEditor');
|
||||
let value = textareaDom.value;
|
||||
let point = range.getCursortPosition(textareaDom);
|
||||
let lastChart = value.substring(point - 1, point);
|
||||
insertContent('~~~~', this);
|
||||
if (lastChart != '\n' && value != '') {
|
||||
range.setCaretPosition(textareaDom, point + 3);
|
||||
} else {
|
||||
range.setCaretPosition(textareaDom, point + 2);
|
||||
}
|
||||
},
|
||||
addStrong: function() {
|
||||
let textareaDom = document.querySelector('.mdEditor');
|
||||
let value = textareaDom.value;
|
||||
let point = range.getCursortPosition(textareaDom);
|
||||
let lastChart = value.substring(point - 1, point);
|
||||
insertContent('****', this);
|
||||
if (lastChart != '\n' && value != '') {
|
||||
range.setCaretPosition(textareaDom, point + 3);
|
||||
} else {
|
||||
range.setCaretPosition(textareaDom, point + 2);
|
||||
}
|
||||
},
|
||||
addItalic: function() {
|
||||
let textareaDom = document.querySelector('.mdEditor');
|
||||
let value = textareaDom.value;
|
||||
let point = range.getCursortPosition(textareaDom);
|
||||
let lastChart = value.substring(point - 1, point);
|
||||
insertContent('**', this);
|
||||
if (lastChart != '\n' && value != '') {
|
||||
range.setCaretPosition(textareaDom, point + 2);
|
||||
} else {
|
||||
range.setCaretPosition(textareaDom, point + 1);
|
||||
}
|
||||
},
|
||||
setStrong: function() {
|
||||
let textareaDom = document.querySelector('.mdEditor');
|
||||
let point = range.getCursortPosition(textareaDom);
|
||||
},
|
||||
addLine: function() {
|
||||
insertContent('\n----\n', this);
|
||||
},
|
||||
addLink: function() {
|
||||
insertContent("[Vue](https://cn.vuejs.org/images/logo.png)", this);
|
||||
},
|
||||
addQuote: function() {
|
||||
let textareaDom = document.querySelector('.mdEditor');
|
||||
let value = textareaDom.value;
|
||||
let point = range.getCursortPosition(textareaDom);
|
||||
let lastChart = value.substring(point - 1, point);
|
||||
insertContent('> ', this);
|
||||
if (lastChart != '\n' && value != '') {
|
||||
range.setCaretPosition(textareaDom, point + 3);
|
||||
} else {
|
||||
range.setCaretPosition(textareaDom, point + 2);
|
||||
}
|
||||
},
|
||||
addTable: function() {
|
||||
insertContent('\nheader 1 | header 2\n', this);
|
||||
insertContent('---|---\n', this);
|
||||
insertContent('row 1 col 1 | row 1 col 2\n', this);
|
||||
insertContent('row 2 col 1 | row 2 col 2\n\n', this);
|
||||
},
|
||||
addUl: function() {
|
||||
insertContent('* ', this);
|
||||
},
|
||||
addOl: function() {
|
||||
insertContent('1. ', this);
|
||||
},
|
||||
previewFn: function() {
|
||||
if (!this.editStatus) {
|
||||
this.editStatus = true;
|
||||
this.previewStatus = !this.previewStatus;
|
||||
} else {
|
||||
this.previewStatus = !this.previewStatus;
|
||||
}
|
||||
},
|
||||
previewAllFn: function() {
|
||||
if (!this.editStatus && this.previewStatus) {
|
||||
this.editStatus = true;
|
||||
this.previewStatus = true;
|
||||
} else {
|
||||
this.editStatus = false;
|
||||
this.previewStatus = true;
|
||||
}
|
||||
},
|
||||
fullPageFn: function() {
|
||||
this.fullPageStatus = !this.fullPageStatus;
|
||||
let maxEditScrollHeight=document.querySelector('.mdEditor').scrollHeight-document.querySelector('.mdEditor').clientHeight;
|
||||
let maxPreviewScrollHeight=document.querySelector('.previewContainer').scrollHeight-document.querySelector('.previewContainer').clientHeight;
|
||||
this.maxEditScrollHeight = maxEditScrollHeight;
|
||||
this.maxPreviewScrollHeight = maxPreviewScrollHeight
|
||||
},
|
||||
previewScroll: function(e, position) {
|
||||
if(this.maxEditScrollHeight!==0){
|
||||
let topPercent=position.scrollTop/this.maxPreviewScrollHeight;
|
||||
document.querySelector('.mdEditor').scrollTop = this.maxEditScrollHeight*topPercent;
|
||||
}
|
||||
},
|
||||
editScroll:function(e, position){
|
||||
if(this.maxPreviewScrollHeight!==0){
|
||||
let topPercent=position.scrollTop/this.maxEditScrollHeight;
|
||||
document.querySelector('.previewContainer').scrollTop = this.maxPreviewScrollHeight*topPercent;
|
||||
}
|
||||
},
|
||||
happyDay:function(){
|
||||
window.open('https://github.com/ovenslove/vue-mdEditor');
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
compiledMarkdown: function() {
|
||||
return marked(this.input, {
|
||||
sanitize: true
|
||||
})
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
input: function() {
|
||||
let data = {};
|
||||
data.mdValue = this.input;
|
||||
data.htmlValue = marked(this.input, {
|
||||
sanitize: false
|
||||
});
|
||||
this.$emit('childevent', data);
|
||||
let maxEditScrollHeight=document.querySelector('.mdEditor').scrollHeight-document.querySelector('.mdEditor').clientHeight;
|
||||
let maxPreviewScrollHeight=document.querySelector('.previewContainer').scrollHeight-document.querySelector('.previewContainer').clientHeight;
|
||||
this.maxEditScrollHeight = maxEditScrollHeight;
|
||||
this.maxPreviewScrollHeight = maxPreviewScrollHeight
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
/*引入reset文件*/
|
||||
@import "../../assets/css/reset";
|
||||
/*引入github的markdown样式文件*/
|
||||
@import "../../assets/css/github-markdown.css";
|
||||
/*引入atom的代码高亮样式文件*/
|
||||
@import "../../assets/css/atom-one-dark.min.css";
|
||||
.mdContainer {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: lightblue;
|
||||
&.fullPage {
|
||||
position: fixed;
|
||||
z-index: 1000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.navContainer {
|
||||
width: 100%;
|
||||
height: 36px;
|
||||
background: #fff;
|
||||
box-sizing: border-box;
|
||||
border-bottom: 1px solid #eee;
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
padding: 0 10px;
|
||||
.nameContainer {
|
||||
color: lightblue;
|
||||
margin-right: 10px;
|
||||
cursor:pointer;
|
||||
}
|
||||
.markContainer {
|
||||
width: auto;
|
||||
height: 100%;
|
||||
margin-left: 0px;
|
||||
ul.markListGroup {
|
||||
height: 100%;
|
||||
width: auto;
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
li.markListItem {
|
||||
list-style: none;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin: 0 1rem 0 0;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
font-size: 18px;
|
||||
color: #333;
|
||||
&:hover {
|
||||
background: #eee;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.mdBodyContainer {
|
||||
width: 100%;
|
||||
height: calc(100% - 36px);
|
||||
background: #fff;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
&.noMenu{
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//编辑区域
|
||||
.editContainer {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
border-right: 1px solid #ddd;
|
||||
background: #333;
|
||||
color: #fff;
|
||||
padding: 10px;
|
||||
.mdEditor {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background: transparent;
|
||||
outline: none;
|
||||
color: #fff;
|
||||
resize: none;
|
||||
}
|
||||
}
|
||||
|
||||
// 预览区
|
||||
.previewContainer {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
background: #fff;
|
||||
overflow: auto;
|
||||
padding: 10px;
|
||||
}
|
||||
</style>
|
27
HSLink-front/src/components/components/NoData.vue
Normal file
@ -0,0 +1,27 @@
|
||||
<template>
|
||||
<el-container>
|
||||
<el-main>
|
||||
<img src="../../assets/img/no-data.png" height="200" width="200"/>
|
||||
<div class="nodata">
|
||||
暂无数据
|
||||
</div>
|
||||
</el-main>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "NoData"
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-main img{
|
||||
display: block;
|
||||
margin: 2rem auto 0;
|
||||
}
|
||||
.nodata{
|
||||
text-align: center;
|
||||
color: #999;
|
||||
}
|
||||
</style>
|
@ -5,8 +5,16 @@ import App from './App'
|
||||
import router from './router'
|
||||
import ElementUI from 'element-ui'
|
||||
import 'element-ui/lib/theme-chalk/index.css'
|
||||
import '@/assets/css/public.css'
|
||||
// 引用API文件
|
||||
import api from './api/index.js'
|
||||
// 将API方法绑定到全局
|
||||
import marked from 'marked'
|
||||
import scroll from 'vue-scroll'
|
||||
Vue.prototype.$ajax = api
|
||||
Vue.config.productionTip = false
|
||||
Vue.use(ElementUI);
|
||||
Vue.use(scroll)
|
||||
/* eslint-disable no-new */
|
||||
new Vue({
|
||||
el: '#app',
|
||||
|
@ -8,14 +8,50 @@ export default new Router({
|
||||
routes: [{
|
||||
path: '/login',
|
||||
name: 'login',
|
||||
component:() => import('@/components/Login'),
|
||||
children:[{
|
||||
//path和name不区分大小写
|
||||
path:'homepage',
|
||||
name:'homepage',
|
||||
component:() => import('@/components/Homepage')
|
||||
}]
|
||||
component:() => import('@/components/Login')
|
||||
},
|
||||
{
|
||||
path:'/',
|
||||
name:'index',
|
||||
component:() => import('@/components/Index'),
|
||||
children: [
|
||||
{
|
||||
path:'help',
|
||||
name:'help',
|
||||
component:() => import('@/components/Help')
|
||||
},
|
||||
{
|
||||
path:'homepage',
|
||||
name:'homepage',
|
||||
component:() => import('@/components/Homepage')
|
||||
},
|
||||
{
|
||||
path:'schoolnotice',
|
||||
name:'schoolnotice',
|
||||
component:() => import('@/components/SchoolNotice')
|
||||
},
|
||||
{
|
||||
path:'parentsproposal',
|
||||
name:'parentsproposal',
|
||||
component:() => import('@/components/ParentsProposal')
|
||||
},
|
||||
{
|
||||
path:'studentthought',
|
||||
name:'studentthought',
|
||||
component:() => import('@/components/StudentThought')
|
||||
},
|
||||
{
|
||||
path:'myclass',
|
||||
name:'myclass',
|
||||
component:() => import('@/components/MyClass')
|
||||
},
|
||||
{
|
||||
path:'content',
|
||||
name:'content',
|
||||
component:() => import('@/components/Content')
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|