Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
cms-ci-test
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
test-ci
cms-ci-test
Commits
ace6ad4a
提交
ace6ad4a
authored
5月 26, 2023
作者:
zhenjie
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
后台用户相关接口
上级
dd11be86
隐藏空白字符变更
内嵌
并排
正在显示
40 个修改的文件
包含
2442 行增加
和
19 行删除
+2442
-19
BaseAccountDTO.java
...main/java/com/mmc/iuav/user/model/dto/BaseAccountDTO.java
+38
-0
LoginSuccessDTO.java
...ain/java/com/mmc/iuav/user/model/dto/LoginSuccessDTO.java
+25
-0
UserAccountSimpleDTO.java
...ava/com/mmc/iuav/user/model/dto/UserAccountSimpleDTO.java
+5
-0
BUserAccountQO.java
.../main/java/com/mmc/iuav/user/model/qo/BUserAccountQO.java
+69
-0
LoginUserQO.java
...src/main/java/com/mmc/iuav/user/model/qo/LoginUserQO.java
+26
-0
BUserAccountVO.java
.../main/java/com/mmc/iuav/user/model/vo/BUserAccountVO.java
+83
-0
UserAccountVO.java
...c/main/java/com/mmc/iuav/user/model/vo/UserAccountVO.java
+6
-0
UserTagVO.java
...l/src/main/java/com/mmc/iuav/user/model/vo/UserTagVO.java
+26
-0
JwtUtil.java
...-common-util/src/main/java/com/mmc/iuav/auth/JwtUtil.java
+3
-4
CodeUtil.java
...mon-util/src/main/java/com/mmc/iuav/general/CodeUtil.java
+4
-0
Create.java
...-common-util/src/main/java/com/mmc/iuav/group/Create.java
+9
-0
Freeze.java
...-common-util/src/main/java/com/mmc/iuav/group/Freeze.java
+9
-0
UpdatePassword.java
...util/src/main/java/com/mmc/iuav/group/UpdatePassword.java
+9
-0
BizException.java
...on-util/src/main/java/com/mmc/iuav/http/BizException.java
+90
-0
BaseInfoQO.java
...mmon-util/src/main/java/com/mmc/iuav/page/BaseInfoQO.java
+44
-0
PageResult.java
...mmon-util/src/main/java/com/mmc/iuav/page/PageResult.java
+49
-0
TimePage.java
...common-util/src/main/java/com/mmc/iuav/page/TimePage.java
+34
-0
ResultEnum.java
...-util/src/main/java/com/mmc/iuav/response/ResultEnum.java
+14
-1
BCrypt.java
...ice-user/src/main/java/com/mmc/iuav/user/auth/BCrypt.java
+927
-0
BCryptPasswordEncoder.java
...in/java/com/mmc/iuav/user/auth/BCryptPasswordEncoder.java
+156
-0
PasswordEncoder.java
...src/main/java/com/mmc/iuav/user/auth/PasswordEncoder.java
+40
-0
PwdUtil.java
...ce-user/src/main/java/com/mmc/iuav/user/auth/PwdUtil.java
+18
-0
AuthController.java
...ain/java/com/mmc/iuav/user/controller/AuthController.java
+16
-0
BackUserAccountController.java
...m/mmc/iuav/user/controller/BackUserAccountController.java
+93
-0
BaseController.java
...ain/java/com/mmc/iuav/user/controller/BaseController.java
+34
-0
CooperationController.java
...a/com/mmc/iuav/user/controller/CooperationController.java
+7
-0
UserAccountController.java
...a/com/mmc/iuav/user/controller/UserAccountController.java
+4
-7
CooperationDao.java
...r/src/main/java/com/mmc/iuav/user/dao/CooperationDao.java
+20
-0
UserServiceDao.java
...r/src/main/java/com/mmc/iuav/user/dao/UserServiceDao.java
+59
-0
UserAccountDO.java
...src/main/java/com/mmc/iuav/user/entity/UserAccountDO.java
+22
-2
UserTagDO.java
...ser/src/main/java/com/mmc/iuav/user/entity/UserTagDO.java
+37
-0
UserAccountStatus.java
.../main/java/com/mmc/iuav/user/enums/UserAccountStatus.java
+34
-0
AuthService.java
.../src/main/java/com/mmc/iuav/user/service/AuthService.java
+15
-0
CooperationService.java
...in/java/com/mmc/iuav/user/service/CooperationService.java
+8
-0
UserAccountService.java
...in/java/com/mmc/iuav/user/service/UserAccountService.java
+61
-0
AuthServiceImpl.java
.../java/com/mmc/iuav/user/service/impl/AuthServiceImpl.java
+53
-3
CooperationServiceImpl.java
...om/mmc/iuav/user/service/impl/CooperationServiceImpl.java
+17
-0
UserAccountServiceImpl.java
...om/mmc/iuav/user/service/impl/UserAccountServiceImpl.java
+142
-0
CooperationDao.xml
...service-user/src/main/resources/mapper/CooperationDao.xml
+16
-0
UserServiceDao.xml
...service-user/src/main/resources/mapper/UserServiceDao.xml
+120
-2
没有找到文件。
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/dto/BaseAccountDTO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
dto
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年11月4日 下午2:38:36
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
BaseAccountDTO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2979712090903806216L
;
private
Integer
id
;
private
String
uid
;
private
String
accountPhone
;
private
String
accountNo
;
private
String
accountName
;
private
String
tokenPort
;
// @ApiModelProperty(value = "角色ID")
// private Integer roleId;
// @ApiModelProperty(value = "是否为管理角色:0否 1是")
// private Integer admin;// 是否为管理角色
// @ApiModelProperty(value = "是否为运营角色:0否 1是")
// private Integer operate;
// @ApiModelProperty(value = "是否PMC发货专员:0否 1是")
// private Integer pmc;
// @ApiModelProperty(value = "单位信息")
// private CompanyCacheDTO companyInfo;// 单位信息
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/dto/LoginSuccessDTO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
dto
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午8:06:14
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
LoginSuccessDTO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
1200834589953161925L
;
private
String
token
;
private
Integer
userAccountId
;
private
String
accountNo
;
// private RoleInfoDTO roleInfo;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/dto/UserAccountSimpleDTO.java
浏览文件 @
ace6ad4a
...
...
@@ -22,6 +22,8 @@ public class UserAccountSimpleDTO implements Serializable {
private
Integer
id
;
@ApiModelProperty
(
value
=
"用户类型"
)
private
Integer
accountType
;
@ApiModelProperty
(
value
=
"用户账号"
)
private
String
accountNo
;
@ApiModelProperty
(
value
=
"用户uid"
)
private
String
uid
;
@ApiModelProperty
(
value
=
"手机号"
)
...
...
@@ -44,4 +46,6 @@ public class UserAccountSimpleDTO implements Serializable {
private
Integer
portType
;
@ApiModelProperty
(
value
=
"企业认证状态, 0未通过,1通过"
)
private
Integer
companyAuthStatus
;
@ApiModelProperty
(
value
=
"合作标签id"
)
private
Integer
cooperationTagId
;
}
\ No newline at end of file
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/qo/BUserAccountQO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
qo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.springframework.data.domain.Page
;
import
javax.validation.constraints.Min
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* @author: zj
* @Date: 2023/5/25 13:32
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
BUserAccountQO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
value
=
"关键字"
,
required
=
false
)
private
String
keyword
;
@ApiModelProperty
(
value
=
"地区"
,
required
=
false
)
private
String
area
;
@ApiModelProperty
(
value
=
"省份编码"
,
required
=
false
)
private
Integer
provinceCode
;
@ApiModelProperty
(
value
=
"城市编码"
,
required
=
false
)
private
Integer
cityCode
;
@ApiModelProperty
(
value
=
"县区编码"
,
required
=
false
)
private
Integer
districtCode
;
@ApiModelProperty
(
value
=
"角色id"
,
required
=
false
)
private
Integer
roleId
;
@ApiModelProperty
(
value
=
"账号状态:0禁用 1可用"
)
private
Integer
accountStatus
;
@ApiModelProperty
(
value
=
"账号状态:0合伙人 1员工"
)
private
Integer
userType
;
@ApiModelProperty
(
value
=
"用户id集合"
)
private
List
<
Integer
>
userIds
;
@ApiModelProperty
(
value
=
"推荐单位id"
)
private
Integer
rcdCompanyId
;
@ApiModelProperty
(
value
=
"单位集合"
,
hidden
=
true
)
private
List
<
Integer
>
companys
;
@ApiModelProperty
(
value
=
"页码"
,
required
=
true
)
@NotNull
(
message
=
"页码不能为空"
,
groups
=
Page
.
class
)
@Min
(
value
=
1
,
groups
=
Page
.
class
)
private
Integer
pageNo
;
@ApiModelProperty
(
value
=
"每页显示数"
,
required
=
true
)
@NotNull
(
message
=
"每页显示数不能为空"
,
groups
=
Page
.
class
)
@Min
(
value
=
1
,
groups
=
Page
.
class
)
private
Integer
pageSize
;
public
void
buildCurrentPage
()
{
this
.
pageNo
=
(
pageNo
-
1
)
*
pageSize
;
}
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/qo/LoginUserQO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
qo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
/**
* @author: zj
* @Date: 2023/5/25 10:39
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
LoginUserQO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
6148830939265702460L
;
@ApiModelProperty
(
value
=
"登录账号"
)
@NotNull
(
message
=
"登录账号不能为空"
)
private
String
accountNo
;
@ApiModelProperty
(
value
=
"登录密码"
)
@NotNull
(
message
=
"登录密码不能为空"
)
private
String
passWord
;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/BUserAccountVO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
vo
;
import
com.mmc.iuav.group.Create
;
import
com.mmc.iuav.group.Update
;
import
com.mmc.iuav.group.UpdatePassword
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
javax.validation.constraints.Email
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
import
java.io.Serializable
;
/**
* @author: zj
* @Date: 2023/5/25 11:15
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
BUserAccountVO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
5809674104674997410L
;
@ApiModelProperty
(
value
=
"id"
)
@NotNull
(
message
=
"更新时ID不能为空"
,
groups
=
{
Update
.
class
,
UpdatePassword
.
class
})
private
Integer
id
;
@ApiModelProperty
(
value
=
"账号"
,
example
=
"developer"
)
@NotEmpty
(
message
=
"账号不能为空"
,
groups
=
{
Create
.
class
,
Update
.
class
})
private
String
accountNo
;
@ApiModelProperty
(
value
=
"姓名"
,
example
=
"张三丰"
)
@NotEmpty
(
message
=
"姓名不能为空"
,
groups
=
{
Create
.
class
,
Update
.
class
})
private
String
userName
;
@ApiModelProperty
(
value
=
"电话"
,
example
=
"13700137000"
)
@NotEmpty
(
message
=
"创建,修改时电话不能为空"
,
groups
=
{
Create
.
class
,
Update
.
class
})
private
String
phoneNum
;
@ApiModelProperty
(
value
=
"密码"
,
example
=
"123456"
)
@NotEmpty
(
message
=
"创建密码不能为空"
,
groups
=
{
Create
.
class
,
UpdatePassword
.
class
})
private
String
passWord
;
@ApiModelProperty
(
value
=
"确认密码"
,
example
=
"123456"
)
@NotEmpty
(
message
=
"确认密码不能为空"
,
groups
=
{
Create
.
class
,
UpdatePassword
.
class
})
private
String
alertPwd
;
@ApiModelProperty
(
value
=
"备注"
,
example
=
"一个备注"
)
private
String
remark
;
@ApiModelProperty
(
value
=
"状态"
,
example
=
"1"
)
@NotNull
(
message
=
"状态不能为空"
,
groups
=
{
Update
.
class
})
private
Integer
accountStatus
;
@ApiModelProperty
(
value
=
"角色"
,
example
=
"1"
,
hidden
=
true
)
//@NotNull(message = "角色不能为空", groups = {Create.class, Update.class})
private
Integer
roleId
;
@ApiModelProperty
(
value
=
"能控制的用户资源来源"
,
hidden
=
true
)
private
Integer
controlSource
;
@ApiModelProperty
(
value
=
"电子邮箱"
,
example
=
"220700100213@163.com"
)
@Email
private
String
email
;
@ApiModelProperty
(
value
=
"所属公司ID"
,
example
=
"1"
,
hidden
=
true
)
private
Integer
companyId
;
@ApiModelProperty
(
value
=
"账号类型:0合伙人 1员工"
,
example
=
"1"
,
hidden
=
true
)
private
Integer
userType
;
@ApiModelProperty
(
value
=
"省份编码"
,
required
=
false
)
private
Integer
provinceCode
;
@ApiModelProperty
(
value
=
"城市编码"
,
required
=
false
)
private
Integer
cityCode
;
@ApiModelProperty
(
value
=
"县区编码"
,
required
=
false
)
private
Integer
districtCode
;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/UserAccountVO.java
浏览文件 @
ace6ad4a
...
...
@@ -30,6 +30,8 @@ public class UserAccountVO implements Serializable {
private
Integer
accountType
;
@ApiModelProperty
(
value
=
"用户uid"
)
private
String
uid
;
@ApiModelProperty
(
value
=
"用户账号"
)
private
String
accountNo
;
@ApiModelProperty
(
value
=
"手机号"
)
private
String
phoneNum
;
@ApiModelProperty
(
value
=
"用户名称"
)
...
...
@@ -53,5 +55,9 @@ public class UserAccountVO implements Serializable {
private
Integer
portType
;
@ApiModelProperty
(
value
=
"注册时间"
)
private
Date
createTime
;
@ApiModelProperty
(
value
=
"企业认证状态, 0未通过,1通过"
)
private
Integer
companyAuthStatus
;
@ApiModelProperty
(
value
=
"合作标签id"
)
private
Integer
cooperationTagId
;
}
cms-common/cms-common-model/src/main/java/com/mmc/iuav/user/model/vo/UserTagVO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
model
.
vo
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* @author: zj
* @Date: 2023/5/26 20:58
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public
class
UserTagVO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2693784088480292773L
;
private
Integer
id
;
private
Integer
cooperationTagId
;
private
Integer
userAccountId
;
private
Date
createTime
;
private
Date
updateTime
;
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/auth/JwtUtil.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
auth
;
import
com.mmc.iuav.general.CodeUtil
;
import
io.jsonwebtoken.Claims
;
import
io.jsonwebtoken.JwtBuilder
;
import
io.jsonwebtoken.Jwts
;
import
io.jsonwebtoken.SignatureAlgorithm
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultEnum
;
import
io.jsonwebtoken.*
;
import
javax.crypto.spec.SecretKeySpec
;
import
javax.xml.bind.DatatypeConverter
;
...
...
cms-common/cms-common-util/src/main/java/com/mmc/iuav/general/CodeUtil.java
浏览文件 @
ace6ad4a
...
...
@@ -25,4 +25,8 @@ public class CodeUtil {
public
static
String
randomCode
(
int
i
)
{
return
CodeUtil
.
getRandomNum
(
i
);
}
public
static
String
removeUserAccount
()
{
return
"DELETE"
+
CodeUtil
.
getRandomNum
(
15
);
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/group/Create.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
group
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月28日 下午5:37:44
* @explain 类说明
*/
public
interface
Create
{
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/group/Freeze.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
group
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年9月18日 上午11:22:40
* @explain 类说明
*/
public
interface
Freeze
{
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/group/UpdatePassword.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
group
;
/**
* author:zhenjie
* Date:2021/10/8
* time:16:26
*/
public
interface
UpdatePassword
{
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/http/BizException.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
http
;
import
com.mmc.iuav.response.BaseErrorInfoInterface
;
import
com.mmc.iuav.response.ResultEnum
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月13日 上午9:25:43
* @explain 类说明
*/
public
class
BizException
extends
RuntimeException
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 错误码
*/
protected
String
errorCode
;
/**
* 错误信息
*/
protected
String
errorMsg
;
public
BizException
()
{
super
();
}
public
BizException
(
BaseErrorInfoInterface
errorInfoInterface
)
{
super
(
errorInfoInterface
.
getResultCode
());
this
.
errorCode
=
errorInfoInterface
.
getResultCode
();
this
.
errorMsg
=
errorInfoInterface
.
getResultMsg
();
}
public
BizException
(
BaseErrorInfoInterface
errorInfoInterface
,
Throwable
cause
)
{
super
(
errorInfoInterface
.
getResultCode
(),
cause
);
this
.
errorCode
=
errorInfoInterface
.
getResultCode
();
this
.
errorMsg
=
errorInfoInterface
.
getResultMsg
();
}
public
BizException
(
ResultEnum
enums
)
{
super
(
enums
.
getResultCode
());
this
.
errorCode
=
enums
.
getResultCode
();
this
.
errorMsg
=
enums
.
getResultMsg
();
}
public
BizException
(
String
errorMsg
)
{
super
(
errorMsg
);
this
.
errorCode
=
"-1"
;
this
.
errorMsg
=
errorMsg
;
}
public
BizException
(
String
errorCode
,
String
errorMsg
)
{
super
(
errorCode
);
this
.
errorCode
=
errorCode
;
this
.
errorMsg
=
errorMsg
;
}
public
BizException
(
String
errorCode
,
String
errorMsg
,
Throwable
cause
)
{
super
(
errorCode
,
cause
);
this
.
errorCode
=
errorCode
;
this
.
errorMsg
=
errorMsg
;
}
public
String
getErrorCode
()
{
return
errorCode
;
}
public
void
setErrorCode
(
String
errorCode
)
{
this
.
errorCode
=
errorCode
;
}
public
String
getErrorMsg
()
{
return
errorMsg
;
}
public
void
setErrorMsg
(
String
errorMsg
)
{
this
.
errorMsg
=
errorMsg
;
}
@Override
public
String
getMessage
()
{
return
errorMsg
;
}
@Override
public
Throwable
fillInStackTrace
()
{
return
this
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/page/BaseInfoQO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
page
;
import
com.mmc.iuav.group.Freeze
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.springframework.data.domain.Page
;
import
javax.validation.constraints.Min
;
import
javax.validation.constraints.NotNull
;
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
BaseInfoQO
{
@ApiModelProperty
(
value
=
"开始时间"
)
private
String
startTime
;
@ApiModelProperty
(
value
=
"结束时间"
)
private
String
endTime
;
@ApiModelProperty
(
value
=
"页码"
)
@NotNull
(
message
=
"页码不能为空"
,
groups
=
{
Page
.
class
,
Freeze
.
class
})
@Min
(
value
=
1
,
groups
=
Page
.
class
,
message
=
"pageNo不能少于1"
)
private
Integer
pageNo
;
@ApiModelProperty
(
value
=
"每页显示数"
)
@NotNull
(
message
=
"每页显示数不能为空"
,
groups
=
{
Page
.
class
,
Freeze
.
class
})
@Min
(
value
=
1
,
groups
=
Page
.
class
,
message
=
"pageSize不能少于1"
)
private
Integer
pageSize
;
/**
* 初始化起始查询行并返回当前页
*/
public
Integer
buildCurrentPage
()
{
Integer
pageNo
=
this
.
pageNo
;
this
.
pageNo
=
(
pageNo
-
1
)
*
pageSize
;
return
pageNo
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/page/PageResult.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
page
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月28日 下午3:18:21
* @explain 分页工具类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
PageResult
<
T
>
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2848996493573325801L
;
private
int
pageNo
;
// 分页起始页
private
int
pageSize
;
// 每页记录数
private
T
list
;
// 返回的记录集合
private
long
totalCount
;
// 总记录条数
private
long
totalPage
;
// 总页数
public
static
PageResult
buildPage
(
int
pageNo
,
int
pageSize
,
int
totalCount
)
{
PageResult
page
=
new
PageResult
();
page
.
pageNo
=
pageNo
;
page
.
pageSize
=
pageSize
;
page
.
totalCount
=
totalCount
;
page
.
totalPage
=
(
totalCount
%
pageSize
==
0
)
?
(
totalCount
/
pageSize
)
:
(
totalCount
/
pageSize
+
1
);
return
page
;
}
public
static
<
T
>
PageResult
buildPage
(
int
pageNo
,
int
pageSize
,
int
totalCount
,
T
list
)
{
PageResult
page
=
PageResult
.
buildPage
(
pageNo
,
pageSize
,
totalCount
);
page
.
setList
(
list
);
return
page
;
}
public
static
PageResult
buildPage
(
BaseInfoQO
qo
,
int
totalCount
)
{
PageResult
page
=
new
PageResult
();
page
.
pageNo
=
qo
.
getPageNo
();
Integer
pageSize
=
qo
.
getPageSize
();
page
.
pageSize
=
pageSize
;
page
.
totalCount
=
totalCount
;
page
.
totalPage
=
(
totalCount
%
pageSize
==
0
)
?
(
totalCount
/
pageSize
)
:
(
totalCount
/
pageSize
+
1
);
return
page
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/page/TimePage.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
page
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年11月10日 上午11:40:34
* @explain 类说明
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
TimePage
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
2530498038870578257L
;
private
int
pageNo
;
// 分页起始页
private
int
pageSize
;
// 每页记录数
private
long
totalCount
;
// 总记录条数
private
long
totalPage
;
// 总页数
private
long
ctime
;
public
static
TimePage
buildPage
(
int
pageNo
,
int
pageSize
,
int
totalCount
,
long
ctime
)
{
TimePage
page
=
new
TimePage
();
page
.
pageNo
=
pageNo
;
page
.
pageSize
=
pageSize
;
page
.
totalCount
=
totalCount
;
page
.
totalPage
=
(
totalCount
%
pageSize
==
0
)
?
(
totalCount
/
pageSize
)
:
(
totalCount
/
pageSize
+
1
);
page
.
setCtime
(
ctime
);
return
page
;
}
}
cms-common/cms-common-util/src/main/java/com/mmc/iuav/response/ResultEnum.java
浏览文件 @
ace6ad4a
...
...
@@ -14,12 +14,25 @@ public enum ResultEnum implements BaseErrorInfoInterface{
COMPANY_NOT_AUTH_ERROR
(
"1001"
,
"未进行企业认证"
),
BUSINESS_LICENSE_CHECK_PARAMETER_ERROR
(
"1002"
,
"企业信息与营业执照信息不一致,请重新上传"
),
LOGIN_ACCOUNT_NOT_EXIT_ERROR
(
"5005"
,
"账号不存在"
),
LOGIN_PASSWORD_ERROR
(
"5006"
,
"密码错误"
),
LOGIN_ACCOUNT_STATUS_ERROR
(
"5008"
,
"外部访问"
),
//微信相关
PASSWORD_INCONSISTENT
(
"5026"
,
"新密码与确认密码不一致,请确认一致"
),
WX_ACCESS_TOKEN_ERROR
(
"5027"
,
"获取微信AccessToken失败"
),
APPLET_QR_CODE_CREATE_ERROR
(
"5030"
,
"生成小程序码错误:"
),
PWD_CREATE_ERROR
(
"6001"
,
"创建密码失败"
),
PWD_CONPARED_ERROR
(
"6002"
,
"密码错误"
),
PWD_ALERT_ERROR
(
"6003"
,
"密码不一致"
),
PWD_REQUEST_AUTH_ERROR
(
"6003"
,
"密码请求验证"
),
APPLET_PORT_TYPE_ERROR
(
"7001"
,
"小程序端口类型错误"
),
APPLET_LOGIN_ERROR
(
"7002"
,
"获取小程序登录失败"
);
APPLET_LOGIN_ERROR
(
"7002"
,
"获取小程序登录失败"
),
UPDATE_USER_ACCOUNT_REPEAT
(
"7003"
,
"修改后的账户名已存在"
),
ADD_USER_ACCOUNT_NAME_EXISTS
(
"7004"
,
"新增账户名已经存在"
);
/**
* 错误码
...
...
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/BCrypt.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
// Copyright (c) 2006 Damien Miller <djm@mindrot.org>
//
// Permission to use, copy, modify, and distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
import
java.nio.charset.StandardCharsets
;
import
java.security.MessageDigest
;
import
java.security.SecureRandom
;
import
java.util.Arrays
;
/**
* BCrypt implements OpenBSD-style Blowfish password hashing using
* the scheme described in "A Future-Adaptable Password Scheme" by
* Niels Provos and David Mazieres.
* <p>
* This password hashing system tries to thwart off-line password
* cracking using a computationally-intensive hashing algorithm,
* based on Bruce Schneier's Blowfish cipher. The work factor of
* the algorithm is parameterised, so it can be increased as
* computers get faster.
* <p>
* Usage is really simple. To hash a password for the first time,
* call the hashpw method with a random salt, like this:
* <p>
* <code>
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); <br />
* </code>
* <p>
* To check whether a plaintext password matches one that has been
* hashed previously, use the checkpw method:
* <p>
* <code>
* if (BCrypt.checkpw(candidate_password, stored_hash))<br />
* System.out.println("It matches");<br />
* else<br />
* System.out.println("It does not match");<br />
* </code>
* <p>
* The gensalt() method takes an optional parameter (log_rounds)
* that determines the computational complexity of the hashing:
* <p>
* <code>
* String strong_salt = BCrypt.gensalt(10)<br />
* String stronger_salt = BCrypt.gensalt(12)<br />
* </code>
* <p>
* The amount of work increases exponentially (2**log_rounds), so
* each increment is twice as much work. The default log_rounds is
* 10, and the valid range is 4 to 31.
*
* @author Damien Miller
* @version 0.3
*/
public
class
BCrypt
{
// BCrypt parameters
private
static
final
int
GENSALT_DEFAULT_LOG2_ROUNDS
=
10
;
private
static
final
int
BCRYPT_SALT_LEN
=
16
;
// Blowfish parameters
private
static
final
int
BLOWFISH_NUM_ROUNDS
=
16
;
// Initial contents of key schedule
private
static
final
int
P_orig
[]
=
{
0x243f6a88
,
0x85a308d3
,
0x13198a2e
,
0x03707344
,
0xa4093822
,
0x299f31d0
,
0x082efa98
,
0xec4e6c89
,
0x452821e6
,
0x38d01377
,
0xbe5466cf
,
0x34e90c6c
,
0xc0ac29b7
,
0xc97c50dd
,
0x3f84d5b5
,
0xb5470917
,
0x9216d5d9
,
0x8979fb1b
};
private
static
final
int
S_orig
[]
=
{
0xd1310ba6
,
0x98dfb5ac
,
0x2ffd72db
,
0xd01adfb7
,
0xb8e1afed
,
0x6a267e96
,
0xba7c9045
,
0xf12c7f99
,
0x24a19947
,
0xb3916cf7
,
0x0801f2e2
,
0x858efc16
,
0x636920d8
,
0x71574e69
,
0xa458fea3
,
0xf4933d7e
,
0x0d95748f
,
0x728eb658
,
0x718bcd58
,
0x82154aee
,
0x7b54a41d
,
0xc25a59b5
,
0x9c30d539
,
0x2af26013
,
0xc5d1b023
,
0x286085f0
,
0xca417918
,
0xb8db38ef
,
0x8e79dcb0
,
0x603a180e
,
0x6c9e0e8b
,
0xb01e8a3e
,
0xd71577c1
,
0xbd314b27
,
0x78af2fda
,
0x55605c60
,
0xe65525f3
,
0xaa55ab94
,
0x57489862
,
0x63e81440
,
0x55ca396a
,
0x2aab10b6
,
0xb4cc5c34
,
0x1141e8ce
,
0xa15486af
,
0x7c72e993
,
0xb3ee1411
,
0x636fbc2a
,
0x2ba9c55d
,
0x741831f6
,
0xce5c3e16
,
0x9b87931e
,
0xafd6ba33
,
0x6c24cf5c
,
0x7a325381
,
0x28958677
,
0x3b8f4898
,
0x6b4bb9af
,
0xc4bfe81b
,
0x66282193
,
0x61d809cc
,
0xfb21a991
,
0x487cac60
,
0x5dec8032
,
0xef845d5d
,
0xe98575b1
,
0xdc262302
,
0xeb651b88
,
0x23893e81
,
0xd396acc5
,
0x0f6d6ff3
,
0x83f44239
,
0x2e0b4482
,
0xa4842004
,
0x69c8f04a
,
0x9e1f9b5e
,
0x21c66842
,
0xf6e96c9a
,
0x670c9c61
,
0xabd388f0
,
0x6a51a0d2
,
0xd8542f68
,
0x960fa728
,
0xab5133a3
,
0x6eef0b6c
,
0x137a3be4
,
0xba3bf050
,
0x7efb2a98
,
0xa1f1651d
,
0x39af0176
,
0x66ca593e
,
0x82430e88
,
0x8cee8619
,
0x456f9fb4
,
0x7d84a5c3
,
0x3b8b5ebe
,
0xe06f75d8
,
0x85c12073
,
0x401a449f
,
0x56c16aa6
,
0x4ed3aa62
,
0x363f7706
,
0x1bfedf72
,
0x429b023d
,
0x37d0d724
,
0xd00a1248
,
0xdb0fead3
,
0x49f1c09b
,
0x075372c9
,
0x80991b7b
,
0x25d479d8
,
0xf6e8def7
,
0xe3fe501a
,
0xb6794c3b
,
0x976ce0bd
,
0x04c006ba
,
0xc1a94fb6
,
0x409f60c4
,
0x5e5c9ec2
,
0x196a2463
,
0x68fb6faf
,
0x3e6c53b5
,
0x1339b2eb
,
0x3b52ec6f
,
0x6dfc511f
,
0x9b30952c
,
0xcc814544
,
0xaf5ebd09
,
0xbee3d004
,
0xde334afd
,
0x660f2807
,
0x192e4bb3
,
0xc0cba857
,
0x45c8740f
,
0xd20b5f39
,
0xb9d3fbdb
,
0x5579c0bd
,
0x1a60320a
,
0xd6a100c6
,
0x402c7279
,
0x679f25fe
,
0xfb1fa3cc
,
0x8ea5e9f8
,
0xdb3222f8
,
0x3c7516df
,
0xfd616b15
,
0x2f501ec8
,
0xad0552ab
,
0x323db5fa
,
0xfd238760
,
0x53317b48
,
0x3e00df82
,
0x9e5c57bb
,
0xca6f8ca0
,
0x1a87562e
,
0xdf1769db
,
0xd542a8f6
,
0x287effc3
,
0xac6732c6
,
0x8c4f5573
,
0x695b27b0
,
0xbbca58c8
,
0xe1ffa35d
,
0xb8f011a0
,
0x10fa3d98
,
0xfd2183b8
,
0x4afcb56c
,
0x2dd1d35b
,
0x9a53e479
,
0xb6f84565
,
0xd28e49bc
,
0x4bfb9790
,
0xe1ddf2da
,
0xa4cb7e33
,
0x62fb1341
,
0xcee4c6e8
,
0xef20cada
,
0x36774c01
,
0xd07e9efe
,
0x2bf11fb4
,
0x95dbda4d
,
0xae909198
,
0xeaad8e71
,
0x6b93d5a0
,
0xd08ed1d0
,
0xafc725e0
,
0x8e3c5b2f
,
0x8e7594b7
,
0x8ff6e2fb
,
0xf2122b64
,
0x8888b812
,
0x900df01c
,
0x4fad5ea0
,
0x688fc31c
,
0xd1cff191
,
0xb3a8c1ad
,
0x2f2f2218
,
0xbe0e1777
,
0xea752dfe
,
0x8b021fa1
,
0xe5a0cc0f
,
0xb56f74e8
,
0x18acf3d6
,
0xce89e299
,
0xb4a84fe0
,
0xfd13e0b7
,
0x7cc43b81
,
0xd2ada8d9
,
0x165fa266
,
0x80957705
,
0x93cc7314
,
0x211a1477
,
0xe6ad2065
,
0x77b5fa86
,
0xc75442f5
,
0xfb9d35cf
,
0xebcdaf0c
,
0x7b3e89a0
,
0xd6411bd3
,
0xae1e7e49
,
0x00250e2d
,
0x2071b35e
,
0x226800bb
,
0x57b8e0af
,
0x2464369b
,
0xf009b91e
,
0x5563911d
,
0x59dfa6aa
,
0x78c14389
,
0xd95a537f
,
0x207d5ba2
,
0x02e5b9c5
,
0x83260376
,
0x6295cfa9
,
0x11c81968
,
0x4e734a41
,
0xb3472dca
,
0x7b14a94a
,
0x1b510052
,
0x9a532915
,
0xd60f573f
,
0xbc9bc6e4
,
0x2b60a476
,
0x81e67400
,
0x08ba6fb5
,
0x571be91f
,
0xf296ec6b
,
0x2a0dd915
,
0xb6636521
,
0xe7b9f9b6
,
0xff34052e
,
0xc5855664
,
0x53b02d5d
,
0xa99f8fa1
,
0x08ba4799
,
0x6e85076a
,
0x4b7a70e9
,
0xb5b32944
,
0xdb75092e
,
0xc4192623
,
0xad6ea6b0
,
0x49a7df7d
,
0x9cee60b8
,
0x8fedb266
,
0xecaa8c71
,
0x699a17ff
,
0x5664526c
,
0xc2b19ee1
,
0x193602a5
,
0x75094c29
,
0xa0591340
,
0xe4183a3e
,
0x3f54989a
,
0x5b429d65
,
0x6b8fe4d6
,
0x99f73fd6
,
0xa1d29c07
,
0xefe830f5
,
0x4d2d38e6
,
0xf0255dc1
,
0x4cdd2086
,
0x8470eb26
,
0x6382e9c6
,
0x021ecc5e
,
0x09686b3f
,
0x3ebaefc9
,
0x3c971814
,
0x6b6a70a1
,
0x687f3584
,
0x52a0e286
,
0xb79c5305
,
0xaa500737
,
0x3e07841c
,
0x7fdeae5c
,
0x8e7d44ec
,
0x5716f2b8
,
0xb03ada37
,
0xf0500c0d
,
0xf01c1f04
,
0x0200b3ff
,
0xae0cf51a
,
0x3cb574b2
,
0x25837a58
,
0xdc0921bd
,
0xd19113f9
,
0x7ca92ff6
,
0x94324773
,
0x22f54701
,
0x3ae5e581
,
0x37c2dadc
,
0xc8b57634
,
0x9af3dda7
,
0xa9446146
,
0x0fd0030e
,
0xecc8c73e
,
0xa4751e41
,
0xe238cd99
,
0x3bea0e2f
,
0x3280bba1
,
0x183eb331
,
0x4e548b38
,
0x4f6db908
,
0x6f420d03
,
0xf60a04bf
,
0x2cb81290
,
0x24977c79
,
0x5679b072
,
0xbcaf89af
,
0xde9a771f
,
0xd9930810
,
0xb38bae12
,
0xdccf3f2e
,
0x5512721f
,
0x2e6b7124
,
0x501adde6
,
0x9f84cd87
,
0x7a584718
,
0x7408da17
,
0xbc9f9abc
,
0xe94b7d8c
,
0xec7aec3a
,
0xdb851dfa
,
0x63094366
,
0xc464c3d2
,
0xef1c1847
,
0x3215d908
,
0xdd433b37
,
0x24c2ba16
,
0x12a14d43
,
0x2a65c451
,
0x50940002
,
0x133ae4dd
,
0x71dff89e
,
0x10314e55
,
0x81ac77d6
,
0x5f11199b
,
0x043556f1
,
0xd7a3c76b
,
0x3c11183b
,
0x5924a509
,
0xf28fe6ed
,
0x97f1fbfa
,
0x9ebabf2c
,
0x1e153c6e
,
0x86e34570
,
0xeae96fb1
,
0x860e5e0a
,
0x5a3e2ab3
,
0x771fe71c
,
0x4e3d06fa
,
0x2965dcb9
,
0x99e71d0f
,
0x803e89d6
,
0x5266c825
,
0x2e4cc978
,
0x9c10b36a
,
0xc6150eba
,
0x94e2ea78
,
0xa5fc3c53
,
0x1e0a2df4
,
0xf2f74ea7
,
0x361d2b3d
,
0x1939260f
,
0x19c27960
,
0x5223a708
,
0xf71312b6
,
0xebadfe6e
,
0xeac31f66
,
0xe3bc4595
,
0xa67bc883
,
0xb17f37d1
,
0x018cff28
,
0xc332ddef
,
0xbe6c5aa5
,
0x65582185
,
0x68ab9802
,
0xeecea50f
,
0xdb2f953b
,
0x2aef7dad
,
0x5b6e2f84
,
0x1521b628
,
0x29076170
,
0xecdd4775
,
0x619f1510
,
0x13cca830
,
0xeb61bd96
,
0x0334fe1e
,
0xaa0363cf
,
0xb5735c90
,
0x4c70a239
,
0xd59e9e0b
,
0xcbaade14
,
0xeecc86bc
,
0x60622ca7
,
0x9cab5cab
,
0xb2f3846e
,
0x648b1eaf
,
0x19bdf0ca
,
0xa02369b9
,
0x655abb50
,
0x40685a32
,
0x3c2ab4b3
,
0x319ee9d5
,
0xc021b8f7
,
0x9b540b19
,
0x875fa099
,
0x95f7997e
,
0x623d7da8
,
0xf837889a
,
0x97e32d77
,
0x11ed935f
,
0x16681281
,
0x0e358829
,
0xc7e61fd6
,
0x96dedfa1
,
0x7858ba99
,
0x57f584a5
,
0x1b227263
,
0x9b83c3ff
,
0x1ac24696
,
0xcdb30aeb
,
0x532e3054
,
0x8fd948e4
,
0x6dbc3128
,
0x58ebf2ef
,
0x34c6ffea
,
0xfe28ed61
,
0xee7c3c73
,
0x5d4a14d9
,
0xe864b7e3
,
0x42105d14
,
0x203e13e0
,
0x45eee2b6
,
0xa3aaabea
,
0xdb6c4f15
,
0xfacb4fd0
,
0xc742f442
,
0xef6abbb5
,
0x654f3b1d
,
0x41cd2105
,
0xd81e799e
,
0x86854dc7
,
0xe44b476a
,
0x3d816250
,
0xcf62a1f2
,
0x5b8d2646
,
0xfc8883a0
,
0xc1c7b6a3
,
0x7f1524c3
,
0x69cb7492
,
0x47848a0b
,
0x5692b285
,
0x095bbf00
,
0xad19489d
,
0x1462b174
,
0x23820e00
,
0x58428d2a
,
0x0c55f5ea
,
0x1dadf43e
,
0x233f7061
,
0x3372f092
,
0x8d937e41
,
0xd65fecf1
,
0x6c223bdb
,
0x7cde3759
,
0xcbee7460
,
0x4085f2a7
,
0xce77326e
,
0xa6078084
,
0x19f8509e
,
0xe8efd855
,
0x61d99735
,
0xa969a7aa
,
0xc50c06c2
,
0x5a04abfc
,
0x800bcadc
,
0x9e447a2e
,
0xc3453484
,
0xfdd56705
,
0x0e1e9ec9
,
0xdb73dbd3
,
0x105588cd
,
0x675fda79
,
0xe3674340
,
0xc5c43465
,
0x713e38d8
,
0x3d28f89e
,
0xf16dff20
,
0x153e21e7
,
0x8fb03d4a
,
0xe6e39f2b
,
0xdb83adf7
,
0xe93d5a68
,
0x948140f7
,
0xf64c261c
,
0x94692934
,
0x411520f7
,
0x7602d4f7
,
0xbcf46b2e
,
0xd4a20068
,
0xd4082471
,
0x3320f46a
,
0x43b7d4b7
,
0x500061af
,
0x1e39f62e
,
0x97244546
,
0x14214f74
,
0xbf8b8840
,
0x4d95fc1d
,
0x96b591af
,
0x70f4ddd3
,
0x66a02f45
,
0xbfbc09ec
,
0x03bd9785
,
0x7fac6dd0
,
0x31cb8504
,
0x96eb27b3
,
0x55fd3941
,
0xda2547e6
,
0xabca0a9a
,
0x28507825
,
0x530429f4
,
0x0a2c86da
,
0xe9b66dfb
,
0x68dc1462
,
0xd7486900
,
0x680ec0a4
,
0x27a18dee
,
0x4f3ffea2
,
0xe887ad8c
,
0xb58ce006
,
0x7af4d6b6
,
0xaace1e7c
,
0xd3375fec
,
0xce78a399
,
0x406b2a42
,
0x20fe9e35
,
0xd9f385b9
,
0xee39d7ab
,
0x3b124e8b
,
0x1dc9faf7
,
0x4b6d1856
,
0x26a36631
,
0xeae397b2
,
0x3a6efa74
,
0xdd5b4332
,
0x6841e7f7
,
0xca7820fb
,
0xfb0af54e
,
0xd8feb397
,
0x454056ac
,
0xba489527
,
0x55533a3a
,
0x20838d87
,
0xfe6ba9b7
,
0xd096954b
,
0x55a867bc
,
0xa1159a58
,
0xcca92963
,
0x99e1db33
,
0xa62a4a56
,
0x3f3125f9
,
0x5ef47e1c
,
0x9029317c
,
0xfdf8e802
,
0x04272f70
,
0x80bb155c
,
0x05282ce3
,
0x95c11548
,
0xe4c66d22
,
0x48c1133f
,
0xc70f86dc
,
0x07f9c9ee
,
0x41041f0f
,
0x404779a4
,
0x5d886e17
,
0x325f51eb
,
0xd59bc0d1
,
0xf2bcc18f
,
0x41113564
,
0x257b7834
,
0x602a9c60
,
0xdff8e8a3
,
0x1f636c1b
,
0x0e12b4c2
,
0x02e1329e
,
0xaf664fd1
,
0xcad18115
,
0x6b2395e0
,
0x333e92e1
,
0x3b240b62
,
0xeebeb922
,
0x85b2a20e
,
0xe6ba0d99
,
0xde720c8c
,
0x2da2f728
,
0xd0127845
,
0x95b794fd
,
0x647d0862
,
0xe7ccf5f0
,
0x5449a36f
,
0x877d48fa
,
0xc39dfd27
,
0xf33e8d1e
,
0x0a476341
,
0x992eff74
,
0x3a6f6eab
,
0xf4f8fd37
,
0xa812dc60
,
0xa1ebddf8
,
0x991be14c
,
0xdb6e6b0d
,
0xc67b5510
,
0x6d672c37
,
0x2765d43b
,
0xdcd0e804
,
0xf1290dc7
,
0xcc00ffa3
,
0xb5390f92
,
0x690fed0b
,
0x667b9ffb
,
0xcedb7d9c
,
0xa091cf0b
,
0xd9155ea3
,
0xbb132f88
,
0x515bad24
,
0x7b9479bf
,
0x763bd6eb
,
0x37392eb3
,
0xcc115979
,
0x8026e297
,
0xf42e312d
,
0x6842ada7
,
0xc66a2b3b
,
0x12754ccc
,
0x782ef11c
,
0x6a124237
,
0xb79251e7
,
0x06a1bbe6
,
0x4bfb6350
,
0x1a6b1018
,
0x11caedfa
,
0x3d25bdd8
,
0xe2e1c3c9
,
0x44421659
,
0x0a121386
,
0xd90cec6e
,
0xd5abea2a
,
0x64af674e
,
0xda86a85f
,
0xbebfe988
,
0x64e4c3fe
,
0x9dbc8057
,
0xf0f7c086
,
0x60787bf8
,
0x6003604d
,
0xd1fd8346
,
0xf6381fb0
,
0x7745ae04
,
0xd736fccc
,
0x83426b33
,
0xf01eab71
,
0xb0804187
,
0x3c005e5f
,
0x77a057be
,
0xbde8ae24
,
0x55464299
,
0xbf582e61
,
0x4e58f48f
,
0xf2ddfda2
,
0xf474ef38
,
0x8789bdc2
,
0x5366f9c3
,
0xc8b38e74
,
0xb475f255
,
0x46fcd9b9
,
0x7aeb2661
,
0x8b1ddf84
,
0x846a0e79
,
0x915f95e2
,
0x466e598e
,
0x20b45770
,
0x8cd55591
,
0xc902de4c
,
0xb90bace1
,
0xbb8205d0
,
0x11a86248
,
0x7574a99e
,
0xb77f19b6
,
0xe0a9dc09
,
0x662d09a1
,
0xc4324633
,
0xe85a1f02
,
0x09f0be8c
,
0x4a99a025
,
0x1d6efe10
,
0x1ab93d1d
,
0x0ba5a4df
,
0xa186f20f
,
0x2868f169
,
0xdcb7da83
,
0x573906fe
,
0xa1e2ce9b
,
0x4fcd7f52
,
0x50115e01
,
0xa70683fa
,
0xa002b5c4
,
0x0de6d027
,
0x9af88c27
,
0x773f8641
,
0xc3604c06
,
0x61a806b5
,
0xf0177a28
,
0xc0f586e0
,
0x006058aa
,
0x30dc7d62
,
0x11e69ed7
,
0x2338ea63
,
0x53c2dd94
,
0xc2c21634
,
0xbbcbee56
,
0x90bcb6de
,
0xebfc7da1
,
0xce591d76
,
0x6f05e409
,
0x4b7c0188
,
0x39720a3d
,
0x7c927c24
,
0x86e3725f
,
0x724d9db9
,
0x1ac15bb4
,
0xd39eb8fc
,
0xed545578
,
0x08fca5b5
,
0xd83d7cd3
,
0x4dad0fc4
,
0x1e50ef5e
,
0xb161e6f8
,
0xa28514d9
,
0x6c51133c
,
0x6fd5c7e7
,
0x56e14ec4
,
0x362abfce
,
0xddc6c837
,
0xd79a3234
,
0x92638212
,
0x670efa8e
,
0x406000e0
,
0x3a39ce37
,
0xd3faf5cf
,
0xabc27737
,
0x5ac52d1b
,
0x5cb0679e
,
0x4fa33742
,
0xd3822740
,
0x99bc9bbe
,
0xd5118e9d
,
0xbf0f7315
,
0xd62d1c7e
,
0xc700c47b
,
0xb78c1b6b
,
0x21a19045
,
0xb26eb1be
,
0x6a366eb4
,
0x5748ab2f
,
0xbc946e79
,
0xc6a376d2
,
0x6549c2c8
,
0x530ff8ee
,
0x468dde7d
,
0xd5730a1d
,
0x4cd04dc6
,
0x2939bbdb
,
0xa9ba4650
,
0xac9526e8
,
0xbe5ee304
,
0xa1fad5f0
,
0x6a2d519a
,
0x63ef8ce2
,
0x9a86ee22
,
0xc089c2b8
,
0x43242ef6
,
0xa51e03aa
,
0x9cf2d0a4
,
0x83c061ba
,
0x9be96a4d
,
0x8fe51550
,
0xba645bd6
,
0x2826a2f9
,
0xa73a3ae1
,
0x4ba99586
,
0xef5562e9
,
0xc72fefd3
,
0xf752f7da
,
0x3f046f69
,
0x77fa0a59
,
0x80e4a915
,
0x87b08601
,
0x9b09e6ad
,
0x3b3ee593
,
0xe990fd5a
,
0x9e34d797
,
0x2cf0b7d9
,
0x022b8b51
,
0x96d5ac3a
,
0x017da67d
,
0xd1cf3ed6
,
0x7c7d2d28
,
0x1f9f25cf
,
0xadf2b89b
,
0x5ad6b472
,
0x5a88f54c
,
0xe029ac71
,
0xe019a5e6
,
0x47b0acfd
,
0xed93fa9b
,
0xe8d3c48d
,
0x283b57cc
,
0xf8d56629
,
0x79132e28
,
0x785f0191
,
0xed756055
,
0xf7960e44
,
0xe3d35e8c
,
0x15056dd4
,
0x88f46dba
,
0x03a16125
,
0x0564f0bd
,
0xc3eb9e15
,
0x3c9057a2
,
0x97271aec
,
0xa93a072a
,
0x1b3f6d9b
,
0x1e6321f5
,
0xf59c66fb
,
0x26dcf319
,
0x7533d928
,
0xb155fdf5
,
0x03563482
,
0x8aba3cbb
,
0x28517711
,
0xc20ad9f8
,
0xabcc5167
,
0xccad925f
,
0x4de81751
,
0x3830dc8e
,
0x379d5862
,
0x9320f991
,
0xea7a90c2
,
0xfb3e7bce
,
0x5121ce64
,
0x774fbe32
,
0xa8b6e37e
,
0xc3293d46
,
0x48de5369
,
0x6413e680
,
0xa2ae0810
,
0xdd6db224
,
0x69852dfd
,
0x09072166
,
0xb39a460a
,
0x6445c0dd
,
0x586cdecf
,
0x1c20c8ae
,
0x5bbef7dd
,
0x1b588d40
,
0xccd2017f
,
0x6bb4e3bb
,
0xdda26a7e
,
0x3a59ff45
,
0x3e350a44
,
0xbcb4cdd5
,
0x72eacea8
,
0xfa6484bb
,
0x8d6612ae
,
0xbf3c6f47
,
0xd29be463
,
0x542f5d9e
,
0xaec2771b
,
0xf64e6370
,
0x740e0d8d
,
0xe75b1357
,
0xf8721671
,
0xaf537d5d
,
0x4040cb08
,
0x4eb4e2cc
,
0x34d2466a
,
0x0115af84
,
0xe1b00428
,
0x95983a1d
,
0x06b89fb4
,
0xce6ea048
,
0x6f3f3b82
,
0x3520ab82
,
0x011a1d4b
,
0x277227f8
,
0x611560b1
,
0xe7933fdc
,
0xbb3a792b
,
0x344525bd
,
0xa08839e1
,
0x51ce794b
,
0x2f32c9b7
,
0xa01fbac9
,
0xe01cc87e
,
0xbcc7d1f6
,
0xcf0111c3
,
0xa1e8aac7
,
0x1a908749
,
0xd44fbd9a
,
0xd0dadecb
,
0xd50ada38
,
0x0339c32a
,
0xc6913667
,
0x8df9317c
,
0xe0b12b4f
,
0xf79e59b7
,
0x43f5bb3a
,
0xf2d519ff
,
0x27d9459c
,
0xbf97222c
,
0x15e6fc2a
,
0x0f91fc71
,
0x9b941525
,
0xfae59361
,
0xceb69ceb
,
0xc2a86459
,
0x12baa8d1
,
0xb6c1075e
,
0xe3056a0c
,
0x10d25065
,
0xcb03a442
,
0xe0ec6e0e
,
0x1698db3b
,
0x4c98a0be
,
0x3278e964
,
0x9f1f9532
,
0xe0d392df
,
0xd3a0342b
,
0x8971f21e
,
0x1b0a7441
,
0x4ba3348c
,
0xc5be7120
,
0xc37632d8
,
0xdf359f8d
,
0x9b992f2e
,
0xe60b6f47
,
0x0fe3f11d
,
0xe54cda54
,
0x1edad891
,
0xce6279cf
,
0xcd3e7e6f
,
0x1618b166
,
0xfd2c1d05
,
0x848fd2c5
,
0xf6fb2299
,
0xf523f357
,
0xa6327623
,
0x93a83531
,
0x56cccd02
,
0xacf08162
,
0x5a75ebb5
,
0x6e163697
,
0x88d273cc
,
0xde966292
,
0x81b949d0
,
0x4c50901b
,
0x71c65614
,
0xe6c6c7bd
,
0x327a140a
,
0x45e1d006
,
0xc3f27b9a
,
0xc9aa53fd
,
0x62a80f00
,
0xbb25bfe2
,
0x35bdd2f6
,
0x71126905
,
0xb2040222
,
0xb6cbcf7c
,
0xcd769c2b
,
0x53113ec0
,
0x1640e3d3
,
0x38abbd60
,
0x2547adf0
,
0xba38209c
,
0xf746ce76
,
0x77afa1c5
,
0x20756060
,
0x85cbfe4e
,
0x8ae88dd8
,
0x7aaaf9b0
,
0x4cf9aa7e
,
0x1948c25c
,
0x02fb8a8c
,
0x01c36ae4
,
0xd6ebe1f9
,
0x90d4f869
,
0xa65cdea0
,
0x3f09252d
,
0xc208e69f
,
0xb74e6132
,
0xce77e25b
,
0x578fdfe3
,
0x3ac372e6
};
// bcrypt IV: "OrpheanBeholderScryDoubt"
static
private
final
int
bf_crypt_ciphertext
[]
=
{
0x4f727068
,
0x65616e42
,
0x65686f6c
,
0x64657253
,
0x63727944
,
0x6f756274
};
// Table for Base64 encoding
static
private
final
char
base64_code
[]
=
{
'.'
,
'/'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
,
'g'
,
'h'
,
'i'
,
'j'
,
'k'
,
'l'
,
'm'
,
'n'
,
'o'
,
'p'
,
'q'
,
'r'
,
's'
,
't'
,
'u'
,
'v'
,
'w'
,
'x'
,
'y'
,
'z'
,
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
};
// Table for Base64 decoding
static
private
final
byte
index_64
[]
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
0
,
1
,
54
,
55
,
56
,
57
,
58
,
59
,
60
,
61
,
62
,
63
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
17
,
18
,
19
,
20
,
21
,
22
,
23
,
24
,
25
,
26
,
27
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
28
,
29
,
30
,
31
,
32
,
33
,
34
,
35
,
36
,
37
,
38
,
39
,
40
,
41
,
42
,
43
,
44
,
45
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
53
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
};
static
final
int
MIN_LOG_ROUNDS
=
4
;
static
final
int
MAX_LOG_ROUNDS
=
31
;
// Expanded Blowfish key
private
int
P
[];
private
int
S
[];
/**
* Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note
* that this is <strong>not</strong> compatible with the standard MIME-base64
* encoding.
*
* @param d the byte array to encode
* @param len the number of bytes to encode
* @param rs the destination buffer for the base64-encoded string
* @exception IllegalArgumentException if the length is invalid
*/
static
void
encode_base64
(
byte
d
[],
int
len
,
StringBuilder
rs
)
throws
IllegalArgumentException
{
int
off
=
0
;
int
c1
,
c2
;
if
(
len
<=
0
||
len
>
d
.
length
)
{
throw
new
IllegalArgumentException
(
"Invalid len"
);
}
while
(
off
<
len
)
{
c1
=
d
[
off
++]
&
0xff
;
rs
.
append
(
base64_code
[(
c1
>>
2
)
&
0x3f
]);
c1
=
(
c1
&
0x03
)
<<
4
;
if
(
off
>=
len
)
{
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
break
;
}
c2
=
d
[
off
++]
&
0xff
;
c1
|=
(
c2
>>
4
)
&
0x0f
;
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
c1
=
(
c2
&
0x0f
)
<<
2
;
if
(
off
>=
len
)
{
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
break
;
}
c2
=
d
[
off
++]
&
0xff
;
c1
|=
(
c2
>>
6
)
&
0x03
;
rs
.
append
(
base64_code
[
c1
&
0x3f
]);
rs
.
append
(
base64_code
[
c2
&
0x3f
]);
}
}
/**
* Look up the 3 bits base64-encoded by the specified character,
* range-checking againt conversion table
* @param x the base64-encoded value
* @return the decoded value of x
*/
private
static
byte
char64
(
char
x
)
{
if
((
int
)
x
<
0
||
(
int
)
x
>=
index_64
.
length
)
return
-
1
;
return
index_64
[(
int
)
x
];
}
/**
* Decode a string encoded using bcrypt's base64 scheme to a
* byte array. Note that this is *not* compatible with
* the standard MIME-base64 encoding.
* @param s the string to decode
* @param maxolen the maximum number of bytes to decode
* @return an array containing the decoded bytes
* @throws IllegalArgumentException if maxolen is invalid
*/
static
byte
[]
decode_base64
(
String
s
,
int
maxolen
)
throws
IllegalArgumentException
{
StringBuilder
rs
=
new
StringBuilder
();
int
off
=
0
,
slen
=
s
.
length
(),
olen
=
0
;
byte
ret
[];
byte
c1
,
c2
,
c3
,
c4
,
o
;
if
(
maxolen
<=
0
)
throw
new
IllegalArgumentException
(
"Invalid maxolen"
);
while
(
off
<
slen
-
1
&&
olen
<
maxolen
)
{
c1
=
char64
(
s
.
charAt
(
off
++));
c2
=
char64
(
s
.
charAt
(
off
++));
if
(
c1
==
-
1
||
c2
==
-
1
)
break
;
o
=
(
byte
)
(
c1
<<
2
);
o
|=
(
c2
&
0x30
)
>>
4
;
rs
.
append
((
char
)
o
);
if
(++
olen
>=
maxolen
||
off
>=
slen
)
break
;
c3
=
char64
(
s
.
charAt
(
off
++));
if
(
c3
==
-
1
)
break
;
o
=
(
byte
)
((
c2
&
0x0f
)
<<
4
);
o
|=
(
c3
&
0x3c
)
>>
2
;
rs
.
append
((
char
)
o
);
if
(++
olen
>=
maxolen
||
off
>=
slen
)
break
;
c4
=
char64
(
s
.
charAt
(
off
++));
o
=
(
byte
)
((
c3
&
0x03
)
<<
6
);
o
|=
c4
;
rs
.
append
((
char
)
o
);
++
olen
;
}
ret
=
new
byte
[
olen
];
for
(
off
=
0
;
off
<
olen
;
off
++)
ret
[
off
]
=
(
byte
)
rs
.
charAt
(
off
);
return
ret
;
}
/**
* Blowfish encipher a single 64-bit block encoded as
* two 32-bit halves
* @param lr an array containing the two 32-bit half blocks
* @param off the position in the array of the blocks
*/
private
void
encipher
(
int
lr
[],
int
off
)
{
int
i
,
n
,
l
=
lr
[
off
],
r
=
lr
[
off
+
1
];
l
^=
P
[
0
];
for
(
i
=
0
;
i
<=
BLOWFISH_NUM_ROUNDS
-
2
;)
{
// Feistel substitution on left word
n
=
S
[(
l
>>
24
)
&
0xff
];
n
+=
S
[
0x100
|
((
l
>>
16
)
&
0xff
)];
n
^=
S
[
0x200
|
((
l
>>
8
)
&
0xff
)];
n
+=
S
[
0x300
|
(
l
&
0xff
)];
r
^=
n
^
P
[++
i
];
// Feistel substitution on right word
n
=
S
[(
r
>>
24
)
&
0xff
];
n
+=
S
[
0x100
|
((
r
>>
16
)
&
0xff
)];
n
^=
S
[
0x200
|
((
r
>>
8
)
&
0xff
)];
n
+=
S
[
0x300
|
(
r
&
0xff
)];
l
^=
n
^
P
[++
i
];
}
lr
[
off
]
=
r
^
P
[
BLOWFISH_NUM_ROUNDS
+
1
];
lr
[
off
+
1
]
=
l
;
}
/**
* Cycically extract a word of key material
* @param data the string to extract the data from
* @param offp a "pointer" (as a one-entry array) to the
* current offset into data
* @param signp a "pointer" (as a one-entry array) to the
* cumulative flag for non-benign sign extension
* @return correct and buggy next word of material from data as int[2]
*/
private
static
int
[]
streamtowords
(
byte
data
[],
int
offp
[],
int
signp
[])
{
int
i
;
int
words
[]
=
{
0
,
0
};
int
off
=
offp
[
0
];
int
sign
=
signp
[
0
];
for
(
i
=
0
;
i
<
4
;
i
++)
{
words
[
0
]
=
(
words
[
0
]
<<
8
)
|
(
data
[
off
]
&
0xff
);
words
[
1
]
=
(
words
[
1
]
<<
8
)
|
(
int
)
data
[
off
];
// sign extension bug
if
(
i
>
0
)
sign
|=
words
[
1
]
&
0x80
;
off
=
(
off
+
1
)
%
data
.
length
;
}
offp
[
0
]
=
off
;
signp
[
0
]
=
sign
;
return
words
;
}
/**
* Cycically extract a word of key material
* @param data the string to extract the data from
* @param offp a "pointer" (as a one-entry array) to the
* current offset into data
* @return the next word of material from data
*/
private
static
int
streamtoword
(
byte
data
[],
int
offp
[])
{
int
signp
[]
=
{
0
};
return
streamtowords
(
data
,
offp
,
signp
)[
0
];
}
/**
* Cycically extract a word of key material, with sign-extension bug
* @param data the string to extract the data from
* @param offp a "pointer" (as a one-entry array) to the
* current offset into data
* @return the next word of material from data
*/
private
static
int
streamtoword_bug
(
byte
data
[],
int
offp
[])
{
int
signp
[]
=
{
0
};
return
streamtowords
(
data
,
offp
,
signp
)[
1
];
}
/**
* Initialise the Blowfish key schedule
*/
private
void
init_key
()
{
P
=
P_orig
.
clone
();
S
=
S_orig
.
clone
();
}
/**
* Key the Blowfish cipher
* @param key an array containing the key
* @param sign_ext_bug true to implement the 2x bug
* @param safety bit 16 is set when the safety measure is requested
*/
private
void
key
(
byte
key
[],
boolean
sign_ext_bug
,
int
safety
)
{
int
i
;
int
koffp
[]
=
{
0
};
int
lr
[]
=
{
0
,
0
};
int
plen
=
P
.
length
,
slen
=
S
.
length
;
for
(
i
=
0
;
i
<
plen
;
i
++)
if
(!
sign_ext_bug
)
P
[
i
]
=
P
[
i
]
^
streamtoword
(
key
,
koffp
);
else
P
[
i
]
=
P
[
i
]
^
streamtoword_bug
(
key
,
koffp
);
for
(
i
=
0
;
i
<
plen
;
i
+=
2
)
{
encipher
(
lr
,
0
);
P
[
i
]
=
lr
[
0
];
P
[
i
+
1
]
=
lr
[
1
];
}
for
(
i
=
0
;
i
<
slen
;
i
+=
2
)
{
encipher
(
lr
,
0
);
S
[
i
]
=
lr
[
0
];
S
[
i
+
1
]
=
lr
[
1
];
}
}
/**
* Perform the "enhanced key schedule" step described by
* Provos and Mazieres in "A Future-Adaptable Password Scheme"
* https://www.openbsd.org/papers/bcrypt-paper.ps
* @param data salt information
* @param key password information
* @param sign_ext_bug true to implement the 2x bug
* @param safety bit 16 is set when the safety measure is requested
*/
private
void
ekskey
(
byte
data
[],
byte
key
[],
boolean
sign_ext_bug
,
int
safety
)
{
int
i
;
int
koffp
[]
=
{
0
},
doffp
[]
=
{
0
};
int
lr
[]
=
{
0
,
0
};
int
plen
=
P
.
length
,
slen
=
S
.
length
;
int
signp
[]
=
{
0
};
// non-benign sign-extension flag
int
diff
=
0
;
// zero iff correct and buggy are same
for
(
i
=
0
;
i
<
plen
;
i
++)
{
int
words
[]
=
streamtowords
(
key
,
koffp
,
signp
);
diff
|=
words
[
0
]
^
words
[
1
];
P
[
i
]
=
P
[
i
]
^
words
[
sign_ext_bug
?
1
:
0
];
}
int
sign
=
signp
[
0
];
/*
* At this point, "diff" is zero iff the correct and buggy algorithms produced
* exactly the same result. If so and if "sign" is non-zero, which indicates
* that there was a non-benign sign extension, this means that we have a
* collision between the correctly computed hash for this password and a set of
* passwords that could be supplied to the buggy algorithm. Our safety measure
* is meant to protect from such many-buggy to one-correct collisions, by
* deviating from the correct algorithm in such cases. Let's check for this.
*/
diff
|=
diff
>>
16
;
/* still zero iff exact match */
diff
&=
0xffff
;
/* ditto */
diff
+=
0xffff
;
/* bit 16 set iff "diff" was non-zero (on non-match) */
sign
<<=
9
;
/* move the non-benign sign extension flag to bit 16 */
sign
&=
~
diff
&
safety
;
/* action needed? */
/*
* If we have determined that we need to deviate from the correct algorithm,
* flip bit 16 in initial expanded key. (The choice of 16 is arbitrary, but
* let's stick to it now. It came out of the approach we used above, and it's
* not any worse than any other choice we could make.)
*
* It is crucial that we don't do the same to the expanded key used in the main
* Eksblowfish loop. By doing it to only one of these two, we deviate from a
* state that could be directly specified by a password to the buggy algorithm
* (and to the fully correct one as well, but that's a side-effect).
*/
P
[
0
]
^=
sign
;
for
(
i
=
0
;
i
<
plen
;
i
+=
2
)
{
lr
[
0
]
^=
streamtoword
(
data
,
doffp
);
lr
[
1
]
^=
streamtoword
(
data
,
doffp
);
encipher
(
lr
,
0
);
P
[
i
]
=
lr
[
0
];
P
[
i
+
1
]
=
lr
[
1
];
}
for
(
i
=
0
;
i
<
slen
;
i
+=
2
)
{
lr
[
0
]
^=
streamtoword
(
data
,
doffp
);
lr
[
1
]
^=
streamtoword
(
data
,
doffp
);
encipher
(
lr
,
0
);
S
[
i
]
=
lr
[
0
];
S
[
i
+
1
]
=
lr
[
1
];
}
}
static
long
roundsForLogRounds
(
int
log_rounds
)
{
if
(
log_rounds
<
4
||
log_rounds
>
31
)
{
throw
new
IllegalArgumentException
(
"Bad number of rounds"
);
}
return
1L
<<
log_rounds
;
}
/**
* Perform the central password hashing step in the
* bcrypt scheme
* @param password the password to hash
* @param salt the binary salt to hash with the password
* @param log_rounds the binary logarithm of the number
* of rounds of hashing to apply
* @param sign_ext_bug true to implement the 2x bug
* @param safety bit 16 is set when the safety measure is requested
* @return an array containing the binary hashed password
*/
private
byte
[]
crypt_raw
(
byte
password
[],
byte
salt
[],
int
log_rounds
,
boolean
sign_ext_bug
,
int
safety
)
{
int
rounds
,
i
,
j
;
int
cdata
[]
=
bf_crypt_ciphertext
.
clone
();
int
clen
=
cdata
.
length
;
byte
ret
[];
if
(
log_rounds
<
4
||
log_rounds
>
31
)
throw
new
IllegalArgumentException
(
"Bad number of rounds"
);
rounds
=
1
<<
log_rounds
;
if
(
salt
.
length
!=
BCRYPT_SALT_LEN
)
throw
new
IllegalArgumentException
(
"Bad salt length"
);
init_key
();
ekskey
(
salt
,
password
,
sign_ext_bug
,
safety
);
for
(
i
=
0
;
i
<
rounds
;
i
++)
{
key
(
password
,
sign_ext_bug
,
safety
);
key
(
salt
,
false
,
safety
);
}
for
(
i
=
0
;
i
<
64
;
i
++)
{
for
(
j
=
0
;
j
<
(
clen
>>
1
);
j
++)
encipher
(
cdata
,
j
<<
1
);
}
ret
=
new
byte
[
clen
*
4
];
for
(
i
=
0
,
j
=
0
;
i
<
clen
;
i
++)
{
ret
[
j
++]
=
(
byte
)
((
cdata
[
i
]
>>
24
)
&
0xff
);
ret
[
j
++]
=
(
byte
)
((
cdata
[
i
]
>>
16
)
&
0xff
);
ret
[
j
++]
=
(
byte
)
((
cdata
[
i
]
>>
8
)
&
0xff
);
ret
[
j
++]
=
(
byte
)
(
cdata
[
i
]
&
0xff
);
}
return
ret
;
}
/**
* Hash a password using the OpenBSD bcrypt scheme
* @param password the password to hash
* @param salt the salt to hash with (perhaps generated
* using BCrypt.gensalt)
* @return the hashed password
*/
public
static
String
hashpw
(
String
password
,
String
salt
)
{
byte
passwordb
[];
passwordb
=
password
.
getBytes
(
StandardCharsets
.
UTF_8
);
return
hashpw
(
passwordb
,
salt
);
}
/**
* Hash a password using the OpenBSD bcrypt scheme
* @param passwordb the password to hash, as a byte array
* @param salt the salt to hash with (perhaps generated
* using BCrypt.gensalt)
* @return the hashed password
*/
public
static
String
hashpw
(
byte
passwordb
[],
String
salt
)
{
com
.
mmc
.
iuav
.
user
.
auth
.
BCrypt
B
;
String
real_salt
;
byte
saltb
[],
hashed
[];
char
minor
=
(
char
)
0
;
int
rounds
,
off
;
StringBuilder
rs
=
new
StringBuilder
();
if
(
salt
==
null
)
{
throw
new
IllegalArgumentException
(
"salt cannot be null"
);
}
int
saltLength
=
salt
.
length
();
if
(
saltLength
<
28
)
{
throw
new
IllegalArgumentException
(
"Invalid salt"
);
}
if
(
salt
.
charAt
(
0
)
!=
'$'
||
salt
.
charAt
(
1
)
!=
'2'
)
throw
new
IllegalArgumentException
(
"Invalid salt version"
);
if
(
salt
.
charAt
(
2
)
==
'$'
)
off
=
3
;
else
{
minor
=
salt
.
charAt
(
2
);
if
((
minor
!=
'a'
&&
minor
!=
'x'
&&
minor
!=
'y'
&&
minor
!=
'b'
)
||
salt
.
charAt
(
3
)
!=
'$'
)
throw
new
IllegalArgumentException
(
"Invalid salt revision"
);
off
=
4
;
}
// Extract number of rounds
if
(
salt
.
charAt
(
off
+
2
)
>
'$'
)
throw
new
IllegalArgumentException
(
"Missing salt rounds"
);
if
(
off
==
4
&&
saltLength
<
29
)
{
throw
new
IllegalArgumentException
(
"Invalid salt"
);
}
rounds
=
Integer
.
parseInt
(
salt
.
substring
(
off
,
off
+
2
));
real_salt
=
salt
.
substring
(
off
+
3
,
off
+
25
);
saltb
=
decode_base64
(
real_salt
,
BCRYPT_SALT_LEN
);
if
(
minor
>=
'a'
)
// add null terminator
passwordb
=
Arrays
.
copyOf
(
passwordb
,
passwordb
.
length
+
1
);
B
=
new
com
.
mmc
.
iuav
.
user
.
auth
.
BCrypt
();
hashed
=
B
.
crypt_raw
(
passwordb
,
saltb
,
rounds
,
minor
==
'x'
,
minor
==
'a'
?
0x10000
:
0
);
rs
.
append
(
"$2"
);
if
(
minor
>=
'a'
)
rs
.
append
(
minor
);
rs
.
append
(
"$"
);
if
(
rounds
<
10
)
rs
.
append
(
"0"
);
rs
.
append
(
rounds
);
rs
.
append
(
"$"
);
encode_base64
(
saltb
,
saltb
.
length
,
rs
);
encode_base64
(
hashed
,
bf_crypt_ciphertext
.
length
*
4
-
1
,
rs
);
return
rs
.
toString
();
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param prefix the prefix value (default $2a)
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @param random an instance of SecureRandom to use
* @return an encoded salt value
* @exception IllegalArgumentException if prefix or log_rounds is invalid
*/
public
static
String
gensalt
(
String
prefix
,
int
log_rounds
,
SecureRandom
random
)
throws
IllegalArgumentException
{
StringBuilder
rs
=
new
StringBuilder
();
byte
rnd
[]
=
new
byte
[
BCRYPT_SALT_LEN
];
if
(!
prefix
.
startsWith
(
"$2"
)
||
(
prefix
.
charAt
(
2
)
!=
'a'
&&
prefix
.
charAt
(
2
)
!=
'y'
&&
prefix
.
charAt
(
2
)
!=
'b'
))
{
throw
new
IllegalArgumentException
(
"Invalid prefix"
);
}
if
(
log_rounds
<
4
||
log_rounds
>
31
)
{
throw
new
IllegalArgumentException
(
"Invalid log_rounds"
);
}
random
.
nextBytes
(
rnd
);
rs
.
append
(
"$2"
);
rs
.
append
(
prefix
.
charAt
(
2
));
rs
.
append
(
"$"
);
if
(
log_rounds
<
10
)
rs
.
append
(
"0"
);
rs
.
append
(
log_rounds
);
rs
.
append
(
"$"
);
encode_base64
(
rnd
,
rnd
.
length
,
rs
);
return
rs
.
toString
();
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param prefix the prefix value (default $2a)
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @return an encoded salt value
* @exception IllegalArgumentException if prefix or log_rounds is invalid
*/
public
static
String
gensalt
(
String
prefix
,
int
log_rounds
)
throws
IllegalArgumentException
{
return
gensalt
(
prefix
,
log_rounds
,
new
SecureRandom
());
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @param random an instance of SecureRandom to use
* @return an encoded salt value
* @exception IllegalArgumentException if log_rounds is invalid
*/
public
static
String
gensalt
(
int
log_rounds
,
SecureRandom
random
)
throws
IllegalArgumentException
{
return
gensalt
(
"$2a"
,
log_rounds
,
random
);
}
/**
* Generate a salt for use with the BCrypt.hashpw() method
* @param log_rounds the log2 of the number of rounds of
* hashing to apply - the work factor therefore increases as
* 2**log_rounds.
* @return an encoded salt value
* @exception IllegalArgumentException if log_rounds is invalid
*/
public
static
String
gensalt
(
int
log_rounds
)
throws
IllegalArgumentException
{
return
gensalt
(
log_rounds
,
new
SecureRandom
());
}
public
static
String
gensalt
(
String
prefix
)
{
return
gensalt
(
prefix
,
GENSALT_DEFAULT_LOG2_ROUNDS
);
}
/**
* Generate a salt for use with the BCrypt.hashpw() method,
* selecting a reasonable default for the number of hashing
* rounds to apply
* @return an encoded salt value
*/
public
static
String
gensalt
()
{
return
gensalt
(
GENSALT_DEFAULT_LOG2_ROUNDS
);
}
/**
* Check that a plaintext password matches a previously hashed
* one
* @param plaintext the plaintext password to verify
* @param hashed the previously-hashed password
* @return true if the passwords match, false otherwise
*/
public
static
boolean
checkpw
(
String
plaintext
,
String
hashed
)
{
return
equalsNoEarlyReturn
(
hashed
,
hashpw
(
plaintext
,
hashed
));
}
/**
* Check that a password (as a byte array) matches a previously hashed
* one
* @param passwordb the password to verify, as a byte array
* @param hashed the previously-hashed password
* @return true if the passwords match, false otherwise
* @since 5.3
*/
public
static
boolean
checkpw
(
byte
[]
passwordb
,
String
hashed
)
{
return
equalsNoEarlyReturn
(
hashed
,
hashpw
(
passwordb
,
hashed
));
}
static
boolean
equalsNoEarlyReturn
(
String
a
,
String
b
)
{
return
MessageDigest
.
isEqual
(
a
.
getBytes
(
StandardCharsets
.
UTF_8
),
b
.
getBytes
(
StandardCharsets
.
UTF_8
));
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/BCryptPasswordEncoder.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Component
;
import
java.security.SecureRandom
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* Implementation of PasswordEncoder that uses the BCrypt strong hashing function. Clients
* can optionally supply a "version" ($2a, $2b, $2y) and a "strength" (a.k.a. log rounds in BCrypt)
* and a SecureRandom instance. The larger the strength parameter the more work will have to be done
* (exponentially) to hash the passwords. The default value is 10.
*
*/
@Component
public
class
BCryptPasswordEncoder
implements
PasswordEncoder
{
private
Pattern
BCRYPT_PATTERN
=
Pattern
.
compile
(
"\\A\\$2(a|y|b)?\\$(\\d\\d)\\$[./0-9A-Za-z]{53}"
);
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
com
.
mmc
.
iuav
.
user
.
auth
.
BCryptPasswordEncoder
.
class
);
private
final
int
strength
;
private
final
BCryptVersion
version
;
private
final
SecureRandom
random
;
public
BCryptPasswordEncoder
()
{
this
(-
1
);
}
/**
* @param strength the log rounds to use, between 4 and 31
*/
public
BCryptPasswordEncoder
(
int
strength
)
{
this
(
strength
,
null
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
)
{
this
(
version
,
null
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param random the secure random instance to use
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
,
SecureRandom
random
)
{
this
(
version
,
-
1
,
random
);
}
/**
* @param strength the log rounds to use, between 4 and 31
* @param random the secure random instance to use
*/
public
BCryptPasswordEncoder
(
int
strength
,
SecureRandom
random
)
{
this
(
BCryptVersion
.
$
2
A
,
strength
,
random
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param strength the log rounds to use, between 4 and 31
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
,
int
strength
)
{
this
(
version
,
strength
,
null
);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param strength the log rounds to use, between 4 and 31
* @param random the secure random instance to use
*/
public
BCryptPasswordEncoder
(
BCryptVersion
version
,
int
strength
,
SecureRandom
random
)
{
if
(
strength
!=
-
1
&&
(
strength
<
BCrypt
.
MIN_LOG_ROUNDS
||
strength
>
BCrypt
.
MAX_LOG_ROUNDS
))
{
throw
new
IllegalArgumentException
(
"Bad strength"
);
}
this
.
version
=
version
;
this
.
strength
=
strength
==
-
1
?
10
:
strength
;
this
.
random
=
random
;
}
public
String
encode
(
CharSequence
rawPassword
)
{
if
(
rawPassword
==
null
)
{
throw
new
IllegalArgumentException
(
"rawPassword cannot be null"
);
}
String
salt
;
if
(
random
!=
null
)
{
salt
=
BCrypt
.
gensalt
(
version
.
getVersion
(),
strength
,
random
);
}
else
{
salt
=
BCrypt
.
gensalt
(
version
.
getVersion
(),
strength
);
}
return
BCrypt
.
hashpw
(
rawPassword
.
toString
(),
salt
);
}
public
boolean
matches
(
CharSequence
rawPassword
,
String
encodedPassword
)
{
if
(
rawPassword
==
null
)
{
throw
new
IllegalArgumentException
(
"rawPassword cannot be null"
);
}
if
(
encodedPassword
==
null
||
encodedPassword
.
length
()
==
0
)
{
logger
.
warn
(
"Empty encoded password"
);
return
false
;
}
if
(!
BCRYPT_PATTERN
.
matcher
(
encodedPassword
).
matches
())
{
logger
.
warn
(
"Encoded password does not look like BCrypt"
);
return
false
;
}
return
BCrypt
.
checkpw
(
rawPassword
.
toString
(),
encodedPassword
);
}
@Override
public
boolean
upgradeEncoding
(
String
encodedPassword
)
{
if
(
encodedPassword
==
null
||
encodedPassword
.
length
()
==
0
)
{
logger
.
warn
(
"Empty encoded password"
);
return
false
;
}
Matcher
matcher
=
BCRYPT_PATTERN
.
matcher
(
encodedPassword
);
if
(!
matcher
.
matches
())
{
throw
new
IllegalArgumentException
(
"Encoded password does not look like BCrypt: "
+
encodedPassword
);
}
else
{
int
strength
=
Integer
.
parseInt
(
matcher
.
group
(
2
));
return
strength
<
this
.
strength
;
}
}
/**
* Stores the default bcrypt version for use in configuration.
*
* @author Lin Feng
*/
public
enum
BCryptVersion
{
$
2
A
(
"$2a"
),
$
2
Y
(
"$2y"
),
$
2
B
(
"$2b"
);
private
final
String
version
;
BCryptVersion
(
String
version
)
{
this
.
version
=
version
;
}
public
String
getVersion
()
{
return
this
.
version
;
}
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/PasswordEncoder.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
/**
* Service interface for encoding passwords.
*
* The preferred implementation is {@code BCryptPasswordEncoder}.
*
* @author Keith Donald
*/
public
interface
PasswordEncoder
{
/**
* Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or
* greater hash combined with an 8-byte or greater randomly generated salt.
*/
String
encode
(
CharSequence
rawPassword
);
/**
* Verify the encoded password obtained from storage matches the submitted raw
* password after it too is encoded. Returns true if the passwords match, false if
* they do not. The stored password itself is never decoded.
*
* @param rawPassword the raw password to encode and match
* @param encodedPassword the encoded password from storage to compare with
* @return true if the raw password, after encoding, matches the encoded password from
* storage
*/
boolean
matches
(
CharSequence
rawPassword
,
String
encodedPassword
);
/**
* Returns true if the encoded password should be encoded again for better security,
* else false. The default implementation always returns false.
* @param encodedPassword the encoded password to check
* @return true if the encoded password should be encoded again for better security,
* else false.
*/
default
boolean
upgradeEncoding
(
String
encodedPassword
)
{
return
false
;
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/auth/PwdUtil.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
auth
;
import
java.math.BigInteger
;
import
java.security.MessageDigest
;
import
java.security.NoSuchAlgorithmException
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午4:39:06
* @explain 密码加密
*/
public
class
PwdUtil
{
public
static
String
securityPwd
(
String
passWord
)
throws
NoSuchAlgorithmException
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"SHA"
);
md
.
update
(
passWord
.
getBytes
());
return
new
BigInteger
(
md
.
digest
()).
toString
(
32
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/AuthController.java
浏览文件 @
ace6ad4a
...
...
@@ -2,6 +2,7 @@ package com.mmc.iuav.user.controller;
import
com.mmc.iuav.group.Insert
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.AppUserSucVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
import
com.mmc.iuav.user.service.AuthService
;
...
...
@@ -28,4 +29,19 @@ public class AuthController {
public
ResultBody
appletLogin
(
@Validated
(
value
=
{
Insert
.
class
})
@RequestBody
WxLoginVO
wxLoginVO
){
return
authService
.
appletLogin
(
wxLoginVO
);
}
@ApiOperation
(
value
=
"平台账号密码登录"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)
})
@PostMapping
(
"backEndLogin"
)
public
ResultBody
backEndLogin
(
@ApiParam
(
value
=
"账号登录QO"
,
required
=
true
)
@Validated
@RequestBody
LoginUserQO
param
)
{
return
authService
.
backEndLogin
(
param
);
}
@ApiOperation
(
value
=
"测试-小程序unionId登录/注册"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
AppUserSucVO
.
class
)
})
@PostMapping
(
"testAppletLogin"
)
public
ResultBody
testAppletLogin
(
@RequestParam
String
unionId
){
return
authService
.
testAppletLogin
(
unionId
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/BackUserAccountController.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
controller
;
import
com.mmc.iuav.group.Create
;
import
com.mmc.iuav.group.Update
;
import
com.mmc.iuav.group.UpdatePassword
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.dto.BaseAccountDTO
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.service.UserAccountService
;
import
io.swagger.annotations.*
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
springfox.documentation.annotations.ApiIgnore
;
import
javax.servlet.http.HttpServletRequest
;
import
java.security.NoSuchAlgorithmException
;
import
java.util.List
;
/**
* @author: zj
* @Date: 2023/5/25 11:22
*/
@Api
(
tags
=
"后台用户相关接口"
)
@RequestMapping
(
"/back-user/"
)
@RestController
public
class
BackUserAccountController
extends
BaseController
{
@Autowired
private
UserAccountService
userAccountService
;
@ApiOperation
(
value
=
"账号-新增"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"insertBAccount"
)
public
ResultBody
insertBAccount
(
@Validated
(
value
=
{
Create
.
class
})
@RequestBody
BUserAccountVO
bUserAccountVO
)
{
return
userAccountService
.
insertBAccount
(
bUserAccountVO
);
}
@ApiOperation
(
value
=
"账号-修改"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"updateBAccount"
)
public
ResultBody
updateBAccount
(
@Validated
(
value
=
{
Update
.
class
})
@RequestBody
BUserAccountVO
bUserAccountVO
)
{
return
userAccountService
.
updateBAccount
(
bUserAccountVO
);
}
@ApiOperation
(
value
=
"账号-删除"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"removeBAccount"
)
public
ResultBody
removeBAccount
(
@RequestParam
Integer
userAccountId
)
{
return
userAccountService
.
removeBAccount
(
userAccountId
);
}
@ApiOperation
(
value
=
"账号-列表"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"listBAccountPage"
)
public
ResultBody
<
UserAccountSimpleDTO
>
listBAccountPage
(
@ApiParam
(
value
=
"账号查询QO"
,
required
=
true
)
@RequestBody
BUserAccountQO
bUserAccountQO
)
{
return
userAccountService
.
listBAccountPage
(
bUserAccountQO
);
}
@ApiOperation
(
value
=
"账号-用户列表-内部调用"
,
hidden
=
true
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
List
.
class
)})
@PostMapping
(
"feignListBAccountPage"
)
public
List
<
UserAccountSimpleDTO
>
feignListBAccountPage
(
@ApiParam
(
value
=
"账号查询QO"
,
required
=
true
)
@RequestBody
BUserAccountQO
bUserAccountQO
)
{
return
userAccountService
.
feignListBAccountPage
(
bUserAccountQO
);
}
@ApiOperation
(
value
=
"账号管理-修改密码"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"updatePassword"
)
public
ResultBody
updatePassword
(
@Validated
(
value
=
{
UpdatePassword
.
class
})
@RequestBody
BUserAccountVO
account
)
throws
NoSuchAlgorithmException
{
return
userAccountService
.
updatePassword
(
account
);
}
@ApiOperation
(
value
=
"feign-验证用户密码"
)
@ApiIgnore
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@GetMapping
(
"feignAuthUserPwd"
)
public
ResultBody
feignAuthUserPwd
(
@RequestParam
(
required
=
true
)
Integer
id
,
@RequestParam
(
required
=
true
)
String
authPwd
)
{
return
userAccountService
.
feignAuthUserPwd
(
id
,
authPwd
);
}
@ApiOperation
(
value
=
"test"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"listTest"
)
public
ResultBody
listTest
(
HttpServletRequest
request
)
{
return
ResultBody
.
success
(
this
.
getUserLoginInfo
(
request
));
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/BaseController.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
controller
;
import
com.mmc.iuav.auth.JwtConstant
;
import
com.mmc.iuav.auth.JwtUtil
;
import
com.mmc.iuav.http.BizException
;
import
com.mmc.iuav.user.model.dto.BaseAccountDTO
;
import
io.jsonwebtoken.Claims
;
import
javax.servlet.http.HttpServletRequest
;
/**
* @author: zj
* @Date: 2023/5/25 18:11
*/
public
abstract
class
BaseController
{
/**
* 解析token,获取用户信息
* @param request
* @return
*/
public
BaseAccountDTO
getUserLoginInfo
(
HttpServletRequest
request
)
{
String
token
=
request
.
getHeader
(
"token"
);
try
{
Claims
claims
=
JwtUtil
.
parseJwt
(
token
);
String
userId
=
claims
.
get
(
JwtConstant
.
USER_ACCOUNT_ID
).
toString
();
// String roleId = claims.get("").toString();
String
tokenType
=
claims
.
get
(
JwtConstant
.
TOKEN_TYPE
).
toString
();
return
BaseAccountDTO
.
builder
().
id
(
Integer
.
parseInt
(
userId
)).
tokenPort
(
tokenType
).
build
();
}
catch
(
Exception
e
){
throw
new
BizException
(
"Invalid token"
);
}
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/CooperationController.java
浏览文件 @
ace6ad4a
...
...
@@ -35,4 +35,11 @@ public class CooperationController {
public
ResultBody
apply
(
@Validated
(
value
=
{
Insert
.
class
})
@RequestBody
UserApplyTagVO
userApplyTagVO
){
return
cooperationService
.
apply
(
userApplyTagVO
);
}
@ApiOperation
(
value
=
"后台设置小程序用户标签"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)
})
@GetMapping
(
"changeUserTag"
)
public
ResultBody
changeUserTag
(
@RequestParam
(
"userAccountId"
)
Integer
userAccountId
,
@RequestParam
(
"cooperationTagId"
)
Integer
cooperationTagId
)
{
return
cooperationService
.
changeUserTag
(
userAccountId
,
cooperationTagId
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/controller/UserAccountController.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
controller
;
import
com.mmc.iuav.group.Insert
;
import
com.mmc.iuav.group.Update
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.vo.AppUserSucVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
import
com.mmc.iuav.user.service.UserAccountService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -16,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.List
;
/**
...
...
@@ -25,7 +23,7 @@ import java.util.List;
@Api
(
tags
=
"账号相关接口"
)
@RequestMapping
(
"/user-account/"
)
@RestController
public
class
UserAccountController
{
public
class
UserAccountController
extends
BaseController
{
@Autowired
private
UserAccountService
userAccountService
;
...
...
@@ -33,8 +31,8 @@ public class UserAccountController {
@ApiOperation
(
value
=
"获取用户信息"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
UserAccountVO
.
class
)
})
@GetMapping
(
"info"
)
public
ResultBody
info
(
@RequestParam
Integer
userAccountId
)
{
return
ResultBody
.
success
(
userAccountService
.
getUserAccountById
(
userAccountId
));
public
ResultBody
info
(
HttpServletRequest
request
)
{
return
ResultBody
.
success
(
userAccountService
.
getUserAccountById
(
this
.
getUserLoginInfo
(
request
).
getId
()
));
}
@ApiOperation
(
value
=
"修改用户信息"
)
...
...
@@ -58,5 +56,4 @@ public class UserAccountController {
return
userAccountService
.
feignListUserAccountIds
(
provinceCode
,
cityCode
,
districtCode
);
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/dao/CooperationDao.java
浏览文件 @
ace6ad4a
...
...
@@ -2,6 +2,7 @@ package com.mmc.iuav.user.dao;
import
com.mmc.iuav.user.entity.CooperationTagDO
;
import
com.mmc.iuav.user.entity.UserApplyTagDO
;
import
com.mmc.iuav.user.entity.UserTagDO
;
import
org.apache.ibatis.annotations.Mapper
;
import
java.util.List
;
...
...
@@ -36,4 +37,23 @@ public interface CooperationDao {
* @param userApplyTagDO
*/
void
updateUserApplyTag
(
UserApplyTagDO
userApplyTagDO
);
/**
* 根据用户id查询渠道登记
* @param userAccountId
* @return
*/
UserTagDO
getUserTag
(
Integer
userAccountId
);
/**
* 用户设置渠道等级
* @param userTagDO
*/
void
insertUserTag
(
UserTagDO
userTagDO
);
/**
* 修改用户渠道等级
* @param userTagDO
*/
void
updateUserTag
(
UserTagDO
userTagDO
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/dao/UserServiceDao.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
dao
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
org.apache.ibatis.annotations.Mapper
;
import
java.util.List
;
...
...
@@ -45,4 +46,62 @@ public interface UserServiceDao {
* @return
*/
List
<
Integer
>
listUserAccountIdsByDistrictCode
(
Integer
provinceCode
,
Integer
cityCode
,
Integer
districtCode
);
/**
* 登录账号密码查询用户信息
* @param accountNo
* @param passWord
* @return
*/
UserAccountDO
getUserLoginInfo
(
String
accountNo
,
String
passWord
);
/**
* 批量获取用户信息
* @param bUserAccountQO
* @return
*/
List
<
UserAccountDO
>
feignListBAccountPage
(
BUserAccountQO
bUserAccountQO
);
/**
* 删除用户
* @param removeNO
* @param userAccountId
*/
void
removeUserAccount
(
String
removeNO
,
Integer
userAccountId
);
/**
* 根据账号名称查询数量
* @param excludeId
* @param accountNo
* @return
*/
int
countUserAccountNo
(
Integer
excludeId
,
String
accountNo
);
/**
* 查询用户数量
* @param param
* @return
*/
int
countListBAccountPage
(
BUserAccountQO
param
);
/**
* 查询用户信息
* @param param
* @return
*/
List
<
UserAccountDO
>
listBAccountPage
(
BUserAccountQO
param
);
/**
* 修改用户密码
* @param id
* @param passWord
*/
void
updatePassword
(
Integer
id
,
String
passWord
);
/**
* 获取用户密码
* @param id
* @return
*/
UserAccountDO
getUserAuthPwdInfo
(
Integer
id
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/entity/UserAccountDO.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
entity
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
...
...
@@ -19,7 +21,9 @@ import java.util.Date;
public
class
UserAccountDO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
5007589179946146721L
;
private
Integer
id
;
private
String
accountNo
;
private
Integer
accountType
;
private
String
password
;
private
String
uid
;
private
String
phoneNum
;
private
String
userName
;
...
...
@@ -36,6 +40,9 @@ public class UserAccountDO implements Serializable {
private
Integer
deleted
;
private
Date
createTime
;
private
Date
updateTime
;
private
Integer
provinceCode
;
private
Integer
cityCode
;
private
Integer
districtCode
;
public
UserAccountDO
(
UserAccountVO
userAccountVO
)
{
this
.
id
=
userAccountVO
.
getId
();
...
...
@@ -50,14 +57,27 @@ public class UserAccountDO implements Serializable {
this
.
portType
=
userAccountVO
.
getPortType
();
}
public
UserAccountDO
(
BUserAccountVO
bUserAccountVO
)
{
this
.
id
=
bUserAccountVO
.
getId
();
this
.
accountNo
=
bUserAccountVO
.
getAccountNo
();
this
.
phoneNum
=
bUserAccountVO
.
getPhoneNum
();
this
.
userName
=
bUserAccountVO
.
getUserName
();
this
.
email
=
bUserAccountVO
.
getEmail
();
this
.
accountStatus
=
bUserAccountVO
.
getAccountStatus
();
this
.
remark
=
bUserAccountVO
.
getRemark
();
this
.
provinceCode
=
bUserAccountVO
.
getProvinceCode
();
this
.
cityCode
=
bUserAccountVO
.
getCityCode
();
this
.
districtCode
=
bUserAccountVO
.
getDistrictCode
();
}
public
UserAccountVO
buildUserAccountVO
()
{
return
UserAccountVO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
accountType
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
return
UserAccountVO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
account
No
(
this
.
accountNo
).
account
Type
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
.
userImg
(
this
.
userImg
).
userSex
(
this
.
userSex
).
email
(
this
.
email
).
source
(
this
.
source
).
accountStatus
(
this
.
accountStatus
).
remark
(
this
.
remark
).
portType
(
this
.
portType
)
.
createTime
(
this
.
createTime
).
build
();
}
public
UserAccountSimpleDTO
buildUserAccountSimpleDTO
()
{
return
UserAccountSimpleDTO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
accountType
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
return
UserAccountSimpleDTO
.
builder
().
id
(
this
.
id
).
uid
(
this
.
uid
).
account
No
(
this
.
accountNo
).
account
Type
(
this
.
accountType
).
phoneNum
(
this
.
phoneNum
).
userName
(
this
.
userName
).
nickName
(
this
.
nickName
)
.
userImg
(
this
.
userImg
).
userSex
(
this
.
userSex
).
email
(
this
.
email
).
source
(
this
.
source
).
accountStatus
(
this
.
accountStatus
).
portType
(
this
.
portType
)
.
build
();
}
...
...
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/entity/UserTagDO.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
entity
;
import
com.mmc.iuav.user.model.vo.UserTagVO
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* @author: zj
* @Date: 2023/5/26 20:55
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public
class
UserTagDO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
5355286947297870886L
;
private
Integer
id
;
private
Integer
cooperationTagId
;
private
Integer
userAccountId
;
private
Integer
deleted
;
private
Date
createTime
;
private
Date
updateTime
;
public
UserTagDO
(
UserTagVO
userTagVO
)
{
this
.
id
=
userTagVO
.
getId
();
this
.
userAccountId
=
userTagVO
.
getUserAccountId
();
this
.
cooperationTagId
=
userTagVO
.
getCooperationTagId
();
}
public
UserTagVO
buildUserTagVO
()
{
return
UserTagVO
.
builder
().
id
(
this
.
id
).
cooperationTagId
(
this
.
cooperationTagId
).
userAccountId
(
this
.
userAccountId
).
build
();
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/enums/UserAccountStatus.java
0 → 100644
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
enums
;
/**
* @author 作者 geDuo
* @version 创建时间:2021年9月7日 下午3:06:26
* @explain 类说明
*/
public
enum
UserAccountStatus
{
NORMAL
(
1
,
"正常可用"
),
DISABLE
(
0
,
"禁用"
);
UserAccountStatus
(
int
accountStatus
,
String
statusName
)
{
this
.
accountStatus
=
accountStatus
;
this
.
statusName
=
statusName
;
}
private
Integer
accountStatus
;
private
String
statusName
;
public
Integer
getAccountStatus
()
{
return
accountStatus
;
}
public
void
setAccountStatus
(
Integer
accountStatus
)
{
this
.
accountStatus
=
accountStatus
;
}
public
String
getStatusName
()
{
return
statusName
;
}
public
void
setStatusName
(
String
statusName
)
{
this
.
statusName
=
statusName
;
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/AuthService.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
service
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
/**
...
...
@@ -14,4 +15,18 @@ public interface AuthService {
* @return
*/
ResultBody
appletLogin
(
WxLoginVO
wxLoginVO
);
/**
* 后台用户登录
* @param param
* @return
*/
ResultBody
backEndLogin
(
LoginUserQO
param
);
/**
* 小程序用户登录
* @param unionId
* @return
*/
ResultBody
testAppletLogin
(
String
unionId
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/CooperationService.java
浏览文件 @
ace6ad4a
...
...
@@ -20,4 +20,12 @@ public interface CooperationService {
* @return
*/
ResultBody
apply
(
UserApplyTagVO
cooperationTagVO
);
/**
* 后台用户设置小程序用户等级标签
* @param userAccountId
* @param cooperationTagId
* @return
*/
ResultBody
changeUserTag
(
Integer
userAccountId
,
Integer
cooperationTagId
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/UserAccountService.java
浏览文件 @
ace6ad4a
...
...
@@ -3,6 +3,9 @@ package com.mmc.iuav.user.service;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
java.util.List
;
...
...
@@ -54,4 +57,62 @@ public interface UserAccountService {
* @return
*/
List
<
Integer
>
feignListUserAccountIds
(
Integer
provinceCode
,
Integer
cityCode
,
Integer
districtCode
);
/**
* 添加后台用户
* @param bUserAccountVO
* @return
*/
ResultBody
insertBAccount
(
BUserAccountVO
bUserAccountVO
);
/**
* 删除用户信
* @param userAccountId
* @return
*/
ResultBody
removeBAccount
(
Integer
userAccountId
);
/**
* 后台用户列表
* @param bUserAccountQO
* @return
*/
ResultBody
listBAccountPage
(
BUserAccountQO
bUserAccountQO
);
/**
* 登录账号密码查询用户信息
* @param accountNo
* @param passWord
* @return
*/
UserAccountDO
getUserLoginInfo
(
String
accountNo
,
String
passWord
);
/**
* 内部获取用户列表
* @param bUserAccountQO
* @return
*/
List
<
UserAccountSimpleDTO
>
feignListBAccountPage
(
BUserAccountQO
bUserAccountQO
);
/**
* 修改用户信息
* @param bUserAccountVO
* @return
*/
ResultBody
updateBAccount
(
BUserAccountVO
bUserAccountVO
);
/**
* 修改用户密码
* @param account
* @return
*/
ResultBody
updatePassword
(
BUserAccountVO
account
);
/**
* 验证用户密码
* @param id
* @param authPwd
* @return
*/
ResultBody
feignAuthUserPwd
(
Integer
id
,
String
authPwd
);
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/impl/AuthServiceImpl.java
浏览文件 @
ace6ad4a
...
...
@@ -7,8 +7,12 @@ import com.mmc.iuav.auth.JwtUtil;
import
com.mmc.iuav.general.CodeUtil
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultEnum
;
import
com.mmc.iuav.user.auth.PwdUtil
;
import
com.mmc.iuav.user.constant.WxConstant
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.enums.UserAccountStatus
;
import
com.mmc.iuav.user.model.dto.LoginSuccessDTO
;
import
com.mmc.iuav.user.model.qo.LoginUserQO
;
import
com.mmc.iuav.user.model.vo.AppUserSucVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.model.vo.WxLoginVO
;
...
...
@@ -16,9 +20,11 @@ import com.mmc.iuav.user.service.AuthService;
import
com.mmc.iuav.user.service.UserAccountService
;
import
com.mmc.iuav.user.service.WxService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.security.NoSuchAlgorithmException
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -44,7 +50,7 @@ public class AuthServiceImpl implements AuthService {
if
(
wxLoginVO
.
getFromPort
().
toString
().
equals
(
WxConstant
.
APP
.
toString
()))
{
//调用小程序登录接口,里面包含unionId
String
appWxJson
=
wxService
.
appLogin
(
wxLoginVO
);
if
(
appWxJson
==
null
)
{
if
(
StringUtils
.
isBlank
(
appWxJson
)
)
{
return
ResultBody
.
error
(
ResultEnum
.
APPLET_PORT_TYPE_ERROR
);
}
log
.
info
(
"wx appLogin msg==>"
+
JSONObject
.
toJSONString
(
appWxJson
));
...
...
@@ -59,7 +65,7 @@ public class AuthServiceImpl implements AuthService {
}
else
if
(
wxLoginVO
.
getFromPort
().
equals
(
WxConstant
.
WEB
)){
//获取access_token接口,里面包含unionId
String
pcWxJson
=
wxService
.
pcLogin
(
wxLoginVO
);
if
(
pcWxJson
==
null
)
{
if
(
StringUtils
.
isBlank
(
pcWxJson
)
)
{
return
ResultBody
.
error
(
ResultEnum
.
APPLET_PORT_TYPE_ERROR
);
}
log
.
info
(
"wx pcLogin msg==>"
+
JSONObject
.
toJSONString
(
pcWxJson
));
...
...
@@ -89,11 +95,55 @@ public class AuthServiceImpl implements AuthService {
}
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
map
.
put
(
JwtConstant
.
USER_ACCOUNT_ID
,
userAccountVO
.
getId
());
map
.
put
(
JwtConstant
.
ROLE_ID
,
0
);
//
map.put(JwtConstant.ROLE_ID, 0);
map
.
put
(
JwtConstant
.
TOKEN_TYPE
,
JwtConstant
.
IUAV_TOKEN
);
String
token
=
JwtUtil
.
createJwt
(
map
);
return
ResultBody
.
success
(
AppUserSucVO
.
builder
().
token
(
token
).
uid
(
userAccountVO
.
getUid
()).
phoneNum
(
userAccountVO
.
getPhoneNum
())
.
nickName
(
userAccountVO
.
getNickName
()).
userAccountId
(
userAccountVO
.
getId
()).
sessionKey
(
sessionKey
).
build
());
}
@Override
public
ResultBody
backEndLogin
(
LoginUserQO
param
)
{
//查询用户信息
UserAccountDO
user
=
userAccountService
.
getUserLoginInfo
(
param
.
getAccountNo
(),
param
.
getPassWord
());
if
(
user
==
null
)
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_ACCOUNT_NOT_EXIT_ERROR
);
}
if
(
user
.
getAccountStatus
()
.
equals
(
UserAccountStatus
.
DISABLE
.
getAccountStatus
())
)
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_ACCOUNT_STATUS_ERROR
);
}
String
loginPwd
=
""
;
try
{
loginPwd
=
PwdUtil
.
securityPwd
(
param
.
getPassWord
());
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CONPARED_ERROR
);
}
if
(!
loginPwd
.
equals
(
user
.
getPassword
()))
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_PASSWORD_ERROR
);
}
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
map
.
put
(
JwtConstant
.
USER_ACCOUNT_ID
,
user
.
getId
());
//map.put(JwtConstant.ROLE_ID, 0);
map
.
put
(
JwtConstant
.
TOKEN_TYPE
,
JwtConstant
.
M_TOKEN
);
String
token
=
JwtUtil
.
createJwt
(
map
);
return
ResultBody
.
success
(
LoginSuccessDTO
.
builder
().
token
(
token
).
userAccountId
(
user
.
getId
()).
accountNo
(
user
.
getAccountNo
()).
build
());
}
@Override
public
ResultBody
testAppletLogin
(
String
unionId
)
{
UserAccountVO
userAccountVO
=
userAccountService
.
getUserAccountInfoByUnionId
(
unionId
);
if
(
userAccountVO
!=
null
)
{
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
map
.
put
(
JwtConstant
.
USER_ACCOUNT_ID
,
userAccountVO
.
getId
());
map
.
put
(
JwtConstant
.
TOKEN_TYPE
,
JwtConstant
.
IUAV_TOKEN
);
String
token
=
JwtUtil
.
createJwt
(
map
);
return
ResultBody
.
success
(
AppUserSucVO
.
builder
().
token
(
token
).
uid
(
userAccountVO
.
getUid
()).
phoneNum
(
userAccountVO
.
getPhoneNum
())
.
nickName
(
userAccountVO
.
getNickName
()).
userAccountId
(
userAccountVO
.
getId
()).
build
());
}
return
null
;
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/impl/CooperationServiceImpl.java
浏览文件 @
ace6ad4a
...
...
@@ -7,6 +7,7 @@ import com.mmc.iuav.user.dao.CooperationDao;
import
com.mmc.iuav.user.entity.CompanyAuthDO
;
import
com.mmc.iuav.user.entity.CooperationTagDO
;
import
com.mmc.iuav.user.entity.UserApplyTagDO
;
import
com.mmc.iuav.user.entity.UserTagDO
;
import
com.mmc.iuav.user.model.vo.CooperationTagVO
;
import
com.mmc.iuav.user.model.vo.UserApplyTagVO
;
import
com.mmc.iuav.user.service.CooperationService
;
...
...
@@ -60,4 +61,20 @@ public class CooperationServiceImpl implements CooperationService {
cooperationDao
.
addApply
(
userApplyTagDO
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
changeUserTag
(
Integer
userAccountId
,
Integer
cooperationTagId
)
{
UserTagDO
userTagDO
=
cooperationDao
.
getUserTag
(
userAccountId
);
if
(
userTagDO
==
null
){
//直接插入
userTagDO
=
new
UserTagDO
();
userTagDO
.
setUserAccountId
(
userAccountId
);
userTagDO
.
setCooperationTagId
(
cooperationTagId
);
cooperationDao
.
insertUserTag
(
userTagDO
);
}
//修改渠道等级
userTagDO
.
setCooperationTagId
(
cooperationTagId
);
cooperationDao
.
updateUserTag
(
userTagDO
);
return
ResultBody
.
success
();
}
}
csm-service/cms-service-user/src/main/java/com/mmc/iuav/user/service/impl/UserAccountServiceImpl.java
浏览文件 @
ace6ad4a
package
com
.
mmc
.
iuav
.
user
.
service
.
impl
;
import
com.mmc.iuav.auth.JwtConstant
;
import
com.mmc.iuav.general.CodeUtil
;
import
com.mmc.iuav.page.PageResult
;
import
com.mmc.iuav.response.ResultBody
;
import
com.mmc.iuav.response.ResultEnum
;
import
com.mmc.iuav.user.auth.PwdUtil
;
import
com.mmc.iuav.user.constant.UserSystemConstant
;
import
com.mmc.iuav.user.dao.CooperationDao
;
import
com.mmc.iuav.user.dao.UserServiceDao
;
import
com.mmc.iuav.user.entity.UserAccountDO
;
import
com.mmc.iuav.user.entity.UserTagDO
;
import
com.mmc.iuav.user.model.dto.UserAccountSimpleDTO
;
import
com.mmc.iuav.user.model.qo.BUserAccountQO
;
import
com.mmc.iuav.user.model.vo.BUserAccountVO
;
import
com.mmc.iuav.user.model.vo.CompanyAuthVO
;
import
com.mmc.iuav.user.model.vo.UserAccountVO
;
import
com.mmc.iuav.user.service.CompanyAuthService
;
import
com.mmc.iuav.user.service.UserAccountService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
import
java.security.NoSuchAlgorithmException
;
import
java.util.List
;
import
java.util.stream.Collectors
;
/**
* @author: zj
...
...
@@ -26,6 +39,9 @@ public class UserAccountServiceImpl implements UserAccountService {
@Autowired
private
CompanyAuthService
companyAuthService
;
@Autowired
private
CooperationDao
cooperationDao
;
@Override
public
UserAccountVO
getUserAccountInfoByUnionId
(
String
unionId
)
{
UserAccountDO
userAccountDO
=
userServiceDao
.
getUserAccountInfoByUnionId
(
unionId
);
...
...
@@ -43,7 +59,20 @@ public class UserAccountServiceImpl implements UserAccountService {
@Override
public
UserAccountVO
getUserAccountById
(
Integer
userAccountId
)
{
UserAccountDO
userAccountDO
=
userServiceDao
.
getUserAccountById
(
userAccountId
);
if
(
userAccountDO
==
null
)
{
return
null
;
}
UserAccountVO
userAccountVO
=
userAccountDO
.
buildUserAccountVO
();
CompanyAuthVO
companyAuthVO
=
companyAuthService
.
getCompanyAuthByUId
(
userAccountId
);
if
(
companyAuthVO
!=
null
)
{
userAccountVO
.
setCompanyAuthStatus
(
companyAuthVO
.
getAuthStatus
());
}
else
{
userAccountVO
.
setCompanyAuthStatus
(
0
);
}
UserTagDO
userTag
=
cooperationDao
.
getUserTag
(
userAccountId
);
if
(
userTag
!=
null
){
userAccountVO
.
setCooperationTagId
(
userTag
.
getCooperationTagId
());
}
return
userAccountVO
;
}
...
...
@@ -64,6 +93,10 @@ public class UserAccountServiceImpl implements UserAccountService {
}
else
{
userAccountSimpleDTO
.
setCompanyAuthStatus
(
0
);
}
UserTagDO
userTag
=
cooperationDao
.
getUserTag
(
userAccountId
);
if
(
userTag
!=
null
){
userAccountSimpleDTO
.
setCooperationTagId
(
userTag
.
getCooperationTagId
());
}
return
userAccountSimpleDTO
;
}
...
...
@@ -72,4 +105,113 @@ public class UserAccountServiceImpl implements UserAccountService {
List
<
Integer
>
ids
=
userServiceDao
.
listUserAccountIdsByDistrictCode
(
provinceCode
,
cityCode
,
districtCode
);
return
ids
;
}
@Override
public
ResultBody
insertBAccount
(
BUserAccountVO
bUserAccountVO
)
{
if
(!
bUserAccountVO
.
getPassWord
().
equals
(
bUserAccountVO
.
getAlertPwd
()))
{
// 两次密码不一致
return
ResultBody
.
error
(
ResultEnum
.
PWD_ALERT_ERROR
);
}
// 获取新增的账户名是否已经存在
int
count
=
userServiceDao
.
countUserAccountNo
(
null
,
bUserAccountVO
.
getAccountNo
());
if
(
count
>
0
)
{
return
ResultBody
.
error
(
ResultEnum
.
ADD_USER_ACCOUNT_NAME_EXISTS
);
}
UserAccountDO
userAccountDO
=
new
UserAccountDO
(
bUserAccountVO
);
try
{
userAccountDO
.
setPassword
(
PwdUtil
.
securityPwd
(
bUserAccountVO
.
getPassWord
()));
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CREATE_ERROR
);
}
userAccountDO
.
setUid
(
CodeUtil
.
generateUserUID
());
userAccountDO
.
setAccountType
(
0
);
userAccountDO
.
setPortType
(
0
);
userAccountDO
.
setOpenId
(
userAccountDO
.
getUid
());
userAccountDO
.
setUnionId
(
userAccountDO
.
getUid
());
userServiceDao
.
insertUserAccount
(
userAccountDO
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
removeBAccount
(
Integer
userAccountId
)
{
String
removeNO
=
CodeUtil
.
removeUserAccount
();
userServiceDao
.
removeUserAccount
(
removeNO
,
userAccountId
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
listBAccountPage
(
BUserAccountQO
param
)
{
int
count
=
userServiceDao
.
countListBAccountPage
(
param
);
if
(
count
==
0
)
{
return
ResultBody
.
success
(
PageResult
.
buildPage
(
param
.
getPageNo
(),
param
.
getPageSize
(),
count
));
}
Integer
pageNo
=
param
.
getPageNo
();
param
.
buildCurrentPage
();
List
<
UserAccountDO
>
users
=
userServiceDao
.
listBAccountPage
(
param
);
List
<
UserAccountVO
>
collect
=
users
.
stream
().
map
(
UserAccountDO:
:
buildUserAccountVO
).
collect
(
Collectors
.
toList
());
return
ResultBody
.
success
(
PageResult
.
buildPage
(
pageNo
,
param
.
getPageSize
(),
count
,
collect
));
}
@Override
public
UserAccountDO
getUserLoginInfo
(
String
accountNo
,
String
passWord
)
{
UserAccountDO
userAccountDO
=
userServiceDao
.
getUserLoginInfo
(
accountNo
,
passWord
);
return
userAccountDO
;
}
@Override
public
List
<
UserAccountSimpleDTO
>
feignListBAccountPage
(
BUserAccountQO
bUserAccountQO
)
{
List
<
UserAccountDO
>
list
=
userServiceDao
.
feignListBAccountPage
(
bUserAccountQO
);
List
<
UserAccountSimpleDTO
>
accountSimpleDTOS
=
list
.
stream
().
map
(
UserAccountDO:
:
buildUserAccountSimpleDTO
).
collect
(
Collectors
.
toList
());
return
accountSimpleDTOS
;
}
@Override
public
ResultBody
updateBAccount
(
BUserAccountVO
bUserAccountVO
)
{
// 判断账号是否重复
if
(!
StringUtils
.
isEmpty
(
bUserAccountVO
.
getAccountNo
()))
{
// 如果传入的名字不为空,就查找数据库,看名字是否重复
int
count
=
userServiceDao
.
countUserAccountNo
(
bUserAccountVO
.
getId
(),
bUserAccountVO
.
getAccountNo
());
if
(
count
>
0
)
{
return
ResultBody
.
error
(
ResultEnum
.
UPDATE_USER_ACCOUNT_REPEAT
);
}
}
UserAccountDO
userAccountDO
=
new
UserAccountDO
(
bUserAccountVO
);
userServiceDao
.
update
(
userAccountDO
);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
updatePassword
(
BUserAccountVO
account
)
{
if
(!
account
.
getPassWord
().
equals
(
account
.
getAlertPwd
()))
{
return
ResultBody
.
error
(
ResultEnum
.
PASSWORD_INCONSISTENT
);
}
try
{
account
.
setPassWord
(
PwdUtil
.
securityPwd
(
account
.
getPassWord
()));
userServiceDao
.
updatePassword
(
account
.
getId
(),
account
.
getPassWord
());
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CONPARED_ERROR
);
}
// RoleInfoDO roleInfo = roleInfoDao.getRoleInfoByUser(account.getId());// 查询账号的角色信息
// this.disableOneToken(account.getId(), roleInfo.getId(), JwtConstant.SXTB_ACCOUNT_TOKEN);
return
ResultBody
.
success
();
}
@Override
public
ResultBody
feignAuthUserPwd
(
Integer
id
,
String
authPwd
)
{
UserAccountDO
account
=
userServiceDao
.
getUserAuthPwdInfo
(
id
);
if
(
account
==
null
)
{
return
ResultBody
.
error
(
ResultEnum
.
LOGIN_ACCOUNT_NOT_EXIT_ERROR
);
}
String
pwd
=
""
;
try
{
pwd
=
PwdUtil
.
securityPwd
(
authPwd
);
}
catch
(
NoSuchAlgorithmException
e
)
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CREATE_ERROR
);
}
if
(!
pwd
.
equals
(
account
.
getPassword
()))
{
return
ResultBody
.
error
(
ResultEnum
.
PWD_CONPARED_ERROR
);
}
return
ResultBody
.
success
();
}
}
csm-service/cms-service-user/src/main/resources/mapper/CooperationDao.xml
浏览文件 @
ace6ad4a
...
...
@@ -9,6 +9,11 @@
values(#{cooperationTagId}, #{userAccountId}, #{applyName}, #{applyPhone}, #{remark}, NOW())
</insert>
<insert
id=
"insertUserTag"
useGeneratedKeys=
"true"
parameterType=
"com.mmc.iuav.user.entity.UserTagDO"
keyProperty=
"id"
>
insert into user_tag(user_account_id, cooperation_tag_id, create_time)
values(#{userAccountId}, #{cooperationTagId}, NOW());
</insert>
<update
id=
"updateUserApplyTag"
parameterType=
"com.mmc.iuav.user.entity.UserApplyTagDO"
>
UPDATE user_apply_tag
<set>
...
...
@@ -34,6 +39,10 @@
WHERE id = #{id};
</update>
<update
id=
"updateUserTag"
>
update user_tag set cooperation_tag_id = #{cooperationTagId} where id = #{id}
</update>
<select
id=
"listTags"
resultType=
"com.mmc.iuav.user.entity.CooperationTagDO"
>
select id, tag_name, tag_img, tag_description, create_time from cooperation_tag
</select>
...
...
@@ -43,4 +52,10 @@
from user_apply_tag
where user_account_id = #{userAccountId} and is_deleted = 0
</select>
<select
id=
"getUserTag"
resultType=
"com.mmc.iuav.user.entity.UserTagDO"
>
select id, user_account_id, cooperation_tag_id,is_deleted as deleted, create_time, update_time
from user_tag
where user_account_id = #{userAccountId} and is_deleted = 0
</select>
</mapper>
\ No newline at end of file
csm-service/cms-service-user/src/main/resources/mapper/UserServiceDao.xml
浏览文件 @
ace6ad4a
...
...
@@ -27,13 +27,16 @@
<insert
id=
"insertUserAccount"
parameterType=
"com.mmc.iuav.user.entity.UserAccountDO"
useGeneratedKeys=
"true"
keyProperty=
"id"
>
insert into user_account(account_type, uid,
phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, sourc
e, remark, port_type, create_time)
values(#{accountType}, #{uid}, #{
phoneNum}, #{userName}, #{nickName}, #{userImg}, #{openId}, #{unionId}, #{userSex}, #{email}, #{sourc
e}, #{remark}, #{portType}, NOW())
insert into user_account(account_type, uid,
account_no, pass_word, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source,province_code, city_code, district_cod
e, remark, port_type, create_time)
values(#{accountType}, #{uid}, #{
accountNo}, #{password}, #{phoneNum}, #{userName}, #{nickName}, #{userImg}, #{openId}, #{unionId}, #{userSex}, #{email}, #{source}, #{provinceCode}, #{cityCode}, #{districtCod
e}, #{remark}, #{portType}, NOW())
</insert>
<update
id=
"update"
parameterType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
update user_account
<set>
<if
test=
"accountNo != null"
>
account_no = #{accountNo},
</if>
<if
test=
"phoneNum != null"
>
phone_num = #{phoneNum},
</if>
...
...
@@ -55,6 +58,15 @@
<if
test=
"accountStatus != null"
>
account_status = #{accountStatus},
</if>
<if
test=
"provinceCode != null"
>
province_code = #{provinceCode},
</if>
<if
test=
"cityCode != null"
>
city_code = #{cityCode},
</if>
<if
test=
"districtCode != null"
>
district_code = #{districtCode},
</if>
<if
test=
"remark != null"
>
remark = #{remark},
</if>
...
...
@@ -67,6 +79,16 @@
</where>
</update>
<update
id=
"removeUserAccount"
>
update user_account set is_deleted = 1, union_id = #{removeNO} where id = #{userAccountId}
</update>
<update
id=
"updatePassword"
>
update user_account
set pass_word=#{passWord}
where id = #{id}
</update>
<select
id=
"getUserAccountInfoByUnionId"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
select id, account_type, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted, create_time, update_time
...
...
@@ -94,4 +116,99 @@
and district_code = #{districtCode}
</if>
</select>
<select
id=
"getUserLoginInfo"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
select ua.id,
ua.account_no,
ua.pass_word,
ua.account_status,
ua.account_type,
ua.user_name
from user_account ua
where ua.is_deleted = 0
and BINARY ua.account_no = #{accountNo}
</select>
<select
id=
"feignListBAccountPage"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
parameterType=
"com.mmc.iuav.user.model.qo.BUserAccountQO"
>
select id, account_type, account_no, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted as deleted, create_time, update_time
from user_account
where is_deleted = 0 and port_type = 0
<if
test=
" userIds != null "
>
<foreach
collection=
"userIds"
item=
"id"
open=
"and id in ("
close=
")"
separator=
","
>
#{id}
</foreach>
</if>
<if
test=
"provinceCode != null"
>
and province_code = #{provinceCode}
</if>
<if
test=
"cityCode != null"
>
and city_code = #{cityCode}
</if>
<if
test=
"districtCode != null"
>
and district_code = #{districtCode}
</if>
</select>
<select
id=
"countUserAccountNo"
resultType=
"java.lang.Integer"
>
select count(*) from user_account
where account_no = #{accountNo} and is_deleted = 0 and port_type = 0
<if
test=
"excludeId != null"
>
and id != #{excludeId}
</if>
</select>
<select
id=
"countListBAccountPage"
resultType=
"java.lang.Integer"
parameterType=
"com.mmc.iuav.user.model.qo.BUserAccountQO"
>
select count(*) from user_account
where is_deleted = 0 and port_type = 0
<if
test=
" keyword != null and keyword != '' "
>
and ( account_no like CONCAT("%",#{keyword},"%") or
user_name like CONCAT("%",#{keyword},"%") )
</if>
<if
test=
"provinceCode != null"
>
and province_code = #{provinceCode}
</if>
<if
test=
"cityCode != null"
>
and city_code = #{cityCode}
</if>
<if
test=
"districtCode != null"
>
and district_code = #{districtCode}
</if>
<if
test=
"accountStatus != null"
>
and account_status = #{accountStatus}
</if>
</select>
<select
id=
"listBAccountPage"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
parameterType=
"com.mmc.iuav.user.model.qo.BUserAccountQO"
>
select id, account_type, account_no, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted as deleted, create_time, update_time
from user_account
where is_deleted = 0 and port_type = 0
<if
test=
" keyword != null and keyword != '' "
>
and ( account_no like CONCAT("%",#{keyword},"%") or
user_name like CONCAT("%",#{keyword},"%") )
</if>
<if
test=
"provinceCode != null"
>
and province_code = #{provinceCode}
</if>
<if
test=
"cityCode != null"
>
and city_code = #{cityCode}
</if>
<if
test=
"districtCode != null"
>
and district_code = #{districtCode}
</if>
<if
test=
"accountStatus != null"
>
and account_status = #{accountStatus}
</if>
</select>
<select
id=
"getUserAuthPwdInfo"
resultType=
"com.mmc.iuav.user.entity.UserAccountDO"
>
select id,
account_no,
pass_word
from user_account
where is_deleted = 0
and id =
#{id}
</select>
</mapper>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论