SystemSetController.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Http;
  6. using Microsoft.Extensions.Logging;
  7. using Microsoft.Extensions.Options;
  8. using System.Web;
  9. using MySystem.Models;
  10. using MySystem.MainModels;
  11. using LitJson;
  12. using Library;
  13. using Microsoft.IdentityModel.Tokens;
  14. using System.Text;
  15. using System.Security.Claims;
  16. using System.IdentityModel.Tokens.Jwt;
  17. namespace MySystem.Areas.Api.Controllers
  18. {
  19. [Area("Api")]
  20. [Route("Api/[controller]/[action]")]
  21. public class SystemSetController : BaseController
  22. {
  23. public SystemSetController(IHttpContextAccessor accessor, ILogger<BaseController> logger, IOptions<Setting> setting) : base(accessor, logger, setting)
  24. {
  25. }
  26. #region APP启动初始数据
  27. public JsonResult Detail(string value)
  28. {
  29. value = HttpUtility.UrlDecode(value);
  30. JsonData data = JsonMapper.ToObject(value);
  31. string apptype = data["apptype"].ToString();
  32. string version = data["version"].ToString();
  33. string CheckSignResult = CheckSign(value, new string[] { });
  34. if (CheckSignResult != "1")
  35. {
  36. return Json(new AppResultJson() { Status = "-1", Info = CheckSignResult });
  37. }
  38. else
  39. {
  40. return DetailDo(value);
  41. }
  42. }
  43. public JsonResult DetailDo(string value)
  44. {
  45. JsonData data = JsonMapper.ToObject(value);
  46. string apptype = data["apptype"].ToString();
  47. string version = data["version"].ToString();
  48. Dictionary<string, object> Obj = new Dictionary<string, object>();
  49. List<Dictionary<string, object>> PageSDK = new List<Dictionary<string, object>>();
  50. Models.SystemSet set = RedisDbconn.Instance.Get<Models.SystemSet>("SystemSet");
  51. List<FileUpdateInfo> files = RedisDbconn.Instance.GetList<FileUpdateInfo>("FileUpdateInfo", 1, 1000).OrderBy(m => m.Path).OrderBy(m => m.FileName).ToList();
  52. foreach (FileUpdateInfo subfile in files)
  53. {
  54. string Tag = function.MD5_16(subfile.Id.ToString());
  55. string Url = subfile.Path;
  56. string FileName = subfile.FileName;
  57. int ver = subfile.Version;
  58. Dictionary<string, object> row = new Dictionary<string, object>();
  59. row.Add("Url", Url);
  60. row.Add("DownloadUrl", "/skin/app/default/" + Url);
  61. row.Add("FileName", FileName);
  62. row.Add("Version", ver);
  63. row.Add("Tag", Tag);
  64. PageSDK.Add(row);
  65. }
  66. List<Dictionary<string, string>> AfterStartPhotos = new List<Dictionary<string, string>>();
  67. string StartAdPhoto = "static/images/startadphoto.png";
  68. if (!string.IsNullOrEmpty(set.StartAdPhoto))
  69. {
  70. StartAdPhoto = set.StartAdPhoto;
  71. StartAdPhoto = StartAdPhoto.Substring(StartAdPhoto.IndexOf("static"));
  72. }
  73. string StartAdUrl = "";
  74. Dictionary<string, string> after = new Dictionary<string, string>();
  75. after.Add("Url", "");
  76. after.Add("Photo", "static/images/afterstartphoto1.png");
  77. AfterStartPhotos.Add(after);
  78. after = new Dictionary<string, string>();
  79. after.Add("Url", "");
  80. after.Add("Photo", "static/images/afterstartphoto2.png");
  81. AfterStartPhotos.Add(after);
  82. after = new Dictionary<string, string>();
  83. after.Add("Url", "");
  84. after.Add("Photo", "static/images/afterstartphoto3.png");
  85. AfterStartPhotos.Add(after);
  86. Obj.Add("PageSDK", PageSDK); //页面所需资源引用
  87. List<Dictionary<string, string>> HtmlVersion = new List<Dictionary<string, string>>();
  88. List<PageUpdateInfo> pages = RedisDbconn.Instance.GetList<PageUpdateInfo>("PageUpdateInfo", 1, 1000).ToList();
  89. foreach (PageUpdateInfo page in pages)
  90. {
  91. Dictionary<string, string> item = new Dictionary<string, string>();
  92. string DataId = function.MD5_16(page.ModulePath);
  93. item.Add("Id", page.Id.ToString());
  94. item.Add("DataId", DataId);
  95. item.Add("ModuleVersion", page.ModuleVersion.ToString());
  96. item.Add("FileName", page.ModulePath);
  97. HtmlVersion.Add(item);
  98. }
  99. Obj.Add("HtmlVersion", HtmlVersion);
  100. Obj.Add("IsPageSDKZip", "0");
  101. Obj.Add("PageSDKZip", "/Areas/Admin/Assets/TemplateFile/Areas.zip");
  102. Obj.Add("StartAdPhoto", string.IsNullOrEmpty(set.StartAdPhoto) ? "" : StartAdPhoto);
  103. Obj.Add("StartAdUrl", StartAdUrl);
  104. Obj.Add("AfterStartPhotos", AfterStartPhotos);
  105. Obj.Add("IsLeftSide", "0"); //是否侧滑
  106. Obj.Add("LeftSideUrl", "http://www.baidu.com/"); //侧滑页面地址
  107. if (apptype == "ios")
  108. {
  109. Obj.Add("AppClose", "0");
  110. int check = RedisDbconn.Instance.GetList<AppVersion>("AppVersion", 1, 1000).Count(m => m.TerminalKind == "ios");
  111. if (check > 0)
  112. {
  113. AppVersion ver = RedisDbconn.Instance.GetList<AppVersion>("AppVersion", 1, 1000).Where(m => m.TerminalKind == "ios").OrderByDescending(m => m.Id).FirstOrDefault();
  114. if (ver.Status == 1 && versionToNumber(version) < versionToNumber(ver.VersionNum))
  115. {
  116. Obj.Add("AppStatus", "1");
  117. Obj.Add("AppTitle", ver.Title);
  118. Obj.Add("AppInfo", ver.Info);
  119. Obj.Add("AppBtn1", ver.ConfirmText);
  120. Obj.Add("AppBtn2", ver.CancelText);
  121. Obj.Add("AppBtn1Url", ver.DownloadUrl);
  122. }
  123. else
  124. {
  125. Obj.Add("AppStatus", "0");
  126. }
  127. }
  128. else
  129. {
  130. Obj.Add("AppStatus", "0");
  131. }
  132. }
  133. else
  134. {
  135. int check = RedisDbconn.Instance.GetList<AppVersion>("AppVersion", 1, 1000).Count(m => m.TerminalKind == "android");
  136. if (check > 0)
  137. {
  138. AppVersion ver = RedisDbconn.Instance.GetList<AppVersion>("AppVersion", 1, 1000).Where(m => m.TerminalKind == "android").OrderByDescending(m => m.Id).FirstOrDefault();
  139. if (ver.Status == 1 && versionToNumber(version) < versionToNumber(ver.VersionNum))
  140. {
  141. Obj.Add("AppStatus", "1");
  142. Obj.Add("AppTitle", ver.Title);
  143. Obj.Add("AppInfo", ver.Info);
  144. Obj.Add("AppBtn1", ver.ConfirmText);
  145. Obj.Add("AppBtn2", ver.CancelText);
  146. Obj.Add("AppBtn1Url", ver.DownloadUrl);
  147. }
  148. else
  149. {
  150. Obj.Add("AppStatus", "0");
  151. }
  152. }
  153. else
  154. {
  155. Obj.Add("AppStatus", "0");
  156. }
  157. }
  158. Obj.Add("ConnectErrUrl", ""); //网络错误页面
  159. return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj });
  160. }
  161. #endregion
  162. #region 附加方法
  163. List<string> SystemFilesV2;
  164. private void GetSystemFilesV2()
  165. {
  166. SystemFilesV2 = new List<string>();
  167. string dataFilePath = function.getPath("/wwwroot/skin/app/default/");
  168. System.IO.FileSystemInfo info = new System.IO.DirectoryInfo(dataFilePath);
  169. scanV2(info);
  170. }
  171. private void scanV2(System.IO.FileSystemInfo info)
  172. {
  173. if (!info.Exists) return;
  174. System.IO.DirectoryInfo dir = info as System.IO.DirectoryInfo;
  175. //不是目录
  176. if (dir == null) return;
  177. System.IO.FileSystemInfo[] files = dir.GetFileSystemInfos();
  178. for (int i = 0; i < files.Length; i++)
  179. {
  180. System.IO.FileInfo file = files[i] as System.IO.FileInfo;
  181. //是文件
  182. if (file != null)
  183. {
  184. string filename = file.FullName.Replace("\\", "/");
  185. SystemFilesV2.Add(filename.Substring(filename.LastIndexOf("/")));
  186. }
  187. else scanV2(files[i]);
  188. }
  189. }
  190. private int versionToNumber(string version)
  191. {
  192. string[] versionlist = version.Split('.');
  193. string left = versionlist[0];
  194. string mid = versionlist[1];
  195. if (mid.Length == 1) mid = "00" + mid;
  196. if (mid.Length == 2) mid = "0" + mid;
  197. string right = versionlist[2];
  198. if (right.Length == 1) right = "00" + right;
  199. if (right.Length == 2) right = "0" + right;
  200. string result = left + mid + right;
  201. return int.Parse(result);
  202. }
  203. #endregion
  204. #region 生成APP配置文件
  205. public string makeAppInitData(string version, string apptype)
  206. {
  207. Models.SystemSet set = RedisDbconn.Instance.Get<Models.SystemSet>("SystemSet") ?? new Models.SystemSet();
  208. string url = Host + "Api/APPSetInfo/List?value={\"Kind\":\"1\",\"PageSize\":\"10\",\"PageNum\":\"1\",\"version\":\"" + version + "\",\"apptype\":\"" + apptype + "\"}";
  209. string AppInfoList = function.GetWebRequest(url);
  210. string SystemSet = function.GetWebRequest(Host + "Api/SystemSet/DetailDo?value={\"version\":\"" + version + "\",\"apptype\":\"" + apptype + "\"}");
  211. string GotoPages = "{";
  212. string PageInfoList = "{";
  213. string LibFile = "{";
  214. List<PageUpdateInfo> newpages = RedisDbconn.Instance.GetList<PageUpdateInfo>("PageUpdateInfo", 1, 1000).OrderBy(m => m.Id).ToList();
  215. foreach (PageUpdateInfo page in newpages)
  216. {
  217. string FileName = page.ModulePath.Split('.')[0];
  218. PageInfoList += "\"page" + FileName + "\":" + function.GetWebRequest(Host + "Api/PageUpdateInfo/CheckDo?value={\"Url\":\"" + FileName + "\",\"version\":\"" + version + "\",\"apptype\":\"" + apptype + "\"}&ismakefile=0") + ",";
  219. GotoPages += "\"page" + FileName + "\":\"" + function.CheckNull(page.GotoPages).Trim(',') + "\",";
  220. string PagePath = function.ReadInstance("/WebRootPath.txt") + "/template/app/default/" + page.ModulePath;
  221. string pageContent = function.ReadInstanceByFull(PagePath);
  222. pageContent = dbconn.Encrypt3DES(pageContent, "*ga34|^7");
  223. LibFile += "\"page" + FileName + "\":\"" + pageContent + "\",";
  224. }
  225. PageInfoList = PageInfoList.TrimEnd(',');
  226. PageInfoList += "}";
  227. GotoPages = GotoPages.TrimEnd(',');
  228. GotoPages += "}";
  229. LibFile = LibFile.TrimEnd(',');
  230. LibFile += "}";
  231. return AppInfoList + "#cut#" + SystemSet + "#cut#" + PageInfoList + "#cut#" + GotoPages + "#cut#" + dbconn.Encrypt3DES(LibFile, "*ga34|^7");
  232. }
  233. #endregion
  234. #region 验证获取jwt的token
  235. public JsonResult AppCheck(string value)
  236. {
  237. value = DesDecrypt(value);
  238. JsonData data = JsonMapper.ToObject(value);
  239. string CheckSignResult = CheckSign(value, new string[] { "uuid", "salt" });
  240. if (CheckSignResult != "1")
  241. {
  242. return Json(new AppResultJson() { Status = "-1", Info = CheckSignResult });
  243. }
  244. else
  245. {
  246. string uuid = data["uuid"].ToString();
  247. string salt = data["salt"].ToString();
  248. string u = function.MD5_16(uuid + salt);
  249. Dictionary<string, object> Obj = new Dictionary<string, object>();
  250. //生成jwt令牌
  251. Obj.Add("Token", AppToken(u));
  252. return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj });
  253. }
  254. }
  255. public JsonResult AppCheckTest(string value)
  256. {
  257. value = DesDecrypt(value);
  258. JsonData data = JsonMapper.ToObject(value);
  259. string uuid = data["uuid"].ToString();
  260. string salt = data["salt"].ToString();
  261. string u = function.MD5_16(uuid + salt);
  262. Dictionary<string, object> Obj = new Dictionary<string, object>();
  263. //生成jwt令牌
  264. Obj.Add("Token", AppToken(u));
  265. return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj });
  266. }
  267. public string AppToken(string u)
  268. {
  269. u = "old_" + u;
  270. string test = function.get_Random(10);
  271. var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(JwtSecret)), SecurityAlgorithms.HmacSha256);
  272. var claims = new Claim[] {
  273. new Claim(JwtRegisteredClaimNames.Iss,JwtIss),
  274. new Claim(JwtRegisteredClaimNames.Aud,test),
  275. new Claim("Guid", Guid.NewGuid().ToString("D")),
  276. new Claim(ClaimTypes.Role, "system"),
  277. new Claim(ClaimTypes.Role, "admin"),
  278. };
  279. SecurityToken securityToken = new JwtSecurityToken(
  280. signingCredentials: securityKey,
  281. expires: DateTime.Now.AddDays(10),//过期时间
  282. claims: claims,
  283. audience: test,
  284. issuer: u
  285. );
  286. RedisDbconn.Instance.Set("utoken:" + u, test);
  287. RedisDbconn.Instance.SetExpire("utoken:" + u, 3600 * 24 * 10);
  288. //生成jwt令牌
  289. return new JwtSecurityTokenHandler().WriteToken(securityToken);
  290. }
  291. public string AppTokenV2(int UserId, string DeviceId, string DeviceType)
  292. {
  293. string Token = RedisDbconn.Instance.Get<string>("apptoken:" + DeviceId + ":" + DeviceType + ":" + UserId);
  294. if(!string.IsNullOrEmpty(Token))
  295. {
  296. return Token;
  297. }
  298. string issuer = "new_" + UserId + "_" + DeviceId + "_" + DeviceType;
  299. string test = function.get_Random(10);
  300. var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(JwtSecret)), SecurityAlgorithms.HmacSha256);
  301. var claims = new Claim[] {
  302. new Claim(JwtRegisteredClaimNames.Iss,JwtIss),
  303. new Claim(JwtRegisteredClaimNames.Aud,test),
  304. new Claim("Guid", Guid.NewGuid().ToString("D")),
  305. new Claim(ClaimTypes.Role, "system"),
  306. new Claim(ClaimTypes.Role, "admin"),
  307. };
  308. SecurityToken securityToken = new JwtSecurityToken(
  309. signingCredentials: securityKey,
  310. expires: DateTime.Now.AddDays(10),//过期时间
  311. claims: claims,
  312. audience: test,
  313. issuer: issuer
  314. );
  315. RedisDbconn.Instance.Set("utoken:" + issuer, test);
  316. RedisDbconn.Instance.SetExpire("utoken:" + issuer, 3600 * 24 * 10);
  317. //生成jwt令牌
  318. Token = new JwtSecurityTokenHandler().WriteToken(securityToken);
  319. RedisDbconn.Instance.Set("apptoken:" + DeviceId + ":" + DeviceType + ":" + UserId, Token);
  320. RedisDbconn.Instance.SetExpire("apptoken:" + DeviceId + ":" + DeviceType + ":" + UserId, 3600 * 24 * 10 - 60);
  321. return Token;
  322. }
  323. #endregion
  324. #region 获取OSS参数
  325. public JsonResult OssParam(string value)
  326. {
  327. Dictionary<string, object> Obj = new Dictionary<string, object>();
  328. Obj.Add("AccessId", "LTAI5t7ivibdYZTro4SRVZ9M");
  329. Obj.Add("AccessKey", "nfr1bmbJbMhLuaj10iBORkuFfIAX7M");
  330. return Json(new AppResultJson() { Status = "-1", Info = "", Data = Obj });
  331. }
  332. #endregion
  333. #region 检查签名是否合法,合法返回1,不合法返回提示信息
  334. /// <summary>
  335. /// 检查签名是否合法,合法返回1,不合法返回提示信息
  336. /// </summary>
  337. /// <param name="value">请求的参数(json字符串)</param>
  338. /// <param name="signField">要签名的字段</param>
  339. /// <returns></returns>
  340. private string CheckSign(string value, string[] signField)
  341. {
  342. JsonData json = JsonMapper.ToObject(value);
  343. Dictionary<string, string> dic = new Dictionary<string, string>();
  344. for (int i = 0; i < signField.Length; i++)
  345. {
  346. dic.Add(signField[i], json[signField[i]].ToString());
  347. }
  348. string sign = json["sign"].ToString(); //客户端签名字符串
  349. return new Sign().sign(dic, sign);
  350. }
  351. #endregion
  352. }
  353. }