Former-commit-id: 3ad3c5f8cac82ebd6fde6c6fc16e9850c9c69e5c
TangShanKaiPing
wanggang 5 years ago
parent 3862807320
commit 750a53ba2a

@ -0,0 +1,30 @@
# Operating System Files
*.DS_Store
Thumbs.db
# Build Files #
bin
target
build/
.gradle
# Eclipse Project Files #
.classpath
.project
.settings
# IntelliJ IDEA Files #
*.iml
*.ipr
*.iws
*.idea
# Spring Bootstrap artifacts
dependency-reduced-pom.xml
out
README.html

@ -0,0 +1,25 @@
plugins {
id 'org.springframework.boot' version '2.2.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group 'com.nbaxp'
version '1.0-SNAPSHOT'
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}

@ -0,0 +1,6 @@
#Thu May 07 11:59:56 CST 2020
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

@ -0,0 +1,183 @@
#!/usr/bin/env sh
#
# Copyright 2015 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.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
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
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
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
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

@ -0,0 +1,100 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem 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, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

@ -0,0 +1,2 @@
rootProject.name = 'SpringDataJPATest'

@ -0,0 +1,13 @@
package com.nbaxp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

@ -0,0 +1,23 @@
package com.nbaxp.Controllers;
import com.nbaxp.Entities.User;
import com.nbaxp.Services.UserService;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
private final UserService userService;
public HomeController(UserService userService)
{
this.userService=userService;
}
@RequestMapping("/")
public Page<User> index()
{
return this.userService.Query();
}
}

@ -0,0 +1,24 @@
package com.nbaxp.Entities;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.util.UUID;
@MappedSuperclass
public abstract class BaseEntity {
@Id
private String id;
public BaseEntity()
{
this.id= UUID.randomUUID().toString();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}

@ -0,0 +1,31 @@
package com.nbaxp.Entities;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import java.util.HashSet;
import java.util.Set;
@Entity
public class Role extends BaseEntity {
private String name;
@OneToMany(mappedBy = "role")
private Set<UserRole> userRoles= new HashSet<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<UserRole> getUserRoles() {
return userRoles;
}
public void setUserRoles(Set<UserRole> userRoles) {
this.userRoles = userRoles;
}
}

@ -0,0 +1,43 @@
package com.nbaxp.Entities;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import java.util.HashSet;
import java.util.Set;
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = "userName"),@UniqueConstraint(columnNames = "email")})
@Entity
public class User extends BaseEntity {
private String userName;
private String email;
@OneToMany(mappedBy = "user")
private Set<UserRole> userRoles= new HashSet<>();
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Set<UserRole> getUserRoles() {
return userRoles;
}
public void setUserRoles(Set<UserRole> userRoles) {
this.userRoles = userRoles;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

@ -0,0 +1,38 @@
package com.nbaxp.Entities;
import javax.persistence.*;
@Table(uniqueConstraints = {@UniqueConstraint(columnNames={"UserId", "RoleId"})})
@Entity
public class UserRole extends BaseEntity {
@Column(name = "UserId",nullable = false,updatable = false, insertable = false)
private String userId;
@JoinColumn(name="UserId")
@ManyToOne
private User user;
@Column(name="RoleId",nullable = false, updatable = false, insertable = false)
private String roleId;
@JoinColumn(name="RoleId")
@ManyToOne
private Role role;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getRoleId() {
return roleId;
}
public void setRoleId(String roleId) {
this.roleId = roleId;
}
}

@ -0,0 +1,8 @@
package com.nbaxp.Repositories;
import com.nbaxp.Entities.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface UserRepository extends JpaRepository<User, String>,JpaSpecificationExecutor {
}

@ -0,0 +1,35 @@
package com.nbaxp.Services;
import com.nbaxp.Entities.User;
import com.nbaxp.Repositories.UserRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.UUID;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository)
{
this.userRepository=userRepository;
}
public Page<User> Query()
{
User user = new User();
user.setUserName("user"+ UUID.randomUUID().toString());
user.setEmail("test@test.com"+ UUID.randomUUID().toString());
this.userRepository.save(user);
List<User> users= this.userRepository.findAll();
Pageable pageRequest = PageRequest.of(0,10,Sort.by(Sort.Order.asc("id")));
return this.userRepository.findAll((root, query, builder) -> {
return query.getRestriction();
},pageRequest);
}
}

@ -0,0 +1,4 @@
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace

@ -0,0 +1,2 @@
server.port=5050
spring.profiles.active=development

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30011.22
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp", "WebApp.csproj", "{8763E5C0-790B-4A1D-A9CF-79A02118C559}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8763E5C0-790B-4A1D-A9CF-79A02118C559}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8763E5C0-790B-4A1D-A9CF-79A02118C559}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8763E5C0-790B-4A1D-A9CF-79A02118C559}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8763E5C0-790B-4A1D-A9CF-79A02118C559}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C9A67CB0-9D7E-40DA-B40E-7D53863BB159}
EndGlobalSection
EndGlobal

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="UTF-8">
@ -8,7 +8,7 @@
<link rel="stylesheet" href="lib/weui/weui.min.css">
<link rel="stylesheet" href="css/weui.ext.css">
<link rel="stylesheet" href="css/app.css">
<title>开始</title>
<title>home</title>
</head>
<body>
<div id="app">
@ -18,7 +18,7 @@
<div class="weui-mask_transparent"></div>
<div class="weui-toast">
<i class="weui-loading weui-icon_toast"></i>
<p class="weui-toast__content">加载中</p>
<p class="weui-toast__content">loading</p>
</div>
</div>
<script src="lib/linq/linq.min.js"></script>
@ -33,6 +33,7 @@
<script src="lib/Chart.js/Chart.bundle.min.js"></script>
<script src="lib/flv.js/flv.min.js"></script>
<script src="lib/WXInlinePlayer/index.js"></script>
<script src="js/config.js"></script>
<script src="js/util.js"></script>
<script src="js/store.js"></script>
<script src="js/message.js"></script>

@ -1,4 +1,4 @@
var userAgent = navigator.userAgent;
var userAgent = navigator.userAgent;
var isApp = userAgent.indexOf('isapp') !== -1;
//axios
axios.interceptors.request.use(
@ -30,7 +30,7 @@ axios.interceptors.response.use(function (response) {
console.log('拦截到返回错误:');
console.log(error.response);
if (error.response.status === 401 && error.config.url.indexOf('refreshToken') === -1) {
var url = '/UserCenter/api/v1/token/refreshToken';
var url = apiHost+'/UserCenter/api/v1/token/refreshToken';
var data = '"' + store.state.refreshToken + '"';
return axios.post(url, data, { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
.then(function (response) {

@ -0,0 +1,2 @@
//var apiHost = "http://localhost";
var apiHost = "http://iot.edusoa.com";

@ -1,4 +1,4 @@
var hubUrl = "/IoTCenter/hub?group=page";
var hubUrl = apiHost + "/IoTCenter/hub?group=page";
var connection = new signalR.HubConnectionBuilder().withUrl(hubUrl).build();
var connectionId;
function connect() {

@ -50,7 +50,7 @@ function copy(from, to) {
function execApi(number, method, query) {
var loading = weui.loading('提交中...');
axios.post('/IoTCenter/api/v1/api/execApi', { connectionId,number,method, query })
axios.post(apiHost + '/IoTCenter/api/v1/api/execApi', { connectionId,number,method, query })
.then(function (response) {
console.log(response);
})
@ -64,7 +64,7 @@ function execApi(number, method, query) {
function execScene(id) {
var loading = weui.loading('提交中...');
axios.post('/IoTCenter/api/v1/api/execScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
axios.post(apiHost + '/IoTCenter/api/v1/api/execScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } })
.then(function (response) {
console.log(response);
})

@ -6,7 +6,7 @@
data() {
return {
title:'首页',
url: '/UserCenter/api/v1/user/getUserInfo'
url: apiHost + '/UserCenter/api/v1/user/getUserInfo'
};
},
mounted: function () {

@ -5,7 +5,7 @@
template: response.data,
data() {
return {
url: '/IoTCenter/api/v1/device/getDevice?number=' + this.$route.query.number
url: apiHost + '/IoTCenter/api/v1/device/getDevice?number=' + this.$route.query.number
};
},
mounted: function () {
@ -39,7 +39,7 @@
},
changeTime: function (key, time,title) {
var vm = this;
var url = '/IoTCenter/api/v1/Device/GetChartData';
var url = apiHost + '/IoTCenter/api/v1/Device/GetChartData';
var data = {
number:this.device.number,
key: key,

@ -5,7 +5,7 @@
template: response.data,
data() {
return {
url: '/IoTCenter/api/v1/node/getNode?number=' + this.$route.query.number
url: apiHost + '/IoTCenter/api/v1/node/getNode?number=' + this.$route.query.number
};
},
mounted: function () {

@ -6,7 +6,7 @@
data() {
return {
name: '智慧教室',
url: '/IoTCenter/api/v1/node/getNodes'
url: apiHost + '/IoTCenter/api/v1/node/getNodes'
};
},
mounted: function () {

@ -5,7 +5,7 @@
template: response.data,
data() {
return {
url: '/IoTCenter/api/v1/product/getProduct?number=' + this.$route.query.number
url: apiHost + '/IoTCenter/api/v1/product/getProduct?number=' + this.$route.query.number
};
},
mounted: function () {

@ -6,7 +6,7 @@
data() {
return {
title: "产品",
url: '/IoTCenter/api/v1/product/getProducts'
url: apiHost + '/IoTCenter/api/v1/product/getProducts'
};
},
mounted: function () {

@ -6,7 +6,7 @@
data() {
return {
title: "场景",
url: '/IoTCenter/api/v1/Scene/GetScenes'
url: apiHost + '/IoTCenter/api/v1/Scene/GetScenes'
};
},
mounted: function () {

@ -6,7 +6,7 @@
data() {
return {
title: '登录',
url: '/UserCenter/api/v1/token/getToken'
url: apiHost + '/UserCenter/api/v1/token/getToken'
};
},
mounted: function () {

@ -11,7 +11,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@ -40,14 +40,14 @@
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.InfluxDB.Standard" Version="1.0.5" />
<PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.3.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.4.1" />
<PackageReference Include="System.Drawing.Common" Version="4.7.0" />
<PackageReference Include="System.Management" Version="4.7.0" />
<PackageReference Include="ValueInjecter" Version="3.2.0" />
<PackageReference Include="Flurl" Version="2.8.2" />
<PackageReference Include="Cronos" Version="0.7.0" />
<PackageReference Include="Polly" Version="7.2.0" />
<PackageReference Include="Polly" Version="7.2.1" />
</ItemGroup>
 <ItemGroup>
<EmbeddedResource Include="wwwroot\**\*" />

@ -264,7 +264,7 @@ namespace Infrastructure.Web
{
if (DateTime.UtcNow > context.SecurityToken.ValidTo)
{
context.Fail("");
context.Fail("token time out");
}
return Task.CompletedTask;
},
@ -335,11 +335,6 @@ namespace Infrastructure.Web
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseStatusCodePagesWithReExecute("/Error");
}
string basePath = this.Configuration.GetValue<String>("BasePath", $"/{Assembly.GetEntryAssembly().GetName().Name}");
app.UsePathBase(basePath);
app.UseForwardedHeaders(new ForwardedHeadersOptions

@ -25,13 +25,22 @@ namespace Infrastructure.Web
public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
validatedToken = new JwtSecurityTokenHandler().ReadJwtToken(securityToken);
var claims = (validatedToken as JwtSecurityToken).Claims.ToList();
var userName = claims.FirstOrDefault(o => o.Type == ClaimTypes.Name).Value;
using var scope = this._serviceProvider.CreateScope();
var roles = scope.ServiceProvider.GetService<IRoleService>().GetRoles(userName).Select(o => new Claim(ClaimTypes.Role, o));
claims.AddRange(roles);
return new ClaimsPrincipal(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme));
try
{
validatedToken = new JwtSecurityTokenHandler().ReadJwtToken(securityToken);
var claims = (validatedToken as JwtSecurityToken).Claims.ToList();
var userName = claims.FirstOrDefault(o => o.Type == ClaimTypes.Name).Value;
using var scope = this._serviceProvider.CreateScope();
var roles = scope.ServiceProvider.GetService<IRoleService>().GetRoles(userName).Select(o => new Claim(ClaimTypes.Role, o));
claims.AddRange(roles);
return new ClaimsPrincipal(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme));
}
catch (Exception ex)
{
validatedToken = null;
Console.WriteLine(ex.ToString());
}
return null;
}
}
}

@ -21,7 +21,7 @@
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="5.3.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="5.4.1" />
</ItemGroup>
</Project>

@ -12,8 +12,6 @@
<ItemGroup>
<PackageReference Include="AspNet.Security.OAuth.GitHub" Version="3.1.0" />
<PackageReference Include="AspNet.Security.OAuth.QQ" Version="3.1.0" />
<PackageReference Include="IdentityServer4" Version="3.1.2" />
<PackageReference Include="IdentityServer4.EntityFramework" Version="3.1.2" />
<PackageReference Include="RavenDB.Embedded" Version="4.2.102" />
</ItemGroup>
<ItemGroup>

@ -1,5 +1,7 @@
{
"AppSettings": {
"database": "sqlite"
}
},
"AccessTokenHours": 0.05,
"RefreshToken": 0.1
}

@ -1,4 +1,4 @@
using System.Reflection;
[assembly: AssemblyVersion("1.0.0.*")]
[assembly: AssemblyInformationalVersion("1.0.0.507-1")]
[assembly: AssemblyInformationalVersion("1.0.0.508")]

@ -0,0 +1,117 @@
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}

@ -333,6 +333,7 @@ syn keyword ngxDirective contained js_access
syn keyword ngxDirective contained js_content
syn keyword ngxDirective contained js_filter
syn keyword ngxDirective contained js_include
syn keyword ngxDirective contained js_path
syn keyword ngxDirective contained js_preread
syn keyword ngxDirective contained js_set
syn keyword ngxDirective contained keepalive
@ -353,6 +354,7 @@ syn keyword ngxDirective contained limit_conn_zone
syn keyword ngxDirective contained limit_rate
syn keyword ngxDirective contained limit_rate_after
syn keyword ngxDirective contained limit_req
syn keyword ngxDirective contained limit_req_dry_run
syn keyword ngxDirective contained limit_req_log_level
syn keyword ngxDirective contained limit_req_status
syn keyword ngxDirective contained limit_req_zone
@ -472,6 +474,7 @@ syn keyword ngxDirective contained proxy_requests
syn keyword ngxDirective contained proxy_responses
syn keyword ngxDirective contained proxy_send_lowat
syn keyword ngxDirective contained proxy_send_timeout
syn keyword ngxDirective contained proxy_session_drop
syn keyword ngxDirective contained proxy_set_body
syn keyword ngxDirective contained proxy_set_header
syn keyword ngxDirective contained proxy_socket_keepalive
@ -1325,6 +1328,7 @@ syn keyword ngxDirectiveThirdParty contained lua_check_client_abort
syn keyword ngxDirectiveThirdParty contained lua_code_cache
syn keyword ngxDirectiveThirdParty contained lua_fake_shm
syn keyword ngxDirectiveThirdParty contained lua_http10_buffering
syn keyword ngxDirectiveThirdParty contained lua_load_resty_core
syn keyword ngxDirectiveThirdParty contained lua_malloc_trim
syn keyword ngxDirectiveThirdParty contained lua_max_pending_timers
syn keyword ngxDirectiveThirdParty contained lua_max_running_timers
@ -1779,6 +1783,7 @@ syn keyword ngxDirectiveThirdParty contained vod_expires_live_time_dependent
syn keyword ngxDirectiveThirdParty contained vod_fallback_upstream_location
syn keyword ngxDirectiveThirdParty contained vod_force_continuous_timestamps
syn keyword ngxDirectiveThirdParty contained vod_force_playlist_type_vod
syn keyword ngxDirectiveThirdParty contained vod_force_sequence_index
syn keyword ngxDirectiveThirdParty contained vod_gop_look_ahead
syn keyword ngxDirectiveThirdParty contained vod_gop_look_behind
syn keyword ngxDirectiveThirdParty contained vod_ignore_edit_list

@ -1,7 +1,197 @@
Changes with nginx 1.16.0 23 Apr 2019
Changes with nginx 1.18.0 21 Apr 2020
*) 1.16.x stable branch.
*) 1.18.x stable branch.
Changes with nginx 1.17.10 14 Apr 2020
*) Feature: the "auth_delay" directive.
Changes with nginx 1.17.9 03 Mar 2020
*) Change: now nginx does not allow several "Host" request header lines.
*) Bugfix: nginx ignored additional "Transfer-Encoding" request header
lines.
*) Bugfix: socket leak when using HTTP/2.
*) Bugfix: a segmentation fault might occur in a worker process if OCSP
stapling was used.
*) Bugfix: in the ngx_http_mp4_module.
*) Bugfix: nginx used status code 494 instead of 400 if errors with code
494 were redirected with the "error_page" directive.
*) Bugfix: socket leak when using subrequests in the njs module and the
"aio" directive.
Changes with nginx 1.17.8 21 Jan 2020
*) Feature: variables support in the "grpc_pass" directive.
*) Bugfix: a timeout might occur while handling pipelined requests in an
SSL connection; the bug had appeared in 1.17.5.
*) Bugfix: in the "debug_points" directive when using HTTP/2.
Thanks to Daniil Bondarev.
Changes with nginx 1.17.7 24 Dec 2019
*) Bugfix: a segmentation fault might occur on start or during
reconfiguration if the "rewrite" directive with an empty replacement
string was used in the configuration.
*) Bugfix: a segmentation fault might occur in a worker process if the
"break" directive was used with the "alias" directive or with the
"proxy_pass" directive with a URI.
*) Bugfix: the "Location" response header line might contain garbage if
the request URI was rewritten to the one containing a null character.
*) Bugfix: requests with bodies were handled incorrectly when returning
redirections with the "error_page" directive; the bug had appeared in
0.7.12.
*) Bugfix: socket leak when using HTTP/2.
*) Bugfix: a timeout might occur while handling pipelined requests in an
SSL connection; the bug had appeared in 1.17.5.
*) Bugfix: in the ngx_http_dav_module.
Changes with nginx 1.17.6 19 Nov 2019
*) Feature: the $proxy_protocol_server_addr and
$proxy_protocol_server_port variables.
*) Feature: the "limit_conn_dry_run" directive.
*) Feature: the $limit_req_status and $limit_conn_status variables.
Changes with nginx 1.17.5 22 Oct 2019
*) Feature: now nginx uses ioctl(FIONREAD), if available, to avoid
reading from a fast connection for a long time.
*) Bugfix: incomplete escaped characters at the end of the request URI
were ignored.
*) Bugfix: "/." and "/.." at the end of the request URI were not
normalized.
*) Bugfix: in the "merge_slashes" directive.
*) Bugfix: in the "ignore_invalid_headers" directive.
Thanks to Alan Kemp.
*) Bugfix: nginx could not be built with MinGW-w64 gcc 8.1 or newer.
Changes with nginx 1.17.4 24 Sep 2019
*) Change: better detection of incorrect client behavior in HTTP/2.
*) Change: in handling of not fully read client request body when
returning errors in HTTP/2.
*) Bugfix: the "worker_shutdown_timeout" directive might not work when
using HTTP/2.
*) Bugfix: a segmentation fault might occur in a worker process when
using HTTP/2 and the "proxy_request_buffering" directive.
*) Bugfix: the ECONNABORTED error log level was "crit" instead of
"error" on Windows when using SSL.
*) Bugfix: nginx ignored extra data when using chunked transfer
encoding.
*) Bugfix: nginx always returned the 500 error if the "return" directive
was used and an error occurred during reading client request body.
*) Bugfix: in memory allocation error handling.
Changes with nginx 1.17.3 13 Aug 2019
*) Security: when using HTTP/2 a client might cause excessive memory
consumption and CPU usage (CVE-2019-9511, CVE-2019-9513,
CVE-2019-9516).
*) Bugfix: "zero size buf" alerts might appear in logs when using
gzipping; the bug had appeared in 1.17.2.
*) Bugfix: a segmentation fault might occur in a worker process if the
"resolver" directive was used in SMTP proxy.
Changes with nginx 1.17.2 23 Jul 2019
*) Change: minimum supported zlib version is 1.2.0.4.
Thanks to Ilya Leoshkevich.
*) Change: the $r->internal_redirect() embedded perl method now expects
escaped URIs.
*) Feature: it is now possible to switch to a named location using the
$r->internal_redirect() embedded perl method.
*) Bugfix: in error handling in embedded perl.
*) Bugfix: a segmentation fault might occur on start or during
reconfiguration if hash bucket size larger than 64 kilobytes was used
in the configuration.
*) Bugfix: nginx might hog CPU during unbuffered proxying and when
proxying WebSocket connections if the select, poll, or /dev/poll
methods were used.
*) Bugfix: in the ngx_http_xslt_filter_module.
*) Bugfix: in the ngx_http_ssi_filter_module.
Changes with nginx 1.17.1 25 Jun 2019
*) Feature: the "limit_req_dry_run" directive.
*) Feature: when using the "hash" directive inside the "upstream" block
an empty hash key now triggers round-robin balancing.
Thanks to Niklas Keller.
*) Bugfix: a segmentation fault might occur in a worker process if
caching was used along with the "image_filter" directive, and errors
with code 415 were redirected with the "error_page" directive; the
bug had appeared in 1.11.10.
*) Bugfix: a segmentation fault might occur in a worker process if
embedded perl was used; the bug had appeared in 1.7.3.
Changes with nginx 1.17.0 21 May 2019
*) Feature: variables support in the "limit_rate" and "limit_rate_after"
directives.
*) Feature: variables support in the "proxy_upload_rate" and
"proxy_download_rate" directives in the stream module.
*) Change: minimum supported OpenSSL version is 0.9.8.
*) Change: now the postpone filter is always built.
*) Bugfix: the "include" directive did not work inside the "if" and
"limit_except" blocks.
*) Bugfix: in byte ranges processing.
Changes with nginx 1.15.12 16 Apr 2019

@ -1,7 +1,202 @@
Изменения в nginx 1.16.0 23.04.2019
Изменения в nginx 1.18.0 21.04.2020
*) Стабильная ветка 1.16.x.
*) Стабильная ветка 1.18.x.
Изменения в nginx 1.17.10 14.04.2020
*) Добавление: директива auth_delay.
Изменения в nginx 1.17.9 03.03.2020
*) Изменение: теперь nginx не разрешает несколько строк "Host" в
заголовке запроса.
*) Исправление: nginx игнорировал дополнительные строки
"Transfer-Encoding" в заголовке запроса.
*) Исправление: утечки сокетов при использовании HTTP/2.
*) Исправление: в рабочем процессе мог произойти segmentation fault,
если использовался OCSP stapling.
*) Исправление: в модуле ngx_http_mp4_module.
*) Исправление: при перенаправлении ошибок с кодом 494 с помощью
директивы error_page nginx возвращал ответ с кодом 494 вместо 400.
*) Исправление: утечки сокетов при использовании подзапросов в модуле
njs и директивы aio.
Изменения в nginx 1.17.8 21.01.2020
*) Добавление: директива grpc_pass поддерживает переменные.
*) Исправление: при обработке pipelined-запросов по SSL-соединению мог
произойти таймаут; ошибка появилась в 1.17.5.
*) Исправление: в директиве debug_points при использовании HTTP/2.
Спасибо Даниилу Бондареву.
Изменения в nginx 1.17.7 24.12.2019
*) Исправление: на старте или во время переконфигурации мог произойти
segmentation fault, если в конфигурации использовалась директива
rewrite с пустой строкой замены.
*) Исправление: в рабочем процессе мог произойти segmentation fault,
если директива break использовалась совместно с директивой alias или
директивой proxy_pass с URI.
*) Исправление: строка Location заголовка ответа могла содержать мусор,
если URI запроса был изменён на URI, содержащий нулевой символ.
*) Исправление: при возврате перенаправлений с помощью директивы
error_page запросы с телом обрабатывались некорректно; ошибка
появилась в 0.7.12.
*) Исправление: утечки сокетов при использовании HTTP/2.
*) Исправление: при обработке pipelined-запросов по SSL-соединению мог
произойти таймаут; ошибка появилась в 1.17.5.
*) Исправление: в модуле ngx_http_dav_module.
Изменения в nginx 1.17.6 19.11.2019
*) Добавление: переменные $proxy_protocol_server_addr и
$proxy_protocol_server_port.
*) Добавление: директива limit_conn_dry_run.
*) Добавление: переменные $limit_req_status и $limit_conn_status.
Изменения в nginx 1.17.5 22.10.2019
*) Добавление: теперь nginx использует вызов ioctl(FIONREAD), если он
доступен, чтобы избежать чтения из быстрого соединения в течение
долгого времени.
*) Исправление: неполные закодированные символы в конце URI запроса
игнорировались.
*) Исправление: "/." и "/.." в конце URI запроса не нормализовывались.
*) Исправление: в директиве merge_slashes.
*) Исправление: в директиве ignore_invalid_headers.
Спасибо Alan Kemp.
*) Исправление: nginx не собирался с MinGW-w64 gcc 8.1 и новее.
Изменения в nginx 1.17.4 24.09.2019
*) Изменение: улучшено детектирование некорректного поведения клиентов в
HTTP/2.
*) Изменение: в обработке непрочитанного тела запроса при возврате
ошибок в HTTP/2.
*) Исправление: директива worker_shutdown_timeout могла не работать при
использовании HTTP/2.
*) Исправление: при использовании HTTP/2 и директивы
proxy_request_buffering в рабочем процессе мог произойти segmentation
fault.
*) Исправление: на Windows при использовании SSL уровень записи в лог
ошибки ECONNABORTED был "crit" вместо "error".
*) Исправление: nginx игнорировал лишние данные при использовании
chunked transfer encoding.
*) Исправление: если использовалась директива return и при чтении тела
запроса возникала ошибка, nginx всегда возвращал ошибку 500.
*) Исправление: в обработке ошибок выделения памяти.
Изменения в nginx 1.17.3 13.08.2019
*) Безопасность: при использовании HTTP/2 клиент мог вызвать чрезмерное
потребление памяти и ресурсов процессора (CVE-2019-9511,
CVE-2019-9513, CVE-2019-9516).
*) Исправление: при использовании сжатия в логах могли появляться
сообщения "zero size buf"; ошибка появилась в 1.17.2.
*) Исправление: при использовании директивы resolver в SMTP
прокси-сервере в рабочем процессе мог произойти segmentation fault.
Изменения в nginx 1.17.2 23.07.2019
*) Изменение: минимальная поддерживаемая версия zlib - 1.2.0.4.
Спасибо Илье Леошкевичу.
*) Изменение: метод $r->internal_redirect() встроенного перла теперь
ожидает закодированный URI.
*) Добавление: теперь с помощью метода $r->internal_redirect()
встроенного перла можно перейти в именованный location.
*) Исправление: в обработке ошибок во встроенном перле.
*) Исправление: на старте или во время переконфигурации мог произойти
segmentation fault, если в конфигурации использовалось значение hash
bucket size больше 64 килобайт.
*) Исправление: при использовании методов обработки соединений select,
poll и /dev/poll nginx мог нагружать процессор во время
небуферизованного проксирования и при проксировании
WebSocket-соединений.
*) Исправление: в модуле ngx_http_xslt_filter_module.
*) Исправление: в модуле ngx_http_ssi_filter_module.
Изменения в nginx 1.17.1 25.06.2019
*) Добавление: директива limit_req_dry_run.
*) Добавление: при использовании директивы hash в блоке upstream пустой
ключ хэширования теперь приводит к переключению на round-robin
балансировку.
Спасибо Niklas Keller.
*) Исправление: в рабочем процессе мог произойти segmentation fault,
если использовалось кэширование и директива image_filter, а ошибки с
кодом 415 перенаправлялись с помощью директивы error_page; ошибка
появилась в 1.11.10.
*) Исправление: в рабочем процессе мог произойти segmentation fault,
если использовался встроенный перл; ошибка появилась в 1.7.3.
Изменения в nginx 1.17.0 21.05.2019
*) Добавление: директивы limit_rate и limit_rate_after поддерживают
переменные.
*) Добавление: директивы proxy_upload_rate и proxy_download_rate в
модуле stream поддерживают переменные.
*) Изменение: минимальная поддерживаемая версия OpenSSL - 0.9.8.
*) Изменение: теперь postpone-фильтр собирается всегда.
*) Исправление: директива include не работала в блоках if и
limit_except.
*) Исправление: в обработке byte ranges.
Изменения в nginx 1.15.12 16.04.2019

@ -25,7 +25,7 @@ Email domain: cam.ac.uk
University of Cambridge Computing Service,
Cambridge, England.
Copyright (c) 1997-2019 University of Cambridge
Copyright (c) 1997-2020 University of Cambridge
All rights reserved.
@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester
Email domain: freemail.hu
Copyright(c) 2010-2019 Zoltan Herczeg
Copyright(c) 2010-2020 Zoltan Herczeg
All rights reserved.
@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester
Email domain: freemail.hu
Copyright(c) 2009-2019 Zoltan Herczeg
Copyright(c) 2009-2020 Zoltan Herczeg
All rights reserved.
Loading…
Cancel
Save