增加管理员登录接口

增加管理员令牌表
master
pan 4 years ago
parent f9a31eed5b
commit 1b5c6cb58a
  1. 36
      src/Controller.kt
  2. 30
      src/Dao.kt
  3. 2
      src/MySQL.kt
  4. 107
      src/Service.kt
  5. 33
      src/Vo.kt
  6. 5
      test/ApplicationTest.kt

@ -50,21 +50,37 @@ fun Application.AccountController() {
} }
} }
//TODO 封装前后台登录逻辑
route(path = "/login") { route(path = "/login") {
post { route(path = ReceiverType.Foreground.name.toLowerCase()){
val userLoginVo = call.receive<UserLoginVo>() post {
environment.log.info("执行登陆") val userLoginVo = call.receive<UserLoginVo>()
val token = AccountService.login(userLoginVo, call.request.host()) val token = AccountService.login(userLoginVo, call.request.host())
environment.log.info("登录请求处理完毕") call.respond(ApiResponse(message = if (token != null) "登陆成功" else "账号或密码错误!!!", body = token))
call.respond(ApiResponse(message = if (token != null) "登陆成功" else "账号或密码错误!!!", body = token)) }
post("/token"){
val tokenVo = call.receive<Token>()
val isValid = AccountService.validToken(tokenVo)
call.respond(ApiResponse(message = if (isValid) "令牌合法" else "令牌不合法", body = isValid))
}
} }
post(path = "/token") { route(path = ReceiverType.Background.name.toLowerCase()){
val tokenVo = call.receive<Token>() post{
val isValid = AccountService.validToken(tokenVo) val managerLoginVo = call.receive<ManagerLoginVo>()
call.respond(ApiResponse(message = if (isValid) "令牌合法" else "令牌不合法", body = isValid)) val token = AccountService.login(managerLoginVo, call.request.host())
call.respond(ApiResponse(message = if (token != null) "登陆成功" else "账号或密码错误!!!", body = token))
}
post("/token"){
val tokenVo = call.receive<Token>()
val isValid = AccountService.validManagerToken(tokenVo)
call.respond(ApiResponse(message = if (isValid) "令牌合法" else "令牌不合法", body = isValid))
}
} }
} }
post(path = "/logout") { post(path = "/logout") {
environment.log.info("退出登录") environment.log.info("退出登录")
val userLogoutVo = call.receive<UserLogoutVo>() val userLogoutVo = call.receive<UserLogoutVo>()

@ -30,12 +30,7 @@ class User(id:EntityID<Int>):IntEntity(id){
var password by Users.password var password by Users.password
} }
@TableComment("用户授权令牌") open class BaseTokens:IntIdTable(){
object UserTokens: IntIdTable(){
@TableComment("授权用户")
val userId:Column<EntityID<Int>> = reference("user_id",Users)
@TableComment("令牌") @TableComment("令牌")
val token:Column<String> = varchar(name="token",length = 32) val token:Column<String> = varchar(name="token",length = 32)
@ -49,6 +44,12 @@ object UserTokens: IntIdTable(){
val device:Column<String> = varchar(name="device",length = 256) val device:Column<String> = varchar(name="device",length = 256)
} }
@TableComment("用户授权令牌")
object UserTokens: BaseTokens(){
@TableComment("授权用户")
val userId:Column<EntityID<Int>> = reference("user_id",Users)
}
class UserToken(id:EntityID<Int>):IntEntity(id){ class UserToken(id:EntityID<Int>):IntEntity(id){
companion object:IntEntityClass<UserToken>(UserTokens) companion object:IntEntityClass<UserToken>(UserTokens)
var user by User referencedOn UserTokens.userId var user by User referencedOn UserTokens.userId
@ -58,6 +59,23 @@ class UserToken(id:EntityID<Int>):IntEntity(id){
var device by UserTokens.device var device by UserTokens.device
} }
@TableComment("管理员授权令牌")
object ManagerTokens:BaseTokens(){
@TableComment("授权管理员")
val managerId:Column<EntityID<Int>> = reference("manager_id",Managers)
}
class ManagerToken(id:EntityID<Int>):IntEntity(id){
companion object:IntEntityClass<ManagerToken>(ManagerTokens)
var manager by Manager referencedOn ManagerTokens.managerId
var token by ManagerTokens.token
var ip by ManagerTokens.ip
var createTime by ManagerTokens.createTime
var device by ManagerTokens.device
}
@TableComment("留言") @TableComment("留言")
object LeaveMessages:IntIdTable(){ object LeaveMessages:IntIdTable(){
@TableComment("留言用户") @TableComment("留言用户")

@ -40,7 +40,7 @@ fun Application.MySQL(testing: Boolean = false){
fun initTable(){ fun initTable(){
transaction { transaction {
val tableList= arrayOf(Users,UserTokens,LeaveMessages,ImageFiles,Associations,Managers,CheckForms,Notifications) val tableList= arrayOf(Users,UserTokens,LeaveMessages,ImageFiles,Associations,Managers,CheckForms,Notifications,ManagerTokens)
SchemaUtils.createMissingTablesAndColumns(*tableList) SchemaUtils.createMissingTablesAndColumns(*tableList)
updateComment(*tableList) updateComment(*tableList)

@ -56,14 +56,12 @@ object AccountService:AbstractService() {
} }
/** /**
* 登录 * 前台登录
* *
* @param userLoginVo 登陆表单
*/ */
fun login(userLoginVo: UserLoginVo,_ip:String):Token?{ fun login(userLoginVo: UserLoginVo,_ip:String):Token?{
return transaction { return transaction {
val matchUser=User.find { Users.studentId eq userLoginVo.studentId }.firstOrNull() val matchUser=User.find { Users.studentId eq userLoginVo.studentId }.firstOrNull()
when { when {
matchUser==null -> { matchUser==null -> {
log.warn("学号:${userLoginVo.studentId}不存在") log.warn("学号:${userLoginVo.studentId}不存在")
@ -89,6 +87,43 @@ object AccountService:AbstractService() {
} }
} }
fun login(managerLoginVo: ManagerLoginVo, _ip:String):Token?{
return transaction {
val matchUser=Manager.find { Managers.account eq managerLoginVo.account }.firstOrNull()
when {
matchUser==null -> {
log.warn("学号:${managerLoginVo.account}不存在")
return@transaction null
}
managerLoginVo.password.md5() != matchUser.password -> {
log.warn("密码:${managerLoginVo.password}错误")
return@transaction null
}
else -> {
val token=ManagerToken.new{
manager=matchUser
ip=_ip
device=managerLoginVo.device
token=listOf(matchUser.id,ip,device).joinToString(separator = ('a' .. 'z').random().toString()).md5()
}
token.flush()
return@transaction Token(id = matchUser.id.value,token = token.token,
createTime = token.createTime.toEpochSecond(
ZoneOffset.of("+8")))
}
}
}
}
fun validManagerToken(token:Token):Boolean{
return transaction {
!ManagerToken.find {
ManagerTokens.managerId eq token.id
ManagerTokens.token eq token.token
}.empty()
}
}
fun validToken(token: Token):Boolean{ fun validToken(token: Token):Boolean{
return transaction { return transaction {
!UserToken.find { !UserToken.find {
@ -256,11 +291,19 @@ object FileService:AbstractService(){
} }
} }
/** /**
* 社团服务 * 社团服务
*/ */
object AssociationService: AbstractService() { object AssociationService: AbstractService() {
/**
* 注册社团
*
* @param vo
* @return
*/
fun register(vo:RegAssociationVo):Boolean{ fun register(vo:RegAssociationVo):Boolean{
return try { return try {
transaction { transaction {
@ -275,6 +318,14 @@ object AssociationService: AbstractService() {
receiverId=vo.token.id receiverId=vo.token.id
receiverClient=ReceiverType.Foreground.name receiverClient=ReceiverType.Foreground.name
} }
val user=User.findById(vo.token.id)
if(user!=null) {
BackgroundService.createBackgroundNotification(title = "审核注册社团",content = "用户${user.name}提交了一份社团资料需要您进行受理",
duty = Duty.PamphaBhusal)
}else{
log.warn("无法根据token id:${vo.token.id}查找到用户名")
}
return@transaction true
} }
log.info("未审核社团创建成功") log.info("未审核社团创建成功")
true true
@ -285,7 +336,7 @@ object AssociationService: AbstractService() {
} }
} }
enum class ManagerType(val desc:String,val level:Int){ enum class Duty(val desc:String, val level:Int){
Teacher("老师",1), Teacher("老师",1),
PamphaBhusal("总部长",2), PamphaBhusal("总部长",2),
SecretaryOfTheMinister("秘书部部长",3), SecretaryOfTheMinister("秘书部部长",3),
@ -338,7 +389,6 @@ object NotificationService:AbstractService(){
} }
/** /**
* TODO
* *
* @param vo * @param vo
* @return * @return
@ -373,17 +423,38 @@ object BackgroundService:AbstractService(){
initManager() initManager()
} }
private fun createManager(type:ManagerType, num:Int=1): MutableList<InitManagerDto> { /**
* 前台任务通知管理员处理
*
*/
fun createBackgroundNotification(content:String,title:String,duty: Duty){
Manager.find { Managers.duty eq duty.name }.apply {
if(count()==0L){
log.warn("找不到适当的${duty.desc}处理此任务")
}else{
forEach {
Notification.new {
this.title = title
this.content = content
receiverId= it.id.value
receiverClient=ReceiverType.Background.name
}
}
}
}
}
private fun createManager(duty:Duty, num:Int=1): MutableList<InitManagerDto> {
val managerList= mutableListOf<InitManagerDto>() val managerList= mutableListOf<InitManagerDto>()
repeat(num){ repeat(num){
val originPassword=randomNum() val originPassword=randomNum()
Manager.new { Manager.new {
account= randomNum() account= randomNum()
password = originPassword.md5() password = originPassword.md5()
duty=type.name this.duty =duty.name
level=type.level level=duty.level
}.apply { }.apply {
managerList.add(InitManagerDto(account=account,originPassword=originPassword)) managerList.add(InitManagerDto(account=account,originPassword=originPassword,duty=duty))
} }
} }
return managerList return managerList
@ -398,20 +469,20 @@ object BackgroundService:AbstractService(){
Manager.count().let { it -> Manager.count().let { it ->
if (it.toInt() == 0) { if (it.toInt() == 0) {
val allManager = mutableListOf<InitManagerDto>() val allManager = mutableListOf<InitManagerDto>()
allManager.addAll(createManager(ManagerType.Teacher, 1)) allManager.addAll(createManager(Duty.Teacher, 1))
allManager.addAll(createManager(ManagerType.PamphaBhusal, 1)) allManager.addAll(createManager(Duty.PamphaBhusal, 1))
allManager.addAll(createManager(ManagerType.SecretaryOfTheMinister, 1)) allManager.addAll(createManager(Duty.SecretaryOfTheMinister, 1))
allManager.addAll(createManager(ManagerType.PropagandaDepartment, 1)) allManager.addAll(createManager(Duty.PropagandaDepartment, 1))
allManager.addAll(createManager(ManagerType.LiaisonMinister, 1)) allManager.addAll(createManager(Duty.LiaisonMinister, 1))
arrayOf( arrayOf(
ManagerType.SecretaryDepartmentOfficer, Duty.SecretaryDepartmentOfficer,
ManagerType.PublicityDepartmentOfficer, Duty.PublicityDepartmentOfficer,
ManagerType.LiaisonOfficer Duty.LiaisonOfficer
).forEach { ).forEach {
allManager.addAll(createManager(it, 3)) allManager.addAll(createManager(it, 3))
} }
allManager.forEach { allManager.forEach {
file.appendText("${it.account}------${it.originPassword}\n") file.appendText("${it.account}------${it.originPassword}------${it.duty.desc}\n")
} }
log.info("共生成${allManager.size}个管理员账号") log.info("共生成${allManager.size}个管理员账号")
} else { } else {

@ -15,27 +15,29 @@ class Simple {
} }
} }
/**
* 用户注册表单
*
* @property studentId 学号
* @property name 姓名
*/
data class UserVo(val studentId:String,val name:String) data class UserVo(val studentId:String,val name:String)
/** sealed class BaseLoginVo{
* 用户登陆表单 abstract val password: String
* abstract val device: String
* @property studentId 学号 abstract val clientType:ReceiverType
* @property password 密码 }
* @property device 设备型号
*/ data class UserLoginVo(val studentId: String,
data class UserLoginVo(val studentId: String,val password: String,val device: String) override val password: String, override val device: String,
override val clientType: ReceiverType=ReceiverType.Foreground
):BaseLoginVo()
data class UserLogoutVo(val userId:Int) data class UserLogoutVo(val userId:Int)
data class UserResDto(val password:String) data class UserResDto(val password:String)
data class ManagerLoginVo(val account:String,
override val password:String, override val device:String):BaseLoginVo() {
override val clientType: ReceiverType=ReceiverType.Background
}
data class Token(val token:String, val createTime:Long, val id:Int) data class Token(val token:String, val createTime:Long, val id:Int)
sealed class BaseVo{ sealed class BaseVo{
@ -45,7 +47,6 @@ sealed class BaseVo{
data class LeaveMessageVo(val message: String, override val token:Token):BaseVo() data class LeaveMessageVo(val message: String, override val token:Token):BaseVo()
data class OnlyToken(override val token: Token):BaseVo() data class OnlyToken(override val token: Token):BaseVo()
//data class PageVo(val pageSize:Int=10,val page:, override val token: Token):BaseVo()
data class LeaveMessageDto(val message: String,val user: UserVo) data class LeaveMessageDto(val message: String,val user: UserVo)
@ -55,7 +56,7 @@ data class ImageFileDto(val filepath:String,val md5:String,val createTime: Long,
data class RegAssociationDto(val name:String,val desc:String,val logo:ImageFileDto) data class RegAssociationDto(val name:String,val desc:String,val logo:ImageFileDto)
data class InitManagerDto(val account:String,val originPassword:String) data class InitManagerDto(val account: String, val originPassword: String, val duty: Duty)
data class PageDto(val currentPage:Long,val pageSize:Int=10) data class PageDto(val currentPage:Long,val pageSize:Int=10)

@ -93,6 +93,11 @@ class ApplicationTest {
println(format.format) println(format.format)
} }
@Test
fun testLowerCase(){
println(ReceiverType.Foreground.name.toLowerCase())
}
/** /**
* 文档生成 * 文档生成
*/ */

Loading…
Cancel
Save