Compare commits

..

18 Commits

Author SHA1 Message Date
d67cf10600 feat: 1.1.1 fix typo 2025-03-02 22:12:47 +08:00
54e4c61c3f feat: 1.1.0
修改gaea包
    修改权限接口
    修复build.gradle打包问题
    修改状态名
2024-12-14 12:50:00 +08:00
25062a9135 feat: 1.0.0 重构gaea引用; 增加docker编译部署方式 2024-09-30 22:57:52 +08:00
aad2aaea77 Merge branch 'dev' of github.com:synebula-myths/zeus into dev 2022-12-02 09:48:01 +08:00
fec580093b 调整GAEA APP包配置信息 2022-12-02 09:45:47 +08:00
c681dd9072 add db init script; update gaea version 2022-11-23 15:42:27 +08:00
14093b1ce1 更新GAEA到版本1.4.0 2022-09-30 14:54:35 +08:00
89b96fb053 修改token信息位置 2022-09-30 14:54:29 +08:00
b58e4c9ad1 Merge branch 'dev' of https://github.com/synebula/zeus into dev
# Conflicts:
#	build.gradle
2022-09-22 21:38:06 +08:00
947853479b 更新GAEA到版本1.5.0: token 认证方式 2022-09-14 09:41:49 +08:00
6f520513a2 Merge pull request #1 from synebula-myths/dev
Dev
2022-08-26 10:47:38 +08:00
cbe75da254 更新GAEA到版本1.4.0 2022-08-26 10:43:25 +08:00
34ff5ee65c 更新gaea 0.13.1;登录增加remember 2021-06-14 09:27:27 +08:00
72cb8cf5ca Merge branch 'dev' 2020-12-07 10:52:18 +08:00
91710bebbe Merge branch 'dev' 2020-11-10 22:49:39 +08:00
c96dbea004 Merge branch 'master' of https://github.com/synebula/zeus 2020-11-10 22:48:31 +08:00
72ef467d09 忽略日志文件 2020-11-01 00:05:22 +08:00
e3067edf53 增加权限相关代码 2020-11-01 00:04:51 +08:00
57 changed files with 405 additions and 273 deletions

1
.gitignore vendored
View File

@@ -3,5 +3,6 @@ gradlew*
build build
gradle gradle
logs logs
bin
!.gitignore !.gitignore

13
Dockerfile Normal file
View File

@@ -0,0 +1,13 @@
FROM gradle:8.10.1-jdk21-alpine AS build
ENV GRADLE_USER_HOME=/.gradle
USER root
WORKDIR /src
COPY --chown=gradle:gradle . .
RUN --mount=type=cache,target=/.gradle gradle bootJar --no-daemon --build-cache
FROM openjdk:21-jdk-slim
EXPOSE 80
VOLUME /logs
WORKDIR /app
COPY --from=build /src/src/zeus.app/build/libs/*.jar ./spring-boot-application.jar
ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions", "-Djava.security.egd=file:/dev/./urandom","-jar","/app/spring-boot-application.jar"]

View File

@@ -1,11 +1,18 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
buildscript { buildscript {
ext { ext {
kotlin_version = '1.6.10' jvm_version = '21'
kotlin_version = '2.0.0'
gaea_version = '1.7.2'
spring_version = "3.3.0"
} }
repositories { repositories {
mavenLocal() mavenLocal()
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/repository/public' }
mavenCentral() mavenCentral()
} }
@@ -14,16 +21,12 @@ buildscript {
} }
} }
allprojects { subprojects {
group 'com.synebula' group 'com.synebula'
version version version version
}
subprojects {
ext { ext {
version '0.9.0' version '1.1.1'
gaea_version = '1.2.0'
spring_version = "2.7.0"
} }
buildscript { buildscript {
@@ -36,6 +39,7 @@ subprojects {
repositories { repositories {
mavenLocal() mavenLocal()
maven { url 'https://git.synebula.com/api/packages/alex/maven' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
mavenCentral() mavenCentral()
} }
@@ -51,13 +55,25 @@ subprojects {
testApi group: 'junit', name: 'junit', version: '4.12' testApi group: 'junit', name: 'junit', version: '4.12'
} }
sourceCompatibility = 1.8 /*** 指定 Java & Kotlin 语言编译目标JVM ***/
targetCompatibility = 1.8 sourceCompatibility = "$jvm_version"
targetCompatibility = "$jvm_version"
compileKotlin { compileKotlin {
kotlinOptions.jvmTarget = "1.8" compilerOptions {
jvmTarget = JvmTarget.valueOf("JVM_$jvm_version")
}
} }
compileTestKotlin { compileTestKotlin {
kotlinOptions.jvmTarget = "1.8" compilerOptions {
jvmTarget = JvmTarget.valueOf("JVM_$jvm_version")
}
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
} }
} }

54
doc/db-init.js Normal file
View File

@@ -0,0 +1,54 @@
db = db.getSiblingDB('zeus');
db.createUser(
{
user: "root",
pwd: "LcY221815",
roles:[ { role: "dbOwner", db: "zeus" }]
}
)
db.role.insertOne(
{
_id: "admin",
name: "管理员"
}
);
db.group.insertOne(
{
_id: "1",
name: "管理员"
}
);
db.user.insertOne({
name: "admin",
password: "1f22f6ce6e58a7326c5b5dd197973105",
realName: "管理员",
phone: "18654551561",
role: "admin",
group: "1",
avalible: true,
_class: "com.synebula.zeus.domain.model.rbac.User"
});
db.system.insertOne({
_id: "1",
name: "web",
uri: "",
order: 1,
})
db.page.insertMany([
{ "_id": "1", "name": "groups", "uri": "/groups", "parent": "0", "system": "1", "order": 1, "icon": "group" },
{ "_id": "2", "name": "roles", "uri": "/roles", "parent": "0", "system": "1", "order": 2, "icon": "manual" },
{ "_id": "3", "name": "users", "uri": "/users", "parent": "0", "system": "1", "order": 3, "icon": "user" },
{ "_id": "4", "name": "pages", "uri": "/pages", "parent": "0", "system": "1", "order": 4, "icon": "page" }})
])
db.authority.insertMany([
{ "role": "admin", "resource": "1", "type": "System", "authority": "Allow", "avalible": true, "_class": "com.synebula.zeus.domain.model.rbac.Authority" },
{ "role": "admin", "resource": "1", "type": "Page", "authority": "Allow", "avalible": true, "_class": "com.synebula.zeus.domain.model.rbac.Authority" },
{ "role": "admin", "resource": "2", "type": "Page", "authority": "Allow", "avalible": true, "_class": "com.synebula.zeus.domain.model.rbac.Authority" },
{ "role": "admin", "resource": "67595cfcbbef24782f95a325", "type": "Page", "authority": "Allow", "avalible": true, "_class": "com.synebula.zeus.domain.model.rbac.Authority" },
])

45
docker-compose.yml Normal file
View File

@@ -0,0 +1,45 @@
services:
app:
image: com.synebula/zeus
restart: always
container_name: zeus.app
build:
context: ./
dockerfile: ./Dockerfile
volumes:
- ./bin/logs:/app/logs
- /etc/hosts:/etc/hosts
- /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone
ports:
- 8080:80
environment:
- TZ=Asia/Shanghai
- DB_URL=mongodb://root:LcY221815@db/zeus
db:
container_name: zeus.db
image: mongo
ports:
- 27017:27017
volumes:
- ./bin/sct:/sct
- ./bin/data:/data/db
- ./bin/backup:/data/backup
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=LcY221815
restart: unless-stopped
# ui:
# image: nginx:mainline-alpine
# restart: always
# container_name: zeus.ui
# links:
# - app
# volumes:
# - ./conf/ui:/etc/nginx/conf.d/
# - ./bin/ui:/app
# - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone
# ports:
# - 80:80
# - 443:443

View File

@@ -14,20 +14,8 @@ dependencies {
api project(":src:zeus.domain") api project(":src:zeus.domain")
api project(":src:zeus.query") api project(":src:zeus.query")
api project(":src:zeus.repository") api project(":src:zeus.repository")
api "com.synebula:gaea.app:$gaea_version" api("com.synebula:gaea.app:$gaea_version")
api "com.synebula:gaea.spring:$gaea_version" api "com.synebula:gaea.spring:$gaea_version"
api "com.synebula:gaea.mongodb:$gaea_version" api "com.synebula:gaea.mongodb:$gaea_version"
} }
publishing {
publications {
publish(MavenPublication) {
group 'com.synebula'
artifactId 'zeus.app'
version "$version"
from components.java
}
}
}

View File

@@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication
@SpringBootApplication @SpringBootApplication
open class Application class Application
fun main(args: Array<String>) { fun main(args: Array<String>) {
SpringApplication.run(Application::class.java, *args) SpringApplication.run(Application::class.java, *args)

View File

@@ -9,7 +9,10 @@ import org.springframework.stereotype.Component
@Component @Component
class ZeusAspect : AppAspect() { class ZeusAspect : AppAspect() {
@Pointcut("target(com.synebula.gaea.app.IApplication)") /**
* 切片执行所有继承[com.synebula.gaea.app.controller.IApplication]接口的类
*/
@Pointcut("target(com.synebula.gaea.app.controller.IApplication)")
override fun func() { override fun func() {
} }
} }

View File

@@ -1,35 +1,28 @@
package com.synebula.zeus.app.config package com.synebula.zeus.app.config
import com.google.gson.Gson import com.google.gson.Gson
import com.synebula.gaea.app.component.security.WebSecurity import com.synebula.gaea.data.message.HttpMessageFactory
import com.synebula.gaea.data.serialization.json.IJsonSerializer import com.synebula.gaea.data.serialization.json.IJsonSerializer
import com.synebula.gaea.db.query.IQuery
import com.synebula.gaea.domain.repository.IRepositoryFactory import com.synebula.gaea.domain.repository.IRepositoryFactory
import com.synebula.gaea.mongodb.query.MongodbQueryFactory
import com.synebula.gaea.mongodb.repository.MongodbRepositoryFactory import com.synebula.gaea.mongodb.repository.MongodbRepositoryFactory
import com.synebula.gaea.query.IQueryFactory import com.synebula.gaea.mongodb.db.MongodbQuery
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.ComponentScan.Filter
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.FilterType import org.springframework.context.annotation.Primary
import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.data.mongodb.core.MongoTemplate
@Configuration @Configuration
@ComponentScan(
basePackages = ["com.synebula.gaea.app.component"],
excludeFilters = [Filter(type = FilterType.ASSIGNABLE_TYPE, classes = [WebSecurity::class])]
)
class ZeusBeans { class ZeusBeans {
@Bean @Bean
fun repoFactory(template: MongoTemplate): IRepositoryFactory { fun repoFactory(template: MongoTemplate): IRepositoryFactory {
return MongodbRepositoryFactory(template) return MongodbRepositoryFactory(template)
} }
@Primary
@Bean @Bean
fun queryFactory(template: MongoTemplate): IQueryFactory { fun defaultQuery(template: MongoTemplate): IQuery {
return MongodbQueryFactory(template) return MongodbQuery(template)
} }
@Bean @Bean
@@ -43,4 +36,9 @@ class ZeusBeans {
} }
} }
} }
@Bean
fun httpMessageFactory(serializer: IJsonSerializer): HttpMessageFactory {
return HttpMessageFactory(serializer)
}
} }

View File

@@ -1,10 +1,10 @@
package com.synebula.zeus.app.config package com.synebula.zeus.app.config
import com.synebula.gaea.app.autoconfig.service.ServiceScan import com.synebula.gaea.app.autoconfig.service.ServiceScan
import com.synebula.gaea.mongodb.autoconfig.MongodbRepoScan import com.synebula.gaea.mongodb.autoconfig.MongoDbRepositoryScan
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@Component @Component
@ServiceScan(basePackages = ["com.synebula.zeus.domain.service"]) @ServiceScan(basePackages = ["com.synebula.zeus.domain.service"])
@MongodbRepoScan(basePackages = ["com.synebula.zeus.domain.repository", "com.synebula.zeus.repository", "com.synebula.zeus.query"]) @MongoDbRepositoryScan(basePackages = ["com.synebula.zeus.domain.repository", "com.synebula.zeus.repository", "com.synebula.zeus.query"])
class ZeusServices class ZeusServices

View File

@@ -1,8 +1,10 @@
package com.synebula.zeus.app.controller package com.synebula.zeus.app.controller
import com.synebula.gaea.app.IApplication import com.synebula.gaea.app.controller.IApplication
import com.synebula.gaea.app.component.security.TokenManager import com.synebula.gaea.app.security.session.UserSession
import com.synebula.gaea.app.struct.HttpMessage import com.synebula.gaea.app.security.session.UserSessionManager
import com.synebula.gaea.data.message.HttpMessage
import com.synebula.gaea.data.message.HttpMessageFactory
import com.synebula.gaea.data.message.Status import com.synebula.gaea.data.message.Status
import com.synebula.gaea.data.serialization.json.IJsonSerializer import com.synebula.gaea.data.serialization.json.IJsonSerializer
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
@@ -10,11 +12,10 @@ import com.synebula.gaea.spring.aop.annotation.Method
import com.synebula.zeus.domain.service.cmd.rbac.UserCmd import com.synebula.zeus.domain.service.cmd.rbac.UserCmd
import com.synebula.zeus.domain.service.contr.rbac.IUserService import com.synebula.zeus.domain.service.contr.rbac.IUserService
import com.synebula.zeus.query.contr.IUserQuery import com.synebula.zeus.query.contr.IUserQuery
import com.synebula.zeus.query.view.UserView
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.PostMapping import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.*
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController @RestController
@RequestMapping("/sign") @RequestMapping("/sign")
@@ -27,11 +28,14 @@ class SignInOutApp(override var logger: ILogger) : IApplication {
lateinit var userService: IUserService lateinit var userService: IUserService
@Autowired @Autowired
lateinit var tokenHelper: TokenManager lateinit var userSessionManager: UserSessionManager
@Autowired @Autowired
lateinit var serializer: IJsonSerializer lateinit var serializer: IJsonSerializer
@Autowired
override lateinit var httpMessageFactory: HttpMessageFactory
override var name: String = "用户登录管理" override var name: String = "用户登录管理"
@Method("用户登录") @Method("用户登录")
@@ -40,32 +44,46 @@ class SignInOutApp(override var logger: ILogger) : IApplication {
return this.safeExecute("用户登录出现异常") { return this.safeExecute("用户登录出现异常") {
val message = this.userQuery.signIn(name, password) val message = this.userQuery.signIn(name, password)
if (message.data != null) { if (message.data != null) {
val user = message.data val user = message.data!!
user!!.remember = remember ?: false val token = userSessionManager.signIn(user.uid, user)
val token = tokenHelper.sign(message.data!!) user.remember = remember ?: false
it.data = token user.token = token
it.data = user
} else { } else {
it.load(message) it.load(message)
} }
} }
} }
@Method("登录用户信息")
@GetMapping("/user")
fun signUser(): HttpMessage {
val userSession = SecurityContextHolder.getContext().authentication.principal as UserSession
return httpMessageFactory.create(userSession.user)
}
@Method("用户登出") @Method("用户登出")
@PostMapping("/out") @PostMapping("/out")
fun signOut(user: String): HttpMessage { fun signOut(): HttpMessage {
return HttpMessage(user) val token = this.session()?.token
return if (token != null) {
userSessionManager.signOut(token)
this.httpMessageFactory.create(token)
} else
this.httpMessageFactory.create(Status.UNAUTHORIZED, "")
} }
@Method("用户注册") @Method("用户注册")
@PostMapping("/up") @PostMapping("/up")
fun signUp(@RequestBody command: UserCmd): HttpMessage { fun signUp(@RequestBody command: UserCmd): HttpMessage {
return this.safeExecute("用户注册出错, 用户信息: ${serializer.serialize(command)}") { return this.safeExecute("用户注册出错, 用户信息: ${serializer.serialize(command)}") {
val list = this.userQuery.list(mapOf(Pair("name", command.name))) val list = this.userQuery.list(mapOf(Pair("name", command.name)), UserView::class.java)
if (list.isEmpty()) { if (list.isEmpty()) {
val message = userService.add(command) val message = userService.add(command)
it.data = message.data it.data = message.data
} else { } else {
it.status = Status.Failure it.status = Status.FAILURE
it.message = "系统中已存在该用户" it.message = "系统中已存在该用户"
} }
} }

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.app.controller.rbac package com.synebula.zeus.app.controller.rbac
import com.synebula.gaea.app.Application import com.synebula.gaea.app.controller.DomainApplication
import com.synebula.gaea.app.struct.HttpMessage import com.synebula.gaea.data.message.HttpMessage
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.gaea.spring.aop.annotation.Method import com.synebula.gaea.spring.aop.annotation.Method
import com.synebula.zeus.domain.service.cmd.rbac.AuthorityBatchAddCmd import com.synebula.zeus.domain.service.cmd.rbac.AuthorityBatchAddCmd
@@ -18,14 +18,14 @@ class AuthorityApp(
query: IAuthorityQuery, query: IAuthorityQuery,
logger: ILogger, logger: ILogger,
private var authorityService: IAuthorityService private var authorityService: IAuthorityService
) : Application<AuthorityCmd, AuthorityView, String>( ) : DomainApplication<AuthorityCmd, AuthorityView, String>(
"权限信息", authorityService, query, logger "权限信息", authorityService, query, AuthorityView::class.java, logger
) { ) {
@Method("批量添加权限信息") @Method("批量添加权限信息")
@PostMapping("/batch") @PostMapping("/batch")
fun add(@RequestBody cmd: AuthorityBatchAddCmd): HttpMessage { fun add(@RequestBody cmd: AuthorityBatchAddCmd): HttpMessage {
this.authorityService.add(cmd) this.authorityService.add(cmd)
return HttpMessage() return this.httpMessageFactory.create()
} }
@Method("根据资源和角色删除权限") @Method("根据资源和角色删除权限")
@@ -36,6 +36,6 @@ class AuthorityApp(
@RequestBody resource: List<String> @RequestBody resource: List<String>
): HttpMessage { ): HttpMessage {
this.authorityService.removeByResourceRole(type, resource, role) this.authorityService.removeByResourceRole(type, resource, role)
return HttpMessage() return this.httpMessageFactory.create()
} }
} }

View File

@@ -1,8 +1,8 @@
package com.synebula.zeus.app.controller.rbac package com.synebula.zeus.app.controller.rbac
import com.synebula.gaea.app.Application import com.synebula.gaea.app.controller.DomainApplication
import com.synebula.gaea.db.query.IQuery
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.gaea.query.IQueryFactory
import com.synebula.zeus.domain.service.cmd.rbac.GroupCmd import com.synebula.zeus.domain.service.cmd.rbac.GroupCmd
import com.synebula.zeus.domain.service.contr.rbac.IGroupService import com.synebula.zeus.domain.service.contr.rbac.IGroupService
import com.synebula.zeus.query.view.GroupView import com.synebula.zeus.query.view.GroupView
@@ -13,8 +13,8 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/groups") @RequestMapping("/groups")
class GroupApp( class GroupApp(
service: IGroupService, service: IGroupService,
factory: IQueryFactory, query: IQuery,
logger: ILogger logger: ILogger
) : Application<GroupCmd, GroupView, String>( ) : DomainApplication<GroupCmd, GroupView, String>(
"组信息", service, factory.createQuery(GroupView::class.java), logger "用户组信息", service, query, GroupView::class.java, logger
) )

View File

@@ -1,8 +1,8 @@
package com.synebula.zeus.app.controller.rbac package com.synebula.zeus.app.controller.rbac
import com.synebula.gaea.app.Application import com.synebula.gaea.app.controller.DomainApplication
import com.synebula.gaea.db.query.IQuery
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.gaea.query.IQueryFactory
import com.synebula.zeus.domain.service.cmd.rbac.RoleCmd import com.synebula.zeus.domain.service.cmd.rbac.RoleCmd
import com.synebula.zeus.domain.service.contr.rbac.IRoleService import com.synebula.zeus.domain.service.contr.rbac.IRoleService
import com.synebula.zeus.query.view.RoleView import com.synebula.zeus.query.view.RoleView
@@ -13,8 +13,8 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/roles") @RequestMapping("/roles")
class RoleApp( class RoleApp(
service: IRoleService, service: IRoleService,
factory: IQueryFactory, query: IQuery,
logger: ILogger logger: ILogger
) : Application<RoleCmd, RoleView, String>( ) : DomainApplication<RoleCmd, RoleView, String>(
"用户信息", service, factory.createQuery(RoleView::class.java), logger "用户信息", service, query, RoleView::class.java, logger
) )

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.app.controller.rbac package com.synebula.zeus.app.controller.rbac
import com.synebula.gaea.app.Application import com.synebula.gaea.app.controller.DomainApplication
import com.synebula.gaea.app.struct.HttpMessage import com.synebula.gaea.data.message.HttpMessage
import com.synebula.gaea.data.message.Status import com.synebula.gaea.data.message.Status
import com.synebula.gaea.data.serialization.json.IJsonSerializer import com.synebula.gaea.data.serialization.json.IJsonSerializer
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
@@ -18,8 +18,8 @@ class UserApp(
service: IUserService, service: IUserService,
query: IUserQuery, query: IUserQuery,
logger: ILogger logger: ILogger
) : Application<UserCmd, UserView, String>( ) : DomainApplication<UserCmd, UserView, String>(
"用户信息", service, query, logger "用户信息", service, query, UserView::class.java, logger
) { ) {
@Autowired @Autowired
@@ -27,11 +27,11 @@ class UserApp(
override fun add(command: UserCmd): HttpMessage { override fun add(command: UserCmd): HttpMessage {
return this.safeExecute("查询重复用户信息出错, 用户信息: ${serializer.serialize(command)}") { return this.safeExecute("查询重复用户信息出错, 用户信息: ${serializer.serialize(command)}") {
val list = this.query.list(mapOf(Pair("name", command.name))) val list = this.query.list(mapOf(Pair("name", command.name)), UserView::class.java)
if (list.isEmpty()) if (list.isEmpty())
it.from(super.add(command)) it.from(super.add(command))
else { else {
it.status = Status.Failure it.status = Status.FAILURE
it.message = "系统中已存在该用户" it.message = "系统中已存在该用户"
} }
} }
@@ -53,12 +53,12 @@ class UserApp(
@GetMapping("/{name}/forgot") @GetMapping("/{name}/forgot")
fun forgot(@PathVariable name: String): HttpMessage { fun forgot(@PathVariable name: String): HttpMessage {
return this.safeExecute("遗忘用户密码出现异常") { return this.safeExecute("遗忘用户密码出现异常") {
val users = this.query.list(mapOf(Pair("name", name))) val users = this.query.list(mapOf(Pair("name", name)), UserView::class.java)
if (users.isNotEmpty()) { if (users.isNotEmpty()) {
it.load((this.service as IUserService).forgotPassword(users[0].id)) it.load((this.service as IUserService).forgotPassword(users[0].id))
} else { } else {
it.status = Status.Failure it.status = Status.FAILURE
it.message = "找不到该用户信息" it.message = "找不到该用户信息"
} }
} }

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.app.controller.rbac.resource package com.synebula.zeus.app.controller.rbac.resource
import com.synebula.gaea.app.Application import com.synebula.gaea.app.controller.DomainApplication
import com.synebula.gaea.app.struct.HttpMessage import com.synebula.gaea.data.message.HttpMessage
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.gaea.spring.aop.annotation.Method import com.synebula.gaea.spring.aop.annotation.Method
import com.synebula.zeus.domain.service.cmd.rbac.resource.InterfaceCmd import com.synebula.zeus.domain.service.cmd.rbac.resource.InterfaceCmd
@@ -19,8 +19,8 @@ class InterfaceApp(
service: IInterfaceService, service: IInterfaceService,
logger: ILogger, logger: ILogger,
var interfaceQuery: IInterfaceQuery var interfaceQuery: IInterfaceQuery
) : Application<InterfaceCmd, InterfaceView, String>( ) : DomainApplication<InterfaceCmd, InterfaceView, String>(
"接口信息", service, interfaceQuery, logger "接口信息", service, interfaceQuery, InterfaceView::class.java, logger
) { ) {
@Method("获取角色系统下有权接口") @Method("获取角色系统下有权接口")

View File

@@ -1,13 +1,14 @@
package com.synebula.zeus.app.controller.rbac.resource package com.synebula.zeus.app.controller.rbac.resource
import com.synebula.gaea.app.Application import com.synebula.gaea.app.controller.DomainApplication
import com.synebula.gaea.app.struct.HttpMessage import com.synebula.gaea.data.message.HttpMessage
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.gaea.spring.aop.annotation.Method import com.synebula.gaea.spring.aop.annotation.Method
import com.synebula.gaea.spring.aop.annotation.Module import com.synebula.gaea.spring.aop.annotation.Module
import com.synebula.zeus.domain.service.cmd.rbac.resource.PageCmd import com.synebula.zeus.domain.service.cmd.rbac.resource.PageCmd
import com.synebula.zeus.domain.service.contr.rbac.resource.IPageService import com.synebula.zeus.domain.service.contr.rbac.resource.IPageService
import com.synebula.zeus.query.contr.resouce.IPageQuery import com.synebula.zeus.query.contr.resouce.IPageQuery
import com.synebula.zeus.query.view.SignUserView
import com.synebula.zeus.query.view.resource.PageView import com.synebula.zeus.query.view.resource.PageView
import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
@@ -21,16 +22,16 @@ class PageApp(
service: IPageService, service: IPageService,
logger: ILogger, logger: ILogger,
var pageQuery: IPageQuery var pageQuery: IPageQuery
) : Application<PageCmd, PageView, String>( ) : DomainApplication<PageCmd, PageView, String>(
"页面信息", service, pageQuery, logger "页面信息", service, pageQuery, PageView::class.java, logger
) { ) {
@Method("获取角色系统下有权页面") @Method("获取角色系统下有权页面")
@GetMapping("/in-system/{system}/authorized/{role}") @GetMapping("/by-system/{system}/authorized/{role}")
fun authorized(@PathVariable system: String, @PathVariable role: String): HttpMessage { fun authorized(@PathVariable system: String, @PathVariable role: String): HttpMessage {
val msg = HttpMessage() return this.safeExecute("获取有权资源列表失败") { msg ->
msg.data = this.pageQuery.authorized(role, system) msg.data = this.pageQuery.authorized(role, system)
return msg }
} }
@Method("获取角色全部有权页面") @Method("获取角色全部有权页面")
@@ -42,20 +43,22 @@ class PageApp(
} }
@Method("验证角色页面权限") @Method("验证角色页面权限")
@GetMapping("/{page}/authorize/{role}") @GetMapping("/{page}/authorize")
fun authorize(@PathVariable page: String, @PathVariable role: String): HttpMessage { fun authorize(@PathVariable page: String): HttpMessage {
val session = this.session()
val rid = session?.user<SignUserView>()?.rid ?: ""
return this.safeExecute("获取权限信息失败") { msg -> return this.safeExecute("获取权限信息失败") { msg ->
msg.data = this.pageQuery.authorize(page, role) msg.data = this.pageQuery.authorize(page, rid)
} }
} }
@Method("验证角色URL权限") @Method("验证角色URL权限")
@GetMapping("/authorize/{role}") @GetMapping("/authorize")
fun uriAuthorize(@PathVariable role: String, uri: String): HttpMessage { fun uriAuthorize(uri: String): HttpMessage {
val session = this.session()
val rid = session?.user<SignUserView>()?.rid ?: ""
return this.safeExecute("获取权限信息失败") { msg -> return this.safeExecute("获取权限信息失败") { msg ->
msg.data = this.pageQuery.uriAuthorize(uri, role) msg.data = this.pageQuery.uriAuthorize(uri, rid)
} }
} }
} }

View File

@@ -1,12 +1,13 @@
package com.synebula.zeus.app.controller.rbac.resource package com.synebula.zeus.app.controller.rbac.resource
import com.synebula.gaea.app.Application import com.synebula.gaea.app.controller.DomainApplication
import com.synebula.gaea.app.struct.HttpMessage import com.synebula.gaea.data.message.HttpMessage
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.gaea.spring.aop.annotation.Method import com.synebula.gaea.spring.aop.annotation.Method
import com.synebula.zeus.domain.service.cmd.rbac.resource.SystemCmd import com.synebula.zeus.domain.service.cmd.rbac.resource.SystemCmd
import com.synebula.zeus.domain.service.contr.rbac.resource.ISystemService import com.synebula.zeus.domain.service.contr.rbac.resource.ISystemService
import com.synebula.zeus.query.contr.resouce.ISystemQuery import com.synebula.zeus.query.contr.resouce.ISystemQuery
import com.synebula.zeus.query.view.SignUserView
import com.synebula.zeus.query.view.resource.SystemView import com.synebula.zeus.query.view.resource.SystemView
import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
@@ -19,8 +20,8 @@ class SystemApp(
service: ISystemService, service: ISystemService,
logger: ILogger, logger: ILogger,
var systemQuery: ISystemQuery var systemQuery: ISystemQuery
) : Application<SystemCmd, SystemView, String>( ) : DomainApplication<SystemCmd, SystemView, String>(
"系统信息", service, systemQuery, logger "系统信息", service, systemQuery, SystemView::class.java, logger
) { ) {
@Method("获取角色有权系统") @Method("获取角色有权系统")
@GetMapping("/authorized/{role}") @GetMapping("/authorized/{role}")
@@ -31,10 +32,12 @@ class SystemApp(
} }
@Method("验证角色系统权限") @Method("验证角色系统权限")
@GetMapping("/{system}/authorize/{role}") @GetMapping("/{system}/authorize")
fun authorize(@PathVariable system: String, @PathVariable role: String): HttpMessage { fun authorize(@PathVariable system: String): HttpMessage {
val session = this.session()
val rid = session?.user<SignUserView>()?.rid ?: ""
return this.safeExecute("获取权限信息失败") { msg -> return this.safeExecute("获取权限信息失败") { msg ->
msg.data = this.systemQuery.authorize(system, role) msg.data = this.systemQuery.authorize(system, rid)
} }
} }
} }

View File

@@ -1,9 +1,39 @@
server: server:
port: 8080 port: 80
error:
whitelabel:
enabled: false
spring: spring:
application: application:
name: gaea.app name: gaea.app
sign-in-url: /sign/in
allow-multi-sign: ${ALLOW_MULTI_SIGN:true}
token-salt: ${TOKEN_SALT:7d25b8e5}
data: data:
mongodb: mongodb:
uri: mongodb://127.0.0.1/zeus uri: ${DB_URL:mongodb://root:LcY221815@127.0.0.1/zeus}
mail:
send: true
target: ge.com
sender: ${MAIL_SENDER:gehsrv@163.com}
protocol: ${MAIL_SENDER:smtp}
host: ${MAIL_HOST:smtp.163.com}
port: ${MAIL_PORT:465}
username: ${MAIL_USER:gehsrv@163.com}
password: ${MAIL_PWD:SRBPJBLFFVVCPZLZ}
default-encoding: UTF-8
properties:
mail:
imap:
ssl:
socketFactory:
fallback: false
smtp:
auth: true
ssl:
enable: true
socketFactory:
class: com.fintech.modules.base.util.mail.MailSSLSocketFactory
starttls:
enable: true
required: true

View File

@@ -31,7 +31,7 @@
</layout> </layout>
</appender> </appender>
<root level="warn"> <root level="info">
<appender-ref ref="file"/> <appender-ref ref="console"/>
</root> </root>
</configuration> </configuration>

View File

@@ -2,15 +2,3 @@ dependencies {
api project(":src:zeus.env") api project(":src:zeus.env")
api "com.synebula:gaea:$gaea_version" api "com.synebula:gaea:$gaea_version"
} }
publishing {
publications {
publish(MavenPublication) {
group 'com.synebula'
artifactId 'zeus.domain'
version "$version"
from components.java
}
}
}

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.domain.model.rbac package com.synebula.zeus.domain.model.rbac
import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.gaea.domain.model.AggregateRoot import com.synebula.gaea.domain.model.AggregateRoot
import com.synebula.zeus.env.AuthorityType
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
class Authority(override var id: String? = null) : AggregateRoot<String>() { class Authority(override var id: String? = null) : AggregateRoot<String>() {

View File

@@ -1,8 +1,10 @@
package com.synebula.zeus.domain.model.rbac package com.synebula.zeus.domain.model.rbac
import com.synebula.gaea.data.permission.PermissionType
import com.synebula.gaea.domain.model.AggregateRoot import com.synebula.gaea.domain.model.AggregateRoot
class Role(override var id: String? = null) : AggregateRoot<String>() { class Role(override var id: String? = null) : AggregateRoot<String>() {
var name = "" var name = ""
var desc = "" var desc = ""
var permissionType = PermissionType.Minimum
} }

View File

@@ -4,5 +4,5 @@ import com.synebula.gaea.domain.model.IAggregateRoot
class Interface : Resource(), IAggregateRoot<String> { class Interface : Resource(), IAggregateRoot<String> {
var system = "" var system = ""
override var alive = true override var available = true
} }

View File

@@ -16,6 +16,6 @@ class Page : Resource(), IAggregateRoot<String> {
// 所属系统 // 所属系统
var system = "" var system = ""
override var alive = true override var available = true
} }

View File

@@ -3,5 +3,5 @@ package com.synebula.zeus.domain.model.rbac.resource
import com.synebula.gaea.domain.model.IAggregateRoot import com.synebula.gaea.domain.model.IAggregateRoot
class System : Resource(), IAggregateRoot<String> { class System : Resource(), IAggregateRoot<String> {
override var alive = true override var available = true
} }

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.domain.service.cmd.rbac package com.synebula.zeus.domain.service.cmd.rbac
import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.gaea.domain.service.Command import com.synebula.gaea.domain.service.Command
import com.synebula.zeus.env.AuthorityType
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
class AuthorityBatchAddCmd : Command() { class AuthorityBatchAddCmd : Command() {

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.domain.service.cmd.rbac package com.synebula.zeus.domain.service.cmd.rbac
import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.gaea.domain.service.Command import com.synebula.gaea.domain.service.Command
import com.synebula.zeus.env.AuthorityType
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
class AuthorityCmd : Command() { class AuthorityCmd : Command() {

View File

@@ -1,9 +1,11 @@
package com.synebula.zeus.domain.service.cmd.rbac package com.synebula.zeus.domain.service.cmd.rbac
import com.synebula.gaea.data.permission.PermissionType
import com.synebula.gaea.domain.service.Command import com.synebula.gaea.domain.service.Command
class RoleCmd : Command() { class RoleCmd : Command() {
var id: String? = null var id: String? = null
var name = "" var name = ""
var desc = "" var desc = ""
var permissionType = PermissionType.Minimum
} }

View File

@@ -10,6 +10,6 @@ class UserCmd : Command() {
var phone: String? = null var phone: String? = null
var role: String? = null var role: String? = null
var group: String = "" var group: String = ""
var alive: Boolean = false var avalible: Boolean = false
var token: String? = null var token: String? = null
} }

View File

@@ -2,5 +2,5 @@ package com.synebula.zeus.domain.service.cmd.rbac.resource
class InterfaceCmd : ResourceCmd() { class InterfaceCmd : ResourceCmd() {
var system = "" var system = ""
var alive = true var avalible = true
} }

View File

@@ -14,6 +14,6 @@ class PageCmd : ResourceCmd() {
// 所属系统 // 所属系统
var system = "" var system = ""
var alive = true var avalible = true
} }

View File

@@ -2,5 +2,5 @@ package com.synebula.zeus.domain.service.cmd.rbac.resource
class SystemCmd : ResourceCmd() { class SystemCmd : ResourceCmd() {
var alive = true var avalible = true
} }

View File

@@ -1,13 +1,18 @@
package com.synebula.zeus.domain.service.impl.rbac package com.synebula.zeus.domain.service.impl.rbac
import com.synebula.gaea.bus.DomainSubscribe
import com.synebula.gaea.data.message.DataMessage import com.synebula.gaea.data.message.DataMessage
import com.synebula.gaea.data.message.Status import com.synebula.gaea.data.message.Status
import com.synebula.gaea.data.serialization.IObjectMapper import com.synebula.gaea.data.serialization.IObjectMapper
import com.synebula.gaea.domain.event.BeforeRemoveEvent
import com.synebula.gaea.domain.repository.IRepositoryFactory import com.synebula.gaea.domain.repository.IRepositoryFactory
import com.synebula.gaea.domain.service.ICommand import com.synebula.gaea.domain.service.ICommand
import com.synebula.gaea.domain.service.Service import com.synebula.gaea.domain.service.Service
import com.synebula.gaea.exception.NoticeUserException
import com.synebula.gaea.ext.toMd5 import com.synebula.gaea.ext.toMd5
import com.synebula.gaea.log.ILogger import com.synebula.gaea.log.ILogger
import com.synebula.zeus.domain.model.rbac.Group
import com.synebula.zeus.domain.model.rbac.Role
import com.synebula.zeus.domain.model.rbac.User import com.synebula.zeus.domain.model.rbac.User
import com.synebula.zeus.domain.service.component.IUserNotifier import com.synebula.zeus.domain.service.component.IUserNotifier
import com.synebula.zeus.domain.service.contr.rbac.IUserService import com.synebula.zeus.domain.service.contr.rbac.IUserService
@@ -20,30 +25,23 @@ class UserService(
var logger: ILogger var logger: ILogger
) : Service<User, String>(User::class.java, factory.createRepository(User::class.java), mapper), IUserService { ) : Service<User, String>(User::class.java, factory.createRepository(User::class.java), mapper), IUserService {
// init { @DomainSubscribe(domainClass = Role::class, messageClass = BeforeRemoveEvent::class)
// groupService.addBeforeRemoveListener(this.clazz.name) { id -> fun beforeRoleRemove(event: BeforeRemoveEvent<Role, String>) {
// val msg = Message() if (this.repository.count(mapOf(Pair("role", event.id!!))) > 0)
// if (this.repository.count(mapOf(Pair("group", id)), this.clazz) > 0) { throw NoticeUserException("角色下还有用户")
// msg.status = Status.Failure }
// msg.message = "组下还有用户"
// } @DomainSubscribe(BeforeRemoveEvent::class, Group::class)
// msg fun beforeGroupRemove(event: BeforeRemoveEvent<Group, String>) {
// } if (this.repository.count(mapOf(Pair("group", event.id!!))) > 0)
// roleService.addBeforeRemoveListener(this.clazz.name) { id -> throw NoticeUserException("用户组下还有用户")
// val msg = Message() }
// if (this.repository.count(mapOf(Pair("role", id)), this.clazz) > 0) {
// msg.status = Status.Failure
// msg.message = "角色下还有用户"
// }
// msg
// }
// }
override fun add(command: ICommand): DataMessage<String> { override fun add(command: ICommand): DataMessage<String> {
val user = this.map(command) val user = this.map(command)
user.password = user.password.toMd5() user.password = user.password.toMd5()
user.token = UUID.randomUUID().toString() user.token = UUID.randomUUID().toString()
user.alive = false user.available = false
this.repository.add(user) this.repository.add(user)
userNotifier?.added(user.id!!, user.name, user.token!!) userNotifier?.added(user.id!!, user.name, user.token!!)
return DataMessage(user.id!!) return DataMessage(user.id!!)
@@ -56,17 +54,17 @@ class UserService(
*/ */
override fun active(key: String, token: String): DataMessage<Any> { override fun active(key: String, token: String): DataMessage<Any> {
val user = this.repository.get(key)!! val user = this.repository.get(key)!!
return if (user.alive) { return if (user.available) {
DataMessage("用户${user.name}无需重复激活") DataMessage("用户${user.name}无需重复激活")
} else { } else {
if (token == user.token) { if (token == user.token) {
user.alive = true user.available = true
user.token = null user.token = null
this.repository.update(user) this.repository.update(user)
DataMessage(Status.Success, "用户${user.name}激活成功") DataMessage(Status.SUCCESS, "用户${user.name}激活成功")
} else { } else {
logger.warn(this, "用户${user.name}激活失败, {key: ${key}, token: ${token}") logger.warn(this, "用户${user.name}激活失败, {key: ${key}, token: $token")
DataMessage(Status.Failure, "用户${user.name}激活失败, 请从系统发送的邮件链接激活用户") DataMessage(Status.FAILURE, "用户${user.name}激活失败, 请从系统发送的邮件链接激活用户")
} }
} }
} }
@@ -80,7 +78,7 @@ class UserService(
DataMessage() DataMessage()
} else { } else {
logger.warn(this, "用户修改${user.name}密码失败, 旧密码验证不通过") logger.warn(this, "用户修改${user.name}密码失败, 旧密码验证不通过")
DataMessage(Status.Failure, "用户修改密码失败, 旧密码验证不通过") DataMessage(Status.FAILURE, "用户修改密码失败, 旧密码验证不通过")
} }
} }
@@ -93,19 +91,22 @@ class UserService(
this.repository.update(user) this.repository.update(user)
DataMessage() DataMessage()
} else { } else {
logger.warn(this, "用户重置${user.name}密码失败, 系统密码修改令牌:${user.token}, {key: ${key} , token: ${token}") logger.warn(
DataMessage(Status.Failure, "用户重置密码失败, 如需重置密码请从系统发送的邮件链接中重置") this,
"用户重置${user.name}密码失败, 系统密码修改令牌:${user.token}, {key: $key , token: $token"
)
DataMessage(Status.FAILURE, "用户重置密码失败, 如需重置密码请从系统发送的邮件链接中重置")
} }
} }
override fun forgotPassword(key: String): DataMessage<String> { override fun forgotPassword(key: String): DataMessage<String> {
val user = this.repository.get(key)!! val user = this.repository.get(key)!!
return if (user.alive) { return if (user.available) {
user.token = UUID.randomUUID().toString() user.token = UUID.randomUUID().toString()
this.repository.update(user) this.repository.update(user)
userNotifier?.forgot(user.id!!, user.name, user.token!!) userNotifier?.forgot(user.id!!, user.name, user.token!!)
DataMessage() DataMessage()
} else } else
DataMessage(Status.Failure, "用户还未激活, 请先激活用户") DataMessage(Status.FAILURE, "用户还未激活, 请先激活用户")
} }
} }

View File

@@ -1,15 +1,3 @@
dependencies { dependencies {
api "com.synebula:gaea:$gaea_version" api "com.synebula:gaea:$gaea_version"
} }
publishing {
publications {
publish(MavenPublication) {
group 'com.synebula'
artifactId 'zeus.env'
version "$version"
from components.java
}
}
}

View File

@@ -1,7 +0,0 @@
package com.synebula.zeus.env
enum class AuthorityType {
Default,
Deny,
Allow
}

View File

@@ -1,5 +1,8 @@
package com.synebula.zeus.env package com.synebula.zeus.env
/**
* 资源类型
*/
enum class ResourceType { enum class ResourceType {
System, System,
Page, Page,

View File

@@ -2,15 +2,3 @@ dependencies {
api project(":src:zeus.env") api project(":src:zeus.env")
api "com.synebula:gaea.mongodb:$gaea_version" api "com.synebula:gaea.mongodb:$gaea_version"
} }
publishing {
publications {
publish(MavenPublication) {
group 'com.synebula'
artifactId 'zeus.query'
version "$version"
from components.java
}
}
}

View File

@@ -1,11 +1,11 @@
package com.synebula.zeus.query.contr package com.synebula.zeus.query.contr
import com.synebula.gaea.query.IQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.db.query.IQuery
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
import com.synebula.zeus.query.view.AuthorityView import com.synebula.zeus.query.view.AuthorityView
interface IAuthorityQuery : IQuery<AuthorityView, String> { interface IAuthorityQuery : IQuery {
/** /**
* 获取角色已授权的资源 * 获取角色已授权的资源

View File

@@ -1,11 +1,11 @@
package com.synebula.zeus.query.contr package com.synebula.zeus.query.contr
import com.synebula.gaea.data.message.DataMessage import com.synebula.gaea.data.message.DataMessage
import com.synebula.gaea.query.IQuery import com.synebula.gaea.db.query.IQuery
import com.synebula.zeus.query.view.SignUserView import com.synebula.zeus.query.view.SignUserView
import com.synebula.zeus.query.view.UserView import com.synebula.zeus.query.view.UserView
interface IUserQuery : IQuery<UserView, String> { interface IUserQuery : IQuery {
/** /**
* 登录接口 * 登录接口
* *

View File

@@ -1,10 +1,10 @@
package com.synebula.zeus.query.contr.resouce package com.synebula.zeus.query.contr.resouce
import com.synebula.gaea.query.IQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.db.query.IQuery
import com.synebula.zeus.query.view.resource.InterfaceView import com.synebula.zeus.query.view.resource.InterfaceView
interface IInterfaceQuery : IQuery<InterfaceView, String> { interface IInterfaceQuery : IQuery {
fun authorized(role: String): List<InterfaceView> fun authorized(role: String): List<InterfaceView>

View File

@@ -1,14 +1,14 @@
package com.synebula.zeus.query.contr.resouce package com.synebula.zeus.query.contr.resouce
import com.synebula.gaea.query.IQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.db.query.IQuery
import com.synebula.zeus.query.view.resource.PageView import com.synebula.zeus.query.view.resource.PageView
interface IPageQuery : IQuery<PageView, String> { interface IPageQuery : IQuery {
fun authorized(role: String): List<PageView> fun authorized(role: String): List<PageView>
fun authorized(role: String, system: String? ): List<PageView> fun authorized(role: String, system: String?): List<PageView>
fun authorize(resource: String, role: String): AuthorityType? fun authorize(resource: String, role: String): AuthorityType?

View File

@@ -1,10 +1,10 @@
package com.synebula.zeus.query.contr.resouce package com.synebula.zeus.query.contr.resouce
import com.synebula.gaea.query.IQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.db.query.IQuery
import com.synebula.zeus.query.view.resource.SystemView import com.synebula.zeus.query.view.resource.SystemView
interface ISystemQuery : IQuery<SystemView, String> { interface ISystemQuery : IQuery {
fun authorized(role: String): List<SystemView> fun authorized(role: String): List<SystemView>

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.query.impl package com.synebula.zeus.query.impl
import com.synebula.gaea.mongodb.query.MongodbQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.mongodb.db.MongodbQuery
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
import com.synebula.zeus.query.contr.IAuthorityQuery import com.synebula.zeus.query.contr.IAuthorityQuery
import com.synebula.zeus.query.view.AuthorityView import com.synebula.zeus.query.view.AuthorityView
@@ -10,15 +10,14 @@ import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query import org.springframework.data.mongodb.core.query.Query
class AuthorityQuery(template: MongoTemplate) : class AuthorityQuery(template: MongoTemplate) :
MongodbQuery<AuthorityView, String>(AuthorityView::class.java, template), IAuthorityQuery { MongodbQuery(template), IAuthorityQuery {
var collection = this.collection(this.clazz)
override fun authorized(resourceType: ResourceType, role: String): List<AuthorityView> { override fun authorized(resourceType: ResourceType, role: String): List<AuthorityView> {
return this.template.find( return this.template.find(
Query.query( Query.query(
Criteria.where("type").`is`(resourceType) Criteria.where("type").`is`(resourceType)
.and("role").`is`(role) .and("role").`is`(role)
), this.clazz, this.collection ), AuthorityView::class.java, this.collection(AuthorityView::class.java)
) )
} }
@@ -28,7 +27,7 @@ class AuthorityQuery(template: MongoTemplate) :
Criteria.where("type").`is`(resourceType) Criteria.where("type").`is`(resourceType)
.and("resource").`is`(resource) .and("resource").`is`(resource)
.and("role").`is`(role) .and("role").`is`(role)
), this.clazz, this.collection ), AuthorityView::class.java, this.collection(AuthorityView::class.java)
) )
return authority?.authority ?: AuthorityType.Default return authority?.authority ?: AuthorityType.Default
} }

View File

@@ -2,8 +2,9 @@ package com.synebula.zeus.query.impl
import com.synebula.gaea.data.message.DataMessage import com.synebula.gaea.data.message.DataMessage
import com.synebula.gaea.data.message.Status import com.synebula.gaea.data.message.Status
import com.synebula.gaea.data.permission.PermissionType
import com.synebula.gaea.ext.toMd5 import com.synebula.gaea.ext.toMd5
import com.synebula.gaea.mongodb.query.MongodbQuery import com.synebula.gaea.mongodb.db.MongodbQuery
import com.synebula.gaea.mongodb.whereId import com.synebula.gaea.mongodb.whereId
import com.synebula.zeus.query.contr.IUserQuery import com.synebula.zeus.query.contr.IUserQuery
import com.synebula.zeus.query.view.GroupView import com.synebula.zeus.query.view.GroupView
@@ -16,15 +17,15 @@ import org.springframework.data.mongodb.core.query.Query
import org.springframework.data.mongodb.core.query.isEqualTo import org.springframework.data.mongodb.core.query.isEqualTo
class UserQuery(template: MongoTemplate) : class UserQuery(template: MongoTemplate) :
MongodbQuery<UserView, String>(UserView::class.java, template), IUserQuery { MongodbQuery(template), IUserQuery {
override fun signIn(name: String, password: String): DataMessage<SignUserView> { override fun signIn(name: String, password: String): DataMessage<SignUserView> {
val query = Query.query( val query = Query.query(
Criteria.where("name").isEqualTo(name) Criteria.where("name").isEqualTo(name)
.and("password").isEqualTo(password.toMd5()) .and("password").isEqualTo(password.toMd5())
.and("alive").isEqualTo(true) .and("avalible").isEqualTo(true)
) )
val user = this.template.findOne(query, this.clazz, "user") val user = this.template.findOne(query, UserView::class.java, "user")
return if (user != null) { return if (user != null) {
val role = this.template.findOne(whereId(user.role), RoleView::class.java, "role") val role = this.template.findOne(whereId(user.role), RoleView::class.java, "role")
val group = this.template.findOne(whereId(user.group), GroupView::class.java, "group") val group = this.template.findOne(whereId(user.group), GroupView::class.java, "group")
@@ -32,15 +33,16 @@ class UserQuery(template: MongoTemplate) :
SignUserView( SignUserView(
user.id, user.realName ?: "", user.id, user.realName ?: "",
user.role ?: "", role?.name ?: "", user.role ?: "", role?.name ?: "",
user.group ?: "", group?.name ?: "" user.group ?: "", group?.name ?: "",
role?.permissionType ?: PermissionType.None
) )
) )
} else } else
DataMessage(Status.Failure, "用户名或密码错误") DataMessage(Status.FAILURE, "用户名或密码错误")
} }
override fun listUsers(idList: List<String>): List<UserView> { override fun listUsers(idList: List<String>): List<UserView> {
return this.template.find(Query.query(Criteria.where("_id").`in`(idList)), this.clazz, "user") return this.template.find(Query.query(Criteria.where("_id").`in`(idList)), UserView::class.java, "user")
} }
} }

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.query.impl.resouce package com.synebula.zeus.query.impl.resouce
import com.synebula.gaea.mongodb.query.MongodbQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.mongodb.db.MongodbQuery
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
import com.synebula.zeus.query.contr.IAuthorityQuery import com.synebula.zeus.query.contr.IAuthorityQuery
import com.synebula.zeus.query.contr.resouce.IInterfaceQuery import com.synebula.zeus.query.contr.resouce.IInterfaceQuery
@@ -13,7 +13,7 @@ class InterfaceQuery(
template: MongoTemplate, template: MongoTemplate,
var authorityQuery: IAuthorityQuery, var authorityQuery: IAuthorityQuery,
var systemQuery: ISystemQuery var systemQuery: ISystemQuery
) : MongodbQuery<InterfaceView, String>(InterfaceView::class.java, template), IInterfaceQuery { ) : MongodbQuery(template), IInterfaceQuery {
override fun authorized(role: String): List<InterfaceView> { override fun authorized(role: String): List<InterfaceView> {
return this.authorized(role, null) return this.authorized(role, null)
@@ -26,9 +26,9 @@ class InterfaceQuery(
if (authority == AuthorityType.Deny) if (authority == AuthorityType.Deny)
return listOf() return listOf()
} }
val params = mutableMapOf<String, Any>() val params = mutableMapOf<String, String>()
if (system != null) params["system"] = system if (system != null) params["system"] = system
val interfaces = this.list(params) val interfaces = this.list(params, InterfaceView::class.java)
val authorities = this.authorityQuery.authorized(ResourceType.Interface, role) val authorities = this.authorityQuery.authorized(ResourceType.Interface, role)
return interfaces.filter { i -> return interfaces.filter { i ->
val authority = authorities.find { p -> i.id == p.resource } val authority = authorities.find { p -> i.id == p.resource }

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.query.impl.resouce package com.synebula.zeus.query.impl.resouce
import com.synebula.gaea.mongodb.query.MongodbQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.mongodb.db.MongodbQuery
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
import com.synebula.zeus.query.contr.IAuthorityQuery import com.synebula.zeus.query.contr.IAuthorityQuery
import com.synebula.zeus.query.contr.resouce.IPageQuery import com.synebula.zeus.query.contr.resouce.IPageQuery
@@ -12,7 +12,7 @@ import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query import org.springframework.data.mongodb.core.query.Query
class PageQuery(template: MongoTemplate, var authorityQuery: IAuthorityQuery, var systemQuery: ISystemQuery) : class PageQuery(template: MongoTemplate, var authorityQuery: IAuthorityQuery, var systemQuery: ISystemQuery) :
MongodbQuery<PageView, String>(PageView::class.java, template), IPageQuery { MongodbQuery(template), IPageQuery {
override fun authorized(role: String): List<PageView> { override fun authorized(role: String): List<PageView> {
return this.authorized(role, null) return this.authorized(role, null)
@@ -24,9 +24,9 @@ class PageQuery(template: MongoTemplate, var authorityQuery: IAuthorityQuery, va
if (authority == AuthorityType.Deny) if (authority == AuthorityType.Deny)
return listOf() return listOf()
} }
val params = mutableMapOf<String, Any>() val params = mutableMapOf<String, String>()
if (system != null) params["system"] = system if (system != null) params["system"] = system
val pages = this.list(params) val pages = this.list(params, PageView::class.java)
val authorities = this.authorityQuery.authorized(ResourceType.Page, role) val authorities = this.authorityQuery.authorized(ResourceType.Page, role)
return pages.filter { i -> return pages.filter { i ->
val authority = authorities.find { p -> i.id == p.resource } val authority = authorities.find { p -> i.id == p.resource }
@@ -41,7 +41,7 @@ class PageQuery(template: MongoTemplate, var authorityQuery: IAuthorityQuery, va
override fun uriAuthorize(path: String, role: String): AuthorityType? { override fun uriAuthorize(path: String, role: String): AuthorityType? {
val page = this.template.findOne( val page = this.template.findOne(
Query.query(Criteria.where("uri").`is`(path)), Query.query(Criteria.where("uri").`is`(path)),
this.clazz, this.collection(this.clazz) PageView::class.java, this.collection(PageView::class.java)
) ?: return null ) ?: return null
return this.authorize(page.id!!, role) return this.authorize(page.id!!, role)
} }

View File

@@ -1,7 +1,7 @@
package com.synebula.zeus.query.impl.resouce package com.synebula.zeus.query.impl.resouce
import com.synebula.gaea.mongodb.query.MongodbQuery import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.mongodb.db.MongodbQuery
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
import com.synebula.zeus.query.contr.IAuthorityQuery import com.synebula.zeus.query.contr.IAuthorityQuery
import com.synebula.zeus.query.contr.resouce.ISystemQuery import com.synebula.zeus.query.contr.resouce.ISystemQuery
@@ -9,10 +9,10 @@ import com.synebula.zeus.query.view.resource.SystemView
import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.data.mongodb.core.MongoTemplate
class SystemQuery(template: MongoTemplate, var authorityQuery: IAuthorityQuery) : class SystemQuery(template: MongoTemplate, var authorityQuery: IAuthorityQuery) :
MongodbQuery<SystemView, String>(SystemView::class.java, template), ISystemQuery { MongodbQuery(template), ISystemQuery {
override fun authorized(role: String): List<SystemView> { override fun authorized(role: String): List<SystemView> {
val systems = this.list(mapOf()) val systems = this.list(mapOf(), SystemView::class.java)
val authorities = this.authorityQuery.authorized(ResourceType.System, role) val authorities = this.authorityQuery.authorized(ResourceType.System, role)
return systems.filter { i -> authorities.find { p -> i.id == p.resource }?.authority == AuthorityType.Allow } return systems.filter { i -> authorities.find { p -> i.id == p.resource }?.authority == AuthorityType.Allow }
} }

View File

@@ -1,6 +1,6 @@
package com.synebula.zeus.query.view package com.synebula.zeus.query.view
import com.synebula.zeus.env.AuthorityType import com.synebula.gaea.data.permission.AuthorityType
import com.synebula.zeus.env.ResourceType import com.synebula.zeus.env.ResourceType
class AuthorityView() { class AuthorityView() {

View File

@@ -1,15 +1,15 @@
package com.synebula.zeus.query.view package com.synebula.zeus.query.view
import com.synebula.gaea.query.Operator import com.synebula.gaea.db.query.Operator
import com.synebula.gaea.query.Table import com.synebula.gaea.db.query.Table
import com.synebula.gaea.query.Where import com.synebula.gaea.db.query.Where
@Table("group") @Table("group")
class GroupView { class GroupView {
var id: String? = null var id: String? = null
@Where(Operator.like) @Where(Operator.Like)
var name = "" var name = ""
var desc = "" var desc = ""

View File

@@ -1,10 +1,12 @@
package com.synebula.zeus.query.view package com.synebula.zeus.query.view
import com.synebula.gaea.query.Table import com.synebula.gaea.data.permission.PermissionType
import com.synebula.gaea.db.query.Table
@Table("role") @Table("role")
class RoleView { class RoleView {
var id: String? = null var id: String? = null
var name = "" var name = ""
var desc = "" var desc = ""
var permissionType = PermissionType.Minimum
} }

View File

@@ -1,5 +1,7 @@
package com.synebula.zeus.query.view package com.synebula.zeus.query.view
import com.synebula.gaea.data.permission.PermissionType
class SignUserView( class SignUserView(
/** /**
* 用户id * 用户id
@@ -30,5 +32,7 @@ class SignUserView(
* 组名称 * 组名称
*/ */
var gname: String = "", var gname: String = "",
var remember: Boolean = false var permissionType: PermissionType = PermissionType.Minimum,
var remember: Boolean = false,
var token: String = ""
) )

View File

@@ -1,8 +1,8 @@
package com.synebula.zeus.query.view package com.synebula.zeus.query.view
import com.synebula.gaea.query.Operator import com.synebula.gaea.db.query.Operator
import com.synebula.gaea.query.Table import com.synebula.gaea.db.query.Table
import com.synebula.gaea.query.Where import com.synebula.gaea.db.query.Where
@Table("user") @Table("user")
class UserView { class UserView {
@@ -12,7 +12,7 @@ class UserView {
var password: String = "" var password: String = ""
@Where(Operator.like) @Where(Operator.Like)
var realName: String? = null var realName: String? = null
var phone: String? = null var phone: String? = null
@@ -23,5 +23,5 @@ class UserView {
var token: String? = null var token: String? = null
var alive: Boolean? = null var avalible: Boolean? = null
} }

View File

@@ -2,5 +2,5 @@ package com.synebula.zeus.query.view.resource
class InterfaceView : ResourceView() { class InterfaceView : ResourceView() {
var system = "" var system = ""
var alive = true var avalible = true
} }

View File

@@ -14,6 +14,6 @@ class PageView : ResourceView() {
// 所属系统 // 所属系统
var system = "" var system = ""
var alive = true var avalible = true
} }

View File

@@ -2,5 +2,5 @@ package com.synebula.zeus.query.view.resource
class SystemView : ResourceView() { class SystemView : ResourceView() {
var alive = true var avalible = true
} }

View File

@@ -3,15 +3,3 @@ dependencies {
api project(":src:zeus.domain") api project(":src:zeus.domain")
api "com.synebula:gaea.mongodb:$gaea_version" api "com.synebula:gaea.mongodb:$gaea_version"
} }
publishing {
publications {
publish(MavenPublication) {
group 'com.synebula'
artifactId 'zeus.repository'
version "$version"
from components.java
}
}
}