using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; using SolarPower.Models.User; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Filters; using Dapper; using SolarPower.Models; using System.Data.SqlClient; using Microsoft.Extensions.Configuration; using SolarPower.Repository.Interface; using System.IO; using System.Text; using SolarPower.Models.OperatorLogModel; using Newtonsoft.Json; using SolarPower.Models.Company; using SolarPower.Models.Role; using Microsoft.AspNetCore.Routing; namespace SolarPower.Controllers { public class MyBaseController : Controller where T : MyBaseController { private ILogger _logger; protected ILogger Logger => _logger ?? (_logger = HttpContext?.RequestServices.GetService>()); private IUserRepository userRepository => HttpContext?.RequestServices.GetService(); private ICompanyRepository companyRepository => HttpContext?.RequestServices.GetService(); private IRoleRepository roleRepository => HttpContext?.RequestServices.GetService(); private IPowerStationRepository powerStationRepository => HttpContext?.RequestServices.GetService(); private IOperatorLogRepository operatorLogRepository => HttpContext?.RequestServices.GetService(); protected MyUser myUser = null; public string controllerName; public string actionName; public string baseURL => HttpContext?.Request.Scheme + "://" + HttpContext?.Request.Host + "/"; public ErrorCode errorCode = new ErrorCode(); public MyBaseController() { } public override void OnActionExecuting(ActionExecutingContext filterContext) { //base.OnActionExecuting(filterContext); EDFunction edFunction = new EDFunction(); var myAccount = edFunction.AESDecrypt(HttpContext.Session.GetString("MyAccount")); //取得登入後,該位使用者的Account controllerName = ControllerContext.RouteData.Values["controller"].ToString(); //controller名稱 actionName = ControllerContext.RouteData.Values["action"].ToString(); //action名稱 bool isAjaxCall = filterContext.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest"; if (string.IsNullOrEmpty(myAccount)) { if (isAjaxCall) { filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 499; return; } else { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { {"controller", "Login"}, {"action", "Index"} }); return; } } //取得當前登入使用者資訊 myUser = userRepository.GetMyUserInfoByAccount(myAccount); myUser.Company = companyRepository.GetMyCompanyInfoById(myUser.CompanyId); myUser.Role = roleRepository.GetMyRoleInfoById(myUser.RoleId); List auth_arr = new List(); foreach (var auth in myUser.Role.Auths) { var per_auch_arr = auth.Split(','); foreach (var x in per_auch_arr) { if (x.Contains("PowerStation")) { auth_arr.Add("PowerStation"); } if (x.Contains("StationOverview") && !auth_arr.Contains("StationOverview")) { auth_arr.Add("StationOverview"); } auth_arr.Add(x); } } if (myUser.Role.Layer != (int)RoleLayerEnum.PlatformAdmin && !auth_arr.Contains(controllerName)) { //排除條件 if (auth_arr.Contains("StationOverview") && !auth_arr.Contains("PowerStation")) { //只有電站總覽 且未包含 電站管理 } else if(controllerName == "User" && (actionName == "ChangePassword" || actionName == "GetPersonalInfo" || actionName == "SavePersonalInfo")) { //查詢個人 資訊 及密碼 } else { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { {"controller", "Login"}, {"action", "SignOut"} }); return; } } //取得當前使用者可以查看的電站 var myPowerStationSummaries = powerStationRepository.GetMyPowerStationSummary(myUser); myUser.PowerStationSummaries = myPowerStationSummaries; ViewBag.myPowerStationSummaries = myPowerStationSummaries; if (controllerName == "PowerStation" && actionName == "Edit") { //電站資訊的各電站 string stationId_param = filterContext.HttpContext.Request.Query["stationId"]; int stationId = stationId_param == "new" ? 0 : int.Parse(stationId_param); if (stationId > 0) { var hasSubTagNum = false; int i = 0; foreach(var myPowerStationSummary in myPowerStationSummaries) { if (hasSubTagNum) { break; } int j = 0; foreach(var myPowerStation in myPowerStationSummary.MyPowerStations) { if(myPowerStation.PowerStationId == stationId) { ViewData["SubNum"] = i; ViewData["TagNum"] = j; hasSubTagNum = true; break; } j++; } i++; } } } ViewBag.auths = auth_arr; ViewBag.myUser = myUser; #region 記錄人員操作記錄 var content = JsonConvert.SerializeObject(filterContext.ActionArguments); OperatorLog operatorLog = new OperatorLog() { ControllerName = controllerName, ActionName = actionName, Parameter = content.CompareTo("{}") == 0 ? null : content, CreatedBy = myUser.Id, }; List removeParam = new List() { "ChangePassword" }; //移除不紀錄參數的actionName if (removeParam.Any(x => actionName.Contains(x))) { operatorLog.Parameter = "{}"; } List properties = new List() { "ControllerName", "ActionName", "Parameter", "CreatedBy", }; operatorLogRepository.Add(operatorLog, properties); #endregion } /// /// 判斷是否維平台的管理員或平台使用者 /// /// /// public bool IsPlatformLayer(byte roleLayer) { if (roleLayer == (int)RoleLayerEnum.PlatformAdmin || roleLayer == (int)RoleLayerEnum.PlatformUser) { return true; } return false; } /// /// 取得最新的流水號 /// /// 當前的 /// /// 0: PadLeft;1: PadRight /// public string GetLastSerialNumber(string current = "", int pad = 4, byte direction = 0) { var tempSerialNumber = 0; if (!string.IsNullOrEmpty(current)) { tempSerialNumber = Convert.ToInt32(current) + 1; } else { tempSerialNumber = 1; } if (direction == 0) { return tempSerialNumber.ToString().Trim().PadLeft(pad, '0'); } else { return tempSerialNumber.ToString().Trim().PadRight(pad, '0'); } } } }