Commit 499151f8 authored by 黄奎's avatar 黄奎
parents ab5a85f1 b9db4d4f
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_";
}
}
<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>
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
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);
}
}
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
using System;
using EduSpider.Utility.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
......@@ -29,7 +30,7 @@ namespace EduSpider.Model.Entity
/// <summary>
/// 类型 1老师 2学生
/// </summary>
public int AccountType { get; set; }
public AccountTypeEnum AccountType { get; set; }
/// <summary>
/// 对应 老师/学生ID
......@@ -39,7 +40,7 @@ namespace EduSpider.Model.Entity
/// <summary>
/// 删除状态
/// </summary>
public int Status { get; set; }
public DateStateEnum Status { get; set; }
/// <summary>
/// 微信唯一识别码
......
......@@ -16,5 +16,10 @@ namespace EduSpider.Model.Extend
/// 帐号名称
/// </summary>
public string AccountName { get; set; }
/// <summary>
/// 用户头像
/// </summary>
public string UserIcon { get; set; }
}
}
......@@ -38,15 +38,15 @@ namespace EduSpider.Repository
}
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)
{
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))
{
......@@ -59,10 +59,10 @@ namespace EduSpider.Repository
string sql = $@"
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
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
) t where {where}
";
......

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);
}
}
}
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
......@@ -5,6 +5,8 @@
</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="VTX.FW" Version="1.1.0" />
</ItemGroup>
......
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
using VTX.FW.Attr;
namespace EduSpider.Utility.Enum
{
/// <summary>
/// 账号类型
/// </summary>
public enum AccountTypeEnum
{
/// <summary>
/// 老师
/// </summary>
[EnumField("老师")]
Teacher = 1,
/// <summary>
/// 学生
/// </summary>
[EnumField("学生")]
Student = 2
}
}
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
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
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using VTX.FW.Helper;
namespace EduSpider.Utility
{
......@@ -76,5 +78,84 @@ namespace EduSpider.Utility
}
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
This diff is collapsed.
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
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
}
}
......@@ -9,6 +9,7 @@
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.2.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />
<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.FileExtensions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
......@@ -20,6 +21,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EduSpider.Cache\EduSpider.Cache.csproj" />
<ProjectReference Include="..\EduSpider.IRepository\EduSpider.IRepository.csproj" />
<ProjectReference Include="..\EduSpider.IServices\EduSpider.IServices.csproj" />
<ProjectReference Include="..\EduSpider.Model\EduSpider.Model.csproj" />
......
......@@ -46,6 +46,13 @@ namespace EduSpider.WebApi
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.
......
......@@ -25,5 +25,13 @@
"ConnectionStrings": {
"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"
}
},
"JwtSecretKey": "@VIITTOREBORN*2022",
"JwtExpirTime": 2592000,
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"IsLocal": 1
}
......@@ -23,6 +23,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider.Utility", "EduSpi
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider", "EduSpider\EduSpider.csproj", "{DAC5E8C6-98DF-4B33-9E2C-452DDE54A5FA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EduSpider.Cache", "EduSpider.Cache\EduSpider.Cache.csproj", "{6D059BFB-A071-4856-A35D-38EB893FED74}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......
......@@ -87,9 +87,9 @@ namespace EduSpider.Spiders.ClassInRule
Id = item.StudentUid,
Account = item.StudentAccount,
AccountId = item.StudId,
AccountType = 2,
AccountType = Utility.Enum.AccountTypeEnum.Student,
OpenId = "",
Password = Utility.DES.Encrypt(item.StudentAccount[^6..]),
Password = DESHepler.Encrypt(item.StudentAccount[^6..]),
Status = 0,
UnionId = ""
});
......
......@@ -86,9 +86,9 @@ namespace EduSpider.Spiders.ClassInRule
Id = item.TeacherUid,
Account = item.TeacherAccount,
AccountId = item.TeacherId,
AccountType = 1,
AccountType = AccountTypeEnum.Teacher,
OpenId = "",
Password = Utility.DES.Encrypt(item.TeacherAccount[^6..]),
Password = DESHepler.Encrypt(item.TeacherAccount[^6..]),
Status = 0,
UnionId = ""
});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment