Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
EduSpider
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
viitto
EduSpider
Commits
499151f8
Commit
499151f8
authored
May 26, 2022
by
黄奎
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
http://gitlab.oytour.com/viitto/eduspider
parents
ab5a85f1
b9db4d4f
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
1890 additions
and
94 deletions
+1890
-94
CacheKey.cs
EduSpider.Cache/CacheKey.cs
+14
-0
EduSpider.Cache.csproj
EduSpider.Cache/EduSpider.Cache.csproj
+19
-0
UserReidsCache.cs
EduSpider.Cache/User/UserReidsCache.cs
+163
-0
IAccountService.cs
EduSpider.IServices/IAccountService.cs
+19
-0
UserInfo.cs
EduSpider.Model/CacheModel/UserInfo.cs
+52
-0
RB_Account.cs
EduSpider.Model/Entity/RB_Account.cs
+4
-3
RB_Account_Extend.cs
EduSpider.Model/Extend/RB_Account_Extend.cs
+5
-0
AccountRepository.cs
EduSpider.Repository/AccountRepository.cs
+5
-5
AccountService.cs
EduSpider.Services/AccountService.cs
+58
-0
Config.cs
EduSpider.Utility/Config.cs
+198
-0
EduSpider.Utility.csproj
EduSpider.Utility/EduSpider.Utility.csproj
+2
-0
DES.cs
EduSpider.Utility/Encrypt/DES.cs
+0
-80
AccountTypeEnum.cs
EduSpider.Utility/Enum/AccountTypeEnum.cs
+22
-0
ApiRequestFromEnum.cs
EduSpider.Utility/Enum/ApiRequestFromEnum.cs
+22
-0
DateStateEnum.cs
EduSpider.Utility/Enum/DateStateEnum.cs
+22
-0
HttpHelper.cs
EduSpider.Utility/HttpHelper.cs
+82
-1
EncryptionHelper.cs
EduSpider.Utility/Plugin/EncryptionHelper.cs
+720
-0
WeChatHelper.cs
EduSpider.Utility/Plugin/WeChatHelper.cs
+195
-0
LoginController.cs
EduSpider.WebApi/Controllers/User/LoginController.cs
+264
-0
EduSpider.WebApi.csproj
EduSpider.WebApi/EduSpider.WebApi.csproj
+2
-0
Startup.cs
EduSpider.WebApi/Startup.cs
+7
-0
appsettings.json
EduSpider.WebApi/appsettings.json
+9
-1
EduSpider.sln
EduSpider.sln
+2
-0
StudentManager.cs
EduSpider/Spiders/ClassInRule/StudentManager.cs
+2
-2
TeacherManager.cs
EduSpider/Spiders/ClassInRule/TeacherManager.cs
+2
-2
No files found.
EduSpider.Cache/CacheKey.cs
0 → 100644
View file @
499151f8
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
namespace
EduSpider.Cache
{
public
class
CacheKey
{
/// <summary>
/// 用户登录缓存Key
/// </summary>
public
static
string
User_Login_Key
=
"JJSW_Login_"
;
}
}
EduSpider.Cache/EduSpider.Cache.csproj
0 → 100644
View file @
499151f8
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="StackExchange.Redis" Version="2.0.601" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EduSpider.Model\EduSpider.Model.csproj" />
<ProjectReference Include="..\EduSpider.Repository\EduSpider.Repository.csproj" />
</ItemGroup>
</Project>
EduSpider.Cache/User/UserReidsCache.cs
0 → 100644
View file @
499151f8
using
EduSpider.Model.Cache
;
using
EduSpider.Repository
;
using
EduSpider.Utility
;
using
EduSpider.Utility.Enum
;
using
System
;
using
System.Linq
;
using
VTX.FW.Helper
;
using
VTX.FW.Api
;
using
VTX.FW.Cache
;
namespace
EduSpider.Cache.User
{
/// <summary>
/// redis缓存
/// </summary>
public
class
UserReidsCache
{
readonly
static
RedisCache
redis
=
new
(
new
RedisConfig
{
DbNum
=
3
,
RedisServer
=
ConfigHelper
.
GetAppsettings
(
"RedisSetting"
,
"RedisServer"
),
RedisPort
=
Convert
.
ToInt32
(
ConfigHelper
.
GetAppsettings
(
"RedisSetting"
,
"RedisPort"
)),
RedisPwd
=
ConfigHelper
.
GetAppsettings
(
"RedisSetting"
,
"RedisPwd"
)
});
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="model"></param>
public
static
void
UserInfoSet
(
string
cacheKey
,
UserInfo
model
,
int
JwtExpirTime
)
{
try
{
TimeSpan
ts
=
GetExpirTime
(
JwtExpirTime
);
redis
.
StringSet
<
UserInfo
>(
cacheKey
,
model
,
ts
);
}
catch
(
Exception
ex
)
{
LogHelper
.
WriteError
(
"UserInfoSet"
,
"缓存设置失败"
,
ex
);
}
}
/// <summary>
/// 获取缓存时长
/// </summary>
/// <param name="JwtExpirTime"></param>
/// <returns></returns>
private
static
TimeSpan
GetExpirTime
(
int
JwtExpirTime
)
{
DateTime
dt
=
DateTime
.
Now
;
DateTime
dt2
=
DateTime
.
Now
;
TimeSpan
ts
=
dt
.
AddSeconds
(
JwtExpirTime
)
-
dt2
;
return
ts
;
}
/// <summary>
/// 判断key是否存在
/// </summary>
/// <param name="cacheKey"></param>
/// <returns></returns>
public
static
bool
Exists
(
string
cacheKey
)
{
return
redis
.
KeyExists
(
cacheKey
);
}
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="Data"></param>
/// <param name="JwtExpirTime"></param>
public
static
void
Set
(
string
cacheKey
,
object
Data
,
int
JwtExpirTime
)
{
try
{
TimeSpan
ts
=
GetExpirTime
(
JwtExpirTime
);
redis
.
StringSet
(
cacheKey
,
Data
,
ts
);
}
catch
(
Exception
)
{
}
}
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="cacheKey"></param>
public
static
object
Get
(
string
cacheKey
)
{
try
{
object
info
=
redis
.
StringGet
<
object
>(
cacheKey
);
return
info
;
}
catch
(
Exception
)
{
return
""
;
}
}
/// <summary>
/// 账号仓储层对象
/// </summary>
private
static
readonly
AccountRepository
accountRepository
=
new
();
/// <summary>
/// 获取用户登录信息
/// </summary>
/// <param name="Id">账号Id</param>
/// <param name="apiRequestFromEnum">请求来源</param>
/// <returns></returns>
public
static
UserInfo
GetUserLoginInfo
(
object
Id
,
ApiRequestFromEnum
apiRequestFromEnum
=
ApiRequestFromEnum
.
MiniProgram
)
{
UserInfo
userInfo
=
null
;
if
(
Id
!=
null
)
{
string
cacheKey
=
CacheKey
.
User_Login_Key
+
Id
.
ToString
();
try
{
userInfo
=
redis
.
StringGet
<
UserInfo
>(
cacheKey
);
}
catch
(
Exception
ex
)
{
LogHelper
.
WriteError
(
"GetUserLoginInfo"
,
"获取缓存失败"
,
ex
);
}
if
(
userInfo
==
null
)
{
Int32
.
TryParse
(
Id
.
ToString
(),
out
int
NewId
);
if
(
NewId
>
0
)
{
string
token
=
""
;
var
model
=
accountRepository
.
GetAccountList
(
new
Model
.
Extend
.
RB_Account_Extend
()
{
Id
=
NewId
})?.
FirstOrDefault
();
if
(
model
!=
null
)
{
userInfo
=
new
UserInfo
{
Id
=
model
.
Id
,
AccountType
=
model
.
AccountType
,
AccountName
=
model
.
AccountName
,
Token
=
token
,
ApiRequestFromEnum
=
apiRequestFromEnum
,
AccountId
=
model
.
AccountId
,
UserMobile
=
model
.
Account
,
UserIcon
=
model
.
UserIcon
,
};
UserInfoSet
(
CacheKey
.
User_Login_Key
+
Id
.
ToString
(),
userInfo
,
Config
.
JwtExpirTime
);
}
}
}
}
else
{
userInfo
=
new
UserInfo
();
}
return
userInfo
;
}
}
}
\ No newline at end of file
EduSpider.IServices/IAccountService.cs
0 → 100644
View file @
499151f8
using
EduSpider.Model.Extend
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
using
VTX.FW.Config
;
namespace
EduSpider.IServices
{
/// <summary>
/// 账号服务层接口
/// </summary>
public
interface
IAccountService
:
IDependency
{
List
<
RB_Account_Extend
>
GetAccountList
(
RB_Account_Extend
demodel
);
bool
UpdateAccountUnionId
(
RB_Account_Extend
model
);
}
}
EduSpider.Model/CacheModel/UserInfo.cs
0 → 100644
View file @
499151f8
using
EduSpider.Utility.Enum
;
using
System.Collections.Generic
;
namespace
EduSpider.Model.Cache
{
/// <summary>
/// 用户缓存
/// </summary>
public
class
UserInfo
{
/// <summary>
/// 账号编号
/// </summary>
public
int
Id
{
get
;
set
;
}
/// <summary>
/// 账号名称
/// </summary>
public
string
AccountName
{
get
;
set
;
}
/// <summary>
/// 请求来源
/// </summary>
public
ApiRequestFromEnum
ApiRequestFromEnum
{
get
;
set
;
}
/// <summary>
/// 账号类型(1-管理端,2,-教师端,3-助教,4-学生)
/// </summary>
public
AccountTypeEnum
AccountType
{
get
;
set
;
}
/// <summary>
/// 对应的账户id
/// </summary>
public
int
AccountId
{
get
;
set
;
}
/// <summary>
/// Token验证
/// </summary>
public
string
Token
{
get
;
set
;
}
/// <summary>
/// 用户头像
/// </summary>
public
string
UserIcon
{
get
;
set
;
}
/// <summary>
/// 用户手机号码
/// </summary>
public
string
UserMobile
{
get
;
set
;
}
}
}
\ No newline at end of file
EduSpider.Model/Entity/RB_Account.cs
View file @
499151f8
using
System
;
using
EduSpider.Utility.Enum
;
using
System
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Linq
;
using
System.Text
;
using
System.Text
;
...
@@ -29,7 +30,7 @@ namespace EduSpider.Model.Entity
...
@@ -29,7 +30,7 @@ namespace EduSpider.Model.Entity
/// <summary>
/// <summary>
/// 类型 1老师 2学生
/// 类型 1老师 2学生
/// </summary>
/// </summary>
public
int
AccountType
{
get
;
set
;
}
public
AccountTypeEnum
AccountType
{
get
;
set
;
}
/// <summary>
/// <summary>
/// 对应 老师/学生ID
/// 对应 老师/学生ID
...
@@ -39,7 +40,7 @@ namespace EduSpider.Model.Entity
...
@@ -39,7 +40,7 @@ namespace EduSpider.Model.Entity
/// <summary>
/// <summary>
/// 删除状态
/// 删除状态
/// </summary>
/// </summary>
public
int
Status
{
get
;
set
;
}
public
DateStateEnum
Status
{
get
;
set
;
}
/// <summary>
/// <summary>
/// 微信唯一识别码
/// 微信唯一识别码
...
...
EduSpider.Model/Extend/RB_Account_Extend.cs
View file @
499151f8
...
@@ -16,5 +16,10 @@ namespace EduSpider.Model.Extend
...
@@ -16,5 +16,10 @@ namespace EduSpider.Model.Extend
/// 帐号名称
/// 帐号名称
/// </summary>
/// </summary>
public
string
AccountName
{
get
;
set
;
}
public
string
AccountName
{
get
;
set
;
}
/// <summary>
/// 用户头像
/// </summary>
public
string
UserIcon
{
get
;
set
;
}
}
}
}
}
EduSpider.Repository/AccountRepository.cs
View file @
499151f8
...
@@ -38,15 +38,15 @@ namespace EduSpider.Repository
...
@@ -38,15 +38,15 @@ namespace EduSpider.Repository
}
}
if
(
demodel
.
AccountType
>
0
)
if
(
demodel
.
AccountType
>
0
)
{
{
where
+=
$" and t.
{
nameof
(
RB_Account_Extend
.
AccountType
)}
=
{
demodel
.
AccountType
}
"
;
where
+=
$" and t.
{
nameof
(
RB_Account_Extend
.
AccountType
)}
=
{
(
int
)
demodel
.
AccountType
}
"
;
}
}
if
(
demodel
.
AccountId
>
0
)
if
(
demodel
.
AccountId
>
0
)
{
{
where
+=
$" and t.
{
nameof
(
RB_Account_Extend
.
AccountId
)}
=
{
demodel
.
AccountId
}
"
;
where
+=
$" and t.
{
nameof
(
RB_Account_Extend
.
AccountId
)}
=
{
demodel
.
AccountId
}
"
;
}
}
if
(
demodel
.
Status
>
-
1
)
if
(
demodel
.
Status
>
=
0
)
{
{
where
+=
$" and t.
{
nameof
(
RB_Account_Extend
.
Status
)}
=
{
demodel
.
Status
}
"
;
where
+=
$" and t.
{
nameof
(
RB_Account_Extend
.
Status
)}
=
{
(
int
)
demodel
.
Status
}
"
;
}
}
if
(!
string
.
IsNullOrEmpty
(
demodel
.
Account
))
if
(!
string
.
IsNullOrEmpty
(
demodel
.
Account
))
{
{
...
@@ -59,10 +59,10 @@ namespace EduSpider.Repository
...
@@ -59,10 +59,10 @@ namespace EduSpider.Repository
string
sql
=
$@"
string
sql
=
$@"
select * from(
select * from(
SELECT a.Id,a.Account,a.`Password`,a.AccountType,a.AccountId,t.TeacherName AS AccountName,a.Status FROM rb_account a
SELECT a.Id,a.Account,a.`Password`,a.AccountType,a.AccountId,t.TeacherName AS AccountName,
t.Logo as UserIcon,
a.Status FROM rb_account a
INNER JOIN rb_teacher t on a.AccountId =t.TeacherId and a.AccountType =1
INNER JOIN rb_teacher t on a.AccountId =t.TeacherId and a.AccountType =1
UNION
UNION
SELECT a.Id,a.Account,a.`Password`,a.AccountType,a.AccountId,s.StudentName AS AccountName,a.Status FROM rb_account a
SELECT a.Id,a.Account,a.`Password`,a.AccountType,a.AccountId,s.StudentName AS AccountName,
'' as UserIcon,
a.Status FROM rb_account a
INNER JOIN rb_student s on a.AccountId =s.StudId and a.AccountType =2
INNER JOIN rb_student s on a.AccountId =s.StudId and a.AccountType =2
) t where
{
where
}
) t where
{
where
}
"
;
"
;
...
...
EduSpider.Services/AccountService.cs
0 → 100644
View file @
499151f8
using
EduSpider.IServices
;
using
EduSpider.Model.Extend
;
using
EduSpider.Repository
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
using
VTX.FW.Attr
;
using
VTX.FW.DB
;
namespace
EduSpider.Services
{
/// <summary>
/// 账号服务实现
/// </summary>
public
class
AccountService
:
IAccountService
{
/// <summary>
/// 帐号仓储接口
/// </summary>
[
Autowired
]
public
IAccountRepository
accountRepository
{
get
;
set
;
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="demodel"></param>
/// <returns></returns>
public
List
<
RB_Account_Extend
>
GetAccountList
(
RB_Account_Extend
demodel
)
{
return
accountRepository
.
GetAccountList
(
demodel
);
}
/// <summary>
/// 更新微信信息
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public
bool
UpdateAccountUnionId
(
RB_Account_Extend
model
)
{
Dictionary
<
string
,
object
>
keyValues
=
new
()
{
{
nameof
(
RB_Account_Extend
.
OpenId
),
model
.
OpenId
},
{
nameof
(
RB_Account_Extend
.
UnionId
),
model
.
UnionId
},
};
List
<
WhereHelper
>
wheres
=
new
()
{
new
WhereHelper
(){
FiledName
=
nameof
(
RB_Account_Extend
.
Id
),
FiledValue
=
model
.
Id
,
OperatorEnum
=
OperatorEnum
.
Equal
}
};
return
accountRepository
.
Update
(
keyValues
,
wheres
);
}
}
}
EduSpider.Utility/Config.cs
0 → 100644
View file @
499151f8
using
Microsoft.Extensions.Configuration
;
using
Microsoft.Extensions.Configuration.Json
;
using
System
;
using
System.IO
;
using
System.Text.RegularExpressions
;
using
VTX.FW.Helper
;
namespace
EduSpider.Utility
{
/// <summary>
/// 全局配置
/// </summary>
public
class
Config
{
/// <summary>
/// 配置文件注入
/// </summary>
public
readonly
static
IConfiguration
Configuration
;
static
Config
()
{
try
{
Configuration
=
new
ConfigurationBuilder
()
.
Add
(
new
JsonConfigurationSource
{
Path
=
"appsettings.json"
,
ReloadOnChange
=
true
})
.
Build
();
}
catch
(
Exception
ex
)
{
LogHelper
.
WriteError
(
"Config"
,
"获取配置文件"
,
ex
);
}
}
/// <summary>
/// 获取连接字符串
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public
static
string
GetConnectionString
(
string
key
)
{
try
{
return
Configuration
.
GetConnectionString
(
key
);
}
catch
{
return
""
;
}
}
/// <summary>
/// 读取配置文件key的值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public
static
string
ReadConfigKey
(
string
key
,
string
subKey
=
""
)
{
string
valueStr
=
""
;
try
{
if
(!
string
.
IsNullOrWhiteSpace
(
subKey
))
{
valueStr
=
Configuration
.
GetSection
(
key
)[
subKey
].
ToString
();
}
else
{
valueStr
=
Configuration
.
GetSection
(
key
).
Value
;
}
}
catch
{
}
return
valueStr
;
}
/// <summary>
/// 异常日志保存路径
/// </summary>
public
static
string
LogPath
{
get
{
string
logPath
=
Path
.
Combine
(
AppDomain
.
CurrentDomain
.
BaseDirectory
,
"log/error"
);
return
logPath
.
ToString
();
}
}
/// <summary>
/// 打印日志保存路径
/// </summary>
public
static
string
InofLogPath
{
get
{
string
logPath
=
Path
.
Combine
(
AppDomain
.
CurrentDomain
.
BaseDirectory
,
"log/info"
);
return
logPath
.
ToString
();
}
}
/// <summary>
/// 接口请求日志保存路径
/// </summary>
public
static
string
RequestLogPath
{
get
{
string
logPath
=
Path
.
Combine
(
AppDomain
.
CurrentDomain
.
BaseDirectory
,
"log/request"
);
return
logPath
.
ToString
();
}
}
/// <summary>
/// JWT加密秘钥
/// </summary>
public
static
string
JwtSecretKey
{
get
{
return
ReadConfigKey
(
"JwtSecretKey"
);
}
}
/// <summary>
/// 过期时间,单位为秒
/// </summary>
public
static
int
JwtExpirTime
{
get
{
Int32
.
TryParse
(
ReadConfigKey
(
"JwtExpirTime"
),
out
int
JwtExpirTime
);
return
JwtExpirTime
;
}
}
/// <summary>
/// 获取文件相对路径
/// </summary>
public
static
string
GetFilePath
(
string
path
)
{
if
(!
string
.
IsNullOrWhiteSpace
(
path
))
{
string
p
=
@"(http|https)://(?<domain>[^(:|/]*)"
;
Regex
reg
=
new
Regex
(
p
,
RegexOptions
.
IgnoreCase
);
string
value
=
reg
.
Match
(
path
).
Value
;
if
(!
string
.
IsNullOrEmpty
(
value
))
{
Uri
url
=
new
Uri
(
path
);
return
url
.
AbsolutePath
;
}
else
{
return
path
;
}
}
else
{
return
path
;
}
}
/// <summary>
/// 甲鹤小程序AppId
/// </summary>
public
static
string
AppID
{
get
{
return
"wx38e054ee42b054f4"
;
}
}
/// <summary>
/// 甲鹤小程序AppSecret
/// </summary>
public
static
string
AppSecret
{
get
{
return
"d3ad4699265ba885ae2c8b65bf574ea5"
;
}
}
/// <summary>
/// 微信小程序Api地址
/// </summary>
public
static
string
WechatApi
{
get
{
return
"https://api.weixin.qq.com/"
;
}
}
/// <summary>
/// 是否是本地服务器
/// </summary>
public
static
int
IsLocal
{
get
{
Int32
.
TryParse
(
ReadConfigKey
(
"IsLocal"
),
out
int
_IsLocal
);
return
_IsLocal
;
}
}
}
}
\ No newline at end of file
EduSpider.Utility/EduSpider.Utility.csproj
View file @
499151f8
...
@@ -5,6 +5,8 @@
...
@@ -5,6 +5,8 @@
</PropertyGroup>
</PropertyGroup>
<ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="VTX.FW" Version="1.1.0" />
<PackageReference Include="VTX.FW" Version="1.1.0" />
</ItemGroup>
</ItemGroup>
...
...
EduSpider.Utility/Encrypt/DES.cs
deleted
100644 → 0
View file @
ab5a85f1
using
System
;
using
System.IO
;
using
System.Security.Cryptography
;
using
System.Text
;
namespace
EduSpider.Utility
{
/// <summary>
/// DES 加解密
/// </summary>
public
class
DES
{
private
static
readonly
byte
[]
_webapikey
=
{
0xF1
,
0x12
,
0xA3
,
0xD1
,
0xBA
,
0x54
,
0x2A
,
0x88
};
private
static
readonly
byte
[]
_webapiiv
=
{
0x04
,
0xAE
,
0x57
,
0x83
,
0x56
,
0x28
,
0x66
,
0xA7
};
/// <summary>
/// DES加密(单向,只能C#用)
/// </summary>
/// <param name="EncryptString">加密字符串</param>
/// <returns></returns>
public
static
string
Encrypt
(
string
EncryptString
)
{
return
Encrypt
(
EncryptString
,
_webapikey
,
_webapiiv
);
}
/// <summary>
/// DES加密(单向,只能C#用)
/// </summary>
/// <param name="EncryptString">待加密的字符串</param>
/// <param name="Key">加密密钥</param>
/// <param name="IV">初始化加密函数的变量</param>
/// <returns></returns>
private
static
string
Encrypt
(
string
EncryptString
,
byte
[]
Key
,
byte
[]
IV
)
{
byte
[]
inputByteArray
=
Encoding
.
UTF8
.
GetBytes
(
EncryptString
);
DESCryptoServiceProvider
des
=
new
DESCryptoServiceProvider
();
MemoryStream
mStream
=
new
MemoryStream
();
CryptoStream
cStream
=
new
CryptoStream
(
mStream
,
des
.
CreateEncryptor
(
Key
,
IV
),
CryptoStreamMode
.
Write
);
cStream
.
Write
(
inputByteArray
,
0
,
inputByteArray
.
Length
);
cStream
.
FlushFinalBlock
();
return
Convert
.
ToBase64String
(
mStream
.
ToArray
());
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="DecryptString">待解密的字符串</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public
static
string
Decrypt
(
string
DecryptString
)
{
return
Decrypt
(
DecryptString
,
_webapikey
,
_webapiiv
);
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="DecryptString">待解密的字符串</param>
/// <param name="Key">解密密钥,要求为8位,和加密密钥相同</param>
/// <param name="IV">初始化加密函数的变量</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
private
static
string
Decrypt
(
string
DecryptString
,
byte
[]
Key
,
byte
[]
IV
)
{
try
{
byte
[]
inputByteArray
=
Convert
.
FromBase64String
(
DecryptString
);
DESCryptoServiceProvider
des
=
new
DESCryptoServiceProvider
();
MemoryStream
mStream
=
new
MemoryStream
();
CryptoStream
cStream
=
new
CryptoStream
(
mStream
,
des
.
CreateDecryptor
(
Key
,
IV
),
CryptoStreamMode
.
Write
);
cStream
.
Write
(
inputByteArray
,
0
,
inputByteArray
.
Length
);
cStream
.
FlushFinalBlock
();
return
Encoding
.
UTF8
.
GetString
(
mStream
.
ToArray
());
}
catch
{
return
""
;
}
}
}
}
\ No newline at end of file
EduSpider.Utility/Enum/AccountTypeEnum.cs
0 → 100644
View file @
499151f8
using
VTX.FW.Attr
;
namespace
EduSpider.Utility.Enum
{
/// <summary>
/// 账号类型
/// </summary>
public
enum
AccountTypeEnum
{
/// <summary>
/// 老师
/// </summary>
[
EnumField
(
"老师"
)]
Teacher
=
1
,
/// <summary>
/// 学生
/// </summary>
[
EnumField
(
"学生"
)]
Student
=
2
}
}
EduSpider.Utility/Enum/ApiRequestFromEnum.cs
0 → 100644
View file @
499151f8
using
VTX.FW.Attr
;
namespace
EduSpider.Utility.Enum
{
/// <summary>
/// 接口请求来源
/// </summary>
public
enum
ApiRequestFromEnum
{
/// <summary>
/// Web端
/// </summary>
[
EnumField
(
"Web端"
)]
Web
=
1
,
/// <summary>
/// 小程序
/// </summary>
[
EnumField
(
"小程序"
)]
MiniProgram
=
2
,
}
}
\ No newline at end of file
EduSpider.Utility/Enum/DateStateEnum.cs
0 → 100644
View file @
499151f8
using
VTX.FW.Attr
;
namespace
EduSpider.Utility.Enum
{
/// <summary>
/// 数据状态
/// </summary>
public
enum
DateStateEnum
{
/// <summary>
/// 正常
/// </summary>
[
EnumField
(
"正常"
)]
Normal
=
0
,
/// <summary>
/// 已删除
/// </summary>
[
EnumField
(
"已删除"
)]
Delete
=
1
}
}
\ No newline at end of file
EduSpider.Utility/HttpHelper.cs
View file @
499151f8
using
System
;
using
System
;
using
System.IO
;
using
System.Net
;
using
System.Net
;
using
System.Net.Http
;
using
System.Net.Http
;
using
System.Text
;
using
VTX.FW.Helper
;
namespace
EduSpider.Utility
namespace
EduSpider.Utility
{
{
...
@@ -76,5 +78,84 @@ namespace EduSpider.Utility
...
@@ -76,5 +78,84 @@ namespace EduSpider.Utility
}
}
return
cc
;
return
cc
;
}
}
/// <summary>
/// Post提交数据
/// </summary>
/// <param name="url">url地址</param>
/// <param name="body">参数</param>
/// <param name="contenttype">参数</param>
/// <returns></returns>
public
static
string
HttpPost
(
string
url
,
string
body
,
string
contenttype
=
""
)
{
try
{
Encoding
encoding
=
Encoding
.
UTF8
;
HttpWebRequest
request
=
(
HttpWebRequest
)
WebRequest
.
Create
(
url
);
request
.
Method
=
"POST"
;
request
.
Accept
=
"application/json, text/javascript, */*"
;
//"text/html, application/xhtml+xml, */*";
request
.
ContentType
=
"application/json; charset=utf-8"
;
if
(
contenttype
!=
""
)
{
request
.
ContentType
=
contenttype
;
}
byte
[]
buffer
=
encoding
.
GetBytes
(
body
);
request
.
ContentLength
=
buffer
.
Length
;
request
.
GetRequestStream
().
Write
(
buffer
,
0
,
buffer
.
Length
);
HttpWebResponse
response
=
(
HttpWebResponse
)
request
.
GetResponse
();
using
StreamReader
reader
=
new
StreamReader
(
response
.
GetResponseStream
(),
encoding
);
return
reader
.
ReadToEnd
();
}
catch
(
WebException
ex
)
{
var
res
=
(
HttpWebResponse
)
ex
.
Response
;
StringBuilder
sb
=
new
StringBuilder
();
StreamReader
sr
=
new
StreamReader
(
res
.
GetResponseStream
(),
Encoding
.
UTF8
);
sb
.
Append
(
sr
.
ReadToEnd
());
throw
new
Exception
(
sb
.
ToString
());
}
}
/// <summary>
/// 执行HTTP GET请求。
/// </summary>
/// <param name="url">请求地址</param>
/// <returns>HTTP响应</returns>
public
static
string
HttpGet
(
string
url
)
{
string
result
=
""
;
HttpWebRequest
req
=
(
HttpWebRequest
)
WebRequest
.
Create
(
url
);
req
.
Method
=
"GET"
;
req
.
ContentType
=
"application/json"
;
HttpWebResponse
rsp
=
(
HttpWebResponse
)
req
.
GetResponse
();
Encoding
encoding
=
Encoding
.
UTF8
;
if
(!
string
.
IsNullOrWhiteSpace
(
rsp
.
CharacterSet
))
{
encoding
=
Encoding
.
GetEncoding
(
rsp
.
CharacterSet
);
}
System
.
IO
.
Stream
stream
=
null
;
StreamReader
reader
=
null
;
try
{
// 以字符流的方式读取HTTP响应
stream
=
rsp
.
GetResponseStream
();
reader
=
new
StreamReader
(
stream
,
encoding
);
result
=
reader
.
ReadToEnd
();
}
catch
(
Exception
ex
)
{
LogHelper
.
WriteError
(
""
,
string
.
Format
(
"HttpGet:url=={0}"
,
url
),
ex
);
result
=
""
;
}
finally
{
// 释放资源
if
(
reader
!=
null
)
reader
.
Close
();
if
(
stream
!=
null
)
stream
.
Close
();
if
(
rsp
!=
null
)
rsp
.
Close
();
}
return
result
;
}
}
}
}
}
\ No newline at end of file
EduSpider.Utility/Plugin/EncryptionHelper.cs
0 → 100644
View file @
499151f8
using
System
;
using
System.Collections.Generic
;
using
System.IO
;
using
System.Linq
;
using
System.Security.Cryptography
;
using
System.Text
;
using
System.Threading.Tasks
;
using
Newtonsoft.Json.Linq
;
using
VTX.FW.Helper
;
namespace
EduSpider.Utility
{
/// <summary>
/// 加密帮助类
/// </summary>
public
class
EncryptionHelper
{
#
region
默认密钥定义
/// <summary>
/// 默认加密密钥
/// </summary>
public
const
string
DefaultDESKey
=
@"12345678"
;
/// <summary>
/// 默认加密向量
/// </summary>
public
const
string
DefaultDESIV
=
@"1234567812345678"
;
/// <summary>
/// 默认加密密钥
/// </summary>
public
const
string
Default3DESKey
=
@"123456781234567812345678"
;
/// <summary>
/// 默认加密向量
/// </summary>
public
const
string
Default3DESIV
=
@"1234567812345678"
;
/// <summary>
/// 获取密钥
/// </summary>
public
const
string
DefaultAESKey
=
@"12345678123456781234567812345678"
;
/// <summary>
/// 获取向量
/// </summary>
public
const
string
DefaultAESIV
=
@"1234567812345678"
;
/// <summary>
/// 默认加密密钥
/// </summary>
public
const
string
DefaultRC2Key
=
@"1234567812345678"
;
/// <summary>
/// 默认加密向量
/// </summary>
public
const
string
DefaultRC2IV
=
@"1234567812345678"
;
/// <summary>
/// 默认的RSA公钥
/// </summary>
public
const
string
DefaultRSAPublicKey
=
@"<RSAKeyValue>xxx</RSAKeyValue>"
;
/// <summary>
/// 默认的RSA密钥
/// </summary>
public
const
string
DefaultRSAPrivateKey
=
@"<RSAKeyValue>ccc</RSAKeyValue>"
;
#
endregion
#
region
对称加密算法
#
region
AES
加密算法
/// <summary>
/// AES 加密
/// </summary>
/// <param name="str">明文(待加密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public
static
string
AesEncrypt
(
string
str
,
string
key
)
{
if
(
string
.
IsNullOrEmpty
(
str
))
return
null
;
Byte
[]
toEncryptArray
=
Encoding
.
UTF8
.
GetBytes
(
str
);
RijndaelManaged
rm
=
new
RijndaelManaged
{
Key
=
Encoding
.
UTF8
.
GetBytes
(
key
),
Mode
=
CipherMode
.
ECB
,
Padding
=
PaddingMode
.
PKCS7
};
ICryptoTransform
cTransform
=
rm
.
CreateEncryptor
();
Byte
[]
resultArray
=
cTransform
.
TransformFinalBlock
(
toEncryptArray
,
0
,
toEncryptArray
.
Length
);
return
Convert
.
ToBase64String
(
resultArray
,
0
,
resultArray
.
Length
);
}
/// <summary>
/// AES 解密
/// </summary>
/// <param name="str">明文(待解密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public
static
string
AesDecrypt
(
string
str
,
string
key
)
{
if
(
string
.
IsNullOrEmpty
(
str
))
return
null
;
Byte
[]
toEncryptArray
=
Convert
.
FromBase64String
(
str
);
RijndaelManaged
rm
=
new
RijndaelManaged
{
Key
=
Encoding
.
UTF8
.
GetBytes
(
key
),
Mode
=
CipherMode
.
ECB
,
Padding
=
PaddingMode
.
PKCS7
};
ICryptoTransform
cTransform
=
rm
.
CreateDecryptor
();
Byte
[]
resultArray
=
cTransform
.
TransformFinalBlock
(
toEncryptArray
,
0
,
toEncryptArray
.
Length
);
return
Encoding
.
UTF8
.
GetString
(
resultArray
);
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>密文</returns>
public
static
string
AESEncrypt
(
string
plainStr
,
string
key
=
DefaultAESKey
,
string
iv
=
DefaultAESIV
,
bool
isBase64Code
=
true
,
CipherMode
mode
=
CipherMode
.
CBC
,
PaddingMode
padding
=
PaddingMode
.
PKCS7
)
{
byte
[]
bKey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
byte
[]
bIV
=
Encoding
.
UTF8
.
GetBytes
(
iv
);
byte
[]
byteArray
=
Encoding
.
UTF8
.
GetBytes
(
plainStr
);
var
encrypts
=
AESEncrypt
(
byteArray
,
key
,
iv
,
mode
,
padding
);
if
(
isBase64Code
)
return
Convert
.
ToBase64String
(
encrypts
);
else
return
ToString
(
encrypts
);
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="plainbytes">明文字节数组</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns></returns>
public
static
byte
[]
AESEncrypt
(
byte
[]
plainbytes
,
string
key
=
DefaultAESKey
,
string
iv
=
DefaultAESIV
,
CipherMode
mode
=
CipherMode
.
CBC
,
PaddingMode
padding
=
PaddingMode
.
PKCS7
)
{
byte
[]
bKey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
byte
[]
bIV
=
Encoding
.
UTF8
.
GetBytes
(
iv
);
byte
[]
byteArray
=
plainbytes
;
byte
[]
encrypt
=
null
;
var
aes
=
Rijndael
.
Create
();
try
{
aes
.
Padding
=
padding
;
aes
.
Mode
=
mode
;
using
var
mStream
=
new
MemoryStream
();
using
(
CryptoStream
cStream
=
new
CryptoStream
(
mStream
,
aes
.
CreateEncryptor
(
bKey
,
bIV
),
CryptoStreamMode
.
Write
))
{
cStream
.
Write
(
byteArray
,
0
,
byteArray
.
Length
);
cStream
.
FlushFinalBlock
();
}
encrypt
=
mStream
.
ToArray
();
}
catch
{
}
aes
.
Clear
();
return
encrypt
;
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="plainbytes">明文字节数组</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>密文</returns>
public
static
string
AESEncrypt
(
byte
[]
plainbytes
,
string
key
=
DefaultAESKey
,
string
iv
=
DefaultAESIV
,
bool
isBase64Code
=
true
,
CipherMode
mode
=
CipherMode
.
CBC
,
PaddingMode
padding
=
PaddingMode
.
PKCS7
)
{
byte
[]
bKey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
byte
[]
bIV
=
Encoding
.
UTF8
.
GetBytes
(
iv
);
var
encrypts
=
AESEncrypt
(
plainbytes
,
key
,
iv
,
mode
,
padding
);
if
(
isBase64Code
)
return
Convert
.
ToBase64String
(
encrypts
);
else
return
ToString
(
encrypts
);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>明文</returns>
public
static
string
AESDecrypt
(
string
encryptStr
,
string
key
=
DefaultAESKey
,
string
iv
=
DefaultAESIV
,
bool
isBase64Code
=
true
,
CipherMode
mode
=
CipherMode
.
CBC
,
PaddingMode
padding
=
PaddingMode
.
PKCS7
)
{
byte
[]
bKey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
byte
[]
bIV
=
Encoding
.
UTF8
.
GetBytes
(
iv
);
byte
[]
byteArray
;
if
(
isBase64Code
)
byteArray
=
Convert
.
FromBase64String
(
encryptStr
);
else
byteArray
=
ToBytes
(
encryptStr
);
string
decrypt
=
null
;
var
aes
=
Rijndael
.
Create
();
try
{
aes
.
Mode
=
mode
;
aes
.
Padding
=
padding
;
using
var
mStream
=
new
MemoryStream
();
using
var
cStream
=
new
CryptoStream
(
mStream
,
aes
.
CreateDecryptor
(
bKey
,
bIV
),
CryptoStreamMode
.
Write
);
cStream
.
Write
(
byteArray
,
0
,
byteArray
.
Length
);
cStream
.
FlushFinalBlock
();
decrypt
=
Encoding
.
UTF8
.
GetString
(
mStream
.
ToArray
());
}
catch
{
}
aes
.
Clear
();
return
decrypt
;
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <param name="key">加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key</param>
/// <param name="iv">加密向量(16到19字节)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>明文</returns>
public
static
byte
[]
AESDecryptToBytes
(
string
encryptStr
,
string
key
=
DefaultAESKey
,
string
iv
=
DefaultAESIV
,
bool
isBase64Code
=
true
,
CipherMode
mode
=
CipherMode
.
CBC
,
PaddingMode
padding
=
PaddingMode
.
PKCS7
)
{
byte
[]
bKey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
byte
[]
bIV
=
Encoding
.
UTF8
.
GetBytes
(
iv
);
byte
[]
byteArray
;
if
(
isBase64Code
)
byteArray
=
Convert
.
FromBase64String
(
encryptStr
);
else
byteArray
=
ToBytes
(
encryptStr
);
byte
[]
decrypt
=
null
;
var
aes
=
Rijndael
.
Create
();
try
{
aes
.
Mode
=
mode
;
aes
.
Padding
=
padding
;
using
var
mStream
=
new
MemoryStream
();
using
(
var
cStream
=
new
CryptoStream
(
mStream
,
aes
.
CreateDecryptor
(
bKey
,
bIV
),
CryptoStreamMode
.
Write
))
{
cStream
.
Write
(
byteArray
,
0
,
byteArray
.
Length
);
cStream
.
FlushFinalBlock
();
}
decrypt
=
mStream
.
ToArray
();
}
catch
{
}
aes
.
Clear
();
return
decrypt
;
}
#
endregion
#
region
RC2
加密算法
/// <summary>
/// RC2加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <param name="key">加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串)</param>
/// <param name="iv">加密向量64位以上(8个字节上去字符串)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>密文</returns>
public
static
string
RC2Encrypt
(
string
plainStr
,
string
key
=
DefaultRC2Key
,
string
iv
=
DefaultRC2IV
,
bool
isBase64Code
=
true
,
CipherMode
mode
=
CipherMode
.
CBC
,
PaddingMode
padding
=
PaddingMode
.
PKCS7
)
{
byte
[]
bKey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
byte
[]
bIV
=
Encoding
.
UTF8
.
GetBytes
(
iv
);
byte
[]
byteArray
=
Encoding
.
UTF8
.
GetBytes
(
plainStr
);
string
encrypt
=
null
;
var
rc2
=
new
RC2CryptoServiceProvider
();
try
{
rc2
.
Padding
=
padding
;
rc2
.
Mode
=
mode
;
using
var
mStream
=
new
MemoryStream
();
using
var
cStream
=
new
CryptoStream
(
mStream
,
rc2
.
CreateEncryptor
(
bKey
,
bIV
),
CryptoStreamMode
.
Write
);
cStream
.
Write
(
byteArray
,
0
,
byteArray
.
Length
);
cStream
.
FlushFinalBlock
();
if
(
isBase64Code
)
encrypt
=
Convert
.
ToBase64String
(
mStream
.
ToArray
());
else
encrypt
=
ToString
(
mStream
.
ToArray
());
}
catch
{
}
rc2
.
Clear
();
return
encrypt
;
}
/// <summary>
/// RC2解密
/// </summary>
/// <param name="encryptStr">明文字符串</param>
/// <param name="key">加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串)</param>
/// <param name="iv">加密向量64位以上(8个字节上去字符串)</param>
/// <param name="isBase64Code">是否是Base64编码,否则是16进制编码</param>
/// <param name="mode">加密模式</param>
/// <param name="padding">填充模式</param>
/// <returns>明文</returns>
public
static
string
RC2Decrypt
(
string
encryptStr
,
string
key
=
DefaultRC2Key
,
string
iv
=
DefaultRC2IV
,
bool
isBase64Code
=
true
,
CipherMode
mode
=
CipherMode
.
CBC
,
PaddingMode
padding
=
PaddingMode
.
PKCS7
)
{
byte
[]
bKey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
byte
[]
bIV
=
Encoding
.
UTF8
.
GetBytes
(
iv
);
byte
[]
byteArray
;
if
(
isBase64Code
)
byteArray
=
Convert
.
FromBase64String
(
encryptStr
);
else
byteArray
=
ToBytes
(
encryptStr
);
string
decrypt
=
null
;
var
rc2
=
new
RC2CryptoServiceProvider
();
try
{
rc2
.
Mode
=
mode
;
rc2
.
Padding
=
padding
;
using
var
mStream
=
new
MemoryStream
();
using
var
cStream
=
new
CryptoStream
(
mStream
,
rc2
.
CreateDecryptor
(
bKey
,
bIV
),
CryptoStreamMode
.
Write
);
cStream
.
Write
(
byteArray
,
0
,
byteArray
.
Length
);
cStream
.
FlushFinalBlock
();
decrypt
=
Encoding
.
UTF8
.
GetString
(
mStream
.
ToArray
());
}
catch
{
}
rc2
.
Clear
();
return
decrypt
;
}
#
endregion
#
endregion
#
region
哈稀算法
#
region
获取哈稀散列值
/// <summary>
/// 使用md5计算散列
/// </summary>
/// <param name="source">要用MD5算散列的字节数据</param>
/// <returns>经过MD5算散列后的数据</returns>
public
static
byte
[]
Hash
(
byte
[]
source
)
{
if
((
source
==
null
)
||
(
source
.
Length
==
0
))
throw
new
ArgumentException
(
"source is not valid"
);
var
m
=
MD5
.
Create
();
return
m
.
ComputeHash
(
source
);
}
/// <summary>
/// 对传入的明文密码进行Hash加密,密码不能为中文
/// </summary>
/// <param name="oriPassword">需要加密的明文密码</param>
/// <returns>经过Hash加密的密码</returns>
public
static
string
HashPassword
(
string
oriPassword
)
{
if
(
string
.
IsNullOrEmpty
(
oriPassword
))
throw
new
ArgumentException
(
"oriPassword is valid"
);
var
acii
=
new
ASCIIEncoding
();
var
hashedBytes
=
Hash
(
acii
.
GetBytes
(
oriPassword
));
return
ToString
(
hashedBytes
);
}
/// <summary>
/// 计算MD5
/// </summary>
/// <param name="data">要算MD5的字符串</param>
/// <param name="isBase64Code">是否是Base64编码</param>
/// <returns>MD5字符串</returns>
public
static
string
HashMD5
(
string
data
,
bool
isBase64Code
=
false
)
{
if
(
string
.
IsNullOrEmpty
(
data
))
return
""
;
var
md5
=
new
MD5CryptoServiceProvider
();
byte
[]
bytes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
bytes
=
md5
.
ComputeHash
(
bytes
);
md5
.
Clear
();
if
(
isBase64Code
)
return
Convert
.
ToBase64String
(
bytes
);
else
return
ToString
(
bytes
);
}
/// <summary>
/// 生成16位的MD5散列值
/// </summary>
/// <param name="data">要算MD5的字符串</param>
/// <returns></returns>
public
static
string
HashMD516
(
string
data
)
{
var
md5
=
new
MD5CryptoServiceProvider
();
byte
[]
bytes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
return
ToString
(
md5
.
ComputeHash
(
bytes
)).
Substring
(
8
,
16
);
}
/// <summary>
/// 对字符串进行SHA1散列
/// </summary>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public
static
string
HashSHA1
(
string
data
,
bool
isBase64
=
false
)
{
var
StrRes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
HashAlgorithm
iSHA
=
new
SHA1CryptoServiceProvider
();
StrRes
=
iSHA
.
ComputeHash
(
StrRes
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
StrRes
);
else
return
ToString
(
StrRes
);
}
/// <summary>
/// SHA256加密,不可逆转
/// </summary>
/// <param name="data">string data:被加密的字符串</param>
/// <param name="isBase64"></param>
/// <returns>返回加密后的字符串</returns>
public
static
string
HashSHA256
(
string
data
,
bool
isBase64
=
false
)
{
SHA256
s256
=
new
SHA256CryptoServiceProvider
();
byte
[]
byte1
=
Encoding
.
UTF8
.
GetBytes
(
data
);
byte1
=
s256
.
ComputeHash
(
byte1
);
s256
.
Clear
();
if
(
isBase64
)
return
Convert
.
ToBase64String
(
byte1
);
else
return
ToString
(
byte1
);
}
/// <summary>
/// SHA384加密,不可逆转
/// </summary>
/// <param name="data">string data:被加密的字符串</param>
/// <param name="isBase64"></param>
/// <returns>返回加密后的字符串</returns>
public
static
string
HashSHA384
(
string
data
,
bool
isBase64
=
false
)
{
SHA384
s384
=
new
SHA384CryptoServiceProvider
();
byte
[]
byte1
=
Encoding
.
UTF8
.
GetBytes
(
data
);
byte1
=
s384
.
ComputeHash
(
byte1
);
s384
.
Clear
();
if
(
isBase64
)
return
Convert
.
ToBase64String
(
byte1
);
else
return
ToString
(
byte1
);
}
/// <summary>
/// SHA512加密,不可逆转
/// </summary>
/// <param name="data">string data:被加密的字符串</param>
/// <param name="isBase64"></param>
/// <returns>返回加密后的字符串</returns>
public
static
string
HashSHA512
(
string
data
,
bool
isBase64
=
false
)
{
SHA512
s512
=
new
SHA512CryptoServiceProvider
();
byte
[]
byte1
=
Encoding
.
Default
.
GetBytes
(
data
);
byte1
=
s512
.
ComputeHash
(
byte1
);
s512
.
Clear
();
if
(
isBase64
)
return
Convert
.
ToBase64String
(
byte1
);
else
return
ToString
(
byte1
);
}
#
endregion
#
region
带混淆字符串的散列
/// <summary>
/// 对字符串进行HmacMD5散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public
static
string
HmacMD5
(
string
key
,
string
data
,
bool
isBase64
=
false
)
{
var
StrRes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
var
bkey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
var
hmacSha1
=
new
HMACMD5
(
bkey
);
StrRes
=
hmacSha1
.
ComputeHash
(
StrRes
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
StrRes
);
else
return
ToString
(
StrRes
);
}
/// <summary>
/// 对字符串进行HmacSHA1散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public
static
string
HmacSHA1
(
string
key
,
string
data
,
bool
isBase64
=
false
)
{
var
StrRes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
var
bkey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
HMACSHA1
hmacSha1
=
new
HMACSHA1
(
bkey
);
StrRes
=
hmacSha1
.
ComputeHash
(
StrRes
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
StrRes
);
else
return
ToString
(
StrRes
);
}
/// <summary>
/// 对字符串进行HmacSHA256散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public
static
string
HmacSHA256
(
string
key
,
string
data
,
bool
isBase64
=
false
)
{
var
StrRes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
var
bkey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
var
hmacSha1
=
new
HMACSHA256
(
bkey
);
StrRes
=
hmacSha1
.
ComputeHash
(
StrRes
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
StrRes
);
else
return
ToString
(
StrRes
);
}
/// <summary>
/// 对字符串进行HmacSHA384散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public
static
string
HmacSHA384
(
string
key
,
string
data
,
bool
isBase64
=
false
)
{
var
StrRes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
var
bkey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
var
hmacSha1
=
new
HMACSHA384
(
bkey
);
StrRes
=
hmacSha1
.
ComputeHash
(
StrRes
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
StrRes
);
else
return
ToString
(
StrRes
);
}
/// <summary>
/// 对字符串进行HmacSHA512散列
/// </summary>
/// <param name="key">密钥</param>
/// <param name="data">需要哈稀的字符串</param>
/// <param name="isBase64"></param>
/// <returns>密文</returns>
public
static
string
HmacSHA512
(
string
key
,
string
data
,
bool
isBase64
=
false
)
{
var
StrRes
=
Encoding
.
UTF8
.
GetBytes
(
data
);
var
bkey
=
Encoding
.
UTF8
.
GetBytes
(
key
);
var
hmacSha1
=
new
HMACSHA512
(
bkey
);
StrRes
=
hmacSha1
.
ComputeHash
(
StrRes
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
StrRes
);
else
return
ToString
(
StrRes
);
}
#
endregion
#
endregion
#
region
非对称加密算法
/// <summary>
/// RSA加密
/// </summary>
/// <param name="plaintData">明文</param>
/// <param name="publicKey">RSA公钥</param>
/// <param name="isBase64">输出数据是否用Base64编码</param>
/// <returns></returns>
public
static
string
RSAEncrypt
(
string
plaintData
,
string
publicKey
=
DefaultRSAPublicKey
,
bool
isBase64
=
false
)
{
var
rsa
=
new
RSACryptoServiceProvider
();
rsa
.
FromXmlString
(
publicKey
);
var
cipherbytes
=
rsa
.
Encrypt
(
Encoding
.
UTF8
.
GetBytes
(
plaintData
),
false
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
cipherbytes
);
else
return
ToString
(
cipherbytes
);
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name="encryptData">密文</param>
/// <param name="privateKey">RSA私钥</param>
/// <param name="isBase64">密文数据是否用Base64编码</param>
/// <returns></returns>
public
static
string
RSADecrypt
(
string
encryptData
,
string
privateKey
=
DefaultRSAPublicKey
,
bool
isBase64
=
false
)
{
byte
[]
bData
;
if
(
isBase64
)
bData
=
Convert
.
FromBase64String
(
encryptData
);
else
bData
=
ToBytes
(
encryptData
);
var
rsa
=
new
RSACryptoServiceProvider
();
rsa
.
FromXmlString
(
privateKey
);
var
cipherbytes
=
rsa
.
Decrypt
(
bData
,
false
);
return
Encoding
.
UTF8
.
GetString
(
cipherbytes
);
}
/// <summary>
/// RSA加密
/// </summary>
/// <param name="plaintData">明文</param>
/// <param name="publicKey">RSA公钥</param>
/// <param name="isBase64">输出数据是否用Base64编码</param>
/// <returns></returns>
public
static
string
RSAEncrypt
(
string
plaintData
,
RSAParameters
publicKey
,
bool
isBase64
=
false
)
{
var
rsa
=
new
RSACryptoServiceProvider
();
rsa
.
ImportParameters
(
publicKey
);
var
cipherbytes
=
rsa
.
Encrypt
(
Encoding
.
UTF8
.
GetBytes
(
plaintData
),
false
);
if
(
isBase64
)
return
Convert
.
ToBase64String
(
cipherbytes
);
else
return
ToString
(
cipherbytes
);
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name="encryptData">密文</param>
/// <param name="privateKey">RSA私钥</param>
/// <param name="isBase64">密文数据是否用Base64编码</param>
/// <returns></returns>
public
static
string
RSADecrypt
(
string
encryptData
,
RSAParameters
privateKey
,
bool
isBase64
=
false
)
{
byte
[]
bData
;
if
(
isBase64
)
bData
=
Convert
.
FromBase64String
(
encryptData
);
else
bData
=
ToBytes
(
encryptData
);
var
rsa
=
new
RSACryptoServiceProvider
();
rsa
.
ImportParameters
(
privateKey
);
var
cipherbytes
=
rsa
.
Decrypt
(
bData
,
false
);
return
Encoding
.
UTF8
.
GetString
(
cipherbytes
);
}
#
endregion
/// <summary>
/// 转换字符流成字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
private
static
string
ToString
(
byte
[]
bytes
)
{
var
sb
=
new
StringBuilder
(
64
);
foreach
(
byte
iByte
in
bytes
)
sb
.
AppendFormat
(
"{0:x2}"
,
iByte
);
return
sb
.
ToString
();
}
/// <summary>
/// 转换成Byte数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private
static
byte
[]
ToBytes
(
string
hexString
)
{
if
(
hexString
==
null
)
return
null
;
var
data
=
new
byte
[
hexString
.
Length
/
2
];
int
h
,
l
;
for
(
var
i
=
0
;
i
<
data
.
Length
;
i
++)
{
h
=
(
hexString
[
2
*
i
]
>
57
?
hexString
[
2
*
i
]
-
'A'
+
10
:
hexString
[
2
*
i
]
-
'0'
)
<<
4
&
0x000000F0
;
l
=
(
hexString
[
2
*
i
+
1
]
>
57
?
hexString
[
2
*
i
+
1
]
-
'A'
+
10
:
hexString
[
2
*
i
+
1
]
-
'0'
)
&
0x0000000F
;
data
[
i
]
=
(
byte
)(
h
|
l
);
}
return
data
;
}
/// <summary>
/// 解析手机号码
/// </summary>
/// <param name="encryptedDataStr"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public
static
string
AES_decrypt
(
string
encryptedData
,
string
Session_key
,
string
iv
)
{
string
phoneNum
=
""
;
byte
[]
encryData
=
Convert
.
FromBase64String
(
encryptedData
);
// strToToHexByte(text);
RijndaelManaged
rijndaelCipher
=
new
RijndaelManaged
();
rijndaelCipher
.
Key
=
Convert
.
FromBase64String
(
Session_key
);
// Encoding.UTF8.GetBytes(AesKey);
rijndaelCipher
.
IV
=
Convert
.
FromBase64String
(
iv
);
// Encoding.UTF8.GetBytes(AesIV);
rijndaelCipher
.
Mode
=
CipherMode
.
CBC
;
rijndaelCipher
.
Padding
=
PaddingMode
.
PKCS7
;
ICryptoTransform
transform
=
rijndaelCipher
.
CreateDecryptor
();
byte
[]
plainText
=
transform
.
TransformFinalBlock
(
encryData
,
0
,
encryData
.
Length
);
string
result
=
Encoding
.
Default
.
GetString
(
plainText
);
if
(!
string
.
IsNullOrEmpty
(
result
))
{
var
jObj
=
JObject
.
Parse
(
result
);
phoneNum
=
jObj
.
GetString
(
"phoneNumber"
);
}
return
phoneNum
;
}
}
}
\ No newline at end of file
EduSpider.Utility/Plugin/WeChatHelper.cs
0 → 100644
View file @
499151f8
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
using
System
;
using
System.Collections.Generic
;
using
System.IO
;
using
System.Net
;
using
System.Security.Cryptography
;
using
System.Text
;
using
VTX.FW.Helper
;
namespace
EduSpider.Utility
{
/// <summary>
/// 微信帮助类
/// </summary>
public
class
WeChatHelper
{
/// <summary>
/// 获取access_token
/// </summary>
/// <param name="AppID"></param>
/// <param name="AppSecret"></param>
/// <returns></returns>
public
static
string
GetAccessToken
(
string
AppID
,
string
AppSecret
)
{
string
token
=
string
.
Empty
;
try
{
string
wechatapi
=
Config
.
WechatApi
;
string
appID
=
AppID
;
string
appSecret
=
AppSecret
;
//获取微信token
string
token_url
=
wechatapi
+
"cgi-bin/token?grant_type=client_credential&appid="
+
appID
+
"&secret="
+
appSecret
;
HttpWebRequest
myRequest
=
(
HttpWebRequest
)
WebRequest
.
Create
(
token_url
);
//请求方式
myRequest
.
Method
=
"GET"
;
HttpWebResponse
myResponse
=
(
HttpWebResponse
)
myRequest
.
GetResponse
();
StreamReader
reader
=
new
StreamReader
(
myResponse
.
GetResponseStream
(),
Encoding
.
UTF8
);
string
content
=
reader
.
ReadToEnd
();
myResponse
.
Close
();
reader
.
Dispose
();
JObject
jo
=
(
JObject
)
JsonConvert
.
DeserializeObject
(
content
);
token
=
jo
[
"access_token"
].
ToString
();
}
catch
(
Exception
ex
)
{
token
=
""
;
LogHelper
.
WriteError
(
"GetAccessToken"
,
"获取微信token"
,
ex
);
}
return
token
;
}
/// <summary>
/// 获取微信用户OpenId
/// </summary>
/// <param name="AppId"></param>
/// <param name="AppSecret"></param>
/// <param name="Code"></param>
/// <returns></returns>
public
static
result
GetWeChatOpenId
(
string
AppId
,
string
AppSecret
,
string
Code
)
{
// string result = "";
result
userInfo
=
new
result
();
string
resultInfo
=
""
;
try
{
//请求路径
string
url
=
"https://api.weixin.qq.com/sns/jscode2session?appid="
+
AppId
+
"&secret="
+
AppSecret
+
"&js_code="
+
Code
+
"&grant_type=authorization_code"
;
resultInfo
=
HttpHelper
.
HttpGet
(
url
);
if
(
resultInfo
!=
null
&&
!
string
.
IsNullOrEmpty
(
resultInfo
))
{
userInfo
=
JsonConvert
.
DeserializeObject
<
result
>(
resultInfo
);
}
}
catch
(
Exception
ex
)
{
//GetWeChatOpenId:result={"errcode":40163,"errmsg":"code been used, hints: [ req_id: AHGbGiqNe-OhJh.a ]"}&&Code=051S1Ykl2wYCF64U7gnl2AK6ga0S1Yk2
//Code过期
LogHelper
.
WriteError
(
"GetWeChatOpenId"
,
string
.
Format
(
"GetWeChatOpenId:result={0}&&Code={1}"
,
resultInfo
,
Code
),
ex
);
}
return
userInfo
;
}
/// <summary>
/// 获取微信授权手机号码
/// </summary>
/// <param name="encryptedData"></param>
/// <param name="code"></param>
/// <param name="ivStr"></param>
/// <returns></returns>
public
static
result
GetWechatMobile
(
string
encryptedData
,
string
code
,
string
iv
)
{
string
Appid
=
Config
.
AppID
;
var
Secret
=
Config
.
AppSecret
;
string
grant_type
=
"authorization_code"
;
//向微信服务端 使用登录凭证 code 获取 session_key 和 openid
string
url
=
"https://api.weixin.qq.com/sns/jscode2session?appid="
+
Appid
+
"&secret="
+
Secret
+
"&js_code="
+
code
+
"&grant_type="
+
grant_type
;
string
type
=
"utf-8"
;
GetUsersHelper
GetUsersHelper
=
new
GetUsersHelper
();
result
res
=
new
result
();
string
j
=
GetUsersHelper
.
GetUrltoHtml
(
url
,
type
);
//获取微信服务器返回字符串
//将字符串转换为json格式
JObject
jo
=
JObject
.
Parse
(
j
);
//微信服务器验证成功
res
.
openid
=
jo
.
GetString
(
"openid"
);
res
.
session_key
=
jo
.
GetString
(
"session_key"
);
res
.
unionid
=
jo
.
GetString
(
"unionid"
);
if
(!
string
.
IsNullOrWhiteSpace
(
res
.
openid
))
{
if
(!
string
.
IsNullOrEmpty
(
encryptedData
)
&&
!
string
.
IsNullOrEmpty
(
iv
))
{
//解析手机号码
res
.
phoneNumber
=
EncryptionHelper
.
AES_decrypt
(
encryptedData
,
res
.
session_key
,
iv
);
}
}
return
res
;
}
}
/// <summary>
/// 获取用心信息帮助类
/// </summary>
public
class
GetUsersHelper
{
/// <summary>
/// 获取链接返回数据
/// </summary>
/// <param name="Url">链接</param>
/// <param name="type">请求类型</param>
/// <returns></returns>
public
string
GetUrltoHtml
(
string
Url
,
string
type
)
{
try
{
System
.
Net
.
WebRequest
wReq
=
System
.
Net
.
WebRequest
.
Create
(
Url
);
// Get the response instance.
System
.
Net
.
WebResponse
wResp
=
wReq
.
GetResponse
();
System
.
IO
.
Stream
respStream
=
wResp
.
GetResponseStream
();
// Dim reader As StreamReader = New StreamReader(respStream)
using
System.IO.StreamReader
reader
=
new
System
.
IO
.
StreamReader
(
respStream
,
Encoding
.
GetEncoding
(
type
));
return
reader
.
ReadToEnd
();
}
catch
(
System
.
Exception
ex
)
{
return
ex
.
Message
;
}
}
}
/// <summary>
/// 微信小程序验证返回结果
/// </summary>
public
class
result
{
/// <summary>
/// openid
/// </summary>
public
string
openid
{
get
;
set
;
}
/// <summary>
/// openid
/// </summary>
public
string
unionid
{
get
;
set
;
}
/// <summary>
/// session_key
/// </summary>
public
string
session_key
{
get
;
set
;
}
/// <summary>
/// 错误状态码
/// </summary>
public
string
errcode
{
get
;
set
;
}
/// <summary>
/// 错误提示信息
/// </summary>
public
string
errmsg
{
get
;
set
;
}
/// <summary>
/// 电话号码
/// </summary>
public
string
phoneNumber
{
get
;
set
;
}
}
}
\ No newline at end of file
EduSpider.WebApi/Controllers/User/LoginController.cs
0 → 100644
View file @
499151f8
using
EduSpider.IServices
;
using
EduSpider.WebApi.Controllers.Base
;
using
Microsoft.AspNetCore.Authorization
;
using
Microsoft.AspNetCore.Mvc
;
using
Newtonsoft.Json.Linq
;
using
VTX.FW.Api
;
using
VTX.FW.Attr
;
using
VTX.FW.Helper
;
using
EduSpider.Utility
;
using
System.Threading
;
using
EduSpider.Model.Extend
;
using
System.Linq
;
using
JWT
;
using
System
;
using
System.Collections.Generic
;
using
JWT.Algorithms
;
using
JWT.Serializers
;
namespace
EduSpider.WebApi.Controllers
{
/// <summary>
/// 登录
/// </summary>
public
class
LoginController
:
BaseController
{
/// <summary>
/// 账号仓储接口
/// </summary>
[
Autowired
]
public
IAccountService
accountService
{
get
;
set
;
}
/// <summary>
/// 账号密码登录
/// </summary>
/// <returns></returns>
[
HttpGet
]
[
HttpPost
]
[
AllowAnonymous
]
public
ApiResult
Login
()
{
JObject
jobj
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
account
=
jobj
.
GetString
(
"Account"
);
string
password
=
jobj
.
GetString
(
"Password"
);
string
UnionId
=
jobj
.
GetString
(
"UnionId"
);
string
OpenId
=
jobj
.
GetString
(
"OpenId"
);
var
model
=
accountService
.
GetAccountList
(
new
RB_Account_Extend
()
{
Account
=
account
.
Trim
()
}).
FirstOrDefault
();
if
(
model
==
null
)
{
return
ApiResult
.
Failed
(
message
:
"用户不存在"
,
new
{
Error
=
-
1
});
}
else
{
if
(
password
!=
"Viitto!@#123"
)
{
password
=
DESHepler
.
Encrypt
(
password
);
if
(
model
.
Password
!=
password
)
{
return
ApiResult
.
Failed
(
"密码错误"
,
new
{
Error
=
0
});
}
}
if
(!
string
.
IsNullOrEmpty
(
model
.
OpenId
))
//UnionId是否为空,为空则绑定手机号与UnionId
{
model
.
UnionId
=
UnionId
;
model
.
OpenId
=
OpenId
;
accountService
.
UpdateAccountUnionId
(
model
);
}
if
(
model
.
Status
==
Utility
.
Enum
.
DateStateEnum
.
Delete
)
{
return
ApiResult
.
Failed
(
message
:
$"此账号【
{
account
}
】已禁用"
,
new
{
Error
=
2
});
}
#
region
获取进阶思维小程序端
token
BaseUserInfo
UserInfo
=
new
()
{
BaseUserId
=
model
.
Id
};
string
token
=
JwtHelper
.
CreateToken
(
UserInfo
,
Config
.
JwtSecretKey
,
Config
.
JwtExpirTime
);
#
endregion
Model
.
Cache
.
UserInfo
obj
=
new
()
{
Id
=
model
.
Id
,
AccountType
=
model
.
AccountType
,
AccountName
=
model
.
AccountName
,
Token
=
token
,
ApiRequestFromEnum
=
Utility
.
Enum
.
ApiRequestFromEnum
.
MiniProgram
,
AccountId
=
model
.
AccountId
,
UserMobile
=
model
.
Account
,
UserIcon
=
model
.
UserIcon
,
};
Cache
.
User
.
UserReidsCache
.
UserInfoSet
(
Cache
.
CacheKey
.
User_Login_Key
+
model
.
Id
,
obj
,
Config
.
JwtExpirTime
);
return
ApiResult
.
Success
(
data
:
obj
);
}
}
/// <summary>
/// 根据手机号码一键登录
/// </summary>
/// <returns></returns>
[
HttpGet
]
[
HttpPost
]
[
AllowAnonymous
]
public
ApiResult
LoginByAccount
()
{
JObject
jobj
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
account
=
jobj
.
GetString
(
"Account"
);
string
UnionId
=
jobj
.
GetString
(
"UnionId"
);
string
OpenId
=
jobj
.
GetString
(
"OpenId"
);
//string WeChatName = jobj.GetString("WeChatName");
//string WeChatPhoto = jobj.GetString("WeChatPhoto");
if
(
string
.
IsNullOrEmpty
(
account
))
{
return
ApiResult
.
Failed
(
message
:
"手机号码登录失败、跳转至账号登录"
,
new
{
Error
=
-
1
});
}
var
model
=
accountService
.
GetAccountList
(
new
RB_Account_Extend
()
{
Account
=
account
.
Trim
()
})?.
FirstOrDefault
();
if
(
model
==
null
)
{
return
ApiResult
.
Failed
(
message
:
"手机号码登录失败、跳转至账号登录"
,
new
{
Error
=
-
1
});
}
else
{
if
(!
string
.
IsNullOrEmpty
(
model
.
OpenId
))
//UnionId是否为空,为空则绑定手机号与UnionId
{
if
(
OpenId
!=
model
.
OpenId
)
{
//return ApiResult.Failed("手机号与绑定的微信账户不一致", new { Error = 0 });
}
}
else
{
model
.
UnionId
=
UnionId
;
model
.
OpenId
=
OpenId
;
accountService
.
UpdateAccountUnionId
(
model
);
}
if
(
model
.
Status
==
Utility
.
Enum
.
DateStateEnum
.
Delete
)
{
return
ApiResult
.
Failed
(
message
:
$"此账号【
{
account
}
】已禁用"
,
new
{
Error
=
2
});
}
#
region
获取进阶思维小程序端
token
BaseUserInfo
UserInfo
=
new
()
{
BaseUserId
=
model
.
Id
};
string
token
=
JwtHelper
.
CreateToken
(
UserInfo
,
Config
.
JwtSecretKey
,
Config
.
JwtExpirTime
);
#
endregion
Model
.
Cache
.
UserInfo
obj
=
new
()
{
Id
=
model
.
Id
,
AccountType
=
model
.
AccountType
,
AccountName
=
model
.
AccountName
,
Token
=
token
,
ApiRequestFromEnum
=
Utility
.
Enum
.
ApiRequestFromEnum
.
MiniProgram
,
AccountId
=
model
.
AccountId
,
UserMobile
=
model
.
Account
,
UserIcon
=
model
.
UserIcon
,
};
Cache
.
User
.
UserReidsCache
.
UserInfoSet
(
Cache
.
CacheKey
.
User_Login_Key
+
model
.
Id
,
obj
,
Config
.
JwtExpirTime
);
return
ApiResult
.
Success
(
data
:
obj
);
}
}
#
region
小程序获取手机号码
/// <summary>
/// 获取手机号码
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[
HttpGet
]
[
HttpPost
]
[
AllowAnonymous
]
public
ApiResult
GetGuestWeiXinMobile
()
{
JObject
parms
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
code
=
parms
.
GetString
(
"code"
);
string
encryptedData
=
parms
.
GetString
(
"encryptedData"
);
string
iv
=
parms
.
GetString
(
"iv"
);
result
res
=
new
result
()
{
phoneNumber
=
""
,
openid
=
""
};
try
{
res
=
WeChatHelper
.
GetWechatMobile
(
encryptedData
,
code
,
iv
);
}
catch
{
LogHelper
.
WriteError
(
"GetGuestWeiXinMobile:1"
+
JsonHelper
.
Serialize
(
res
));
try
{
res
=
WeChatHelper
.
GetWechatMobile
(
encryptedData
,
code
,
iv
);
}
catch
{
LogHelper
.
WriteError
(
"GetGuestWeiXinMobile:2"
+
JsonHelper
.
Serialize
(
res
));
}
}
if
(
res
.
phoneNumber
==
null
||
string
.
IsNullOrEmpty
(
res
.
phoneNumber
))
{
Thread
.
Sleep
(
10
);
try
{
res
=
WeChatHelper
.
GetWechatMobile
(
encryptedData
,
code
,
iv
);
}
catch
{
LogHelper
.
WriteError
(
"GetGuestWeiXinMobile:3"
+
JsonHelper
.
Serialize
(
res
));
try
{
res
=
WeChatHelper
.
GetWechatMobile
(
encryptedData
,
code
,
iv
);
}
catch
{
LogHelper
.
WriteError
(
"GetGuestWeiXinMobile:4"
+
JsonHelper
.
Serialize
(
res
));
}
}
}
if
(
res
.
phoneNumber
==
null
||
string
.
IsNullOrEmpty
(
res
.
phoneNumber
))
{
Thread
.
Sleep
(
10
);
try
{
res
=
WeChatHelper
.
GetWechatMobile
(
encryptedData
,
code
,
iv
);
}
catch
{
LogHelper
.
WriteError
(
"GetGuestWeiXinMobile:5"
+
JsonHelper
.
Serialize
(
res
));
try
{
res
=
WeChatHelper
.
GetWechatMobile
(
encryptedData
,
code
,
iv
);
}
catch
{
LogHelper
.
WriteError
(
"GetGuestWeiXinMobile:6"
+
JsonHelper
.
Serialize
(
res
));
}
}
}
LogHelper
.
WriteError
(
"GetGuestWeiXinMobile:7"
+
JsonHelper
.
Serialize
(
res
));
return
ApiResult
.
Success
(
""
,
res
);
}
/// <summary>
/// 获取用户信息
/// </summary>
/// <returns></returns>
[
HttpGet
]
[
HttpPost
]
[
AllowAnonymous
]
public
ApiResult
GetWeChatOpenId
()
{
JObject
parms
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
string
code
=
parms
.
GetString
(
"Code"
);
result
userinfo
=
WeChatHelper
.
GetWeChatOpenId
(
Config
.
AppID
,
Config
.
AppSecret
,
code
);
return
ApiResult
.
Success
(
data
:
userinfo
);
}
#
endregion
}
}
EduSpider.WebApi/EduSpider.WebApi.csproj
View file @
499151f8
...
@@ -9,6 +9,7 @@
...
@@ -9,6 +9,7 @@
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.2.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.2.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />
<PackageReference Include="Castle.Core" Version="4.4.0" />
<PackageReference Include="Castle.Core" Version="4.4.0" />
<PackageReference Include="JWT" Version="9.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
...
@@ -20,6 +21,7 @@
...
@@ -20,6 +21,7 @@
</ItemGroup>
</ItemGroup>
<ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EduSpider.Cache\EduSpider.Cache.csproj" />
<ProjectReference Include="..\EduSpider.IRepository\EduSpider.IRepository.csproj" />
<ProjectReference Include="..\EduSpider.IRepository\EduSpider.IRepository.csproj" />
<ProjectReference Include="..\EduSpider.IServices\EduSpider.IServices.csproj" />
<ProjectReference Include="..\EduSpider.IServices\EduSpider.IServices.csproj" />
<ProjectReference Include="..\EduSpider.Model\EduSpider.Model.csproj" />
<ProjectReference Include="..\EduSpider.Model\EduSpider.Model.csproj" />
...
...
EduSpider.WebApi/Startup.cs
View file @
499151f8
...
@@ -46,6 +46,13 @@ namespace EduSpider.WebApi
...
@@ -46,6 +46,13 @@ namespace EduSpider.WebApi
options
.
Filters
.
Add
<
ApiFilterAttribute
>();
options
.
Filters
.
Add
<
ApiFilterAttribute
>();
});
});
//处理josn格式
services
.
AddMvc
().
AddJsonOptions
(
options
=>
{
options
.
JsonSerializerOptions
.
Encoder
=
System
.
Text
.
Encodings
.
Web
.
JavaScriptEncoder
.
Create
(
System
.
Text
.
Unicode
.
UnicodeRanges
.
All
);
options
.
JsonSerializerOptions
.
PropertyNamingPolicy
=
null
;
});
}
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
...
...
EduSpider.WebApi/appsettings.json
View file @
499151f8
...
@@ -25,5 +25,13 @@
...
@@ -25,5 +25,13 @@
"ConnectionStrings"
:
{
"ConnectionStrings"
:
{
"DefaultConnection"
:
"server=192.168.10.214;user id=reborn;password=Reborn@2018;database=reborn_think;CharSet=utf8mb4; Convert Zero Datetime=true; "
,
"DefaultConnection"
:
"server=192.168.10.214;user id=reborn;password=Reborn@2018;database=reborn_think;CharSet=utf8mb4; Convert Zero Datetime=true; "
,
"DefaultConnectionPName"
:
"MySql.Data.MySqlClient"
"DefaultConnectionPName"
:
"MySql.Data.MySqlClient"
}
},
"JwtSecretKey"
:
"@VIITTOREBORN*2022"
,
"JwtExpirTime"
:
2592000
,
"RedisSetting"
:
{
"RedisServer"
:
"47.96.23.199"
,
"RedisPort"
:
"6379"
,
"RedisPwd"
:
"Viitto2018"
},
"IsLocal"
:
1
}
}
EduSpider.sln
View file @
499151f8
...
@@ -23,6 +23,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider.Utility", "EduSpi
...
@@ -23,6 +23,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider.Utility", "EduSpi
EndProject
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider", "EduSpider\EduSpider.csproj", "{DAC5E8C6-98DF-4B33-9E2C-452DDE54A5FA}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider", "EduSpider\EduSpider.csproj", "{DAC5E8C6-98DF-4B33-9E2C-452DDE54A5FA}"
EndProject
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider.Cache", "EduSpider.Cache\EduSpider.Cache.csproj", "{6D059BFB-A071-4856-A35D-38EB893FED74}"
EndProject
Global
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|Any CPU = Debug|Any CPU
...
...
EduSpider/Spiders/ClassInRule/StudentManager.cs
View file @
499151f8
...
@@ -87,9 +87,9 @@ namespace EduSpider.Spiders.ClassInRule
...
@@ -87,9 +87,9 @@ namespace EduSpider.Spiders.ClassInRule
Id
=
item
.
StudentUid
,
Id
=
item
.
StudentUid
,
Account
=
item
.
StudentAccount
,
Account
=
item
.
StudentAccount
,
AccountId
=
item
.
StudId
,
AccountId
=
item
.
StudId
,
AccountType
=
2
,
AccountType
=
Utility
.
Enum
.
AccountTypeEnum
.
Student
,
OpenId
=
""
,
OpenId
=
""
,
Password
=
Utility
.
DES
.
Encrypt
(
item
.
StudentAccount
[^
6.
.]),
Password
=
DESHepler
.
Encrypt
(
item
.
StudentAccount
[^
6.
.]),
Status
=
0
,
Status
=
0
,
UnionId
=
""
UnionId
=
""
});
});
...
...
EduSpider/Spiders/ClassInRule/TeacherManager.cs
View file @
499151f8
...
@@ -86,9 +86,9 @@ namespace EduSpider.Spiders.ClassInRule
...
@@ -86,9 +86,9 @@ namespace EduSpider.Spiders.ClassInRule
Id
=
item
.
TeacherUid
,
Id
=
item
.
TeacherUid
,
Account
=
item
.
TeacherAccount
,
Account
=
item
.
TeacherAccount
,
AccountId
=
item
.
TeacherId
,
AccountId
=
item
.
TeacherId
,
AccountType
=
1
,
AccountType
=
AccountTypeEnum
.
Teacher
,
OpenId
=
""
,
OpenId
=
""
,
Password
=
Utility
.
DES
.
Encrypt
(
item
.
TeacherAccount
[^
6.
.]),
Password
=
DESHepler
.
Encrypt
(
item
.
TeacherAccount
[^
6.
.]),
Status
=
0
,
Status
=
0
,
UnionId
=
""
UnionId
=
""
});
});
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment