加入專案檔案。

This commit is contained in:
Kai 2021-06-09 15:03:24 +08:00
parent 9bc4b000c8
commit 3ee7eb7e55
640 changed files with 578347 additions and 0 deletions

View File

@ -0,0 +1,315 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SolarPower.Models;
using SolarPower.Models.Company;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Controllers
{
public class CompanyController : MyBaseController<CompanyController>
{
private readonly ICompanyRepository companyRepository;
public CompanyController(ICompanyRepository companyRepository) : base()
{
this.companyRepository = companyRepository;
}
public IActionResult Index()
{
return View();
}
/// <summary>
/// 取得下拉式公司選單須為Deleted: 0
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ApiResult<List<CompanySelectItemList>>> GetCompanySelectOptionListAsync()
{
ApiResult<List<CompanySelectItemList>> apiResult = new ApiResult<List<CompanySelectItemList>>();
try
{
var companySelectItemLists = await companyRepository.GetCompanySelectOptionListAsync();
apiResult.Code = "0000";
apiResult.Data = companySelectItemLists;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
/// <summary>
/// 公司管理列表
/// </summary>
/// <param name="post"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult> CompanyListAsync(PostCompanyFilter post)
{
ApiResult<List<CompanyDataTable>> apiResult = new ApiResult<List<CompanyDataTable>>();
int totalRecords = 0; //總資料筆數
int recFilter = 0; //過濾後資料筆數
List<CompanyDataTable> companies = null;
try
{
companies = await companyRepository.GetAllByFilterAsync(post);
foreach(var company in companies)
{
//找出當前狀態正常使用者人數
var registerNumber = await companyRepository.GetNormalUserNumberByCompanyIdAsync(company.Id);
company.RegisterRatio = registerNumber.ToString() + " / " + company.RegisterUpperLimit.ToString();
//if(mySimpleCompany.Id == 1)
//{
company.Function = @"
<a href='javascript:;' class='btn btn-success btn-pills waves-effect waves-themed' data-toggle='modal' data-target='#companyrule'></a>
<button type='button' class='btn btn-primary btn-pills waves-effect waves-themed edit-btn'></button>
<button type='button' class='btn btn-danger btn-pills waves-effect waves-themed del-btn'></button>";
//}
//else
//{
// company.Functoin = @"
// <button type='button' class='btn btn-primary btn-pills waves-effect waves-themed edit-btn'>修改</button>";
//}
}
totalRecords = companies.Count();
recFilter = companies.Count();
apiResult.Code = "0000";
apiResult.Data = companies;
}
catch (Exception exception)
{
apiResult.Code = "9999";
string json = System.Text.Json.JsonSerializer.Serialize(post);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + json);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
var result = Json(new
{
recordsTotal = totalRecords,
recordsFiltered = recFilter,
data = apiResult
});
return result;
}
/// <summary>
/// 取得單一系統管理員
/// </summary>
/// <param name="guid"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<Company>> GetOneCompany(int id)
{
ApiResult<Company> apiResult = new ApiResult<Company>();
Company company = null;
try
{
company = await companyRepository.GetOneAsync(id);
if (company == null)
{
apiResult.Code = "9996";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
apiResult.Code = "0000";
apiResult.Data = company;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + "Id=" + id);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
/// <summary>
/// 新增 / 修改 公司資料
/// </summary>
/// <param name="post"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<string>> SaveCompany(PostCompany post)
{
ApiResult<string> apiResult = new ApiResult<string>();
Company company = null;
try
{
company = await companyRepository.GetOneAsync(post.Id);
if (company == null)
{
if (post.Id != 0)
{
apiResult.Code = "9996";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
#region
//先檢查統編是否已被使用
var exist = await companyRepository.GetOneNormalSimpleCompanyByTaxIDNumber(post.TaxIDNumber);
if(exist != null)
{
apiResult.Code = "9995";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
company = new Company()
{
Name = post.Name,
//Logo = post.Logo,
TaxIDNumber = post.TaxIDNumber,
Phone = post.Phone,
Address = post.Address,
RegisterUpperLimit= post.RegisterUpperLimit,
CreatedBy = mySimpleUser.Id
};
List<string> properties = new List<string>()
{
"Name",
"TaxIDNumber",
"Phone",
"Address",
"RegisterUpperLimit",
"CreatedBy",
};
await companyRepository.AddAsync(company, properties);
apiResult.Code = "0000";
apiResult.Msg = "儲存成功";
#endregion
}
else
{
#region 使
//先檢查統編是否已被使用
var exist = await companyRepository.GetOneNormalSimpleCompanyByTaxIDNumber(post.TaxIDNumber);
if(exist != null && exist.Id != company.Id)
{
apiResult.Code = "9995";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
UpdateCompany update = new UpdateCompany()
{
Id = post.Id,
Name = post.Name,
TaxIDNumber = post.TaxIDNumber,
//Status = post.Status,
Phone = post.Phone,
Address = post.Address,
RegisterUpperLimit = post.RegisterUpperLimit,
UpdatedBy = mySimpleUser.Id,
};
List<string> properties = new List<string>()
{
"Id",
"Name",
"TaxIDNumber",
"Phone",
"Address",
"RegisterUpperLimit",
"UpdatedBy",
};
await companyRepository.UpdateCompany(update, properties);
apiResult.Code = "0000";
apiResult.Msg = "儲存成功";
#endregion
}
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = errorCode.GetString(apiResult.Code);
string json = System.Text.Json.JsonSerializer.Serialize(post);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + json);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
/// <summary>
/// 軟刪除單一公司
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<string>> DeleteOneCompany(int id)
{
ApiResult<string> apiResult = new ApiResult<string>();
Company company = null;
try
{
company = await companyRepository.GetOneCompany(id);
if (company == null)
{
apiResult.Code = "9996";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
await companyRepository.DeleteOne(company.Id);
apiResult.Code = "0000";
apiResult.Msg = "刪除成功";
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = errorCode.GetString(apiResult.Code);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + "Id=" + id);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
}
}

View File

@ -0,0 +1,40 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using SolarPower.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Controllers
{
public class HomeController : MyBaseController<HomeController>
{
//private readonly ILogger<HomeController> _logger;
public HomeController() : base()
{
}
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}

View File

@ -0,0 +1,173 @@
using Dapper;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using SolarPower.Models;
using SolarPower.Models.LoginViewModel;
using SolarPower.Models.User;
using SolarPower.Repository;
using SolarPower.Repository.Interface;
using SolarPower.Services.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
namespace SolarPower.Controllers
{
public class LoginController : Controller
{
private readonly ILogger<LoginController> logger;
private readonly IUserRepository userRepository;
private readonly ISendEmailService sendEmailService;
public ErrorCode errorCode = new ErrorCode();
public LoginController(ILogger<LoginController> logger,
IUserRepository userRepository,
ISendEmailService sendEmailService)
{
this.logger = logger;
this.userRepository = userRepository;
this.sendEmailService = sendEmailService;
}
public IActionResult Index()
{
return View();
}
/// <summary>
/// 表單post提交準備登入
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> IndexAsync(LoginViewModel login)
{
if (!ModelState.IsValid)
{
return View();
}
User user = null;
EDFunction edFunction = new EDFunction();
try
{
user = await userRepository.GetOneByAccountAsync(login.Account);
if (user == null)
{
ViewBag.errMsg = errorCode.GetString("9997"); //帳號或密碼輸入錯誤
return View();
}
string SHA256Pwd = edFunction.GetSHA256Encryption(login.Password);
if (string.Compare(user.Password, SHA256Pwd) != 0)
{
ViewBag.errMsg = errorCode.GetString("9997"); //帳號或密碼輸入錯誤
return View();
}
}
catch (Exception ex)
{
ViewBag.ErrMsg = errorCode.GetString("9999");
string json = System.Text.Json.JsonSerializer.Serialize(login);
logger.LogError("【Login/Index - 登入資訊】" + json);
logger.LogError("【Login/Index】" + ex.Message);
return View();
}
HttpContext.Session.SetString("MyAccount", edFunction.AESEncrypt(user.Account)); //將帳號透過AES加密
return RedirectToAction("Index", "User");
}
/// <summary>
/// 登出Action 記得別加上[Authorize]不管用戶是否登入都可以執行SignOut
/// </summary>
/// <returns></returns>
public IActionResult SignOut()
{
HttpContext.Session.Clear();
return RedirectToAction("Index", "Login");//導至登入頁
}
/// <summary>
/// 忘記密碼
/// </summary>
/// <returns></returns>
public IActionResult ForgotPassword()
{
return View("~/Views/Login/ForgotPassword.cshtml");
}
/// <summary>
/// 取得新密碼
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> ForgotPasswordAsync(ForgotPasswordViewModel forgot)
{
if (!ModelState.IsValid)
{
return View();
}
var user = await userRepository.GetOneByEmailAsync(forgot.Email);
if (user == null)
{
ViewBag.errMsg = "查無此信箱";
return View();
}
//隨機產生亂數
Random random = new Random((int)DateTime.Now.Ticks);
const string chars = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";
string random_password = new string(Enumerable.Repeat(chars, 8).Select(s => s[random.Next(chars.Length)]).ToArray());
EDFunction edFunction = new EDFunction();
var newPassword = edFunction.GetSHA256Encryption(random_password);
UpdatePassword update = new UpdatePassword()
{
Password = edFunction.GetSHA256Encryption(newPassword),
UpdatedBy = user.Id,
Id = user.Id
};
List<string> properties = new List<string>()
{
"Password",
"UpdatedBy",
"Id"
};
await userRepository.UpdatePassword(update, properties);
var sendSubject = "變更密碼成功";
var sendContent = $"您的新密碼為:{random_password}";
List<string> recipientEmails = new List<string>()
{
user.Email
};
sendEmailService.Send(recipientEmails, sendSubject, sendContent);
return RedirectToAction("Index", "Login");
}
}
}

View File

@ -0,0 +1,89 @@
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;
namespace SolarPower.Controllers
{
public class MyBaseController<T> : Controller where T : MyBaseController<T>
{
private ILogger<T> _logger;
protected ILogger<T> Logger => _logger ?? (_logger = HttpContext?.RequestServices.GetService<ILogger<T>>());
private IUserRepository userRepository => HttpContext?.RequestServices.GetService<IUserRepository>();
private ICompanyRepository companyRepository => HttpContext?.RequestServices.GetService<ICompanyRepository>();
private IOperatorLogRepository operatorLogRepository => HttpContext?.RequestServices.GetService<IOperatorLogRepository>();
protected SimpleUser mySimpleUser = null;
protected SimpleCompany mySimpleCompany = null;
public string controllerName;
public string actionName;
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名稱
if (string.IsNullOrEmpty(myAccount) && myAccount.CompareTo(HttpContext.Session.GetString("MyAccount")) == 0)
{
//session 找不到account或者無法成功解密
return;
}
mySimpleUser = userRepository.GetOneNormalSimpleUserByAccount(myAccount);
mySimpleCompany = companyRepository.GetOneNormalSimpleCompanyById(mySimpleUser.CompanyId);
ViewBag.systemAdminName = mySimpleUser.Name;
#region
var content = JsonConvert.SerializeObject(filterContext.ActionArguments);
OperatorLog operatorLog = new OperatorLog()
{
ControllerName = controllerName,
ActionName = actionName,
Parameter = content.CompareTo("{}") == 0? null : content,
CreatedBy = mySimpleUser.Id,
};
List<string> properties = new List<string>()
{
"ControllerName",
"ActionName",
"Parameter",
"CreatedBy",
};
operatorLogRepository.Add(operatorLog, properties);
#endregion
}
}
}

View File

@ -0,0 +1,51 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SolarPower.Models;
using SolarPower.Models.Role;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Controllers
{
public class RoleController : MyBaseController<RoleController>
{
private readonly IRoleRepository roleRepository;
public RoleController(IRoleRepository roleRepository) : base()
{
this.roleRepository = roleRepository;
}
public IActionResult Index()
{
return View();
}
/// <summary>
/// 取得下拉式公司選單須為Deleted: 0
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ApiResult<List<RoleSelectItemList>>> GetRoleSelectOptionListAsync(int companyId)
{
ApiResult<List<RoleSelectItemList>> apiResult = new ApiResult<List<RoleSelectItemList>>();
try
{
var roleSelectItemLists = await roleRepository.GetRoleSelectOptionListAsync(companyId);
apiResult.Code = "0000";
apiResult.Data = roleSelectItemLists;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
}
}

View File

@ -0,0 +1,16 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Controllers
{
public class UIController : Controller
{
public IActionResult Index()
{
return View();
}
}
}

View File

@ -0,0 +1,405 @@

using Dapper;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using SolarPower.Models;
using SolarPower.Models.User;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Controllers
{
public class UserController : MyBaseController<UserController>
{
private readonly IUserRepository userRepository;
public UserController(IUserRepository userRepository) : base()
{
this.userRepository = userRepository;
}
public IActionResult Index()
{
return View();
}
/// <summary>
/// 取得個人資訊
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<User>> GetPersonalInfo()
{
ApiResult<User> apiResult = new ApiResult<User>();
try
{
var user = await userRepository.GetOneAsync(mySimpleUser.Id);
apiResult.Code = "0000";
apiResult.Data = user;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
/// <summary>
/// 修改個人資料
/// </summary>
/// <param name="post"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<string>> SavePersonalInfoAsync(PostPersonalInfo post)
{
ApiResult<string> apiResult = new ApiResult<string>();
User user = null;
try
{
user = await userRepository.GetOneAsync(mySimpleUser.Id);
if (user == null)
{
apiResult.Code = "9998";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
UpdateUser update = new UpdateUser()
{
Name = post.Name,
Email = post.Email,
Phone = post.Phone,
UpdatedBy = mySimpleUser.Id,
Id = user.Id
};
List<string> properties = new List<string>()
{
"Name",
"Email",
"Phone",
"UpdatedBy",
"UpdatedAt",
"Id"
};
await userRepository.UpdatePersonInfo(update, properties);
apiResult.Code = "0000";
apiResult.Msg = "修改成功";
}
catch (Exception exception)
{
apiResult.Code = "9999";
string json = System.Text.Json.JsonSerializer.Serialize(post);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + json);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
/// <summary>
/// 變更密碼
/// </summary>
/// <param name="post"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<string>> ChangePasswordAsync(PostChangePassword post)
{
ApiResult<string> apiResult = new ApiResult<string>();
User user = null;
try
{
user = await userRepository.GetOneAsync(mySimpleUser.Id);
if (user == null)
{
apiResult.Code = "9998";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
EDFunction edFunction = new EDFunction();
if (string.Compare(user.Password, edFunction.GetSHA256Encryption(post.OldPassword)) != 0)
{
apiResult.Code = "0001";
apiResult.Msg = "密碼錯誤,請重新輸入。";
return apiResult;
}
if (string.Compare(post.NewPassword, post.AgainPassword) != 0)
{
apiResult.Code = "0001";
apiResult.Msg = "新密碼輸入不一致,請重新輸入。";
return apiResult;
}
UpdatePassword update = new UpdatePassword()
{
Password = edFunction.GetSHA256Encryption(post.NewPassword),
UpdatedBy = mySimpleUser.Id,
Id = user.Id
};
List<string> properties = new List<string>()
{
"Password",
"UpdatedBy",
"UpdatedAt",
"Id"
};
await userRepository.UpdatePassword(update, properties);
apiResult.Code = "0000";
apiResult.Msg = "修改成功";
}
catch (Exception exception)
{
apiResult.Code = "9999";
string json = System.Text.Json.JsonSerializer.Serialize(post);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + json);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
/// <summary>
/// 帳號管理列表
/// </summary>
/// <param name="post"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult> UserListAsync(PostUserFilter post)
{
ApiResult<List<UserDateTable>> apiResult = new ApiResult<List<UserDateTable>>();
int totalRecords = 0; //總資料筆數
int recFilter = 0; //過濾後資料筆數
List<UserDateTable> users = null;
try
{
users = await userRepository.GetAllByFilterAsync(post);
totalRecords = users.Count();
recFilter = users.Count();
apiResult.Code = "0000";
apiResult.Data = users;
}
catch (Exception exception)
{
apiResult.Code = "9999";
string json = System.Text.Json.JsonSerializer.Serialize(post);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + json);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
var result = Json(new
{
recordsTotal = totalRecords,
recordsFiltered = recFilter,
data = apiResult
});
return result;
}
/// <summary>
/// 取得單一使用者
/// </summary>
/// <param name="guid"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<SimpleUser>> GetOneUser(int id)
{
ApiResult<SimpleUser> apiResult = new ApiResult<SimpleUser>();
SimpleUser simpleUser = null;
try
{
simpleUser = await userRepository.GetOneSimpleUser(id);
if (simpleUser == null)
{
apiResult.Code = "9998";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
apiResult.Code = "0000";
apiResult.Data = simpleUser;
}
catch (Exception exception)
{
apiResult.Code = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + "Id=" + id);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
/// <summary>
/// 新增 / 修改 使用者
/// </summary>
/// <param name="post"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<string>> SaveUser(PostUser post)
{
ApiResult<string> apiResult = new ApiResult<string>();
User user = null;
try
{
user = await userRepository.GetOneAsync(post.Id);
if (user == null)
{
if (post.Id != 0)
{
apiResult.Code = "9998";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
#region 使
EDFunction edFunction = new EDFunction();
user = new User()
{
CompanyId = post.CompanyId,
Name = post.Name,
Email = post.Email,
Account = post.Account,
Password = edFunction.GetSHA256Encryption(post.Account),
Phone = post.Phone,
CreatedBy = mySimpleUser.Id,
};
List<string> properties = new List<string>()
{
"CompanyId",
"Name",
"Email",
"Account",
"Password",
"Phone",
"CreatedBy",
};
await userRepository.AddAsync(user, properties);
apiResult.Code = "0000";
apiResult.Msg = "儲存成功";
#endregion
}
else
{
#region 使
UpdateUser update = new UpdateUser()
{
Id = post.Id,
Name = post.Name,
Email = post.Email,
Phone = post.Phone,
UpdatedBy = mySimpleUser.Id,
};
List<string> properties = new List<string>()
{
"Id",
"Name",
"Status",
"Email",
"Phone",
"UpdatedBy",
};
await userRepository.UpdatePersonInfo(update, properties);
apiResult.Code = "0000";
apiResult.Msg = "儲存成功";
#endregion
}
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = errorCode.GetString(apiResult.Code);
string json = System.Text.Json.JsonSerializer.Serialize(post);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + json);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
/// <summary>
/// 軟刪除單一系統管理員
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost]
public async Task<ApiResult<string>> DeleteOneUser(int id)
{
ApiResult<string> apiResult = new ApiResult<string>();
SimpleUser user = null;
try
{
user = await userRepository.GetOneSimpleUser(id);
if (user == null)
{
apiResult.Code = "9998";
apiResult.Msg = errorCode.GetString(apiResult.Code);
return apiResult;
}
await userRepository.DeleteOne(user.Id);
apiResult.Code = "0000";
apiResult.Msg = "刪除成功";
}
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = errorCode.GetString(apiResult.Code);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + "Id=" + id);
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
}
return apiResult;
}
}
}

View File

@ -0,0 +1,59 @@
using Microsoft.Extensions.Options;
using MySql.Data.MySqlClient;
using SolarPower.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Helper
{
/// <summary>
/// Database 介面
/// </summary>
public interface IDatabaseHelper
{
/// <summary>
/// 取得連線
/// </summary>
/// <returns></returns>
IDbConnection GetConnection();
}
public class DatabaseHelper : IDatabaseHelper
{
private readonly string _connectionString;
public DatabaseHelper(DBConfig dbConfig)
{
EDFunction ed = new EDFunction();
var serverStr1 = ed.AESEncrypt(dbConfig.Server);
var databaseStr1 = ed.DESEncrypt(dbConfig.Database);
var rootStr1 = ed.DESEncrypt(dbConfig.Root);
var passwordStr1 = ed.DESEncrypt(dbConfig.Password);
var serverStr = ed.AESDecrypt(serverStr1);
var databaseStr = ed.DESDecrypt(databaseStr1);
var rootStr = ed.DESDecrypt(rootStr1);
var passwordStr = ed.DESDecrypt(passwordStr1);
//var connStr = $"server={serverStr};database={databaseStr};user={rootStr};password={passwordStr};charset=utf8;";
var connStr = $"server=127.0.0.1;database=solar_power;user=root;password=000000;charset=utf8;";
//var connStr = @"data source=127.0.0.1;initial catalog=SolarPower;integrated security=true;";
this._connectionString = connStr;
}
public IDbConnection GetConnection()
{
var conn = new MySqlConnection(this._connectionString);
return conn;
}
}
}

View File

@ -0,0 +1,96 @@
2021-06-07T19:08:34.5638117+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-07T19:08:34.5813162+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-07T19:08:34.5934161+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower(old)\SolarPower" (b5d60022)
2021-06-07T19:09:59.7451997+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-07T19:09:59.9653416+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-07T19:10:00.5115088+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-07T19:19:22.9552777+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-07T19:19:22.9835556+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-07T19:19:22.9878709+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-07T19:21:09.1192659+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-07T19:21:09.1292304+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-07T19:21:09.1317281+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-07T19:21:25.6934294+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-07T19:21:25.7059492+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-07T19:21:25.7077765+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-07T19:21:56.8091449+08:00 8000001c-0001-f800-b63f-84710c7967bb [ERR] An unhandled exception has occurred while executing the request. (48a46595)
MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution.
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Parameter '@controller_name' must be defined.
at MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex)
at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
at MySql.Data.MySqlClient.Statement.BindParameters()
at MySql.Data.MySqlClient.PreparableStatement.Execute()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at SolarPower.Repository.Implement.OperatorLogRepository.Add(OperatorLog entity, List`1 properties) in D:\Visual Studio Project\SolarPower\SolarPower\Repository\Implement\OperatorLogRepository.cs:line 39
at SolarPower.Controllers.MyBaseController`1.OnActionExecuting(ActionExecutingContext filterContext) in D:\Visual Studio Project\SolarPower\SolarPower\Controllers\MyBaseController.cs:line 81
at Microsoft.AspNetCore.Mvc.Controller.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2021-06-07T19:23:50.9139742+08:00 80000006-0000-f800-b63f-84710c7967bb [ERR] An unhandled exception has occurred while executing the request. (48a46595)
MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution.
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Parameter '@controller_name' must be defined.
at MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex)
at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
at MySql.Data.MySqlClient.Statement.BindParameters()
at MySql.Data.MySqlClient.PreparableStatement.Execute()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at SolarPower.Repository.Implement.OperatorLogRepository.Add(OperatorLog entity, List`1 properties) in D:\Visual Studio Project\SolarPower\SolarPower\Repository\Implement\OperatorLogRepository.cs:line 39
at SolarPower.Controllers.MyBaseController`1.OnActionExecuting(ActionExecutingContext filterContext) in D:\Visual Studio Project\SolarPower\SolarPower\Controllers\MyBaseController.cs:line 81
at Microsoft.AspNetCore.Mvc.Controller.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2021-06-07T19:24:06.2458433+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-07T19:24:06.2571624+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-07T19:24:06.2588511+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-07T19:25:01.2335635+08:00 80000224-0000-ff00-b63f-84710c7967bb [ERR] An unhandled exception has occurred while executing the request. (48a46595)
MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during command execution.
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Parameter '@controller_name' must be defined.
at MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex)
at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
at MySql.Data.MySqlClient.Statement.BindParameters()
at MySql.Data.MySqlClient.PreparableStatement.Execute()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at SolarPower.Repository.Implement.OperatorLogRepository.Add(OperatorLog entity, List`1 properties) in D:\Visual Studio Project\SolarPower\SolarPower\Repository\Implement\OperatorLogRepository.cs:line 39
at SolarPower.Controllers.MyBaseController`1.OnActionExecuting(ActionExecutingContext filterContext) in D:\Visual Studio Project\SolarPower\SolarPower\Controllers\MyBaseController.cs:line 81
at Microsoft.AspNetCore.Mvc.Controller.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

View File

@ -0,0 +1,164 @@
2021-06-08T09:10:44.3722923+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T09:10:44.3833969+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T09:10:44.3873303+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T09:11:52.0067660+08:00 8000000e-0003-f500-b63f-84710c7967bb [ERR] An unhandled exception has occurred while executing the request. (48a46595)
MySql.Data.MySqlClient.MySqlException (0x80004005): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '[ControllerName],[ActionName],[Parameter],[CreatedBy]) VALUES ('Home','Index'...' at line 1
at SolarPower.Repository.Implement.OperatorLogRepository.Add(OperatorLog entity, List`1 properties) in D:\Visual Studio Project\SolarPower\SolarPower\Repository\Implement\OperatorLogRepository.cs:line 39
at SolarPower.Controllers.MyBaseController`1.OnActionExecuting(ActionExecutingContext filterContext) in D:\Visual Studio Project\SolarPower\SolarPower\Controllers\MyBaseController.cs:line 81
at Microsoft.AspNetCore.Mvc.Controller.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2021-06-08T09:14:36.8769199+08:00 800004b3-0001-fd00-b63f-84710c7967bb [ERR] An unhandled exception has occurred while executing the request. (48a46595)
MySql.Data.MySqlClient.MySqlException (0x80004005): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '[ControllerName],[ActionName],[Parameter],[CreatedBy]) VALUES ('Home','Index'...' at line 1
at SolarPower.Repository.Implement.OperatorLogRepository.Add(OperatorLog entity, List`1 properties) in D:\Visual Studio Project\SolarPower\SolarPower\Repository\Implement\OperatorLogRepository.cs:line 39
at SolarPower.Controllers.MyBaseController`1.OnActionExecuting(ActionExecutingContext filterContext) in D:\Visual Studio Project\SolarPower\SolarPower\Controllers\MyBaseController.cs:line 81
at Microsoft.AspNetCore.Mvc.Controller.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Filters.ControllerActionFilter.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2021-06-08T09:14:58.4373956+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T09:14:58.4482552+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T09:14:58.4510762+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T09:41:13.9025997+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T09:41:13.9274496+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T09:41:13.9302975+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T10:05:23.3185775+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T10:05:23.3285713+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T10:05:23.3307083+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T10:07:33.5775234+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T10:07:33.5915753+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T10:07:33.5934659+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T10:11:17.5490633+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T10:11:17.5608004+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T10:11:17.5625816+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T10:40:43.6751476+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T10:40:43.6841631+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T10:40:43.6878927+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T12:59:13.6342934+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T12:59:13.6654986+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T12:59:13.6689315+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T13:00:26.0506442+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T13:00:26.0606261+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T13:00:26.0652303+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T13:04:09.1092382+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T13:04:09.1242548+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T13:04:09.1292254+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T13:18:33.7762479+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T13:18:33.7872946+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T13:18:33.7900579+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T13:45:07.2040869+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T13:45:07.2156433+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T13:45:07.2196565+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T13:45:54.9296408+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T13:45:54.9399481+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T13:45:54.9416384+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T13:49:43.0785931+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T13:49:43.0878724+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T13:49:43.0902883+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:06:25.8056694+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:06:25.8238629+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:06:25.8274038+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:06:47.2531399+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:06:47.2766596+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:06:47.2797555+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:11:21.5094713+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:11:21.5411230+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:11:21.5483422+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:13:41.0523427+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:13:41.0653282+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:13:41.0676251+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:18:36.3975879+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:18:36.4576250+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:18:36.4717917+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:29:07.3003715+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:29:07.3774094+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:29:07.3878527+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:29:28.1110609+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:29:28.1258001+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:29:28.1308880+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:33:57.6344194+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:33:57.6457251+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:33:57.6485956+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T15:58:37.0608219+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T15:58:37.0731909+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T15:58:37.0783469+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:08:58.9825652+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:08:59.0271433+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:08:59.0323077+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:10:27.8679340+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:10:27.8989772+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:10:27.9008353+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:18:55.8384967+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:18:55.8561818+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:18:55.8591720+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:40:00.9244209+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:40:00.9346967+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:40:00.9373310+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:41:28.7221199+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:41:28.7322051+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:41:28.7348816+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:43:20.2337339+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:43:20.2448107+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:43:20.2463085+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:46:01.8586772+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:46:01.8781311+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:46:01.8807161+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T16:48:23.6180037+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T16:48:23.6401695+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T16:48:23.6491787+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T17:00:03.5166088+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T17:00:03.5272187+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T17:00:03.5340661+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T17:03:00.2072621+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T17:03:00.2242659+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T17:03:00.2289173+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T17:56:38.9661213+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T17:56:38.9785729+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T17:56:38.9819380+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T18:05:10.7409840+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T18:05:10.9547511+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T18:05:11.0097875+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T18:27:30.3583251+08:00 80000193-0003-fc00-b63f-84710c7967bb [ERR] 【Company/CompanyList】{"SelectedCompanyId":0,"Name":null,"Phone":null,"TaxIDNumber":null} (78a28179)
2021-06-08T18:27:30.3643734+08:00 80000193-0003-fc00-b63f-84710c7967bb [ERR] 【Company/CompanyList】Object reference not set to an instance of an object. (c54cf4f2)
2021-06-08T18:28:08.8316442+08:00 80000044-0002-ea00-b63f-84710c7967bb [ERR] 【Company/CompanyList】{"SelectedCompanyId":0,"Name":null,"Phone":null,"TaxIDNumber":null} (78a28179)
2021-06-08T18:28:08.8348405+08:00 80000044-0002-ea00-b63f-84710c7967bb [ERR] 【Company/CompanyList】Object reference not set to an instance of an object. (c54cf4f2)
2021-06-08T18:28:36.9291448+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T18:28:36.9441893+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T18:28:36.9472082+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T18:29:25.9425669+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T18:29:25.9531638+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T18:29:25.9554442+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T18:32:37.5424446+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T18:32:37.5540317+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T18:32:37.5560015+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T18:34:02.6123734+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T18:34:02.6269317+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T18:34:02.6295712+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-08T18:35:36.6391571+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-08T18:35:36.6490001+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-08T18:35:36.6506005+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)

View File

@ -0,0 +1,126 @@
2021-06-09T09:27:01.0916216+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:27:01.1223469+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:27:01.1253940+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:27:45.7227456+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:27:45.7428027+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:27:45.7457606+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:43:10.6440298+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:43:10.6546016+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:43:10.6563018+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:46:19.1122462+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:46:19.1214190+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:46:19.1234486+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:46:54.1310725+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:46:54.1406844+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:46:54.1426727+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:49:15.8957017+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:49:15.9043735+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:49:15.9060543+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:49:50.0855155+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:49:50.0942813+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:49:50.0972447+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:51:49.5549996+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:51:49.5688709+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:51:49.5770506+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T09:53:43.8294296+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T09:53:43.8392646+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T09:53:43.8413102+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T10:45:56.6083598+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T10:45:56.6208246+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T10:45:56.6261792+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T10:48:08.9949871+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T10:48:09.0083972+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T10:48:09.0102682+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:02:23.5908265+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:02:23.6001878+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:02:23.6025088+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:03:13.7613119+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:03:13.7725973+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:03:13.7742126+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:05:31.8870741+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:05:31.8970451+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:05:31.9000258+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:07:13.9323662+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:07:13.9433682+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:07:13.9472882+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:25:47.0464074+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:25:47.0558618+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:25:47.0581099+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:30:27.2378260+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:30:27.2468733+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:30:27.2484429+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:54:25.7088184+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:54:25.7180612+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:54:25.7204273+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:55:35.1746563+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:55:35.1857247+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:55:35.1881815+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T11:56:22.8434502+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T11:56:22.8548291+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T11:56:22.8571818+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:02:39.5235387+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:02:39.5333549+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:02:39.5358795+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:05:19.4685081+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:05:19.5071721+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:05:19.5194443+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:05:35.9501321+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:05:35.9594381+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:05:35.9614948+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:07:06.7108648+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:07:06.7215696+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:07:06.7243122+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:08:37.0620319+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:08:37.0730175+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:08:37.0746894+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:09:47.4013554+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:09:47.4122884+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:09:47.4141433+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:10:38.7722499+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:10:38.7825162+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:10:38.7847413+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:20:56.4863350+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:20:56.4971710+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:20:56.4992028+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:22:19.5742549+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:22:19.5839585+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:22:19.5856826+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:28:15.7174467+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:28:15.7270558+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:28:15.7285353+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T12:30:23.6083361+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T12:30:23.6177445+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T12:30:23.6229262+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T13:02:14.7452578+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T13:02:14.7580191+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T13:02:14.7598235+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T13:08:16.2883040+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T13:08:16.2991593+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T13:08:16.3036209+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T13:09:09.0112364+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T13:09:09.0210086+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T13:09:09.0254732+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T13:11:53.4843712+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T13:11:53.4932645+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T13:11:53.4947863+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T13:14:17.5483715+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T13:14:17.5590449+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T13:14:17.5610831+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T13:15:51.8548712+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T13:15:51.8688269+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T13:15:51.8726643+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T14:24:30.6413562+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T14:24:30.6592813+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T14:24:30.6645190+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T14:50:24.5173514+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T14:50:24.5275408+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T14:50:24.5343682+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T14:54:47.8080898+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T14:54:47.8222125+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T14:54:47.8291714+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T14:55:55.7879004+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T14:55:55.8086977+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T14:55:55.8137188+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)
2021-06-09T14:56:07.3092293+08:00 [INF] Application started. Press Ctrl+C to shut down. (dcaefe54)
2021-06-09T14:56:07.3218017+08:00 [INF] Hosting environment: "Development" (c3307c92)
2021-06-09T14:56:07.3233623+08:00 [INF] Content root path: "D:\Visual Studio Project\SolarPower\SolarPower" (b5d60022)

View File

@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models.Company
{
public enum CompanyStatusEnum : byte
{
Suspend = 0, //停權
Normal = 1, //正常
}
public class Company : Created
{
public int Id { get; set; }
public byte Deleted { get; set; }
public byte Status { get; set; }
public string Name { get; set; }
public string Logo { get; set; }
public string TaxIDNumber { get; set; } //統一編號
public string Phone { get; set; }
public string Address { get; set; }
public int RegisterUpperLimit { get; set; } //註冊上限
}
/// <summary>
/// 公司管理 - DataTable
/// </summary>
public class CompanyDataTable : Company
{
public string RegisterRatio { get; set; } // 註冊數量 / 註冊上限
public string Function { get; set; } // DataTable Function col
public int SPStationAmount { get; set; } //太陽能電站數量
}
public class SimpleCompany
{
public int Id { get; set; }
public byte Deleted { get; set; }
public byte Status { get; set; }
public string Name { get; set; }
public string Logo { get; set; }
}
public class UpdateCompany : Updated
{
public string Name { get; set; } //名稱
public byte Status { get; set; } //狀態
public string Logo { get; set; }
public string TaxIDNumber { get; set; } //統一編號
public string Phone { get; set; } //電話
public string Address { get; set; }
public int RegisterUpperLimit { get; set; } //註冊上限
}
public class PostCompanyFilter
{
public int SelectedCompanyId { get; set; } //選擇的公司編號
public string Name { get; set; } //公司名稱
public string Phone { get; set; } //電話
public string TaxIDNumber { get; set; } //統一編號
}
/// <summary>
/// 公司列表下拉選單
/// </summary>
public class CompanySelectItemList
{
public string Text { get; set; }
public string Value { get; set; }
}
public class PostCompany
{
public int Id { get; set; } //編號
public string Name { get; set; } //名稱
public string TaxIDNumber { get; set; } //統一編號
//public byte Status { get; set; } //狀態
public string Phone { get; set; } //手機
public string Address { get; set; } //地址
public int RegisterUpperLimit { get; set; } //註冊上限
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models
{
public class DBConfig
{
public string Server { get; set; }
public string Database { get; set; }
public string Root { get; set; }
public string Password { get; set; }
}
}

View File

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models
{
//public enum ErrorCode : byte
//{
// Normal = 0, //正常
// Suspend = 1 //停權
//}
public class ErrorCode
{
Dictionary<string, string> errorrCode = new Dictionary<string, string>()
{
{ "0000", "OK" },
{ "0001", "傳入參數錯誤。" },
{ "9995", "該統一編號已被使用。" },
{ "9996", "查無該公司資訊。" },
{ "9997", "帳號或密碼輸入錯誤。"},
{ "9998", "查無該使用者。"},
{ "9999", "系統內部錯誤,請聯絡管理者。"}
};
/// <summary>
/// 取得錯誤代碼字串
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public string GetString(string code)
{
if (true == (errorrCode.ContainsKey(code)))
{
return errorrCode[code];
}
else
{
return "查無代碼";
}
}
}
}

View File

@ -0,0 +1,11 @@
using System;
namespace SolarPower.Models
{
public class ErrorViewModel
{
public string RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models
{
public class ForgotPasswordViewModel
{
[Required(ErrorMessage = "信箱為必填欄位")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models.LoginViewModel
{
public class LoginViewModel
{
[Required(ErrorMessage = "帳號為必填欄位")]
public string Account { get; set; }
[Required(ErrorMessage = "密碼為必填欄位")]
[DataType(DataType.Password)]
public string Password { get; set; }
//public string ReturnUrl { get; set; }
}
}

View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models
{
/// <summary>
/// 基礎BaseModel
/// </summary>
public class MyBaseModel
{
public int Id { get; set; } //編號
}
public class Created
{
private string createdAt;
public int CreatedBy { get; set; } //創建者
public string CreatedAt { get { return Convert.ToDateTime(createdAt).ToString("yyyy-MM-dd HH:mm:ss"); } set { createdAt = value; } } //創建時間
}
public class Updated : MyBaseModel
{
private string updatedAt;
public int UpdatedBy { get; set; } //修改者
public string UpdatedAt { get { return Convert.ToDateTime(updatedAt).ToString("yyyy-MM-dd HH:mm:ss"); } set { updatedAt = value; } } //修改時間
}
/// <summary>
/// 當前登入的使用者基本資訊
/// </summary>
public class MyUser
{
public int Id { get; set; } //編號
public MyCompany Company { get; set; } //公司資訊
}
/// <summary>
/// 當前登入使用者的公司資訊
/// </summary>
public class MyCompany
{
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models.OperatorLogModel
{
public class OperatorLog
{
public int Id { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string Parameter { get; set; }
public int CreatedBy { get; set; }
public string CreatedAt { get; set; }
}
}

25
SolarPower/Models/Role.cs Normal file
View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models.Role
{
public class Role : Created
{
public int Id { get; set; }
public byte Deleted { get; set; }
public int CompanyId { get; set; }
public string Name { get; set; }
public byte Layer { get; set; }
}
/// <summary>
/// 角色下拉式選單
/// </summary>
public class RoleSelectItemList
{
public string Text { get; set; }
public string Value { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models
{
public class SMTPConfig
{
public string Host { get; set; }
public int Port { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public bool EnableSsl { get; set; }
}
}

286
SolarPower/Models/Share.cs Normal file
View File

@ -0,0 +1,286 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace SolarPower.Models
{
/// <summary>
/// Encryption Decryption Function - 加解密
/// </summary>
public class EDFunction
{
const string SHA256_KEY = "SHA256_KEY"; //自訂金鑰
const string DES_KEY = "SUMT_KEY"; //DES_KEY金鑰(8位字元)
const string DES_IV = "SUMMT_IV"; //DES_IV初始化向量字串(8位字元)
const string AES_KEY = "SUMT_KEY"; //AES_KEY金鑰
const string AES_IV = "SUMMT_IV"; //AES_IV初始化向量字串
/// <summary>
/// 單向加密SHA256
/// </summary>
/// <param name="text">加密字串</param>
/// <returns></returns>
public string GetSHA256Encryption(string text)
{
string signRet = string.Empty;
byte[] key_byte = Encoding.Default.GetBytes(SHA256_KEY);
using (HMACSHA256 mac = new HMACSHA256(key_byte))
{
byte[] source = Encoding.Default.GetBytes(text);//將字串轉為Byte[]
byte[] crypto = mac.ComputeHash(source);//進行SHA256加密
signRet = Convert.ToBase64String(crypto);//把加密後的字串從Byte[]轉為字串
}
return signRet;
}
/// <summary>
/// DES加密
/// </summary>
/// <param name="text">待加密資料</param>
/// <returns></returns>
public string DESEncrypt(string text)
{
try
{
byte[] byKey = Encoding.ASCII.GetBytes(DES_KEY); //密鑰
byte[] byIV = Encoding.ASCII.GetBytes(DES_IV); //IV值
byte[] data = Encoding.Unicode.GetBytes(text);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();//加密、解密對象
MemoryStream MStream = new MemoryStream();//內存流對象
//用內存流實例化加密流對象
CryptoStream CStream = new CryptoStream(MStream, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
CStream.Write(data, 0, data.Length);//向加密流中寫入數據
CStream.FlushFinalBlock();//將數據壓入基礎流
byte[] temp = MStream.ToArray();//從內存流中獲取字節序列
CStream.Close();//關閉加密流
MStream.Close();//關閉內存流
return Convert.ToBase64String(temp);//返回加密後的字符串
}
catch
{
return text;
}
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="text">待解密字符串</param>
/// <returns></returns>
public string DESDecrypt(string text)
{
try
{
byte[] byKey = Encoding.ASCII.GetBytes(DES_KEY); //DES密鑰
byte[] byIV = Encoding.ASCII.GetBytes(DES_IV); //IV值
byte[] data = Convert.FromBase64String(text);
DESCryptoServiceProvider descsp = new DESCryptoServiceProvider();
MemoryStream MStream = new MemoryStream();
//用內存流實例化解密流對象
CryptoStream CStream = new CryptoStream(MStream, descsp.CreateDecryptor(byKey, byIV), CryptoStreamMode.Write);
CStream.Write(data, 0, data.Length);//向加密流中寫入數據
CStream.FlushFinalBlock();//將數據壓入基礎流
byte[] temp = MStream.ToArray();//從內存流中獲取字節序列
CStream.Close();//關閉加密流
MStream.Close();//關閉內存流
return Encoding.Unicode.GetString(temp);//返回解密後的字符串
}
catch
{
return text;
}
}
/// <summary>
/// AES加密
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public string AESEncrypt(string text)
{
var encrypt = "";
try
{
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
byte[] keyData = sha256.ComputeHash(Encoding.UTF8.GetBytes(AES_KEY));
byte[] ivData = md5.ComputeHash(Encoding.UTF8.GetBytes(AES_IV));
byte[] dataByteArray = Encoding.UTF8.GetBytes(text);
using (MemoryStream ms = new MemoryStream())
{
using (
CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(keyData, ivData), CryptoStreamMode.Write)
)
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
encrypt = Convert.ToBase64String(ms.ToArray());
}
}
return encrypt;
}
catch
{
return text;
}
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public string AESDecrypt(string text)
{
var decrypt = "";
try
{
SymmetricAlgorithm aes = new AesCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
byte[] keyData = sha256.ComputeHash(Encoding.UTF8.GetBytes(AES_KEY));
byte[] ivData = md5.ComputeHash(Encoding.UTF8.GetBytes(AES_IV));
byte[] dataByteArray = Convert.FromBase64String(text);
using (MemoryStream ms = new MemoryStream())
{
using (
CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(keyData, ivData), CryptoStreamMode.Write)
)
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(ms.ToArray());
}
}
return decrypt;
}
catch
{
return text;
}
}
}
/// <summary>
/// 回傳結果
/// </summary>
/// <typeparam name="T">資料型別</typeparam>
public class ApiResult<T>
{
public string Code { get; set; }
public string Msg { get; set; }
public T Data { get; set; }
}
public class DapperConnection
{
/// <summary>
/// 新增SQL字串
/// </summary>
/// <param name="TableName">Table名稱</param>
/// <param name="TableValue">Add新增欄位名稱</param>
/// <returns></returns>
//public string InsertQueryTxt(string TableName, List<string> TableValue)
//{
// var sqlId = "";
// var sqlValue = "";
// foreach (var value in TableValue)
// {
// sqlId += value + ",";
// sqlValue += "@" + value + ",";
// }
// var connTxt = "INSERT INTO " + TableName + "(" + sqlId.Substring(0, sqlId.Length - 1) + ") VALUES" + "(" + sqlValue.Substring(0, sqlValue.Length - 1) + ");";
// return connTxt;
//}
/// <summary>
/// 修改SQL字串
/// </summary>
/// <param name="TableName">Table名稱</param>
/// <param name="TableValue">Update變動欄位名稱</param>
/// <param name="sWhere">where條件</param>
/// <returns></returns>
//public string UpdateQueryTxt(string TableName, List<string> TableValue, string sWhere = "")
//{
// var sqlTxt = "";
// foreach (var value in TableValue)
// {
// sqlTxt += value + "=@" + value + ",";
// }
// var connTxt = "UPDATE " + TableName + " SET " + sqlTxt.Substring(0, sqlTxt.Length - 1);
// if (sWhere != "")
// {
// connTxt += " WHERE " + sWhere;
// }
// return connTxt;
//}
//private string GenerateInsertQuery()
//{
// var insertQuery = new StringBuilder($"INSERT INTO {_tableName} ");
// insertQuery.Append("(");
// var properties = GenerateListOfProperties(GetProperties);
// properties.ForEach(prop => { insertQuery.Append($"[{prop}],"); });
// insertQuery
// .Remove(insertQuery.Length - 1, 1)
// .Append(") VALUES (");
// properties.ForEach(prop => { insertQuery.Append($"@{prop},"); });
// insertQuery
// .Remove(insertQuery.Length - 1, 1)
// .Append(")");
// return insertQuery.ToString();
//}
//private string GenerateUpdateQuery()
//{
// var updateQuery = new StringBuilder($"UPDATE {_tableName} SET ");
// var properties = GenerateListOfProperties(GetProperties);
// properties.ForEach(property =>
// {
// if (!property.Equals("Id"))
// {
// updateQuery.Append($"{property}=@{property},");
// }
// });
// updateQuery.Remove(updateQuery.Length - 1, 1); //remove last comma
// updateQuery.Append(" WHERE Id=@Id");
// return updateQuery.ToString();
//}
}
}

131
SolarPower/Models/User.cs Normal file
View File

@ -0,0 +1,131 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Models.User
{
public enum UserStatusEnum : byte
{
Suspend = 0, //停權
Normal = 1, //正常
}
//Base Class。如由其餘需求使用繼承
public class User : Created
{
public int Id { get; set; } //編號
public byte Deleted { get; set; } //是否刪除
public byte Status { get; set; } //狀態
public string StatusText //狀態文字
{
get
{
Dictionary<int, string> pairs = new Dictionary<int, string>()
{
{ 0, "停權"},
{ 1, "正常"},
};
return pairs[Status];
}
}
public string Name { get; set; } //姓名
public int CompanyId { get; set; } //公司編號
public string Account { get; set; } //帳號
public string Password { get; set; } //密碼
public string Email { get; set; } //信箱
public string Phone { get; set; } //手機
public string Tel { get; set; } //市話
}
/// <summary>
/// 使用者DataTable
/// </summary>
public class UserDateTable : User
{
public string CompanyName { get; set; }
public string RoleName { get; set; }
public int SPStationAmount { get; set; } //太陽能電站數量
}
/// <summary>
/// 簡化個人資料
/// </summary>
public class SimpleUser
{
public int Id { get; set; } //編號
public string Name { get; set; } //姓名
public string Account { get; set; } //帳號
public byte Status { get; set; } //狀態
public byte IsGod { get; set; } //神級帳號
public int CompanyId { get; set; } //公司編號
public string Email { get; set; } //信箱
public string Phone { get; set; } //手機
}
/// <summary>
/// 接收POST - 修改個人資料
/// </summary>
public class PostPersonalInfo
{
public string Name { get; set; } //姓名
public string Account { get; set; } //帳號
public string Email { get; set; } //信箱
public string Phone { get; set; } //手機
}
/// <summary>
/// 更新使用者
/// </summary>
public class UpdateUser : Updated
{
public string Name { get; set; } //姓名
public byte Status { get; set; } //狀態
public string Email { get; set; } //信箱
public string Phone { get; set; } //手機
}
/// <summary>
/// 接收POST - 變更密碼的值
/// </summary>
public class PostChangePassword
{
public string OldPassword { get; set; } //舊密碼
public string NewPassword { get; set; } //新密碼
public string AgainPassword { get; set; } //確認新密碼
}
/// <summary>
/// 修改密碼
/// </summary>
public class UpdatePassword : Updated
{
public string Password { get; set; } //新密碼
}
/// <summary>
/// 使用者列表 - 搜尋條件
/// </summary>
public class PostUserFilter
{
public int SelectedCompanyId { get; set; } //選擇公司編號
public string Name { get; set; } //姓名
public int SelectedRoleId { get; set; } //選擇角色編號
}
/// <summary>
/// 接收POST - 新增/修改使用者
/// </summary>
public class PostUser
{
public int Id { get; set; } //編號
public int CompanyId { get; set; } //公司編號
public string Name { get; set; } //姓名
public string Email { get; set; } //信箱
public string Account { get; set; } //帳號
public int RoleId { get; set; } //角色編號
public string Phone { get; set; } //手機
}
}

26
SolarPower/Program.cs Normal file
View File

@ -0,0 +1,26 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}

View File

@ -0,0 +1,31 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iis": {
"applicationUrl": "http://localhost/SolarPower",
"sslPort": 0
},
"iisExpress": {
"applicationUrl": "http://localhost:63003",
"sslPort": 44398
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"SolarPower": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

View File

@ -0,0 +1,236 @@
using Dapper;
using SolarPower.Helper;
using SolarPower.Models.Company;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Implement
{
public class CompanyRepository : RepositoryBase<Company>, ICompanyRepository
{
public CompanyRepository(IDatabaseHelper databaseHelper) : base(databaseHelper)
{
tableName = "company";
}
/// <summary>
/// 取得下拉式公司選單須為Deleted: 0
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public async Task<List<CompanySelectItemList>> GetCompanySelectOptionListAsync()
{
List<CompanySelectItemList> result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = $"SELECT Id AS Value, Name AS Text FROM {tableName} WHERE Deleted = 0";
result = (await conn.QueryAsync<CompanySelectItemList>(sql)).ToList();
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
/// <summary>
/// 取得狀態為正常的公司基本資料
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
public SimpleCompany GetOneNormalSimpleCompanyById(int id)
{
SimpleCompany result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
try
{
var sql = $"SELECT * FROM {tableName} WHERE Deleted = 0 AND Status = @Status AND Id = @Id";
result = conn.QueryFirstOrDefault<SimpleCompany>(sql, new { Status = CompanyStatusEnum.Normal, Id = id });
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return result;
}
}
/// <summary>
/// 透過搜尋條件,查詢過濾後的公司
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public async Task<List<CompanyDataTable>> GetAllByFilterAsync(PostCompanyFilter filter)
{
List<CompanyDataTable> result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = $"SELECT * FROM {tableName} WHERE Deleted = 0";
if (filter.SelectedCompanyId > 0)
{
sql += @" Where Id = @SelectedCompanyId";
}
else
{
if (!string.IsNullOrEmpty(filter.Name))
{
sql += @" AND Name LIKE CONCAT('%', @Name, '%')";
}
if (!string.IsNullOrEmpty(filter.Phone))
{
sql += @" AND Phone LIKE CONCAT('%', @Phone, '%')";
}
if (!string.IsNullOrEmpty(filter.TaxIDNumber))
{
sql += @" AND TaxIDNumber LIKE CONCAT('%', @TaxIDNumber, '%')";
}
}
result = (await conn.QueryAsync<CompanyDataTable>(sql, filter)).ToList();
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
/// <summary>
/// 透過搜尋條件,查詢過濾後的公司
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public async Task<int> GetNormalUserNumberByCompanyIdAsync(int id)
{
int result = 0;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = $"SELECT COUNT(*) FROM user WHERE Deleted = 0 AND Status = @Status AND CompanyId = @CompanyId";
result = (await conn.QueryAsync<int>(sql, new { Status = CompanyStatusEnum.Normal, CompanyId = id })).FirstOrDefault();
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
/// <summary>
/// 取得單一公司資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Company> GetOneCompany(int id)
{
Company result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
try
{
var sql = $"SELECT * FROM {tableName} WHERE deleted = 0 AND id = @Id";
result = await conn.QueryFirstOrDefaultAsync<Company>(sql, new { Id = id });
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return result;
}
}
/// <summary>
/// 修改公司資料
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task UpdateCompany(UpdateCompany entity, List<string> properties)
{
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = GenerateUpdateQuery(properties);
await conn.ExecuteAsync(sql, entity, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 透過統編,取得單一公司基本資料
/// </summary>
/// <param name="taxIDNumber"></param>
/// <returns></returns>
public async Task<SimpleCompany> GetOneNormalSimpleCompanyByTaxIDNumber(string taxIDNumber)
{
SimpleCompany result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
try
{
var sql = $"SELECT * FROM {tableName} WHERE Deleted = 0 AND TaxIDNumber = @TaxIDNumber";
result = await conn.QueryFirstOrDefaultAsync<SimpleCompany>(sql, new { TaxIDNumber = taxIDNumber });
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return result;
}
}
}
}

View File

@ -0,0 +1,49 @@
using Dapper;
using SolarPower.Helper;
using SolarPower.Models.OperatorLogModel;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Implement
{
public class OperatorLogRepository : RepositoryBase<OperatorLog>, IOperatorLogRepository
{
public OperatorLogRepository(IDatabaseHelper databaseHelper) : base(databaseHelper)
{
tableName = "operator_log";
}
public void Add(OperatorLog entity, List<string> properties)
{
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = GenerateInsertQuery(properties);
conn.Execute(sql, entity, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
}
}

View File

@ -0,0 +1,253 @@

using Dapper;
using SolarPower.Helper;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace SolarPower.Repository.Implement
{
public class RepositoryBase<T> : IRepositoryBase<T> where T : class
{
protected readonly IDatabaseHelper _databaseHelper;
protected string tableName;
protected IEnumerable<PropertyInfo> GetProperties = typeof(T).GetProperties();
public RepositoryBase(IDatabaseHelper databaseHelper)
{
this._databaseHelper = databaseHelper;
}
/// <summary>
/// 新增資料
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public virtual async Task<int> AddAsync(T entity, List<string> properties)
{
int count;
using (IDbConnection conn = _databaseHelper.GetConnection())
{
conn.Open();
try
{
string sql = GenerateInsertQuery(properties);
count = await conn.ExecuteAsync(sql, entity);
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return count;
}
}
/// <summary>
/// 透過Id軟刪除單一筆資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual async Task DeleteOne(int id)
{
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = $"UPDATE {tableName} SET deleted = 1 WHERE id = @Id";
await conn.ExecuteAsync(sql, new { Id = id }, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 取得所有資料
/// </summary>
/// <returns></returns>
public virtual async Task<List<T>> GetAllAsync()
{
List<T> result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = $"SELECT * FROM {tableName}";
result = (await conn.QueryAsync<T>(sql)).ToList();
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
/// <summary>
/// 取得單一筆資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual async Task<T> GetOneAsync(int id)
{
T result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = $"SELECT * FROM {tableName} WHERE id = @Id";
result = await conn.QueryFirstOrDefaultAsync<T>(sql, new { Id = id });
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
/// <summary>
/// 透過Id實際刪除單一筆資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual async Task PurgeOneAsync(int id)
{
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = $"DELETE FROM {tableName} WHERE id = @Id";
await conn.ExecuteAsync(sql, new { Id = id }, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 修改資料
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public virtual async Task Update(T entity, List<string> properties)
{
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = GenerateUpdateQuery(properties);
await conn.ExecuteAsync(sql, entity, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 產生Insert語句
/// </summary>
/// <returns></returns>
protected string GenerateInsertQuery(List<string> properties)
{
var insertQuery = new StringBuilder($"INSERT INTO {tableName} ");
insertQuery.Append("(");
properties.ForEach(prop => { insertQuery.Append($"{prop},"); });
insertQuery
.Remove(insertQuery.Length - 1, 1)
.Append(") VALUES (");
properties.ForEach(prop => { insertQuery.Append($"@{prop},"); });
insertQuery
.Remove(insertQuery.Length - 1, 1)
.Append(")");
return insertQuery.ToString();
}
/// <summary>
/// 產生Update語句
/// </summary>
/// <param name="properties"></param>
/// <returns></returns>
protected string GenerateUpdateQuery(List<string> properties)
{
var updateQuery = new StringBuilder($"UPDATE {tableName} SET ");
properties.ForEach(property =>
{
if (!property.Equals("Id"))
{
updateQuery.Append($"{property}=@{property},");
}
});
updateQuery.Remove(updateQuery.Length - 1, 1); //remove last comma
updateQuery.Append(" WHERE id = @Id");
return updateQuery.ToString();
}
}
}

View File

@ -0,0 +1,39 @@
using Dapper;
using SolarPower.Helper;
using SolarPower.Models.Role;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Implement
{
public class RoleRepository : RepositoryBase<Role>, IRoleRepository
{
public RoleRepository(IDatabaseHelper databaseHelper) : base(databaseHelper)
{
tableName = "Role";
}
public async Task<List<RoleSelectItemList>> GetRoleSelectOptionListAsync(int companyId)
{
List<RoleSelectItemList> result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = $"SELECT Id AS Value, Name AS Text FROM {tableName} WHERE Deleted = 0 AND CompanyId = @CompanyId";
result = (await conn.QueryAsync<RoleSelectItemList>(sql, new { CompanyId = companyId })).ToList();
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
}
}

View File

@ -0,0 +1,280 @@
using Dapper;
using SolarPower.Helper;
using SolarPower.Models.User;
using SolarPower.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Implement
{
public class UserRepository : RepositoryBase<User>, IUserRepository
{
public UserRepository(IDatabaseHelper databaseHelper) : base(databaseHelper)
{
tableName = "user";
}
/// <summary>
/// 透過Account取得單一筆資料
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
public async Task<User> GetOneByAccountAsync(string account)
{
User result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = $"SELECT * FROM {tableName} WHERE deleted = 0 AND status = @Status AND account = @Account";
result = await conn.QueryFirstOrDefaultAsync<User>(sql, new { Status = UserStatusEnum.Normal, Account = account });
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
/// <summary>
/// 透過Email取得單一筆資料
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
public async Task<User> GetOneByEmailAsync(string email)
{
User result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
try
{
var sql = $"SELECT * FROM {tableName} WHERE deleted = 0 AND status = @Status AND email = @Email";
result = await conn.QueryFirstOrDefaultAsync<User>(sql, new { Status = UserStatusEnum.Normal, Email = email });
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return result;
}
}
/// <summary>
/// 更換密碼
/// </summary>
/// <param name="password"></param>
/// <param name="id"></param>
/// <returns></returns>
public async Task ChangePassword(string password, int id)
{
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = $"UPDATE {tableName} SET password = @Password WHERE id = @Id";
await conn.ExecuteAsync(sql, new { Password = password, Id = id }, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 取得狀態為正常的使用者基本資料
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
public SimpleUser GetOneNormalSimpleUserByAccount(string account)
{
SimpleUser result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
try
{
var sql = $"SELECT * FROM {tableName} WHERE deleted = 0 AND status = @Status AND account = @Account";
result = conn.QueryFirstOrDefault<SimpleUser>(sql, new { Status = UserStatusEnum.Normal, Account = account });
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return result;
}
}
/// <summary>
/// 取得使用者基本資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<SimpleUser> GetOneSimpleUser(int id)
{
SimpleUser result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
try
{
var sql = $"SELECT * FROM {tableName} WHERE deleted = 0 AND id = @Id";
result = await conn.QueryFirstOrDefaultAsync<SimpleUser>(sql, new { Id = id });
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return result;
}
}
/// <summary>
/// 修改個人資料
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task UpdatePersonInfo(UpdateUser entity, List<string> properties)
{
GetProperties = typeof(UpdateUser).GetProperties();
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = GenerateUpdateQuery(properties);
await conn.ExecuteAsync(sql, entity, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 更新密碼
/// </summary>
/// <param name="entity"></param>
/// <param name="properties"></param>
/// <returns></returns>
public async Task UpdatePassword(UpdatePassword entity, List<string> properties)
{
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
var sql = GenerateUpdateQuery(properties);
await conn.ExecuteAsync(sql, entity, trans);
trans.Commit();
}
catch (Exception exception)
{
trans.Rollback();
throw exception;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 透過搜尋條件,查詢所有使用者
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public async Task<List<UserDateTable>> GetAllByFilterAsync(PostUserFilter filter)
{
List<UserDateTable> result;
using (IDbConnection conn = this._databaseHelper.GetConnection())
{
try
{
var sql = @$"SELECT
u.*,
c.Name AS CompanyName,
r.Name AS RoleName
FROM {tableName} u
LEFT JOIN company c ON u.CompanyId = c.Id
LEFT JOIN role r ON u.RoleId = r.Id
WHERE u.Deleted = 0";
if (filter.SelectedCompanyId > 0)
{
sql += @" AND CompanyId = @SelectedCompanyId";
}
if (!string.IsNullOrEmpty(filter.Name))
{
sql += @" AND Name LIKE CONCAT('%', @Name, '%')";
}
if (filter.SelectedRoleId > 0)
{
sql += @" AND RoleId = @SelectedRoleId";
}
result = (await conn.QueryAsync<UserDateTable>(sql, filter)).ToList();
}
catch (Exception exception)
{
throw exception;
}
return result;
}
}
}
}

View File

@ -0,0 +1,62 @@
using SolarPower.Models.Company;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Interface
{
public interface ICompanyRepository : IRepositoryBase<Company>
{
/// <summary>
/// 取得狀態為正常的公司
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
SimpleCompany GetOneNormalSimpleCompanyById(int id);
/// <summary>
/// 修改公司資料
/// </summary>
/// <param name="entity"></param>
/// <param name="properties"></param>
/// <returns></returns>
Task UpdateCompany(UpdateCompany entity, List<string> properties);
/// <summary>
/// 取得下拉式公司選單須為Deleted: 0、Status: 1
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
Task<List<CompanySelectItemList>> GetCompanySelectOptionListAsync();
/// <summary>
/// 透過搜尋條件,查詢過濾後的公司
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
Task<List<CompanyDataTable>> GetAllByFilterAsync(PostCompanyFilter filter);
/// <summary>
/// 透過公司Id查詢該公司底下狀態為正常的使用者
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
Task<int> GetNormalUserNumberByCompanyIdAsync(int id);
/// <summary>
/// 取得單一公司資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<Company> GetOneCompany(int id);
/// <summary>
/// 透過統編,取得單一公司基本資料
/// </summary>
/// <param name="taxIDNumber"></param>
/// <returns></returns>
Task<SimpleCompany> GetOneNormalSimpleCompanyByTaxIDNumber(string taxIDNumber);
}
}

View File

@ -0,0 +1,13 @@
using SolarPower.Models.OperatorLogModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Interface
{
interface IOperatorLogRepository : IRepositoryBase<OperatorLog>
{
void Add(OperatorLog entity, List<string> properties);
}
}

View File

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Interface
{
public interface IRepositoryBase<T> where T : class
{
/// <summary>
/// 透過Id取得單一資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<T> GetOneAsync(int id);
/// <summary>
/// 取得所有資料
/// </summary>
/// <returns></returns>
Task<List<T>> GetAllAsync();
/// <summary>
/// 新增資料
/// </summary>
/// <param name="entity"></param>
/// <param name="properties"></param>
/// <returns></returns>
Task<int> AddAsync(T entity, List<string> properties);
/// <summary>
/// 修改資料
/// </summary>
/// <param name="entity"></param>
/// <param name="properties"></param>
/// <returns></returns>
Task Update(T entity, List<string> properties);
/// <summary>
/// 透過Id軟刪除單一筆資料
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task DeleteOne(int id);
/// <summary>
/// 透過Id實際刪除單一筆資料
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
Task PurgeOneAsync(int id);
}
}

View File

@ -0,0 +1,18 @@
using SolarPower.Models.Role;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Interface
{
public interface IRoleRepository : IRepositoryBase<Role>
{
/// <summary>
/// 取得下拉式公司角色選單須為Deleted: 0
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
Task<List<RoleSelectItemList>> GetRoleSelectOptionListAsync(int companyId);
}
}

View File

@ -0,0 +1,70 @@
using SolarPower.Models.User;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Repository.Interface
{
public interface IUserRepository : IRepositoryBase<User>
{
/// <summary>
/// 透過Account取得單一筆資料
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
Task<User> GetOneByAccountAsync(string account);
/// <summary>
/// 透過Email取得單一筆資料
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
Task<User> GetOneByEmailAsync(string email);
/// <summary>
/// 更換密碼
/// </summary>
/// <param name="password"></param>
/// <param name="id"></param>
/// <returns></returns>
Task ChangePassword(string password, int id);
/// <summary>
/// 透過Account取得狀態為正常的使用者
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
SimpleUser GetOneNormalSimpleUserByAccount(string account);
/// <summary>
/// 取得單一使用者
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Task<SimpleUser> GetOneSimpleUser(int id);
/// <summary>
/// 修改個人資料
/// </summary>
/// <param name="entity"></param>
/// <param name="properties"></param>
/// <returns></returns>
Task UpdatePersonInfo(UpdateUser entity, List<string> properties);
/// <summary>
/// 更新密碼
/// </summary>
/// <param name="entity"></param>
/// <param name="properties"></param>
/// <returns></returns>
Task UpdatePassword(UpdatePassword entity, List<string> properties);
/// <summary>
/// 透過搜尋條件,查詢過濾後的使用者
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
Task<List<UserDateTable>> GetAllByFilterAsync(PostUserFilter filter);
}
}

View File

@ -0,0 +1,61 @@
using Microsoft.Extensions.Options;
using SolarPower.Models;
using SolarPower.Services.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Threading.Tasks;
namespace SolarPower.Services
{
public class SendEmailService : ISendEmailService
{
private readonly IOptions<SMTPConfig> _options;
private SMTPConfig smtp;
public SendEmailService(IOptions<SMTPConfig> options)
{
smtp = options.Value;
}
public bool Send(List<string> recipientEmails, string subject, string content)
{
MailMessage MyMail = new MailMessage();
MyMail.SubjectEncoding = System.Text.Encoding.UTF8;//郵件標題編碼
MyMail.BodyEncoding = System.Text.Encoding.UTF8; //郵件內容編碼
MyMail.IsBodyHtml = true; //是否使用html格式
MyMail.From = new System.Net.Mail.MailAddress(smtp.UserName); //寄件人
foreach(var email in recipientEmails)
{
MyMail.To.Add(email); //設定收件者Email
}
MyMail.Subject = subject; //主題
MyMail.Body = content; //設定信件內容
//讀取 SMTP Config
SmtpClient MySMTP = new SmtpClient(smtp.Host, smtp.Port);
MySMTP.EnableSsl = smtp.EnableSsl;
MySMTP.Credentials = new System.Net.NetworkCredential(smtp.UserName, smtp.Password);
try
{
MySMTP.Send(MyMail);
MySMTP.Dispose();
MyMail.Dispose(); //釋放資源
return true;
}
catch (Exception ex)
{
//_log.LogError("【SendEmailSMSService】 " + noticeInfo.Recipient_email + "寄送信件失敗");
return false;
}
}
}
}

View File

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower.Services.Interface
{
public interface ISendEmailService
{
bool Send(List<string> recipientEmails, string subject, string content);
}
}

View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AssemblyName>SolarPower</AssemblyName>
<RootNamespace>SolarPower</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.78" />
<PackageReference Include="MySql.Data" Version="8.0.24" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Serilog.Extensions.Logging.File" Version="2.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.2" />
</ItemGroup>
<ItemGroup>
<Folder Include="Logs\" />
</ItemGroup>
</Project>

112
SolarPower/Startup.cs Normal file
View File

@ -0,0 +1,112 @@
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MySql.Data.MySqlClient;
using SolarPower.Helper;
using SolarPower.Models;
using SolarPower.Repository.Implement;
using SolarPower.Repository.Interface;
using SolarPower.Services;
using SolarPower.Services.Interface;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
namespace SolarPower
{
public class Startup
{
public IConfiguration Configuration { get; }
public DBConfig dBConfig = new DBConfig();
public Startup(IConfiguration configuration)
{
Configuration = configuration;
dBConfig.Server = Configuration.GetValue<string>("DBConfig:Server");
dBConfig.Database = Configuration.GetValue<string>("DBConfig:Database");
dBConfig.Root = Configuration.GetValue<string>("DBConfig:Root");
dBConfig.Password = Configuration.GetValue<string>("DBConfig:Password");
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(
builder =>
{
builder.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddFilter("NToastNotify", LogLevel.Warning)
.AddConsole();
});
#region SMPT°t¸m
services.AddTransient<ISendEmailService, SendEmailService>();
services.Configure<SMTPConfig>(Configuration.GetSection("SMTPConfig"));
#endregion
#region DBHelper ª`¤J
services.AddScoped<IDatabaseHelper>(x => new DatabaseHelper(dBConfig));
#endregion
#region Repository ª`¤J
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<ICompanyRepository, CompanyRepository>();
services.AddScoped<IRoleRepository, RoleRepository>();
services.AddScoped<IOperatorLogRepository, OperatorLogRepository>();
#endregion
double loginExpireMinute = this.Configuration.GetValue<double>("LoginExpireMinute");
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(loginExpireMinute);
});
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddFile("Logs/log-{Date}.txt");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Login}/{action=Index}/{id?}");
});
}
}
}

View File

@ -0,0 +1,401 @@
@{
ViewData["MainNum"] = "6";
ViewData["SubNum"] = "2";
ViewData["Title"] = "客戶公司管理";
}
<ol class="breadcrumb page-breadcrumb">
<li class="breadcrumb-item"><a href="javascript:void(0);">系統管理</a></li>
<li class="breadcrumb-item active">@ViewData["Title"]</li>
<li class="position-absolute pos-top pos-right d-none d-sm-block"><span class="js-get-date"></span></li>
</ol>
<div class="subheader">
<h1 class="subheader-title">
<i class='subheader-icon fal fa-globe'></i> @ViewData["Title"]
</h1>
</div>
<!-- Your main content goes below here: -->
<div class="row">
<div class="col-xl-12">
<div id="panel-5" class="panel">
<div class="panel-hdr">
<div class="panel-hdr color-warning-800">
<h2></h2>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<div class="form-group">
<select class="form-control" id="company_select">
<option value="0" selected>全部</option>
</select>
</div>
</div>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<input type="text" id="company_name" class="form-control form-control-sm" placeholder="名稱" autocomplete="off">
</div>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<input type="text" id="company_phone" class="form-control form-control-sm" placeholder="電話" autocomplete="off">
</div>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<input type="text" id="company_taxIDNumber" class="form-control form-control-sm" placeholder="統編" autocomplete="off">
</div>
</div>
<button type="button" class="btn btn-primary btn-sm waves-effect waves-themed ml-2" onclick="SearchCompany()">搜尋</button>
</div>
<div class="panel-container show">
<div class="panel-content">
<button type="button" class="btn btn-success waves-effect waves-themed mb-3" onclick="AddCompany()">
<span class="fal fa-plus mr-1"></span>
新增
</button>
<div class="frame-wrap">
<table id="company_table" class="table table-bordered table-hover m-0 text-center">
<thead class="thead-themed">
<tr>
<th>#</th>
<th>logo</th>
<th>名稱</th>
<th>統編</th>
<th>電話</th>
<th>地址</th>
<th>註冊/上限人數</th>
<th>電站數量</th>
<th>建立時間</th>
<th>功能</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!--公司資料-->
<div class="modal fade" id="company-modal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
公司基本資料 - 新增
</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="fal fa-times"></i></span>
</button>
</div>
<div class="modal-body">
<form class="company-form" id="company-form">
<div class="row">
<div class="form-group col-lg-6">
<label class="form-label" for="company_name_modal">名稱</label>
<input type="text" id="company_name_modal" name="company_name_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="company_taxIDNumber_modal">統編</label>
<input type="text" id="company_taxIDNumber_modal" name="company_taxIDNumber_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="company_phone_modal">電話</label>
<input type="text" id="company_phone_modal" name="company_phone_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="company_address_modal">地址</label>
<input type="text" id="company_address_modal" name="company_address_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="company_registerUpperLimit_modal">註冊上限人數</label>
<input type="number" id="company_registerUpperLimit_modal" name="company_registerUpperLimit_modal" class="form-control" min="0" oninput="value=value.replace(/\D+/g, '')">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="SaveComapny()">確定</button>
</div>
</div>
</div>
</div>
<!--/.公司資料-->
<div class="modal fade" id="company-auth-modal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
選擇功能
</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="fal fa-times"></i></span>
</button>
</div>
<div class="modal-body">
<table class="table table-bordered text-center">
<tbody>
<tr>
<td>選擇</td>
<td>編號</td>
<td>功能大項</td>
<td>功能名稱</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary">確定</button>
</div>
</div>
</div>
</div>
@section Scripts{
<script>
var companyTable;
var selected_id = 0;
$(function () {
//#region 預先載入公司下拉式選單select_option
var url_company_select_option = "/Company/GetCompanySelectOptionList";
$.get(url_company_select_option, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$("#company_select").empty();
$("#company_select").append($("<option />").val(0).text("全部"));
$.each(rel.data, function (index, val) {
$("#company_select").append($("<option />").val(val.value).text(val.text));
});
//預設查詢第一個
$("#company_select").val($("#company_select option:first").val()).trigger('change');
});
//#endregion
//#region 公司管理列表 DataTable
companyTable = $("#company_table").DataTable({
"paging": true,
"lengthChange": false,
"searching": false,
"ordering": true,
"info": true,
"autoWidth": false,
"responsive": true,
"order": [[8, "desc"]],
"columns": [{
"data": "id"
}, {
"data": "logo"
}, {
"data": "name"
}, {
"data": "taxIDNumber"
}, {
"data": "phone"
}, {
"data": "address"
}, {
"data": "registerRatio"
}, {
"data": "spStationAmount"
}, {
"data": "createdAt"
}, {
"data": "function",
}
],
"language": {
"emptyTable": "無資料...",
"processing": "處理中...",
"loadingRecords": "載入中...",
"lengthMenu": "顯示 _MENU_ 項結果",
"zeroRecords": "沒有符合的結果",
"info": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項",
"infoEmpty": "顯示第 0 至 0 項結果,共 0 項",
"infoFiltered": "(從 _MAX_ 項結果中過濾)",
"infoPostFix": "",
"search": "搜尋:",
"paginate": {
"first": "第一頁",
"previous": "上一頁",
"next": "下一頁",
"last": "最後一頁"
},
"aria": {
"sortAscending": ": 升冪排列",
"sortDescending": ": 降冪排列"
}
},
'createdRow': function (row, data, dataIndex) {
$(row).attr('data-id', data.id);
},
"ajax": {
"url": "/Company/CompanyList",
"type": "POST",
"data": function (d) {
d.SelectedCompanyId = $('#system_admin_account').val();
d.Name = $('#company_name').val();
d.Phone = $('#company_phone').val();
d.TaxIDNumber = $('#company_taxIDNumber').val();
},
"dataSrc": function (rel) {
if (rel.data.code == "9999") {
toast_error(rel.data.msg);
return;
}
data = rel.data.data;
if (data == null || data.length == 0) {
this.data = [];
}
return data;
}
}
});
//#endregion
});
//#region 搜尋公司列表
function SearchCompany() {
companyTable.ajax.reload();
}
//#endregion
//#region 新增系統管理員
function AddCompany() {
selected_id = 0;
$("#company-modal .modal-title").html("公司基本資料 - 新增");
$("#company-form").trigger("reset");
$("#company-modal").modal();
}
//#endregion
//#region 編輯公司資料
$('#company_table').on("click", "button.edit-btn", function () {
$("#company-modal .modal-title").html("公司基本資料 - 編輯");
selected_id = $(this).parents('tr').attr('data-id');
//取得單一公司基本資料
var url = "/Company/GetOneCompany/";
var send_data = {
id: selected_id
}
$.post(url, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$("#company_name_modal").val(rel.data.name);
$("#company_taxIDNumber_modal").val(rel.data.taxIDNumber);
$("#company_phone_modal").val(rel.data.phone);
$("#company_address_modal").val(rel.data.address);
$("#company_registerUpperLimit_modal").val(rel.data.registerUpperLimit);
$("#company-modal").modal();
}, 'json');
});
//#endregion
//#region 公司資料表單驗證
$("#company-form").validate({
rules: {
company_taxIDNumber_modal: {
required: true,
},
},
});
//#endregion
//#region 儲存公司資料
function SaveComapny() {
if ($("#company-form").valid()) {
var url = "/Company/SaveCompany";
var send_data = {
Id: selected_id,
Name: $("#company_name_modal").val(),
TaxIDNumber: $("#company_taxIDNumber_modal").val(),
Phone: $("#company_phone_modal").val(),
Address: $("#company_address_modal").val(),
}
$.post(url, send_data, function (rel) {
if (rel.code == "9999") {
toast_error(rel.msg);
return;
}
else if (rel.code == "9998") {
toast_error(rel.msg);
return;
}
toast_ok(rel.msg);
$('#company-modal').modal('hide');
companyTable.ajax.reload();
}, 'json');
}
}
//#endregion
//#region 刪除公司
$('#company_table').on("click", "button.del-btn", function () {
selected_id = $(this).parents('tr').attr('data-id');
//取得單一系統管理員
var url = "/Company/DeleteOneCompany/";
var send_data = {
Id: selected_id
}
$.post(url, send_data, function (rel) {
if (rel.code == "9999") {
toast_error(rel.msg);
return;
}
else if (rel.code == "9998") {
toast_error(rel.msg);
return;
}
toast_ok(rel.msg);
companyTable.ajax.reload();
}, 'json');
});
//#endregion
</script>
}

View File

@ -0,0 +1,8 @@
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

View File

@ -0,0 +1,6 @@
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>

View File

@ -0,0 +1,64 @@
@{
Layout = null;
}
@model SolarPower.Models.ForgotPasswordViewModel
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>後台管理 | 忘記密碼</title>
<!-- Font Awesome -->
<link href="~/lib/fontawesome-free/css/all.min.css" rel="stylesheet" />
<!-- icheck bootstrap -->
<link href="~/lib/icheck-bootstrap/icheck-bootstrap.min.css" rel="stylesheet" />
<!-- AdminLTE -->
<link href="~/css/adminlte.min.css" rel="stylesheet" />
</head>
<body class="hold-transition login-page">
<div class="login-box">
<div class="card card-outline card-primary">
<div class="card-header text-center">
<a href="../../index2.html" class="h1"><b>Admin</b>LTE</a>
</div>
<div class="card-body">
<p class="login-box-msg">忘記密碼</p>
@if (ViewBag.ErrMsg != null && ViewBag.ErrMsg != "")
{
<p class="alert alert-danger">@ViewBag.ErrMsg</p>
}
<form asp-action="ForgotPassword" method="post">
<div class="mb-3">
<div class="input-group">
<input asp-for="Email" type="email" class="form-control" placeholder="Email">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-envelope"></span>
</div>
</div>
</div>
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="row">
<div class="col-12">
<button type="submit" class="btn btn-primary btn-block">取得新密碼</button>
</div>
<!-- /.col -->
</div>
</form>
<p class="mt-3 mb-1">
<a href="/Login/Index">登入</a>
</p>
</div>
<!-- /.login-card-body -->
</div>
</div>
<!-- /.login-box -->
<!-- jQuery -->
<script src="~/lib/jquery/dist/jquery.js"></script>
<!-- Bootstrap 4 -->
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="~/js/adminlte.min.js"></script>
</body>
</html>

View File

@ -0,0 +1,144 @@
@{
Layout = null;
}
@model SolarPower.Models.LoginViewModel.LoginViewModel
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>登入 | 太陽能電站管理系統</title>
<!-- base css -->
<link id="vendorsbundle" rel="stylesheet" media="screen, print" href="~/css/vendors.bundle.css">
<link id="appbundle" rel="stylesheet" media="screen, print" href="~/css/app.bundle.css">
<link id="mytheme" rel="stylesheet" media="screen, print" href="#">
<link id="myskin" rel="stylesheet" media="screen, print" href="~/css/skins/skin-master.css">
<!-- Place favicon.ico in the root directory -->
<link rel="apple-touch-icon" sizes="180x180" href="~/img/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="~/img/favicon/favicon-32x32.png">
<link rel="mask-icon" href="~/img/favicon/safari-pinned-tab.svg" color="#5bbad5">
<link rel="stylesheet" media="screen, print" href="~/css/page-login-alt.css">
<!-- Font Awesome -->
<link href="~/lib/fontawesome-free/css/all.min.css" rel="stylesheet" />
<!-- icheck bootstrap -->
<link href="~/lib/icheck-bootstrap/icheck-bootstrap.min.css" rel="stylesheet" />
<!-- Theme style -->
</head>
<body>
<div class="blankpage-form-field">
<div class="page-logo m-0 w-100 align-items-center justify-content-center rounded border-bottom-left-radius-0 border-bottom-right-radius-0 px-4">
<a href="javascript:void(0)" class="page-logo-link press-scale-down d-flex align-items-center">
<img src="img/logo.png" alt="SmartAdmin WebApp" aria-roledescription="logo">
<span class="page-logo-text mr-1">太陽能電站管理系統</span>
<i class="fal fa-angle-down d-inline-block ml-1 fs-lg color-primary-300"></i>
</a>
</div>
<div class="card p-4 border-top-left-radius-0 border-top-right-radius-0">
<form id="login-form" asp-action="Index" method="post">
<div class="form-group">
<label class="form-label" for="username">帳號</label>
<input asp-for="Account" type="text" id="account" class="form-control" placeholder="Account">
<span asp-validation-for="Account" class="text-danger"></span>
<span class="help-block">
您的帳號
</span>
</div>
<div class="form-group">
<label class="form-label" for="password">密碼</label>
<input asp-for="Password" type="password" id="password" class="form-control" placeholder="Password" autocomplete="off">
<span asp-validation-for="Password" class="text-danger"></span>
<span class="help-block">
您的密碼
</span>
</div>
<div class="form-group text-left">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="rememberme">
<label class="custom-control-label" for="rememberme"> 記住我</label>
</div>
</div>
<button type="submit" class="btn btn-default float-right">登入</button>
</form>
</div>
<div class="blankpage-footer text-center">
<a href="#"><strong>忘記密碼</strong></a> | <a href="#"><strong>申請帳號</strong></a>
</div>
</div>
<video poster="~/img/backgrounds/clouds.png" id="bgvid" playsinline autoplay muted loop>
<source src="~/media/video/cc.webm" type="video/webm">
<source src="~/media/video/cc.mp4" type="video/mp4">
</video>
@*
<div class="login-box">
<!-- /.login-logo -->
<div class="card card-outline card-primary">
<div class="card-body">
<p class="login-box-msg">Sign in to start your session</p>
@if (ViewBag.ErrMsg != null && ViewBag.ErrMsg != "")
{
<p class="alert alert-danger">@ViewBag.ErrMsg</p>
}
<form id="login-form" asp-action="Index" method="post">
<div class="mb-3">
<div class="input-group">
<input asp-for="Account" type="text" id="account" class="form-control" placeholder="Account">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-envelope"></span>
</div>
</div>
</div>
<span asp-validation-for="Account" class="text-danger"></span>
</div>
<div class="mb-3">
<div class="input-group">
<input asp-for="Password" type="password" id="password" class="form-control" placeholder="Password" autocomplete="off">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-lock"></span>
</div>
</div>
</div>
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="row">
<div class="col-8">
@*<div class="icheck-primary">
<input type="checkbox" id="remember">
<label for="remember">
Remember Me
</label>
</div>
</div>
<div class="col-4">
<button type="submit" class="btn btn-primary btn-block">Sign In</button>
</div>
</div>
</form>
<p class="mb-1">
<a asp-action="ForgotPassword">忘記密碼?</a>
</p>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
<!-- /.login-box -->
*@
<!-- jQuery -->
<script src="~/lib/jquery/dist/jquery.js"></script>
<!-- Bootstrap 4 -->
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
@*<script src="~/js/adminlte.min.js"></script>*@
<script src="~/js/vendors.bundle.js"></script>
<script src="~/js/app.bundle.js"></script>
</body>
</html>

View File

@ -0,0 +1,25 @@
@model ErrorViewModel
@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (Model.ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@Model.RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

View File

@ -0,0 +1,54 @@
@{
ViewData["MainNum"] = "1";
ViewData["SubNum"] = "1";
}
<div class="card card-success card-outline">
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-edit"></i>
SweetAlert2 Examples
</h3>
</div>
<div class="card-body">
<button type="button" class="btn btn-success swalDefaultSuccess">
Launch Success Toast
</button>
<button type="button" class="btn btn-info swalDefaultInfo">
Launch Info Toast
</button>
<button type="button" class="btn btn-danger swalDefaultError">
Launch Error Toast
</button>
<button type="button" class="btn btn-warning swalDefaultWarning">
Launch Warning Toast
</button>
<div class="text-muted mt-3">
For more examples look at <a href="https://sweetalert2.github.io/">https://sweetalert2.github.io/</a>
</div>
</div>
<!-- /.card -->
</div>
@section Scripts{
<script>
$(function () {
$('.swalDefaultSuccess').click(function () {
toast_ok('Lorem ipsum dolor sit amet, consetetur sadipscing elitr.')
});
$('.swalDefaultInfo').click(function () {
toast('Lorem ipsum dolor sit amet, consetetur sadipscing elitr.', 'info')
});
$('.swalDefaultError').click(function () {
toast_error('Lorem ipsum dolor sit amet, consetetur sadipscing elitr.')
});
$('.swalDefaultWarning').click(function () {
toast_warning('Lorem ipsum dolor sit amet, consetetur sadipscing elitr.')
});
})
</script>
}

View File

@ -0,0 +1,511 @@
@{
ViewData["MainNum"] = "6";
ViewData["SubNum"] = "3";
ViewData["Title"] = "帳號管理";
}
<ol class="breadcrumb page-breadcrumb">
<li class="breadcrumb-item"><a href="javascript:void(0);">系統管理</a></li>
<li class="breadcrumb-item">FIC</li>
<li class="breadcrumb-item active">帳號管理</li>
<li class="position-absolute pos-top pos-right d-none d-sm-block"><span class="js-get-date"></span></li>
</ol>
<div class="row">
<div class="col-xl-12">
<div id="panel-5" class="panel">
<div class="panel-container show">
<div class="panel-content">
<div class="subheader">
<h1 class="subheader-title">
<img src="img/asus.png"> 華碩電腦
</h1>
</div>
<ul class="nav nav-tabs nav-tabs-clean" role="tablist">
<li class="nav-item"><a class="nav-link active" data-toggle="tab" href="#tab-user-manager" role="tab">帳號管理</a></li>
<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-role-manager" role="tab">角色管理</a></li>
<li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-role-auth" role="tab">角色權限</a></li>
</ul>
<div class="tab-content p-3">
<div class="tab-pane fade show active" id="tab-user-manager" role="tabpanel" aria-labelledby="tab-user-manager">
@Html.Partial("_UserManager")
</div>
<div class="tab-pane fade" id="tab-role-manager" role="tabpanel" aria-labelledby="tab-role-manager">
@Html.Partial("_RoleManager")
</div>
<div class="tab-pane fade" id="tab-role-auth" role="tabpanel" aria-labelledby="tab-role-auth">
@Html.Partial("_RoleAuth")
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@*
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">搜尋條件</h3>
</div>
<div class="card-body">
<form id="system-admin-filter-form">
<div class="form-row">
<div class="form-group col-md-6">
<label>帳號:</label>
<input type="text" class="form-control" id="system_admin_account" name="system_admin_account">
</div>
<div class="form-group col-md-6">
<label>姓名:</label>
<input type="text" class="form-control" id="system_admin_name" name="system_admin_name">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>電子信箱:</label>
<input type="text" class="form-control" id="system_admin_email" name="system_admin_email">
</div>
<div class="form-group col-md-6">
<label>手機號碼:</label>
<input type="text" class="form-control" id="system_admin_phone" name="system_admin_phone">
</div>
</div>
</form>
</div>
<div class="card-footer text-right">
<button type="button" class="btn btn-default" onclick="ResetForm()">清除</button>
<button type="button" class="btn btn-primary" onclick="SearchSystemAdmin()">查詢</button>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">人員列表</h3>
<div class="card-tools">
<button class="btn btn-success" onclick="AddSystemAdmin()"><i class="fa fa-plus"></i>&nbsp;新增</button>
</div>
</div>
<!-- /.card-header -->
<div class="card-body">
<table id="system_admin_table" class="table table-bordered table-hover">
<thead>
<tr>
<th>帳號</th>
<th>姓名</th>
<th>電子信箱</th>
<th>手機號碼</th>
<th>狀態</th>
<th>建立時間</th>
<th>功能</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
</div>
</div>
<!-- 個人資料 -->
<div class="modal" tabindex="-1" id="system-admin-modal" role="dialog" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">系統管理員</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-12">
<form class="system-admin-form" id="system-admin-form">
<div class="form-row">
<div class="form-group col-md-12">
<label for="system_admin_name_modal">
<font class="text-danger">*</font>姓名:
</label>
<input type="text" class="form-control" id="system_admin_name_modal" name="system_admin_name_modal" autocomplete="off" />
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label for="system_admin_account_modal">
帳號:
</label>
<input type="text" class="form-control" id="system_admin_account_modal" name="system_admin_account_modal" disabled>
</div>
</div>
<div class="form-row system_admin_password_form_row">
<div class="form-group col-md-12">
<label>
密碼:等同帳號
</label>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label>狀態:</label>
<div class="custom-control custom-radio d-inline">
<input class="custom-control-input" type="radio" id="system_admin_status_normal_modal" name="system_admin_status_modal" value="0">
<label for="system_admin_status_normal_modal" class="custom-control-label">正常</label>
</div>
<div class="custom-control custom-radio d-inline">
<input class="custom-control-input" type="radio" id="system_admin_status_suspend_modal" name="system_admin_status_modal" value="1">
<label for="system_admin_status_suspend_modal" class="custom-control-label">停權</label>
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label for="system_admin_email_modal">
電子信箱:
</label>
<input type="email" class="form-control" id="system_admin_email_modal" name="system_admin_email_modal" autocomplete="off">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label for="system_admin_phone_modal">
電話:
</label>
<input type="text" class="form-control" id="system_admin_phone_modal" name="system_admin_phone_modal" autocomplete="off">
</div>
</div>
</form>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary btn-save" onclick="SaveSystemAdmin()">儲存</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
<!-- /.個人資料 -->
*@
@section Scripts {
<script>
var userTable;
var selected_id = 0;
var selected_company_id = 0;
$(function () {
//#region 預先載入公司下拉式選單select_option
var url_company_select_option = "/Company/GetCompanySelectOptionList";
$.get(url_company_select_option, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$(".select_user_company").empty();
$.each(rel.data, function (index, val) {
$(".select_user_company").append($("<option />").val(val.value).text(val.text));
});
//預設查詢第一個
$(".select_user_company").val($(".select_user_company option:first").val()).trigger('change');
});
//#endregion
//#region 選擇公司角色下拉式選單select_option
$(".select_user_company").change(function () {
//查詢該公司的角色
var url_company_role_select_option = "/Role/GetRoleSelectOptionList";
send_data = {
CompanyId: $("#select_user_company_userManager_tab").val()
}
$.get(url_company_role_select_option, send_data, function (rel) {
if (rel.code != "0000") {
toast_error(rel.msg);
return;
}
$(".select_company_role").empty();
$("#company_select").append($("<option />").val(0).text("全部"));
$.each(rel.data, function (index, val) {
$(".select_company_role").append($("<option />").val(val.value).text(val.text));
});
//預設查詢第一個
$(".select_company_role").val($(".select_company_role option:first").val()).trigger('change');
//#region user manager tab 人員基本資料新增/修改 modal
$('#user_role_modal').empty();
$.each(rel.data, function (index, val) {
$(".user_role_modal").append($("<option />").val(val.value).text(val.text));
});
//預設查詢第一個
$(".user_role_modal").val($(".user_role_modal option:first").val()).trigger('change');
//#endregion
});
});
//#endregion
//#region 使用者列表 DataTable
userTable = $("#user_table").DataTable({
"paging": true,
"lengthChange": false,
"searching": false,
"ordering": true,
"info": true,
"autoWidth": false,
"responsive": false,
"order": [[7, "desc"]],
"columns": [{
"data": "id"
}, {
"data": "companyName"
}, {
"data": "name"
}, {
"data": "roleName"
}, {
"data": "email"
}, {
"data": "phone"
}, {
"data": "spStationAmount"
}, {
"data": "createdAt"
}, {
"data": null,
"defaultContent": '<button class="btn btn-primary edit-btn">修改</button> <button class="btn btn-danger del-btn">刪除</button>'
}
],
"language": {
"emptyTable": "無資料...",
"processing": "處理中...",
"loadingRecords": "載入中...",
"lengthMenu": "顯示 _MENU_ 項結果",
"zeroRecords": "沒有符合的結果",
"info": "顯示第 _START_ 至 _END_ 項結果,共 _TOTAL_ 項",
"infoEmpty": "顯示第 0 至 0 項結果,共 0 項",
"infoFiltered": "(從 _MAX_ 項結果中過濾)",
"infoPostFix": "",
"search": "搜尋:",
"paginate": {
"first": "第一頁",
"previous": "上一頁",
"next": "下一頁",
"last": "最後一頁"
},
"aria": {
"sortAscending": ": 升冪排列",
"sortDescending": ": 降冪排列"
}
},
'createdRow': function (row, data, dataIndex) {
$(row).attr('data-guid', data.guid);
},
"ajax": {
"url": "/User/UserList",
"type": "POST",
"data": function (d) {
d.SelectedCompanyId = $('#select_user_company').val();
d.Name = $('#user_name').val();
d.SelectedRoleId = $('#select_user_role').val();
},
"dataSrc": function (rel) {
if (rel.data.code == "9999") {
toast_error(rel.data.msg);
return;
}
data = rel.data.data;
if (data == null || data.length == 0) {
this.data = [];
}
return data;
}
}
});
//#endregion
});
//#region 搜尋使用者列表
function SearchUser() {
userTable.ajax.reload();
}
//#endregion
//#region 清除搜尋條件
@*function ResetForm() {
$("#system-admin-filter-form").trigger("reset");
}*@
//#endregion
//#region 新增系統管理員
function AddUser() {
selected_id = 0;
$("#user-modal .modal-title").html("人員基本資料 - 新增");
$("#user_companyId_modal").val($("#select_user_company_userManager_tab").val());
$("#user_account_modal").prop("disabled", false);
$(".user_account_same_email_div").show();
$("#user_account_same_email").prop("disabled", false);
$(".user_password_form_row").show();
$("#user-form").trigger("reset");
$("#user-modal").modal();
}
//#endregion
//#region 帳號是否等同Email
$('#user_account_same_email').change(function () {
var email = $("#user_email_modal").val();
if (email == undefined || email == null || email == "") {
toast_warning("請先填寫email");
$(this).prop("checked", false);
return;
}
if (this.checked && selected_id == 0) {
//只提供新增時可透過email填入帳號欄位
$("#user_account_modal").val(email);
$("#user_account_modal").prop("disabled", true);
}
else {
$("#user_account_modal").prop("disabled", false);
}
});
//#endregion
//#region 編輯系統管理員
$('#user_table').on("click", "button.edit-btn", function () {
$("#user-modal .modal-title").html("人員基本資料 - 編輯");
selected_id = $(this).parents('tr').attr('data-id');
//取得單一系統管理員
var url = "/User/GetOneUser/";
var send_data = {
id: selected_id
}
$.post(url, send_data, function (rel) {
if (rel.code == "9999") {
toast_error(rel.msg);
return;
}
else if (rel.code == "9998") {
toast_error(rel.msg);
return;
}
$("#user_name_modal").val(rel.data.name);
$("#user_email_modal").val(rel.data.email);
$("#user_account_modal").val(rel.data.account);
$("#user_account_modal").prop("disabled", true);
$(".user_account_same_email_div").hide();
$("#user_account_same_email").prop("disabled", true);
$(".system_admin_password_form_row").hide();
$("#user_phone_modal").val(rel.data.phone);
$("#user-modal").modal();
}, 'json');
});
//#endregion
//#region 使用者表單驗證
$("#user-form").validate({
rules: {
user_email_modal: {
email: true,
},
},
});
//#endregion
//#region 儲存使用者
function SaveUser() {
if ($("#user-form").valid()) {
var url = "/User/SaveUser";
var send_data = {
Id: selected_id,
CompanyId: $("#user_comapnyId_modal").val(),
Name: $("#user_name_modal").val(),
Email: $("#user_email_modal").val(),
Account: $("#user_account_modal").val(),
Phone: $("#user_phone_modal").val(),
RoleId: $("#user_role_modal").val()
}
$.post(url, send_data, function (rel) {
if (rel.code == "9999") {
toast_error(rel.msg);
return;
}
else if (rel.code == "9998") {
toast_error(rel.msg);
return;
}
toast_ok(rel.msg);
$('#user-modal').modal('hide');
userTable.ajax.reload();
}, 'json');
}
}
//#endregion
//#region 刪除使用者
$('#user_table').on("click", "button.del-btn", function () {
selected_id = $(this).parents('tr').attr('data-id');
//取得單一系統管理員
var url = "/User/DeleteOneUser/";
var send_data = {
Id: selected_id
}
$.post(url, send_data, function (rel) {
if (rel.code == "9999") {
toast_error(rel.msg);
return;
}
else if (rel.code == "9998") {
toast_error(rel.msg);
return;
}
userTable.ajax.reload();
}, 'json');
});
//#endregion
</script>
}

View File

@ -0,0 +1,76 @@
<div class="row mb-5">
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<div class="form-group">
<select class="form-control" id="example-select">
<option>客戶公司</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
</div>
</div>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<div class="form-group">
<select class="form-control" id="example-select">
<option>角色名稱</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
</div>
</div>
</div>
<button type="button" class="btn btn-primary btn-sm waves-effect waves-themed ml-2">搜尋</button>
</div>
<div class="row mb-3">
<div class="col-12">
<a href="javascript:;" class="btn btn-success waves-effect waves-themed mb-3" data-toggle="modal" data-target="#companyrule"><span class="fal fa-plus mr-1"></span> 加入可用功能</a>
</div>
</div>
<div class="row">
<div class="col-12">
<!-- datatable start -->
<table class="table table-bordered table-hover m-0 text-center">
<thead class="thead-themed">
<tr>
<th>#</th>
<th>公司</th>
<th>角色</th>
<th>功能名稱</th>
<th>建立時間</th>
<th>建立人/th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>華碩</td>
<td>機房運維</td>
<td>帳號管理</td>
<td>2021-06-01 09:36</td>
<td>王小明</td>
<td>
<button type="button" class="btn btn-danger btn-pills waves-effect waves-themed">刪除</button>
</td>
</tr>
<tr>
<th scope="row">2</th>
<td>華碩</td>
<td>機房運維</td>
<td>報表查詢 - 逆變器歷史資料</td>
<td>2021-06-01 09:36</td>
<td>王小明</td>
<td>
<button type="button" class="btn btn-danger btn-pills waves-effect waves-themed">刪除</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@ -0,0 +1,62 @@
<div class="row mb-5">
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<div class="form-group">
<select class="form-control select_user_company" id="select_user_company_rolemanager_tab" name="select_user_company_rolemanager_tab">
</select>
</div>
</div>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<input type="text" class="form-control form-control-sm" placeholder="角色名稱">
</div>
</div>
<button type="button" class="btn btn-primary btn-sm waves-effect waves-themed ml-2">搜尋</button>
</div>
<div class="row mb-3">
<div class="col-12">
<a href="javascript:;" class="btn btn-success waves-effect waves-themed mb-3" data-toggle="modal" data-target="#addpeople"><span class="fal fa-plus mr-1"></span> 新增</a>
</div>
</div>
<div class="row">
<div class="col-12">
<!-- datatable start -->
<table class="table table-bordered table-hover m-0 text-center">
<thead class="thead-themed">
<tr>
<th>#</th>
<th>公司</th>
<th>名稱</th>
<th>建立人</th>
<th>建立時間</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td><a href="javascript:;">FIC</a></td>
<td>平台管理員</td>
<td>王小明</td>
<td>2021-06-01 09:36</td>
<td>
<a href="javascript:;" type="button" class="btn btn-primary btn-pills waves-effect waves-themed" data-toggle="modal" data-target="#addpeople">修改</a>
<button type="button" class="btn btn-danger btn-pills waves-effect waves-themed">刪除</button>
</td>
</tr>
<tr>
<th scope="row">2</th>
<td><a href="javascript:;">FIC</a></td>
<td>平台運維</td>
<td>王小明</td>
<td>2021-06-01 09:36</td>
<td>
<a href="javascript:;" type="button" class="btn btn-primary btn-pills waves-effect waves-themed" data-toggle="modal" data-target="#addpeople">修改</a>
<button type="button" class="btn btn-danger btn-pills waves-effect waves-themed">刪除</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@ -0,0 +1,121 @@
<div class="row mb-5">
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<div class="form-group">
<select class="form-control select_user_company" id="select_user_company_userManager_tab" name="select_user_company_usermanager_tab">
<option value="0" selected>請選擇公司</option>
</select>
</div>
</div>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<input type="text" class="form-control form-control-sm" id="user_name" name="user_name" placeholder="姓名">
</div>
</div>
<div class="panel-toolbar ml-2">
<div class="d-flex position-relative ml-auto" style="max-width: 8rem;">
<div class="form-group">
<select class="form-control select_company_role" id="select_company_role_usermanager_tab" disabled>
<option value="0" selected>請先選擇公司</option>
</select>
</div>
</div>
</div>
<button type="button" class="btn btn-primary btn-sm waves-effect waves-themed ml-2" onclick="SearchUser()">搜尋</button>
</div>
<div class="row mb-3">
<div class="col-12">
<a href="javascript:;" class="btn btn-success waves-effect waves-themed mb-3" data-toggle="modal" data-target="#addpeople" onclick="AddUser()"><span class="fal fa-plus mr-1"></span>新增</a> 可再增加 7 個帳號
</div>
</div>
<div class="row">
<div class="col-12">
<!-- datatable start -->
<table id="user_table" class="table table-bordered table-hover m-0 text-center">
<thead class="thead-themed">
<tr>
<th>#</th>
<th>公司</th>
<th>姓名</th>
<th>角色</th>
<th>email</th>
<th>手機號碼</th>
<th>管理電站數量</th>
<th>建立時間</th>
<th>功能</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
<!-- Modal 人員基本資料 -->
<div class="modal fade" id="user-modal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">
人員基本資料 - 新增
</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true"><i class="fal fa-times"></i></span>
</button>
</div>
<div class="modal-body">
<form class="user-form" id="user-form">
<div class="row">
<div class="form-group col-lg-6" style="display:none">
<label class="form-label" for="user_companyId_modal">公司</label>
<input type="text" id="user_companyId_modal" name="user_companyId_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="user_name_modal"><span class="text-danger">*</span>姓名</label>
<input type="text" id="user_name_modal" name="user_name_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="user_email_modal"><span class="text-danger">*</span>email</label>
<input type="text" id="user_email_modal" name="user_email_modal" class="form-control">
</div>
<div class="form-group col-lg-6">
<div style="margin-bottom: 0.3rem">
<label class="form-label" for="user_account_modal"><span class="text-danger">*</span>帳號</label>
<input type="text" id="user_account_modal" name="user_account_modal" class="form-control">
</div>
<div class="custom-control custom-checkbox user_account_same_email_div">
<input type="checkbox" class="custom-control-input" id="user_account_same_email" />
<label class="custom-control-label" for="user_account_same_email">與email相同</label>
</div>
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="user_password_modal">密碼</label>
<input type="password" id="user_password_modal" name="user_password_modal" class="form-control disabled" placeholder="由系統產生">
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="user_role_modal">角色權限</label>
<select class="form-control" id="user_role_modal">
</select>
</div>
<div class="form-group col-lg-6">
<label class="form-label" for="user_phone_modal">電話</label>
<input type="text" id="user_phone_modal" class="form-control">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="SaveUser()">確定</button>
</div>
</div>
</div>
</div>
<!-- /.Modal 人員基本資料 -->

View File

@ -0,0 +1,3 @@
@using SolarPower
@using SolarPower.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@ -0,0 +1,3 @@
@{
Layout = "_Layout";
}

View File

@ -0,0 +1,30 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"LoginExpireMinute": 60, //()
"DBConfig": {
"Server": "Abc123456",
"Database": "321",
"Root": "147",
"Password": "741"
},
"JWTConfig": {
"Issuer": "SHH", //Token
"Audience": "EveryOne", //Token
"IssuerSigningKey": "0dd6b2fa-ce1b-40e5-8ca9-e798a4c7bb23", //token16
"AccessTokenExpiresMinutes": "600" //
},
"SMTPConfig": {
"Host": "smtp.gmail.com",
"Port": 25,
"UserName": "shanghohui@gmail.com",
"Password": "wswgnluvoodfexrb",
"EnableSsl": true
}
}

View File

@ -0,0 +1,10 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

12
SolarPower/wwwroot/css/adminlte.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,17 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@font-face {
font-family: 'Font Awesome 5 Brands';
font-style: normal;
font-weight: 400;
font-display: block;
src: url("../webfonts/fa-brands-400.eot");
src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
.fab {
font-family: 'Font Awesome 5 Brands';
font-weight: 400; }
/*# sourceMappingURL=fa-brands.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,17 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 300;
font-display: block;
src: url("../webfonts/fa-light-300.eot");
src: url("../webfonts/fa-light-300.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-light-300.woff2") format("woff2"), url("../webfonts/fa-light-300.woff") format("woff"), url("../webfonts/fa-light-300.ttf") format("truetype"), url("../webfonts/fa-light-300.svg#fontawesome") format("svg"); }
.fal {
font-family: 'Font Awesome 5 Pro';
font-weight: 300; }
/*# sourceMappingURL=fa-light.css.map */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,17 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 400;
font-display: block;
src: url("../webfonts/fa-regular-400.eot");
src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
.far {
font-family: 'Font Awesome 5 Pro';
font-weight: 400; }
/*# sourceMappingURL=fa-regular.css.map */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,18 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 900;
font-display: block;
src: url("../webfonts/fa-solid-900.eot");
src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
.fa,
.fas {
font-family: 'Font Awesome 5 Pro';
font-weight: 900; }
/*# sourceMappingURL=fa-solid.css.map */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,403 @@
/*!
* Bootstrap Colorpicker - Bootstrap Colorpicker is a modular color picker plugin for Bootstrap 4.
* @package bootstrap-colorpicker
* @version v3.2.0
* @license MIT
* @link https://itsjavi.com/bootstrap-colorpicker/
* @link https://github.com/itsjavi/bootstrap-colorpicker.git
*/
.colorpicker {
position: relative;
display: none;
font-size: inherit;
color: inherit;
text-align: left;
list-style: none;
background-color: #ffffff;
background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.2);
padding: .75rem .75rem;
width: 148px;
border-radius: 4px;
-webkit-box-sizing: content-box;
box-sizing: content-box; }
.colorpicker.colorpicker-disabled,
.colorpicker.colorpicker-disabled * {
cursor: default !important; }
.colorpicker div {
position: relative; }
.colorpicker-popup {
position: absolute;
top: 100%;
left: 0;
float: left;
margin-top: 1px;
z-index: 1060; }
.colorpicker-popup.colorpicker-bs-popover-content {
position: relative;
top: auto;
left: auto;
float: none;
margin: 0;
z-index: initial;
border: none;
padding: 0.25rem 0;
border-radius: 0;
background: none;
-webkit-box-shadow: none;
box-shadow: none; }
.colorpicker:before,
.colorpicker:after {
content: "";
display: table;
clear: both;
line-height: 0; }
.colorpicker-clear {
clear: both;
display: block; }
.colorpicker:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: rgba(0, 0, 0, 0.2);
position: absolute;
top: -7px;
left: auto;
right: 6px; }
.colorpicker:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #ffffff;
position: absolute;
top: -6px;
left: auto;
right: 7px; }
.colorpicker.colorpicker-with-alpha {
width: 170px; }
.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
display: block; }
.colorpicker-saturation {
position: relative;
width: 126px;
height: 126px;
/* FF3.6+ */
/* Chrome,Safari4+ */
/* Chrome10+,Safari5.1+ */
/* Opera 11.10+ */
/* IE10+ */
background: -webkit-gradient(linear, left top, left bottom, from(transparent), to(black)), -webkit-gradient(linear, left top, right top, from(white), to(rgba(255, 255, 255, 0)));
background: linear-gradient(to bottom, transparent 0%, black 100%), linear-gradient(to right, white 0%, rgba(255, 255, 255, 0) 100%);
/* W3C */
cursor: crosshair;
float: left;
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
margin-bottom: 6px; }
.colorpicker-saturation .colorpicker-guide {
display: block;
height: 6px;
width: 6px;
border-radius: 6px;
border: 1px solid #000;
-webkit-box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
position: absolute;
top: 0;
left: 0;
margin: -3px 0 0 -3px; }
.colorpicker-hue,
.colorpicker-alpha {
position: relative;
width: 16px;
height: 126px;
float: left;
cursor: row-resize;
margin-left: 6px;
margin-bottom: 6px; }
.colorpicker-alpha-color {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%; }
.colorpicker-hue,
.colorpicker-alpha-color {
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }
.colorpicker-hue .colorpicker-guide,
.colorpicker-alpha .colorpicker-guide {
display: block;
height: 4px;
background: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(0, 0, 0, 0.4);
position: absolute;
top: 0;
left: 0;
margin-left: -2px;
margin-top: -2px;
right: -2px;
z-index: 1; }
.colorpicker-hue {
/* FF3.6+ */
/* Chrome,Safari4+ */
/* Chrome10+,Safari5.1+ */
/* Opera 11.10+ */
/* IE10+ */
background: -webkit-gradient(linear, left bottom, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
background: linear-gradient(to top, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
/* W3C */ }
.colorpicker-alpha {
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px;
display: none; }
.colorpicker-bar {
min-height: 16px;
margin: 6px 0 0 0;
clear: both;
text-align: center;
font-size: 10px;
line-height: normal;
max-width: 100%;
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }
.colorpicker-bar:before {
content: "";
display: table;
clear: both; }
.colorpicker-bar.colorpicker-bar-horizontal {
height: 126px;
width: 16px;
margin: 0 0 6px 0;
float: left; }
.colorpicker-input-addon {
position: relative; }
.colorpicker-input-addon i {
display: inline-block;
cursor: pointer;
vertical-align: text-top;
height: 16px;
width: 16px;
position: relative; }
.colorpicker-input-addon:before {
content: "";
position: absolute;
width: 16px;
height: 16px;
display: inline-block;
vertical-align: text-top;
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker.colorpicker-inline {
position: relative;
display: inline-block;
float: none;
z-index: auto;
vertical-align: text-bottom; }
.colorpicker.colorpicker-horizontal {
width: 126px;
height: auto; }
.colorpicker.colorpicker-horizontal .colorpicker-bar {
width: 126px; }
.colorpicker.colorpicker-horizontal .colorpicker-saturation {
float: none;
margin-bottom: 0; }
.colorpicker.colorpicker-horizontal .colorpicker-hue,
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
float: none;
width: 126px;
height: 16px;
cursor: col-resize;
margin-left: 0;
margin-top: 6px;
margin-bottom: 0; }
.colorpicker.colorpicker-horizontal .colorpicker-hue .colorpicker-guide,
.colorpicker.colorpicker-horizontal .colorpicker-alpha .colorpicker-guide {
position: absolute;
display: block;
bottom: -2px;
left: 0;
right: auto;
height: auto;
width: 4px; }
.colorpicker.colorpicker-horizontal .colorpicker-hue {
/* FF3.6+ */
/* Chrome,Safari4+ */
/* Chrome10+,Safari5.1+ */
/* Opera 11.10+ */
/* IE10+ */
background: -webkit-gradient(linear, right top, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
background: linear-gradient(to left, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
/* W3C */ }
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker-inline:before,
.colorpicker-no-arrow:before,
.colorpicker-popup.colorpicker-bs-popover-content:before {
content: none;
display: none; }
.colorpicker-inline:after,
.colorpicker-no-arrow:after,
.colorpicker-popup.colorpicker-bs-popover-content:after {
content: none;
display: none; }
.colorpicker-alpha,
.colorpicker-saturation,
.colorpicker-hue {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.colorpicker.colorpicker-visible,
.colorpicker-alpha.colorpicker-visible,
.colorpicker-saturation.colorpicker-visible,
.colorpicker-hue.colorpicker-visible,
.colorpicker-bar.colorpicker-visible {
display: block; }
.colorpicker.colorpicker-hidden,
.colorpicker-alpha.colorpicker-hidden,
.colorpicker-saturation.colorpicker-hidden,
.colorpicker-hue.colorpicker-hidden,
.colorpicker-bar.colorpicker-hidden {
display: none; }
.colorpicker-inline.colorpicker-visible {
display: inline-block; }
.colorpicker.colorpicker-disabled:after {
border: none;
content: '';
display: block;
width: 100%;
height: 100%;
background: rgba(233, 236, 239, 0.33);
top: 0;
left: 0;
right: auto;
z-index: 2;
position: absolute; }
.colorpicker.colorpicker-disabled .colorpicker-guide {
display: none; }
/** EXTENSIONS **/
.colorpicker-preview {
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker-preview > div {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%; }
.colorpicker-bar.colorpicker-swatches {
-webkit-box-shadow: none;
box-shadow: none;
height: auto; }
.colorpicker-swatches--inner {
clear: both;
margin-top: -6px; }
.colorpicker-swatch {
position: relative;
cursor: pointer;
float: left;
height: 16px;
width: 16px;
margin-right: 6px;
margin-top: 6px;
margin-left: 0;
display: block;
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker-swatch--inner {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%; }
.colorpicker-swatch:nth-of-type(7n+0) {
margin-right: 0; }
.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(7n+0) {
margin-right: 6px; }
.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(8n+0) {
margin-right: 0; }
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(6n+0) {
margin-right: 0; }
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(7n+0) {
margin-right: 6px; }
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(8n+0) {
margin-right: 6px; }
.colorpicker-swatch:last-of-type:after {
content: "";
display: table;
clear: both; }
*[dir='rtl'] .colorpicker-element input,
.colorpicker-element[dir='rtl'] input,
.colorpicker-element input[dir='rtl'] {
direction: ltr;
text-align: right; }
/*# sourceMappingURL=bootstrap-colorpicker.css.map */
/*# sourceMappingURL=bootstrap-colorpicker.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,809 @@
@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900");
.daterangepicker {
position: absolute;
color: inherit;
background-color: #fff;
border-radius: 4px;
border: 1px solid #ddd;
width: 278px;
max-width: none;
padding: 0;
margin-top: 7px;
top: 100px;
left: 20px;
z-index: 3001;
display: none;
font-family: arial;
font-size: 15px;
line-height: 1em; }
.daterangepicker:before, .daterangepicker:after {
position: absolute;
display: inline-block;
border-bottom-color: rgba(0, 0, 0, 0.2);
content: ''; }
.daterangepicker:before {
top: -7px;
border-right: 7px solid transparent;
border-left: 7px solid transparent;
border-bottom: 7px solid #ccc; }
.daterangepicker:after {
top: -6px;
border-right: 6px solid transparent;
border-bottom: 6px solid #fff;
border-left: 6px solid transparent; }
.daterangepicker.opensleft:before {
right: 9px; }
.daterangepicker.opensleft:after {
right: 10px; }
.daterangepicker.openscenter:before {
left: 0;
right: 0;
width: 0;
margin-left: auto;
margin-right: auto; }
.daterangepicker.openscenter:after {
left: 0;
right: 0;
width: 0;
margin-left: auto;
margin-right: auto; }
.daterangepicker.opensright:before {
left: 9px; }
.daterangepicker.opensright:after {
left: 10px; }
.daterangepicker.drop-up {
margin-top: -7px; }
.daterangepicker.drop-up:before {
top: initial;
bottom: -7px;
border-bottom: initial;
border-top: 7px solid #ccc; }
.daterangepicker.drop-up:after {
top: initial;
bottom: -6px;
border-bottom: initial;
border-top: 6px solid #fff; }
.daterangepicker.single .daterangepicker .ranges, .daterangepicker.single .drp-calendar {
float: none; }
.daterangepicker.single .drp-selected {
display: none; }
.daterangepicker.show-calendar .drp-calendar {
display: block; }
.daterangepicker.show-calendar .drp-buttons {
display: block; }
.daterangepicker.auto-apply .drp-buttons {
display: none; }
.daterangepicker .drp-calendar {
display: none;
max-width: 270px; }
.daterangepicker .drp-calendar.left {
padding: 8px 0 8px 8px; }
.daterangepicker .drp-calendar.right {
padding: 8px; }
.daterangepicker .drp-calendar.single .calendar-table {
border: none; }
.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span {
color: #fff;
border: solid black;
border-width: 0 2px 2px 0;
border-radius: 0;
display: inline-block;
padding: 3px; }
.daterangepicker .calendar-table .next span {
transform: rotate(-45deg);
-webkit-transform: rotate(-45deg); }
.daterangepicker .calendar-table .prev span {
transform: rotate(135deg);
-webkit-transform: rotate(135deg); }
.daterangepicker .calendar-table th, .daterangepicker .calendar-table td {
white-space: nowrap;
text-align: center;
vertical-align: middle;
min-width: 32px;
width: 32px;
height: 24px;
line-height: 24px;
font-size: 12px;
border-radius: 4px;
border: 1px solid transparent;
white-space: nowrap;
cursor: pointer; }
.daterangepicker .calendar-table {
border: 1px solid #fff;
border-radius: 4px;
background-color: #fff; }
.daterangepicker .calendar-table table {
width: 100%;
margin: 0;
border-spacing: 0;
border-collapse: collapse; }
.daterangepicker td.available:hover, .daterangepicker th.available:hover {
background-color: #eee;
border-color: transparent;
color: inherit; }
.daterangepicker td.week, .daterangepicker th.week {
font-size: 80%;
color: #ccc; }
.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date {
background-color: #fff;
border-color: transparent;
color: #999; }
.daterangepicker td.in-range {
background-color: #ebf4f8;
border-color: transparent;
color: #000;
border-radius: 0; }
.daterangepicker td.start-date {
border-radius: 4px 0 0 4px; }
.daterangepicker td.end-date {
border-radius: 0 4px 4px 0; }
.daterangepicker td.start-date.end-date {
border-radius: 4px; }
.daterangepicker td.active, .daterangepicker td.active:hover {
background-color: #357ebd;
border-color: transparent;
color: #fff; }
.daterangepicker th.month {
width: auto; }
.daterangepicker td.disabled, .daterangepicker option.disabled {
color: #999;
cursor: not-allowed;
text-decoration: line-through; }
.daterangepicker select.monthselect, .daterangepicker select.yearselect {
font-size: 12px;
padding: 1px;
height: auto;
margin: 0;
cursor: default; }
.daterangepicker select.monthselect {
margin-right: 2%;
width: 56%; }
.daterangepicker select.yearselect {
width: 40%; }
.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {
width: 50px;
margin: 0 auto;
background: #eee;
border: 1px solid #eee;
padding: 2px;
outline: 0;
font-size: 12px; }
.daterangepicker .calendar-time {
text-align: center;
margin: 4px auto 0 auto;
line-height: 30px;
position: relative; }
.daterangepicker .calendar-time select.disabled {
color: #ccc;
cursor: not-allowed; }
.daterangepicker .drp-buttons {
clear: both;
text-align: right;
padding: 8px;
border-top: 1px solid #ddd;
display: none;
line-height: 12px;
vertical-align: middle; }
.daterangepicker .drp-selected {
display: inline-block;
font-size: 12px;
padding-right: 8px; }
.daterangepicker .drp-buttons .btn {
margin-left: 8px;
font-size: 12px;
font-weight: bold;
padding: 4px 8px; }
.daterangepicker.show-ranges.single.rtl .drp-calendar.left {
border-right: 1px solid #ddd; }
.daterangepicker.show-ranges.single.ltr .drp-calendar.left {
border-left: 1px solid #ddd; }
.daterangepicker.show-ranges.rtl .drp-calendar.right {
border-right: 1px solid #ddd; }
.daterangepicker.show-ranges.ltr .drp-calendar.left {
border-left: 1px solid #ddd; }
.daterangepicker .ranges {
float: none;
text-align: left;
margin: 0; }
.daterangepicker.show-calendar .ranges {
margin-top: 8px; }
.daterangepicker .ranges ul {
list-style: none;
margin: 0 auto;
padding: 0;
width: 100%; }
.daterangepicker .ranges li {
font-size: 12px;
padding: 8px 12px;
cursor: pointer; }
.daterangepicker .ranges li:hover {
background-color: #eee; }
.daterangepicker .ranges li.active {
background-color: #08c;
color: #fff; }
/* Larger Screen Styling */
@media (min-width: 564px) {
.daterangepicker {
width: auto; }
.daterangepicker .ranges ul {
width: 140px; }
.daterangepicker.single .ranges ul {
width: 100%; }
.daterangepicker.single .drp-calendar.left {
clear: none; }
.daterangepicker.single .ranges, .daterangepicker.single .drp-calendar {
float: left; }
.daterangepicker {
direction: ltr;
text-align: left; }
.daterangepicker .drp-calendar.left {
clear: left;
margin-right: 0; }
.daterangepicker .drp-calendar.left .calendar-table {
border-right: none;
border-top-right-radius: 0;
border-bottom-right-radius: 0; }
.daterangepicker .drp-calendar.right {
margin-left: 0; }
.daterangepicker .drp-calendar.right .calendar-table {
border-left: none;
border-top-left-radius: 0;
border-bottom-left-radius: 0; }
.daterangepicker .drp-calendar.left .calendar-table {
padding-right: 8px; }
.daterangepicker .ranges, .daterangepicker .drp-calendar {
float: left; } }
@media (min-width: 730px) {
.daterangepicker .ranges {
width: auto; }
.daterangepicker .ranges {
float: left; }
.daterangepicker.rtl .ranges {
float: right; }
.daterangepicker .drp-calendar.left {
clear: none !important; } }
/* #BOOTSTRAP AND MIXINS - Base Unmodified Bootstrap file with theme mixins
========================================================================== */
/*---------------------------------------------------
SASS ELements (based on LESS Elements 0.9 http://lesselements.com)
-------------------------------- -------------------
LESS ELEMENTS made by Dmitry Fadeyev (http://fadeyev.net)
SASS port by Samuel Beek (http://samuelbeek.com)
---------------------------------------------------*/
/*------------------------
Usage
$color-white: hexToRGBString(#fff) => "255,255,255"
$color-white: hexToRGBString(rgb(255,255,255)) => "255,255,255"
$color-white: hexToRGBString(rgba(#fff,1)) => "255,255,255"
------------------------*/
/*------------------------
Usage
h1 {
font-size: rem(32);
}
OR:
h1 {
font-size: rem(32px);
}
------------------------*/
/*------------------------
FADE IN
e.g. @include fadeIn( 2s );
------------------------*/
/*------------------------
mixin that calculates if text needs to be light or dark
depending on the background color passed.
From this W3C document: http://www.webmasterworld.com/r.cgi?f=88&d=9769&url=http://www.w3.org/TR/AERT#color-contrast
usage:
@include text-contrast($bgcolor)
Color brightness is determined by the following formula:
((Red value X 299) + (Green value X 587) + (Blue value X 114)) / 1000
------------------------*/
/*------------------------
color factory
eg: contrast-ink($contrastvalue)
------------------------*/
/*------------------------
color factory
eg: @include paint($blue-grey-50, bg-blue-grey-50);
------------------------*/
/* backface visibility */
/* generate theme button */
/* #BASE - Base Variable file along with font library, and colors.
========================================================================== */
/* THEME COLORs
========================================================================== */
/* Looks good on chrome default color profile */
/* We will manually convert these primary colors to rgb for the dark mode option of the theme */
/* looks good in sRGB but washed up on chrome default
$color-primary: #826bb0;
$color-success: #31cb55;
$color-info: #5e93ec;
$color-warning: #eec559;
$color-danger: #dc4b92;
$color-fusion: darken(desaturate(adjust-hue($color-primary, 5), 80%), 25%); */
/* Color Polarity
========================================================================== */
/* PAINTBUCKET MIXER
========================================================================== */
/* the grays */
/* the sapphires */
/* the emeralds */
/* the amethyths */
/* the topaz */
/* the rubies */
/* the graphites */
/* Define universal border difition (div outlines, etc)
========================================================================== */
/* MOBILE BREAKPOINT & GUTTERS (contains some bootstrap responsive overrides)
========================================================================== */
/* define when mobile menu activates, here we are declearing (lg) so it targets the one after it */
/* bootstrap reference xs: 0, sm: 544px, md: 768px, lg: 992px, xl: 1200px*/
/* global var used for spacing*/
/* Uniform Padding variable */
/* Heads up! This is a global scoped variable - changing may impact the whole template */
/* BOOTSTRAP OVERRIDES (bootstrap variables)
========================================================================== */
/* usage: theme-colors("primary"); */
/* forms */
/*$input-height: calc(2.25rem + 1px); //I had to add this because the input gruops was having improper height for some reason... */
/* links */
/* checkbox */
/*$custom-file-height-inner: calc(2.25rem - 1px);*/
/* not part of bootstrap variable */
/* custom checkbox */
/* custom range */
/* custom file */
/* badge */
/* cards */
/*border radius*/
/* alert */
/* toast */
/* breadcrumb */
/* input button */
/* nav link */
/* nav, tabs, pills */
/* tables */
/* dropdowns */
/* dropdowns sizes */
/* popovers */
/* tooltips */
/* modal */
/* reference guide
http://www.standardista.com/px-to-rem-conversion-if-root-font-size-is-16px/
8px = 0.5rem
9px = 0.5625rem
10px = 0.625rem
11px = 0.6875rem
12px = 0.75rem
13px = 0.8125rem
14px = 0.875rem
15px = 0.9375rem
16px = 1rem (base)
17px = 1.0625rem
18px = 1.125rem
19px = 1.1875rem
20px = 1.25rem
21px = 1.3125rem
22px = 1.375rem
24px = 1.5rem
25px = 1.5625rem
26px = 1.625rem
28px = 1.75rem
30px = 1.875rem
32px = 2rem
34px = 2.125rem
36px = 2.25rem
38px = 2.375rem
40px = 2.5rem
*/
/* Fonts */
/* carousel */
/* BASE VARS
========================================================================== */
/* font vars below will auto change to rem values using function rem($value)*/
/* 11px */
/* 12px */
/* 12.5px */
/* 14px */
/* 15px */
/* 16px */
/* 28px */
/* Font Family
========================================================================== */
/*hint: you can also try the font called 'Poppins' by replacing the font 'Roboto' */
/* ANIMATIONS
========================================================================== */
/* this addresses all animation related to nav hide to nav minify */
/* Z-INDEX declearation
========================================================================== */
/* we adjust bootstrap z-index to be higher than our higest z-index*/
/* CUSTOM ICON PREFIX
========================================================================== */
/* PRINT CSS (landscape or portrait)
========================================================================== */
/* landscape or portrait */
/* auto, letter */
/* Common Element Variables
========================================================================== */
/* Z-index decleartion "birds eye view"
========================================================================== */
/* Components
========================================================================== */
/* PAGE HEADER STUFF
========================================================================== */
/* colors */
/* height */
/* logo */
/* try not to go beywond the width of $main_nav_width value */
/* you may need to change this depending on your logo design */
/* adjust this as you see fit : left, right, center */
/* icon font size (not button) */
/* search input box */
/* suggestion: #ccced0*/
/* btn */
/* dropdown: app list */
/* badge */
/* COMPONENTS & MODS */
/* NAVIGATION STUFF
Guide:
aside.page-sidebar ($nav-width, $nav-background)
.page-logo
.primary-nav
.info-card
ul.nav-menu
li
a (parent level-0..., $nav-link-color, $nav-link-hover-color, $nav-link-hover-bg-color, $nav-link-hover-left-border-color)
icon
span
collapse-sign
ul.nav-menu-sub-one
li
a ($nav-level-1... $nav-sub-link-height)
span
collapse-sign
ul.nav-menu-sub-two
li
a ($nav-level-2... $nav-sub-link-height)
span
p.nav-title ($nav-title-*...)
========================================================================== */
/* main navigation */
/* left panel */
/* nav footer */
/* nav parent level-0 */
/* nav link level-1 */
/* nav level-1 bg */
/* nav icon sizes */
/* badge default */
/* all child */
/* nav title */
/* nav Minify */
/* when the menu pops on hover */
/* navigation Width */
/* partial visibility of the menu */
/* top navigation */
/* nav Info Card (appears below the logo) */
/* width is auto */
/* nav DL labels for all child */
/* will be pulled to left as a negative value */
/* MISC Settings
========================================================================== */
/* List Table */
/* PAGE SETTINGS
========================================================================== */
/* PAGE BREADCRUMB
========================================================================== */
/* PAGE COMPONENT PANELS
========================================================================== */
/* PAGE COMPONENT PROGRESSBARS
========================================================================== */
/* PAGE COMPONENT MESSENGER
========================================================================== */
/* FOOTER
========================================================================== */
/* GLOBALS
========================================================================== */
/* ACCESSIBILITIES */
/* SHORTCUT BUTTON (appears on bottom right of the page) */
/* GULP WARNINGS */
body {
font-family: "Roboto", "Helvetica Neue", Helvetica, Arial;
font-size: 0.8125rem;
letter-spacing: 0.1px; }
.page-content {
color: #666666; }
h1, h2, h3, h4, h5, h6 {
line-height: 1.3;
font-weight: 400; }
strong {
font-weight: 500; }
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.h1 small,
.h2 small,
.h3 small,
.h4 small,
.h5 small,
.h6 small {
font-weight: 300;
display: block;
font-size: 0.9375rem;
line-height: 1.5;
margin: 2px 0 1.5rem; }
h2 small,
h3 small,
.h2 small,
.h3 small {
font-size: 0.9375rem; }
h4 small,
.h4 small {
font-size: 0.875rem; }
h5 small,
h6 small,
.h5 small,
.h6 small {
font-size: 0.8125rem; }
/* contrast text */
.text-contrast {
color: #333333; }
/* text-gradient */
.text-gradient {
background: -webkit-gradient(linear, left top, left bottom, color-stop(25%, #6e4e9e), color-stop(50%, #62468d), color-stop(75%, #0c7cd5), to(#0960a5));
background: linear-gradient(180deg, #6e4e9e 25%, #62468d 50%, #0c7cd5 75%, #0960a5 100%);
color: #886ab5;
background-clip: text;
text-fill-color: transparent;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: none; }
/* looking for font size? Check _helpers.scss */
/* PLACEHOLDER
=============================================
EXAMPLE:
%bg-image {
width: 100%;
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
}
.image-one {
@extend %bg-image;
background-image:url(/img/image-one.jpg");
}
RESULT:
.image-one, .image-two {
width: 100%;
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
}
*/
/*
%shadow-hover {
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 0 2px rgba(0,0,0,0.24);
transition: all 0.2s ease-in-out;
&:hover {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 -1px 6px rgba(0,0,0,0.23);
}
}
*/
/*%fixed-header-shadow {
@include box-shadow(0 2px 2px -1px rgba(0,0,0,.1));
}*/
/* %selected-dot {
&:before {
content: " ";
display: block;
border-radius: 50%;
background: inherit;
background-image: none;
border: 2px solid rgba(0,0,0,0.2);
position: absolute;
top: 15px;
left: 15px;
height: 20px;
width: 20px;
}
&:after {
content: " ";
height: inherit;
width: inherit;
border: 5px solid rgba(0,0,0,0.1);
position: absolute;
left: 0;
top: 0;
border-radius: 50%;
}
}*/
/* patterns */
.daterangepicker table tr td,
.daterangepicker table tr th {
width: 38px !important;
height: 34px !important; }
.daterangepicker table tr td.old,
.daterangepicker table tr td.new {
color: darkgray; }
.daterangepicker table tr td.active:active,
.daterangepicker table tr td.active.highlighted:active,
.daterangepicker table tr td.active.active,
.daterangepicker table tr td.active.highlighted.active,
.daterangepicker table tr td.selected,
.daterangepicker table tr td.selected.highlighted,
.daterangepicker table tr td span.active.active,
.daterangepicker table tr td span.focused {
background-color: #967bbd;
color: #fff; }
.daterangepicker table tr td.active:active:hover,
.daterangepicker table tr td.active.highlighted:active:hover,
.daterangepicker table tr td.active.active:hover,
.daterangepicker table tr td.active.highlighted.active:hover,
.daterangepicker table tr td.active:active:focus,
.daterangepicker table tr td.active.highlighted:active:focus,
.daterangepicker table tr td.active.active:focus,
.daterangepicker table tr td.active.highlighted.active:focus,
.daterangepicker table tr td.active:active.focus,
.daterangepicker table tr td.active.highlighted:active.focus,
.daterangepicker table tr td.active.active.focus,
.daterangepicker table tr td.active.highlighted.active.focus,
.daterangepicker table tr td.selected:active:hover,
.daterangepicker table tr td.selected.highlighted:active:hover,
.daterangepicker table tr td.selected.active:hover,
.daterangepicker table tr td.selected.highlighted.active:hover,
.daterangepicker table tr td.selected:active:focus,
.daterangepicker table tr td.selected.highlighted:active:focus,
.daterangepicker table tr td.selected.active:focus,
.daterangepicker table tr td.selected.highlighted.active:focus,
.daterangepicker table tr td.selected:active.focus,
.daterangepicker table tr td.selected.highlighted:active.focus,
.daterangepicker table tr td.selected.active.focus,
.daterangepicker table tr td.selected.highlighted.active.focus,
.daterangepicker table tr td.selected:hover,
.daterangepicker table tr td.selected.highlighted:hover {
background-color: #7a59ad;
color: #fff; }
.daterangepicker .calendar-table .next,
.daterangepicker .calendar-table .prev {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center; }
.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span {
border-color: #a1a8c3; }
.daterangepicker .in-range.available {
background-color: #ffe3a7; }
.daterangepicker .off.ends.in-range.available {
background-color: #ffebc1; }
.daterangepicker td.available:hover, .daterangepicker th.available:hover {
background-color: #ffd274; }
.daterangepicker td.start-date {
border-radius: 10px 0 0 10px; }
.daterangepicker td.end-date {
border-radius: 0 10px 10px 0; }
.daterangepicker table tr td,
.daterangepicker table tr th {
width: 38px !important;
height: 34px !important; }
.daterangepicker .calendar-table table thead tr th {
font-weight: bold; }
.daterangepicker .calendar-table table thead tr th.month {
color: #a1a8c3; }
.daterangepicker .ranges li {
font-size: 0.8125rem;
padding: 0.75rem 1rem; }
.daterangepicker .ranges li.active {
background-color: #886ab5; }
/*# sourceMappingURL=bootstrap-daterangepicker.css.map */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,146 @@
.md-editor {
display: block;
border: 1px solid #ddd; }
.md-editor .md-footer, .md-editor > .md-header {
display: block;
padding: 6px 4px;
background: #f5f5f5; }
.md-editor > .md-header {
margin: 0; }
.md-editor > .md-preview {
background: #fff;
border-top: 1px dashed #ddd;
border-bottom: 1px dashed #ddd;
min-height: 10px;
overflow: auto; }
.md-editor > textarea {
font-family: Menlo,Monaco,Consolas,"Courier New",monospace;
font-size: 14px;
outline: 0;
margin: 0;
display: block;
padding: 0;
width: 100%;
border: 0;
border-top: 1px dashed #ddd;
border-bottom: 1px dashed #ddd;
border-radius: 0;
-webkit-box-shadow: none;
box-shadow: none;
background: #eee; }
.md-editor > textarea:focus {
-webkit-box-shadow: none;
box-shadow: none;
background: #fff; }
.md-editor.active {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }
.md-editor .md-controls {
float: right;
padding: 3px; }
.md-editor .md-controls .md-control {
right: 5px;
color: #bebebe;
padding: 3px 3px 3px 10px; }
.md-editor .md-controls .md-control:hover {
color: #333; }
.md-editor.md-fullscreen-mode {
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
z-index: 99999;
padding: 60px 30px 15px;
background: #fff !important;
border: 0 !important; }
.md-editor.md-fullscreen-mode .md-footer {
display: none; }
.md-editor.md-fullscreen-mode .md-input, .md-editor.md-fullscreen-mode .md-preview {
margin: 0 auto !important;
height: 100% !important;
font-size: 20px !important;
padding: 20px !important;
color: #999;
line-height: 1.6em !important;
resize: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
background: #fff !important;
border: 0 !important; }
.md-editor.md-fullscreen-mode .md-preview {
color: #333;
overflow: auto; }
.md-editor.md-fullscreen-mode .md-input:focus, .md-editor.md-fullscreen-mode .md-input:hover {
color: #333;
background: #fff !important; }
.md-editor.md-fullscreen-mode .md-header {
background: 0 0;
text-align: center;
position: fixed;
width: 100%;
top: 20px; }
.md-editor.md-fullscreen-mode .btn-group {
float: none; }
.md-editor.md-fullscreen-mode .btn {
border: 0;
background: 0 0;
color: #b3b3b3; }
.md-editor.md-fullscreen-mode .btn.active, .md-editor.md-fullscreen-mode .btn:active, .md-editor.md-fullscreen-mode .btn:focus, .md-editor.md-fullscreen-mode .btn:hover {
-webkit-box-shadow: none;
box-shadow: none;
color: #333; }
.md-editor.md-fullscreen-mode .md-fullscreen-controls {
position: absolute;
top: 20px;
right: 20px;
text-align: right;
z-index: 1002;
display: block; }
.md-editor.md-fullscreen-mode .md-fullscreen-controls a {
color: #b3b3b3;
clear: right;
margin: 10px;
width: 30px;
height: 30px;
text-align: center; }
.md-editor.md-fullscreen-mode .md-fullscreen-controls a:hover {
color: #333;
text-decoration: none; }
.md-editor.md-fullscreen-mode .md-editor {
height: 100% !important;
position: relative; }
.md-editor .md-fullscreen-controls {
display: none; }
.md-nooverflow {
overflow: hidden;
position: fixed;
width: 100%; }
/*# sourceMappingURL=bootstrap-markdown.css.map */

View File

@ -0,0 +1 @@
{"version":3,"sources":["bootstrap-markdown.css"],"names":[],"mappings":"AAAA;EAAW,cAAa;EAAC,sBAAqB,EAAA;;AAAC;EAA4C,cAAa;EAAC,gBAAe;EAAC,mBAAkB,EAAA;;AAAC;EAAsB,SAAQ,EAAA;;AAAC;EAAuB,gBAAe;EAAC,2BAA0B;EAAC,8BAA6B;EAAC,gBAAe;EAAC,cAAa,EAAA;;AAAC;EAAoB,0DAAyD;EAAC,eAAc;EAAC,UAAS;EAAC,SAAQ;EAAC,cAAa;EAAC,UAAS;EAAC,WAAU;EAAC,SAAQ;EAAC,2BAA0B;EAAC,8BAA6B;EAAC,gBAAe;EAAC,wBAAe;UAAf,gBAAe;EAAC,gBAAe,EAAA;;AAAC;EAA0B,wBAAe;UAAf,gBAAe;EAAC,gBAAe,EAAA;;AAAC;EAAkB,qBAAoB;EAAC,UAAS;EAAC,0FAAgF;EAAC,kFAAwE,EAAA;;AAAC;EAAwB,YAAW;EAAC,YAAW,EAAA;;AAAC;EAAoC,UAAS;EAAC,cAAa;EAAC,yBAAwB,EAAA;;AAAC;EAA0C,WAAU,EAAA;;AAAC;EAA8B,WAAU;EAAC,YAAW;EAAC,eAAc;EAAC,MAAK;EAAC,OAAM;EAAC,cAAa;EAAC,uBAAsB;EAAC,2BAAyB;EAAC,oBAAkB,EAAA;;AAAC;EAAyC,aAAY,EAAA;;AAAC;EAAkF,yBAAuB;EAAC,uBAAqB;EAAC,0BAAwB;EAAC,wBAAsB;EAAC,WAAU;EAAC,6BAA2B;EAAC,uBAAqB;EAAC,mCAAyB;UAAzB,2BAAyB;EAAC,2BAAyB;EAAC,oBAAkB,EAAA;;AAAC;EAA0C,WAAU;EAAC,cAAa,EAAA;;AAAC;EAA4F,WAAU;EAAC,2BAAyB,EAAA;;AAAC;EAAyC,eAAc;EAAC,kBAAiB;EAAC,eAAc;EAAC,WAAU;EAAC,SAAQ,EAAA;;AAAC;EAAyC,WAAU,EAAA;;AAAC;EAAmC,SAAQ;EAAC,eAAc;EAAC,cAAa,EAAA;;AAAC;EAAsK,wBAAe;UAAf,gBAAe;EAAC,WAAU,EAAA;;AAAC;EAAsD,kBAAiB;EAAC,SAAQ;EAAC,WAAU;EAAC,iBAAgB;EAAC,aAAY;EAAC,cAAa,EAAA;;AAAC;EAAwD,cAAa;EAAC,YAAW;EAAC,YAAW;EAAC,WAAU;EAAC,YAAW;EAAC,kBAAiB,EAAA;;AAAC;EAA8D,WAAU;EAAC,qBAAoB,EAAA;;AAAC;EAAyC,uBAAqB;EAAC,kBAAiB,EAAA;;AAAC;EAAmC,aAAY,EAAA;;AAAC;EAAe,gBAAe;EAAC,eAAc;EAAC,WAAU,EAAA","file":"bootstrap-markdown.css","sourcesContent":[".md-editor{display:block;border:1px solid #ddd}.md-editor .md-footer,.md-editor>.md-header{display:block;padding:6px 4px;background:#f5f5f5}.md-editor>.md-header{margin:0}.md-editor>.md-preview{background:#fff;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;min-height:10px;overflow:auto}.md-editor>textarea{font-family:Menlo,Monaco,Consolas,\"Courier New\",monospace;font-size:14px;outline:0;margin:0;display:block;padding:0;width:100%;border:0;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;border-radius:0;box-shadow:none;background:#eee}.md-editor>textarea:focus{box-shadow:none;background:#fff}.md-editor.active{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.md-editor .md-controls{float:right;padding:3px}.md-editor .md-controls .md-control{right:5px;color:#bebebe;padding:3px 3px 3px 10px}.md-editor .md-controls .md-control:hover{color:#333}.md-editor.md-fullscreen-mode{width:100%;height:100%;position:fixed;top:0;left:0;z-index:99999;padding:60px 30px 15px;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-footer{display:none}.md-editor.md-fullscreen-mode .md-input,.md-editor.md-fullscreen-mode .md-preview{margin:0 auto!important;height:100%!important;font-size:20px!important;padding:20px!important;color:#999;line-height:1.6em!important;resize:none!important;box-shadow:none!important;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-preview{color:#333;overflow:auto}.md-editor.md-fullscreen-mode .md-input:focus,.md-editor.md-fullscreen-mode .md-input:hover{color:#333;background:#fff!important}.md-editor.md-fullscreen-mode .md-header{background:0 0;text-align:center;position:fixed;width:100%;top:20px}.md-editor.md-fullscreen-mode .btn-group{float:none}.md-editor.md-fullscreen-mode .btn{border:0;background:0 0;color:#b3b3b3}.md-editor.md-fullscreen-mode .btn.active,.md-editor.md-fullscreen-mode .btn:active,.md-editor.md-fullscreen-mode .btn:focus,.md-editor.md-fullscreen-mode .btn:hover{box-shadow:none;color:#333}.md-editor.md-fullscreen-mode .md-fullscreen-controls{position:absolute;top:20px;right:20px;text-align:right;z-index:1002;display:block}.md-editor.md-fullscreen-mode .md-fullscreen-controls a{color:#b3b3b3;clear:right;margin:10px;width:30px;height:30px;text-align:center}.md-editor.md-fullscreen-mode .md-fullscreen-controls a:hover{color:#333;text-decoration:none}.md-editor.md-fullscreen-mode .md-editor{height:100%!important;position:relative}.md-editor .md-fullscreen-controls{display:none}.md-nooverflow{overflow:hidden;position:fixed;width:100%}"]}

View File

@ -0,0 +1,408 @@
/*!
* Cropper.js v1.5.6
* https://fengyuanchen.github.io/cropperjs
*
* Copyright 2015-present Chen Fengyuan
* Released under the MIT license
*
* Date: 2019-10-04T04:33:44.164Z
*/
.cropper-container {
direction: ltr;
font-size: 0;
line-height: 0;
position: relative;
-ms-touch-action: none;
touch-action: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.cropper-container img {
display: block;
height: 100%;
image-orientation: 0deg;
max-height: none !important;
max-width: none !important;
min-height: 0 !important;
min-width: 0 !important;
width: 100%; }
.cropper-wrap-box,
.cropper-canvas,
.cropper-drag-box,
.cropper-crop-box,
.cropper-modal {
bottom: 0;
left: 0;
position: absolute;
right: 0;
top: 0; }
.cropper-wrap-box,
.cropper-canvas {
overflow: hidden; }
.cropper-drag-box {
background-color: #fff;
opacity: 0; }
.cropper-modal {
background-color: #000;
opacity: 0.5; }
.cropper-view-box {
display: block;
height: 100%;
outline: 1px solid #39f;
outline-color: rgba(51, 153, 255, 0.75);
overflow: hidden;
width: 100%; }
.cropper-dashed {
border: 0 dashed #eee;
display: block;
opacity: 0.5;
position: absolute; }
.cropper-dashed.dashed-h {
border-bottom-width: 1px;
border-top-width: 1px;
height: calc(100% / 3);
left: 0;
top: calc(100% / 3);
width: 100%; }
.cropper-dashed.dashed-v {
border-left-width: 1px;
border-right-width: 1px;
height: 100%;
left: calc(100% / 3);
top: 0;
width: calc(100% / 3); }
.cropper-center {
display: block;
height: 0;
left: 50%;
opacity: 0.75;
position: absolute;
top: 50%;
width: 0; }
.cropper-center::before,
.cropper-center::after {
background-color: #eee;
content: ' ';
display: block;
position: absolute; }
.cropper-center::before {
height: 1px;
left: -3px;
top: 0;
width: 7px; }
.cropper-center::after {
height: 7px;
left: 0;
top: -3px;
width: 1px; }
.cropper-face,
.cropper-line,
.cropper-point {
display: block;
height: 100%;
opacity: 0.1;
position: absolute;
width: 100%; }
.cropper-face {
background-color: #fff;
left: 0;
top: 0; }
.cropper-line {
background-color: #39f; }
.cropper-line.line-e {
cursor: ew-resize;
right: -3px;
top: 0;
width: 5px; }
.cropper-line.line-n {
cursor: ns-resize;
height: 5px;
left: 0;
top: -3px; }
.cropper-line.line-w {
cursor: ew-resize;
left: -3px;
top: 0;
width: 5px; }
.cropper-line.line-s {
bottom: -3px;
cursor: ns-resize;
height: 5px;
left: 0; }
.cropper-point {
background-color: #39f;
height: 5px;
opacity: 0.75;
width: 5px; }
.cropper-point.point-e {
cursor: ew-resize;
margin-top: -3px;
right: -3px;
top: 50%; }
.cropper-point.point-n {
cursor: ns-resize;
left: 50%;
margin-left: -3px;
top: -3px; }
.cropper-point.point-w {
cursor: ew-resize;
left: -3px;
margin-top: -3px;
top: 50%; }
.cropper-point.point-s {
bottom: -3px;
cursor: s-resize;
left: 50%;
margin-left: -3px; }
.cropper-point.point-ne {
cursor: nesw-resize;
right: -3px;
top: -3px; }
.cropper-point.point-nw {
cursor: nwse-resize;
left: -3px;
top: -3px; }
.cropper-point.point-sw {
bottom: -3px;
cursor: nesw-resize;
left: -3px; }
.cropper-point.point-se {
bottom: -3px;
cursor: nwse-resize;
height: 20px;
opacity: 1;
right: -3px;
width: 20px; }
@media (min-width: 768px) {
.cropper-point.point-se {
height: 15px;
width: 15px; } }
@media (min-width: 992px) {
.cropper-point.point-se {
height: 10px;
width: 10px; } }
@media (min-width: 1200px) {
.cropper-point.point-se {
height: 5px;
opacity: 0.75;
width: 5px; } }
.cropper-point.point-se::before {
background-color: #39f;
bottom: -50%;
content: ' ';
display: block;
height: 200%;
opacity: 0;
position: absolute;
right: -50%;
width: 200%; }
.cropper-invisible {
opacity: 0; }
.cropper-bg {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC"); }
.cropper-hide {
display: block;
height: 0;
position: absolute;
width: 0; }
.cropper-hidden {
display: none !important; }
.cropper-move {
cursor: move; }
.cropper-crop {
cursor: crosshair; }
.cropper-disabled .cropper-drag-box,
.cropper-disabled .cropper-face,
.cropper-disabled .cropper-line,
.cropper-disabled .cropper-point {
cursor: not-allowed; }
label.btn {
margin-bottom: 0; }
.carbonads {
border-radius: .25rem;
border: 1px solid #ccc;
font-size: .875rem;
overflow: hidden;
padding: 1rem; }
.carbon-wrap {
overflow: hidden; }
.carbon-img {
clear: left;
display: block;
float: left; }
.carbon-text,
.carbon-poweredby {
display: block;
margin-left: 140px; }
.carbon-text,
.carbon-text:hover,
.carbon-text:focus {
color: #fff;
text-decoration: none; }
.carbon-poweredby,
.carbon-poweredby:hover,
.carbon-poweredby:focus {
color: #ddd;
text-decoration: none; }
@media (min-width: 768px) {
.carbonads {
float: right;
margin-bottom: -1rem;
margin-top: -1rem;
max-width: 360px; } }
.img-container,
.img-preview {
background-color: #f7f7f7;
text-align: center;
width: 100%; }
.img-container {
margin-bottom: 1rem;
max-height: 497px;
min-height: 200px; }
@media (min-width: 768px) {
.img-container {
min-height: 497px; } }
.img-container > img {
max-width: 100%; }
.docs-preview {
margin-right: -1rem; }
.img-preview {
float: left;
margin-bottom: .5rem;
margin-right: .5rem;
overflow: hidden; }
.img-preview > img {
max-width: 100%; }
.preview-lg {
height: 9rem;
width: 16rem; }
.preview-md {
height: 4.5rem;
width: 8rem; }
.preview-sm {
height: 2.25rem;
width: 4rem; }
.preview-xs {
height: 1.125rem;
margin-right: 0;
width: 2rem; }
.docs-data > .input-group {
margin-bottom: .5rem; }
.docs-data .input-group-prepend .input-group-text {
min-width: 4rem; }
.docs-data .input-group-append .input-group-text {
min-width: 3rem; }
.docs-buttons > .btn,
.docs-buttons > .btn-group,
.docs-buttons > .form-control {
margin-bottom: .5rem;
margin-right: .25rem; }
.docs-toggles > .btn,
.docs-toggles > .btn-group,
.docs-toggles > .dropdown {
margin-bottom: .5rem; }
.docs-tooltip {
display: block;
margin: -.5rem -.75rem;
padding: .5rem .46rem; }
.docs-tooltip > .icon {
margin: 0 -.25rem;
vertical-align: top; }
@media (max-width: 400px) {
.btn-group-crop {
margin-right: -1rem !important; }
.btn-group-crop > .btn {
padding-left: .5rem;
padding-right: .5rem; }
.btn-group-crop .docs-tooltip {
margin-left: -.5rem;
margin-right: -.5rem;
padding-left: .5rem;
padding-right: .5rem; } }
.docs-options .dropdown-menu {
width: 100%; }
.docs-options .dropdown-menu > li {
font-size: .875rem;
padding: .125rem 1rem; }
.docs-options .dropdown-menu .form-check-label {
display: block; }
.docs-cropped .modal-body {
text-align: center; }
.docs-cropped .modal-body > img,
.docs-cropped .modal-body > canvas {
max-width: 100%; }
/*# sourceMappingURL=cropper.css.map */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,571 @@
/*
* The MIT License
* Copyright (c) 2012 Matias Meno <m@tias.me>
*/
@-webkit-keyframes passing-through {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
transform: translateY(40px); }
30%, 70% {
opacity: 1;
-webkit-transform: translateY(0px);
transform: translateY(0px); }
100% {
opacity: 0;
-webkit-transform: translateY(-40px);
transform: translateY(-40px); } }
@keyframes passing-through {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
transform: translateY(40px); }
30%, 70% {
opacity: 1;
-webkit-transform: translateY(0px);
transform: translateY(0px); }
100% {
opacity: 0;
-webkit-transform: translateY(-40px);
transform: translateY(-40px); } }
@-webkit-keyframes slide-in {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
transform: translateY(40px); }
30% {
opacity: 1;
-webkit-transform: translateY(0px);
transform: translateY(0px); } }
@keyframes slide-in {
0% {
opacity: 0;
-webkit-transform: translateY(40px);
transform: translateY(40px); }
30% {
opacity: 1;
-webkit-transform: translateY(0px);
transform: translateY(0px); } }
@-webkit-keyframes pulse {
0% {
-webkit-transform: scale(1);
transform: scale(1); }
10% {
-webkit-transform: scale(1.1);
transform: scale(1.1); }
20% {
-webkit-transform: scale(1);
transform: scale(1); } }
@keyframes pulse {
0% {
-webkit-transform: scale(1);
transform: scale(1); }
10% {
-webkit-transform: scale(1.1);
transform: scale(1.1); }
20% {
-webkit-transform: scale(1);
transform: scale(1); } }
.dropzone, .dropzone * {
-webkit-box-sizing: border-box;
box-sizing: border-box; }
.dropzone {
min-height: 150px;
border: 2px solid rgba(0, 0, 0, 0.3);
background: white;
padding: 20px 20px; }
.dropzone.dz-clickable {
cursor: pointer; }
.dropzone.dz-clickable * {
cursor: default; }
.dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message * {
cursor: pointer; }
.dropzone.dz-started .dz-message {
display: none; }
.dropzone.dz-drag-hover {
border-style: solid; }
.dropzone.dz-drag-hover .dz-message {
opacity: 0.5; }
.dropzone .dz-message {
text-align: center;
margin: 2em 0; }
.dropzone .dz-message .dz-button {
background: none;
color: inherit;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
outline: inherit; }
.dropzone .dz-preview {
position: relative;
display: inline-block;
vertical-align: top;
margin: 16px;
min-height: 100px; }
.dropzone .dz-preview:hover {
z-index: 1000; }
.dropzone .dz-preview:hover .dz-details {
opacity: 1; }
.dropzone .dz-preview.dz-file-preview .dz-image {
border-radius: 20px;
background: #999;
background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#ddd));
background: linear-gradient(to bottom, #eee, #ddd); }
.dropzone .dz-preview.dz-file-preview .dz-details {
opacity: 1; }
.dropzone .dz-preview.dz-image-preview {
background: white; }
.dropzone .dz-preview.dz-image-preview .dz-details {
-webkit-transition: opacity 0.2s linear;
transition: opacity 0.2s linear; }
.dropzone .dz-preview .dz-remove {
font-size: 14px;
text-align: center;
display: block;
cursor: pointer;
border: none; }
.dropzone .dz-preview .dz-remove:hover {
text-decoration: underline; }
.dropzone .dz-preview:hover .dz-details {
opacity: 1; }
.dropzone .dz-preview .dz-details {
z-index: 20;
position: absolute;
top: 0;
left: 0;
opacity: 0;
font-size: 13px;
min-width: 100%;
max-width: 100%;
padding: 2em 1em;
text-align: center;
color: rgba(0, 0, 0, 0.9);
line-height: 150%; }
.dropzone .dz-preview .dz-details .dz-size {
margin-bottom: 1em;
font-size: 16px; }
.dropzone .dz-preview .dz-details .dz-filename {
white-space: nowrap; }
.dropzone .dz-preview .dz-details .dz-filename:hover span {
border: 1px solid rgba(200, 200, 200, 0.8);
background-color: rgba(255, 255, 255, 0.8); }
.dropzone .dz-preview .dz-details .dz-filename:not(:hover) {
overflow: hidden;
text-overflow: ellipsis; }
.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span {
border: 1px solid transparent; }
.dropzone .dz-preview .dz-details .dz-filename span, .dropzone .dz-preview .dz-details .dz-size span {
background-color: rgba(255, 255, 255, 0.4);
padding: 0 0.4em;
border-radius: 3px; }
.dropzone .dz-preview:hover .dz-image img {
-webkit-transform: scale(1.05, 1.05);
transform: scale(1.05, 1.05);
-webkit-filter: blur(8px);
filter: blur(8px); }
.dropzone .dz-preview .dz-image {
border-radius: 20px;
overflow: hidden;
width: 120px;
height: 120px;
position: relative;
display: block;
z-index: 10; }
.dropzone .dz-preview .dz-image img {
display: block; }
.dropzone .dz-preview.dz-success .dz-success-mark {
-webkit-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); }
.dropzone .dz-preview.dz-error .dz-error-mark {
opacity: 1;
-webkit-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); }
.dropzone .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark {
pointer-events: none;
opacity: 0;
z-index: 500;
position: absolute;
display: block;
top: 50%;
left: 50%;
margin-left: -27px;
margin-top: -27px; }
.dropzone .dz-preview .dz-success-mark svg, .dropzone .dz-preview .dz-error-mark svg {
display: block;
width: 54px;
height: 54px; }
.dropzone .dz-preview.dz-processing .dz-progress {
opacity: 1;
-webkit-transition: all 0.2s linear;
transition: all 0.2s linear; }
.dropzone .dz-preview.dz-complete .dz-progress {
opacity: 0;
-webkit-transition: opacity 0.4s ease-in;
transition: opacity 0.4s ease-in; }
.dropzone .dz-preview:not(.dz-processing) .dz-progress {
-webkit-animation: pulse 6s ease infinite;
animation: pulse 6s ease infinite; }
.dropzone .dz-preview .dz-progress {
opacity: 1;
z-index: 1000;
pointer-events: none;
position: absolute;
height: 16px;
left: 50%;
top: 50%;
margin-top: -8px;
width: 80px;
margin-left: -40px;
background: rgba(255, 255, 255, 0.9);
-webkit-transform: scale(1);
border-radius: 8px;
overflow: hidden; }
.dropzone .dz-preview .dz-progress .dz-upload {
background: #333;
background: -webkit-gradient(linear, left top, left bottom, from(#666), to(#444));
background: linear-gradient(to bottom, #666, #444);
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 0;
-webkit-transition: width 300ms ease-in-out;
transition: width 300ms ease-in-out; }
.dropzone .dz-preview.dz-error .dz-error-message {
display: block; }
.dropzone .dz-preview.dz-error:hover .dz-error-message {
opacity: 1;
pointer-events: auto; }
.dropzone .dz-preview .dz-error-message {
pointer-events: none;
z-index: 1000;
position: absolute;
display: block;
display: none;
opacity: 0;
-webkit-transition: opacity 0.3s ease;
transition: opacity 0.3s ease;
border-radius: 8px;
font-size: 13px;
top: 130px;
left: -10px;
width: 140px;
background: #be2626;
background: -webkit-gradient(linear, left top, left bottom, from(#be2626), to(#a92222));
background: linear-gradient(to bottom, #be2626, #a92222);
padding: 0.5em 1.2em;
color: white; }
.dropzone .dz-preview .dz-error-message:after {
content: '';
position: absolute;
top: -6px;
left: 64px;
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #be2626; }
/* THEME COLORs
========================================================================== */
/* Looks good on chrome default color profile */
/* We will manually convert these primary colors to rgb for the dark mode option of the theme */
/* looks good in sRGB but washed up on chrome default
$color-primary: #826bb0;
$color-success: #31cb55;
$color-info: #5e93ec;
$color-warning: #eec559;
$color-danger: #dc4b92;
$color-fusion: darken(desaturate(adjust-hue($color-primary, 5), 80%), 25%); */
/* Color Polarity
========================================================================== */
/* PAINTBUCKET MIXER
========================================================================== */
/* the grays */
/* the sapphires */
/* the emeralds */
/* the amethyths */
/* the topaz */
/* the rubies */
/* the graphites */
/* Define universal border difition (div outlines, etc)
========================================================================== */
/* MOBILE BREAKPOINT & GUTTERS (contains some bootstrap responsive overrides)
========================================================================== */
/* define when mobile menu activates, here we are declearing (lg) so it targets the one after it */
/* bootstrap reference xs: 0, sm: 544px, md: 768px, lg: 992px, xl: 1200px*/
/* global var used for spacing*/
/* Uniform Padding variable */
/* Heads up! This is a global scoped variable - changing may impact the whole template */
/* BOOTSTRAP OVERRIDES (bootstrap variables)
========================================================================== */
/* usage: theme-colors("primary"); */
/* forms */
/*$input-height: calc(2.25rem + 1px); //I had to add this because the input gruops was having improper height for some reason... */
/* links */
/* checkbox */
/*$custom-file-height-inner: calc(2.25rem - 1px);*/
/* not part of bootstrap variable */
/* custom checkbox */
/* custom range */
/* custom file */
/* badge */
/* cards */
/*border radius*/
/* alert */
/* toast */
/* breadcrumb */
/* input button */
/* nav link */
/* nav, tabs, pills */
/* tables */
/* dropdowns */
/* dropdowns sizes */
/* popovers */
/* tooltips */
/* modal */
/* reference guide
http://www.standardista.com/px-to-rem-conversion-if-root-font-size-is-16px/
8px = 0.5rem
9px = 0.5625rem
10px = 0.625rem
11px = 0.6875rem
12px = 0.75rem
13px = 0.8125rem
14px = 0.875rem
15px = 0.9375rem
16px = 1rem (base)
17px = 1.0625rem
18px = 1.125rem
19px = 1.1875rem
20px = 1.25rem
21px = 1.3125rem
22px = 1.375rem
24px = 1.5rem
25px = 1.5625rem
26px = 1.625rem
28px = 1.75rem
30px = 1.875rem
32px = 2rem
34px = 2.125rem
36px = 2.25rem
38px = 2.375rem
40px = 2.5rem
*/
/* Fonts */
/* carousel */
/* BASE VARS
========================================================================== */
/* font vars below will auto change to rem values using function rem($value)*/
/* 11px */
/* 12px */
/* 12.5px */
/* 14px */
/* 15px */
/* 16px */
/* 28px */
/* Font Family
========================================================================== */
/*hint: you can also try the font called 'Poppins' by replacing the font 'Roboto' */
/* ANIMATIONS
========================================================================== */
/* this addresses all animation related to nav hide to nav minify */
/* Z-INDEX declearation
========================================================================== */
/* we adjust bootstrap z-index to be higher than our higest z-index*/
/* CUSTOM ICON PREFIX
========================================================================== */
/* PRINT CSS (landscape or portrait)
========================================================================== */
/* landscape or portrait */
/* auto, letter */
/* Common Element Variables
========================================================================== */
/* Z-index decleartion "birds eye view"
========================================================================== */
/* Components
========================================================================== */
/* PAGE HEADER STUFF
========================================================================== */
/* colors */
/* height */
/* logo */
/* try not to go beywond the width of $main_nav_width value */
/* you may need to change this depending on your logo design */
/* adjust this as you see fit : left, right, center */
/* icon font size (not button) */
/* search input box */
/* suggestion: #ccced0*/
/* btn */
/* dropdown: app list */
/* badge */
/* COMPONENTS & MODS */
/* NAVIGATION STUFF
Guide:
aside.page-sidebar ($nav-width, $nav-background)
.page-logo
.primary-nav
.info-card
ul.nav-menu
li
a (parent level-0..., $nav-link-color, $nav-link-hover-color, $nav-link-hover-bg-color, $nav-link-hover-left-border-color)
icon
span
collapse-sign
ul.nav-menu-sub-one
li
a ($nav-level-1... $nav-sub-link-height)
span
collapse-sign
ul.nav-menu-sub-two
li
a ($nav-level-2... $nav-sub-link-height)
span
p.nav-title ($nav-title-*...)
========================================================================== */
/* main navigation */
/* left panel */
/* nav footer */
/* nav parent level-0 */
/* nav link level-1 */
/* nav level-1 bg */
/* nav icon sizes */
/* badge default */
/* all child */
/* nav title */
/* nav Minify */
/* when the menu pops on hover */
/* navigation Width */
/* partial visibility of the menu */
/* top navigation */
/* nav Info Card (appears below the logo) */
/* width is auto */
/* nav DL labels for all child */
/* will be pulled to left as a negative value */
/* MISC Settings
========================================================================== */
/* List Table */
/* PAGE SETTINGS
========================================================================== */
/* PAGE BREADCRUMB
========================================================================== */
/* PAGE COMPONENT PANELS
========================================================================== */
/* PAGE COMPONENT PROGRESSBARS
========================================================================== */
/* PAGE COMPONENT MESSENGER
========================================================================== */
/* FOOTER
========================================================================== */
/* GLOBALS
========================================================================== */
/* ACCESSIBILITIES */
/* SHORTCUT BUTTON (appears on bottom right of the page) */
/* GULP WARNINGS */
.dropzone {
border: 2px dashed #dedede;
border-radius: 5px;
background: #f5f5f5;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
padding: 0.5rem; }
.dropzone i {
font-size: 3rem; }
.dropzone .dz-message {
color: rgba(0, 0, 0, 0.54);
font-weight: 500;
font-size: initial;
text-transform: uppercase;
width: 100%; }
.dropzone .dz-preview .dz-image {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
border-radius: 0; }
.dropzone .dz-preview .dz-image img {
border-radius: 4px; }
.dropzone .dz-preview.dz-image-preview {
background: transparent; }
.dropzone .dz-message {
font-weight: normal;
text-transform: none;
color: inherit; }
.dropzone.dz-drag-hover {
border-style: dashed;
border-color: #886ab5; }
.dropzone .dz-preview.dz-file-preview .dz-image {
border-radius: 4px; }
/*# sourceMappingURL=dropzone.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,318 @@
/*! nouislider - 14.5.0 - 5/11/2020 */
/* Functional styling;
* These styles are required for noUiSlider to function.
* You don't need to change these rules to apply your design.
*/
.noUi-target,
.noUi-target * {
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-user-select: none;
-ms-touch-action: none;
touch-action: none;
-ms-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-box-sizing: border-box;
box-sizing: border-box; }
.noUi-target {
position: relative; }
.noUi-base,
.noUi-connects {
width: 100%;
height: 100%;
position: relative;
z-index: 1; }
/* Wrapper for all connect elements.
*/
.noUi-connects {
overflow: hidden;
z-index: 0; }
.noUi-connect,
.noUi-origin {
will-change: transform;
position: absolute;
z-index: 1;
top: 0;
right: 0;
-ms-transform-origin: 0 0;
-webkit-transform-origin: 0 0;
-webkit-transform-style: preserve-3d;
transform-origin: 0 0;
-webkit-transform-style: flat;
transform-style: flat; }
.noUi-connect {
height: 100%;
width: 100%; }
.noUi-origin {
height: 10%;
width: 10%; }
/* Offset direction
*/
.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin {
left: 0;
right: auto; }
/* Give origins 0 height/width so they don't interfere with clicking the
* connect elements.
*/
.noUi-vertical .noUi-origin {
width: 0; }
.noUi-horizontal .noUi-origin {
height: 0; }
.noUi-handle {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
position: absolute; }
.noUi-touch-area {
height: 100%;
width: 100%; }
.noUi-state-tap .noUi-connect,
.noUi-state-tap .noUi-origin {
-webkit-transition: transform 0.3s;
-webkit-transition: -webkit-transform 0.3s;
transition: -webkit-transform 0.3s;
transition: transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s; }
.noUi-state-drag * {
cursor: inherit !important; }
/* Slider size and handle placement;
*/
.noUi-horizontal {
height: 18px; }
.noUi-horizontal .noUi-handle {
width: 34px;
height: 28px;
right: -17px;
top: -6px; }
.noUi-vertical {
width: 18px; }
.noUi-vertical .noUi-handle {
width: 28px;
height: 34px;
right: -6px;
top: -17px; }
.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle {
left: -17px;
right: auto; }
/* Styling;
* Giving the connect element a border radius causes issues with using transform: scale
*/
.noUi-target {
background: #FAFAFA;
border-radius: 4px;
border: 1px solid #D3D3D3;
-webkit-box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB;
box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB; }
.noUi-connects {
border-radius: 3px; }
.noUi-connect {
background: #3FB8AF; }
/* Handles and cursors;
*/
.noUi-draggable {
cursor: ew-resize; }
.noUi-vertical .noUi-draggable {
cursor: ns-resize; }
.noUi-handle {
border: 1px solid #D9D9D9;
border-radius: 3px;
background: #FFF;
cursor: default;
-webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB;
box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; }
.noUi-active {
-webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB;
box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB; }
/* Handle stripes;
*/
.noUi-handle:before,
.noUi-handle:after {
content: "";
display: block;
position: absolute;
height: 14px;
width: 1px;
background: #E8E7E6;
left: 14px;
top: 6px; }
.noUi-handle:after {
left: 17px; }
.noUi-vertical .noUi-handle:before,
.noUi-vertical .noUi-handle:after {
width: 14px;
height: 1px;
left: 6px;
top: 14px; }
.noUi-vertical .noUi-handle:after {
top: 17px; }
/* Disabled state;
*/
[disabled] .noUi-connect {
background: #B8B8B8; }
[disabled].noUi-target,
[disabled].noUi-handle,
[disabled] .noUi-handle {
cursor: not-allowed; }
/* Base;
*
*/
.noUi-pips,
.noUi-pips * {
-webkit-box-sizing: border-box;
box-sizing: border-box; }
.noUi-pips {
position: absolute;
color: #999; }
/* Values;
*
*/
.noUi-value {
position: absolute;
white-space: nowrap;
text-align: center; }
.noUi-value-sub {
color: #ccc;
font-size: 10px; }
/* Markings;
*
*/
.noUi-marker {
position: absolute;
background: #CCC; }
.noUi-marker-sub {
background: #AAA; }
.noUi-marker-large {
background: #AAA; }
/* Horizontal layout;
*
*/
.noUi-pips-horizontal {
padding: 10px 0;
height: 80px;
top: 100%;
left: 0;
width: 100%; }
.noUi-value-horizontal {
-webkit-transform: translate(-50%, 50%);
transform: translate(-50%, 50%); }
.noUi-rtl .noUi-value-horizontal {
-webkit-transform: translate(50%, 50%);
transform: translate(50%, 50%); }
.noUi-marker-horizontal.noUi-marker {
margin-left: -1px;
width: 2px;
height: 5px; }
.noUi-marker-horizontal.noUi-marker-sub {
height: 10px; }
.noUi-marker-horizontal.noUi-marker-large {
height: 15px; }
/* Vertical layout;
*
*/
.noUi-pips-vertical {
padding: 0 10px;
height: 100%;
top: 0;
left: 100%; }
.noUi-value-vertical {
-webkit-transform: translate(0, -50%);
transform: translate(0, -50%);
padding-left: 25px; }
.noUi-rtl .noUi-value-vertical {
-webkit-transform: translate(0, 50%);
transform: translate(0, 50%); }
.noUi-marker-vertical.noUi-marker {
width: 5px;
height: 2px;
margin-top: -1px; }
.noUi-marker-vertical.noUi-marker-sub {
width: 10px; }
.noUi-marker-vertical.noUi-marker-large {
width: 15px; }
.noUi-tooltip {
display: block;
position: absolute;
border: 1px solid #D9D9D9;
border-radius: 3px;
background: #fff;
color: #000;
padding: 5px;
text-align: center;
white-space: nowrap; }
.noUi-horizontal .noUi-tooltip {
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
left: 50%;
bottom: 120%; }
.noUi-vertical .noUi-tooltip {
-webkit-transform: translate(0, -50%);
transform: translate(0, -50%);
top: 50%;
right: 120%; }
.noUi-horizontal .noUi-origin > .noUi-tooltip {
-webkit-transform: translate(50%, 0);
transform: translate(50%, 0);
left: auto;
bottom: 10px; }
.noUi-vertical .noUi-origin > .noUi-tooltip {
-webkit-transform: translate(0, -18px);
transform: translate(0, -18px);
top: auto;
right: 28px; }
/*# sourceMappingURL=nouislider.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,611 @@
/*!
* SmartWizard v4.4.x
* jQuery Wizard Plugin
* http://www.techlaboratory.net/smartwizard
*
* Created by Dipu Raj
* http://dipuraj.me
*
* Licensed under the terms of MIT License
* https://github.com/techlab/SmartWizard/blob/master/LICENSE
*/
/* SmartWizard Basic CSS */
.sw-main {
position: relative;
display: block;
margin: 0;
padding: 0;
border-radius: 0.25rem !important; }
.sw-main .sw-container {
display: block;
margin: 0;
padding: 0;
position: relative; }
.sw-main .step-content {
display: none;
position: relative;
margin: 0; }
.sw-main .sw-toolbar {
margin-left: 0; }
/* SmartWizard Theme: White */
.sw-theme-default {
-webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3); }
.sw-theme-default .sw-container {
min-height: 250px; }
.sw-theme-default .step-content {
padding: 10px;
border: 0px solid #D4D4D4;
background-color: #FFF;
text-align: left; }
.sw-theme-default .sw-toolbar {
background: #f9f9f9;
border-radius: 0 !important;
padding-left: 10px;
padding-right: 10px;
padding: 10px;
margin-bottom: 0 !important; }
.sw-theme-default .sw-toolbar-top {
border-bottom-color: #ddd !important; }
.sw-theme-default .sw-toolbar-bottom {
border-top-color: #ddd !important; }
.sw-theme-default > ul.step-anchor > li {
position: relative;
margin-right: 2px; }
.sw-theme-default > ul.step-anchor > li > a, .sw-theme-default > ul.step-anchor > li > a:hover {
border: none !important;
color: #bbb;
text-decoration: none;
outline-style: none;
background: transparent !important;
border: none !important;
cursor: not-allowed; }
.sw-theme-default > ul.step-anchor > li.clickable > a:hover {
color: #4285F4 !important;
background: transparent !important;
cursor: pointer; }
.sw-theme-default > ul.step-anchor > li > a::after {
content: "";
background: #4285F4;
height: 2px;
position: absolute;
width: 100%;
left: 0px;
bottom: 0px;
-webkit-transition: all 250ms ease 0s;
transition: all 250ms ease 0s;
-webkit-transform: scale(0);
transform: scale(0); }
.sw-theme-default > ul.step-anchor > li.active > a {
border: none !important;
color: #4285F4 !important;
background: transparent !important;
cursor: pointer; }
.sw-theme-default > ul.step-anchor > li.active > a::after {
-webkit-transform: scale(1);
transform: scale(1); }
.sw-theme-default > ul.step-anchor > li.done > a {
border: none !important;
color: #000 !important;
background: transparent !important;
cursor: pointer; }
.sw-theme-default > ul.step-anchor > li.done > a::after {
background: #5cb85c;
-webkit-transform: scale(1);
transform: scale(1); }
.sw-theme-default > ul.step-anchor > li.danger > a {
border: none !important;
color: #d9534f !important;
/* background: #d9534f !important; */
cursor: pointer; }
.sw-theme-default > ul.step-anchor > li.danger > a::after {
background: #d9534f;
border-left-color: #f8d7da;
-webkit-transform: scale(1);
transform: scale(1); }
.sw-theme-default > ul.step-anchor > li.disabled > a, .sw-theme-default > ul.step-anchor > li.disabled > a:hover {
color: #eee !important;
cursor: not-allowed; }
/* Responsive CSS */
@media screen and (max-width: 768px) {
.sw-theme-default > .nav-tabs > li {
float: none !important; } }
/* Common Loader */
.sw-loading::after {
position: absolute;
display: block;
opacity: 1;
content: "";
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba(255, 255, 255, 0.7);
-webkit-transition: all .2s ease;
transition: all .2s ease;
z-index: 2; }
.sw-loading::before {
content: '';
display: inline-block;
position: absolute;
top: 50%;
left: 50%;
z-index: 10;
border: 10px solid #f3f3f3;
border-radius: 50%;
border-top: 10px solid #3498db;
width: 80px;
height: 80px;
margin-top: -40px;
margin-left: -40px;
-webkit-animation: spin 1s linear infinite;
/* Safari */
animation: spin 1s linear infinite; }
/* Safari */
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg); } }
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
/*!
* SmartWizard v4.4.x
* jQuery Wizard Plugin
* http://www.techlaboratory.net/smartwizard
*
* Created by Dipu Raj
* http://dipuraj.me
*
* Licensed under the terms of MIT License
* https://github.com/techlab/SmartWizard/blob/master/LICENSE
*/
/* SmartWizard Theme: Arrows */
.sw-theme-arrows {
border-radius: 5px;
border: 1px solid #ddd; }
.sw-theme-arrows > .sw-container {
min-height: 200px; }
.sw-theme-arrows .step-content {
padding: 0 10px;
border: 0px solid #D4D4D4;
background-color: #FFF;
text-align: left; }
.sw-theme-arrows .sw-toolbar {
padding: 10px;
margin-bottom: 0 !important; }
.sw-theme-arrows > ul.step-anchor {
border: 0;
border-bottom: 1px solid #ddd;
padding: 0px;
background: #f5f5f5;
border-radius: 0;
border-top-right-radius: 5px;
list-style: none;
overflow: hidden; }
.sw-theme-arrows > ul.step-anchor li + li:before {
padding: 0; }
.sw-theme-arrows > ul.step-anchor > li > a, .sw-theme-arrows > ul.step-anchor > li > a:hover {
color: #bbb;
text-decoration: none;
padding: 10px 0 10px 45px;
position: relative;
display: block;
border: 0 !important;
border-radius: 0;
outline-style: none;
background: #f5f5f5; }
.sw-theme-arrows > ul.step-anchor > li > a:after {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 30px solid #f5f5f5;
position: absolute;
top: 50%;
margin-top: -50px;
left: 100%;
z-index: 2; }
.sw-theme-arrows > ul.step-anchor > li > a:before {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
/* Go big on the size, and let overflow hide */
border-bottom: 50px solid transparent;
border-left: 30px solid #ddd;
position: absolute;
top: 50%;
margin-top: -50px;
margin-left: 1px;
left: 100%;
z-index: 1; }
.sw-theme-arrows > ul.step-anchor > li:first-child > a {
padding-left: 15px; }
.sw-theme-arrows > ul.step-anchor > li > a:hover {
color: #bbb;
text-decoration: none;
outline-style: none;
background: #f5f5f5;
border-color: #f5f5f5; }
.sw-theme-arrows > ul.step-anchor > li > a:hover:after {
border-left-color: #f5f5f5; }
.sw-theme-arrows > ul.step-anchor > li.clickable > a:hover {
color: #4285F4 !important;
background: #46b8da !important; }
.sw-theme-arrows > ul.step-anchor > li.active > a {
border-color: #5cb85c !important;
color: #fff !important;
background: #5cb85c !important; }
.sw-theme-arrows > ul.step-anchor > li.active > a:after {
border-left: 30px solid #5cb85c !important; }
.sw-theme-arrows > ul.step-anchor > li.done > a {
border-color: #b1dfbb !important;
/* #5cb85c */
color: #fff !important;
background: #b1dfbb !important; }
.sw-theme-arrows > ul.step-anchor > li.done > a:after {
border-left: 30px solid #b1dfbb;
/* c3e6cb */ }
.sw-theme-arrows > ul.step-anchor > li.danger > a {
border-color: #d9534f !important;
color: #fff !important;
background: #d9534f !important; }
.sw-theme-arrows > ul.step-anchor > li.danger > a:after {
border-left: 30px solid #d9534f !important; }
.sw-theme-arrows > ul.step-anchor > li.disabled > a, .sw-theme-arrows > ul.step-anchor > li.disabled > a:hover {
color: #eee !important; }
/* Responsive CSS */
@media screen and (max-width: 768px) {
.sw-theme-arrows > ul.step-anchor {
border: 0;
background: #ddd !important; }
.sw-theme-arrows > .nav-tabs > li {
float: none !important;
margin-bottom: 0; }
.sw-theme-arrows > ul.step-anchor > li > a, .sw-theme-arrows > ul.step-anchor > li > a:hover {
padding-left: 15px;
margin-right: 0;
margin-bottom: 1px; }
.sw-theme-arrows > ul.step-anchor > li > a:after, .sw-theme-arrows > ul.step-anchor > li > a:before {
display: none; } }
/* Loader Custom Style */
.sw-theme-arrows::before {
border: 10px solid #f3f3f3;
border-top: 10px solid #5cb85c; }
/*!
* SmartWizard v4.4.x
* jQuery Wizard Plugin
* http://www.techlaboratory.net/smartwizard
*
* Created by Dipu Raj
* http://dipuraj.me
*
* Licensed under the terms of MIT License
* https://github.com/techlab/SmartWizard/blob/master/LICENSE
*/
/* SmartWizard Theme: Circles */
.sw-theme-circles .sw-container {
min-height: 300px; }
.sw-theme-circles .step-content {
padding: 10px 0;
background-color: #FFF;
text-align: left; }
.sw-theme-circles .sw-toolbar {
background: #fff;
padding-left: 10px;
padding-right: 10px;
margin-bottom: 0 !important; }
.sw-theme-circles .sw-toolbar-bottom {
border-top-color: #ddd !important;
border-bottom-color: #ddd !important; }
.sw-theme-circles > ul.step-anchor {
position: relative;
background: #fff;
border: none;
list-style: none;
margin-bottom: 40px; }
.sw-theme-circles > ul.step-anchor:before {
content: " ";
position: absolute;
top: 50%;
bottom: 0;
width: 100%;
height: 5px;
background-color: #f5f5f5;
border-radius: 3px;
z-index: 0; }
.sw-theme-circles > ul.step-anchor > li {
border: none;
margin-left: 40px;
z-index: 98; }
.sw-theme-circles > ul.step-anchor > li > a {
border: 2px solid #f5f5f5;
background: #f5f5f5;
width: 75px;
height: 75px;
text-align: center;
padding: 25px 0;
border-radius: 50%;
-webkit-box-shadow: inset 0px 0px 0px 3px #fff !important;
box-shadow: inset 0px 0px 0px 3px #fff !important;
text-decoration: none;
outline-style: none;
z-index: 99;
color: #bbb;
background: #f5f5f5;
line-height: 1; }
.sw-theme-circles > ul.step-anchor > li > a:hover {
color: #bbb;
background: #f5f5f5;
border-width: 2px; }
.sw-theme-circles > ul.step-anchor > li > a > small {
position: relative;
bottom: -40px;
color: #ccc; }
.sw-theme-circles > ul.step-anchor > li.clickable > a:hover {
color: #4285F4 !important; }
.sw-theme-circles > ul.step-anchor > li.active > a {
border-color: #5bc0de;
color: #fff;
background: #5bc0de; }
.sw-theme-circles > ul.step-anchor > li.active > a > small {
color: #5bc0de; }
.sw-theme-circles > ul.step-anchor > li.done > a {
border-color: #5cb85c;
color: #fff;
background: #5cb85c; }
.sw-theme-circles > ul.step-anchor > li.done > a > small {
color: #5cb85c; }
.sw-theme-circles > ul.step-anchor > li.danger > a {
border-color: #d9534f;
color: #d9534f;
background: #fff; }
.sw-theme-circles > ul.step-anchor > li.danger > a > small {
color: #d9534f; }
.sw-theme-circles > ul.step-anchor > li.disabled > a, .sw-theme-circles > ul.step-anchor > li.disabled > a:hover {
color: #eee !important; }
/*!
* SmartWizard v4.4.x
* jQuery Wizard Plugin
* http://www.techlaboratory.net/smartwizard
*
* Created by Dipu Raj
* http://dipuraj.me
*
* Licensed under the terms of MIT License
* https://github.com/techlab/SmartWizard/blob/master/LICENSE
*/
/* SmartWizard Theme: Dots */
.sw-theme-dots .sw-container {
min-height: 300px; }
.sw-theme-dots .step-content {
padding: 10px 0;
border: none;
background-color: #FFF;
text-align: left; }
.sw-theme-dots .sw-toolbar {
background: #fff;
border-radius: 0 !important;
padding-left: 10px;
padding-right: 10px;
margin-bottom: 0 !important; }
.sw-theme-dots .sw-toolbar-top {
border-bottom-color: #ddd !important; }
.sw-theme-dots .sw-toolbar-bottom {
border-top-color: #ddd !important;
border-bottom-color: #ddd !important; }
.sw-theme-dots > ul.step-anchor {
position: relative;
background: #fff;
border: 0px solid #ccc !important;
list-style: none; }
.sw-theme-dots > ul.step-anchor:before {
content: " ";
position: absolute;
top: 70px;
bottom: 0;
width: 100%;
height: 5px;
background-color: #f5f5f5;
border-radius: 3px;
z-order: 0;
z-index: 95; }
.sw-theme-dots > ul.step-anchor > li {
border: none; }
/* Anchors styles */
.sw-theme-dots > ul.step-anchor > li > a {
position: relative;
text-align: center;
font-weight: bold;
background: transparent;
border: none;
color: #ccc;
text-decoration: none;
outline-style: none;
z-index: 96;
display: block; }
.sw-theme-dots > ul.step-anchor > li > a:before {
content: ' ';
position: absolute;
bottom: 2px;
left: 40%;
margin-top: 10px;
display: block;
border-radius: 50%;
color: #428bca;
background: #f5f5f5;
border: none;
width: 30px;
height: 30px;
text-decoration: none;
z-index: 98; }
.sw-theme-dots > ul.step-anchor > li > a:after {
content: ' ';
position: relative;
left: 43%;
bottom: 2px;
margin-top: 10px;
display: block;
width: 15px;
height: 15px;
background: #f5f5f5;
border-radius: 50%;
z-index: 99; }
.sw-theme-dots > ul.step-anchor > li > a:hover {
color: #ccc;
background: transparent; }
.sw-theme-dots > ul.step-anchor > li > a:focus {
color: #ccc;
border: none; }
.sw-theme-dots > ul.step-anchor > li.clickable > a:hover {
color: #999; }
/* Active anchors */
.sw-theme-dots > ul.step-anchor > li.active > a {
color: #5bc0de; }
.sw-theme-dots > ul.step-anchor > li.active > a:hover {
border: none; }
.sw-theme-dots > ul.step-anchor > li.active > a:after {
background: #5bc0de; }
/* Done anchors */
.sw-theme-dots > ul.step-anchor > li.done > a {
color: #5cb85c; }
.sw-theme-dots > ul.step-anchor > li.done > a:after {
background: #5cb85c; }
/* Danger anchors */
.sw-theme-dots > ul.step-anchor > li.danger > a {
color: #d9534f; }
.sw-theme-dots > ul.step-anchor > li.danger > a:after {
background: #d9534f; }
.sw-theme-dots > ul.step-anchor > li.disabled > a, .sw-theme-dots > ul.step-anchor > li.disabled > a:hover {
color: #eee !important; }
.sw-theme-dots > ul.step-anchor > li.disabled > a:after {
background: #eee; }
/* Responsive CSS */
@media screen and (max-width: 768px) {
.sw-theme-dots > ul.step-anchor:before {
top: 0;
bottom: 0;
left: 10px;
width: 5px;
height: 100%;
background-color: #f5f5f5;
display: block;
margin-right: 10px; }
.sw-theme-dots > ul.step-anchor > li {
margin-left: 20px;
display: block;
clear: both; }
.sw-theme-dots > ul.step-anchor > li > a {
text-align: left;
margin-left: 0;
display: block; }
.sw-theme-dots > ul.step-anchor > li > a:before {
top: 5px;
left: -23px;
margin-right: 10px;
display: block; }
.sw-theme-dots > ul.step-anchor > li > a:after {
top: -38px;
left: -31px;
margin-right: 10px;
display: block; } }
/*# sourceMappingURL=smartwizard.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,453 @@
/* #BOOTSTRAP AND MIXINS - Base Unmodified Bootstrap file with theme mixins
========================================================================== */
/*---------------------------------------------------
SASS ELements (based on LESS Elements 0.9 http://lesselements.com)
-------------------------------- -------------------
LESS ELEMENTS made by Dmitry Fadeyev (http://fadeyev.net)
SASS port by Samuel Beek (http://samuelbeek.com)
---------------------------------------------------*/
/*------------------------
Usage
$color-white: hexToRGBString(#fff) => "255,255,255"
$color-white: hexToRGBString(rgb(255,255,255)) => "255,255,255"
$color-white: hexToRGBString(rgba(#fff,1)) => "255,255,255"
------------------------*/
/*------------------------
Usage
h1 {
font-size: rem(32);
}
OR:
h1 {
font-size: rem(32px);
}
------------------------*/
/*------------------------
FADE IN
e.g. @include fadeIn( 2s );
------------------------*/
/*------------------------
mixin that calculates if text needs to be light or dark
depending on the background color passed.
From this W3C document: http://www.webmasterworld.com/r.cgi?f=88&d=9769&url=http://www.w3.org/TR/AERT#color-contrast
usage:
@include text-contrast($bgcolor)
Color brightness is determined by the following formula:
((Red value X 299) + (Green value X 587) + (Blue value X 114)) / 1000
------------------------*/
/*------------------------
color factory
eg: contrast-ink($contrastvalue)
------------------------*/
/*------------------------
color factory
eg: @include paint($blue-grey-50, bg-blue-grey-50);
------------------------*/
/* backface visibility */
/* generate theme button */
/* #BASE - Base Variable file along with font library, and colors.
========================================================================== */
/* THEME COLORs
========================================================================== */
/* Looks good on chrome default color profile */
/* We will manually convert these primary colors to rgb for the dark mode option of the theme */
/* looks good in sRGB but washed up on chrome default
$color-primary: #826bb0;
$color-success: #31cb55;
$color-info: #5e93ec;
$color-warning: #eec559;
$color-danger: #dc4b92;
$color-fusion: darken(desaturate(adjust-hue($color-primary, 5), 80%), 25%); */
/* Color Polarity
========================================================================== */
/* PAINTBUCKET MIXER
========================================================================== */
/* the grays */
/* the sapphires */
/* the emeralds */
/* the amethyths */
/* the topaz */
/* the rubies */
/* the graphites */
/* Define universal border difition (div outlines, etc)
========================================================================== */
/* MOBILE BREAKPOINT & GUTTERS (contains some bootstrap responsive overrides)
========================================================================== */
/* define when mobile menu activates, here we are declearing (lg) so it targets the one after it */
/* bootstrap reference xs: 0, sm: 544px, md: 768px, lg: 992px, xl: 1200px*/
/* global var used for spacing*/
/* Uniform Padding variable */
/* Heads up! This is a global scoped variable - changing may impact the whole template */
/* BOOTSTRAP OVERRIDES (bootstrap variables)
========================================================================== */
/* usage: theme-colors("primary"); */
/* forms */
/*$input-height: calc(2.25rem + 1px); //I had to add this because the input gruops was having improper height for some reason... */
/* links */
/* checkbox */
/*$custom-file-height-inner: calc(2.25rem - 1px);*/
/* not part of bootstrap variable */
/* custom checkbox */
/* custom range */
/* custom file */
/* badge */
/* cards */
/*border radius*/
/* alert */
/* toast */
/* breadcrumb */
/* input button */
/* nav link */
/* nav, tabs, pills */
/* tables */
/* dropdowns */
/* dropdowns sizes */
/* popovers */
/* tooltips */
/* modal */
/* reference guide
http://www.standardista.com/px-to-rem-conversion-if-root-font-size-is-16px/
8px = 0.5rem
9px = 0.5625rem
10px = 0.625rem
11px = 0.6875rem
12px = 0.75rem
13px = 0.8125rem
14px = 0.875rem
15px = 0.9375rem
16px = 1rem (base)
17px = 1.0625rem
18px = 1.125rem
19px = 1.1875rem
20px = 1.25rem
21px = 1.3125rem
22px = 1.375rem
24px = 1.5rem
25px = 1.5625rem
26px = 1.625rem
28px = 1.75rem
30px = 1.875rem
32px = 2rem
34px = 2.125rem
36px = 2.25rem
38px = 2.375rem
40px = 2.5rem
*/
/* Fonts */
/* carousel */
/* BASE VARS
========================================================================== */
/* font vars below will auto change to rem values using function rem($value)*/
/* 11px */
/* 12px */
/* 12.5px */
/* 14px */
/* 15px */
/* 16px */
/* 28px */
/* Font Family
========================================================================== */
/*hint: you can also try the font called 'Poppins' by replacing the font 'Roboto' */
/* ANIMATIONS
========================================================================== */
/* this addresses all animation related to nav hide to nav minify */
/* Z-INDEX declearation
========================================================================== */
/* we adjust bootstrap z-index to be higher than our higest z-index*/
/* CUSTOM ICON PREFIX
========================================================================== */
/* PRINT CSS (landscape or portrait)
========================================================================== */
/* landscape or portrait */
/* auto, letter */
/* Common Element Variables
========================================================================== */
/* Z-index decleartion "birds eye view"
========================================================================== */
/* Components
========================================================================== */
/* PAGE HEADER STUFF
========================================================================== */
/* colors */
/* height */
/* logo */
/* try not to go beywond the width of $main_nav_width value */
/* you may need to change this depending on your logo design */
/* adjust this as you see fit : left, right, center */
/* icon font size (not button) */
/* search input box */
/* suggestion: #ccced0*/
/* btn */
/* dropdown: app list */
/* badge */
/* COMPONENTS & MODS */
/* NAVIGATION STUFF
Guide:
aside.page-sidebar ($nav-width, $nav-background)
.page-logo
.primary-nav
.info-card
ul.nav-menu
li
a (parent level-0..., $nav-link-color, $nav-link-hover-color, $nav-link-hover-bg-color, $nav-link-hover-left-border-color)
icon
span
collapse-sign
ul.nav-menu-sub-one
li
a ($nav-level-1... $nav-sub-link-height)
span
collapse-sign
ul.nav-menu-sub-two
li
a ($nav-level-2... $nav-sub-link-height)
span
p.nav-title ($nav-title-*...)
========================================================================== */
/* main navigation */
/* left panel */
/* nav footer */
/* nav parent level-0 */
/* nav link level-1 */
/* nav level-1 bg */
/* nav icon sizes */
/* badge default */
/* all child */
/* nav title */
/* nav Minify */
/* when the menu pops on hover */
/* navigation Width */
/* partial visibility of the menu */
/* top navigation */
/* nav Info Card (appears below the logo) */
/* width is auto */
/* nav DL labels for all child */
/* will be pulled to left as a negative value */
/* MISC Settings
========================================================================== */
/* List Table */
/* PAGE SETTINGS
========================================================================== */
/* PAGE BREADCRUMB
========================================================================== */
/* PAGE COMPONENT PANELS
========================================================================== */
/* PAGE COMPONENT PROGRESSBARS
========================================================================== */
/* PAGE COMPONENT MESSENGER
========================================================================== */
/* FOOTER
========================================================================== */
/* GLOBALS
========================================================================== */
/* ACCESSIBILITIES */
/* SHORTCUT BUTTON (appears on bottom right of the page) */
/* GULP WARNINGS */
@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900");
body {
font-family: "Roboto", "Helvetica Neue", Helvetica, Arial;
font-size: 0.8125rem;
letter-spacing: 0.1px; }
.page-content {
color: #666666; }
h1, h2, h3, h4, h5, h6 {
line-height: 1.3;
font-weight: 400; }
strong {
font-weight: 500; }
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.h1 small,
.h2 small,
.h3 small,
.h4 small,
.h5 small,
.h6 small {
font-weight: 300;
display: block;
font-size: 0.9375rem;
line-height: 1.5;
margin: 2px 0 1.5rem; }
h2 small,
h3 small,
.h2 small,
.h3 small {
font-size: 0.9375rem; }
h4 small,
.h4 small {
font-size: 0.875rem; }
h5 small,
h6 small,
.h5 small,
.h6 small {
font-size: 0.8125rem; }
/* contrast text */
.text-contrast {
color: #333333; }
/* text-gradient */
.text-gradient {
background: -webkit-gradient(linear, left top, left bottom, color-stop(25%, #6e4e9e), color-stop(50%, #62468d), color-stop(75%, #0c7cd5), to(#0960a5));
background: linear-gradient(180deg, #6e4e9e 25%, #62468d 50%, #0c7cd5 75%, #0960a5 100%);
color: #886ab5;
background-clip: text;
text-fill-color: transparent;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: none; }
/* looking for font size? Check _helpers.scss */
/* PLACEHOLDER
=============================================
EXAMPLE:
%bg-image {
width: 100%;
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
}
.image-one {
@extend %bg-image;
background-image:url(/img/image-one.jpg");
}
RESULT:
.image-one, .image-two {
width: 100%;
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
}
*/
/*
%shadow-hover {
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 0 2px rgba(0,0,0,0.24);
transition: all 0.2s ease-in-out;
&:hover {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 -1px 6px rgba(0,0,0,0.23);
}
}
*/
/*%fixed-header-shadow {
@include box-shadow(0 2px 2px -1px rgba(0,0,0,.1));
}*/
/* %selected-dot {
&:before {
content: " ";
display: block;
border-radius: 50%;
background: inherit;
background-image: none;
border: 2px solid rgba(0,0,0,0.2);
position: absolute;
top: 15px;
left: 15px;
height: 20px;
width: 20px;
}
&:after {
content: " ";
height: inherit;
width: inherit;
border: 5px solid rgba(0,0,0,0.1);
position: absolute;
left: 0;
top: 0;
border-radius: 50%;
}
}*/
/* patterns */
ul.json-dict, ol.json-array {
list-style-type: none;
margin: 0 0 0 1px;
border-left: 1px dotted #ccc;
padding-left: 2em;
font-size: 0.875rem !important; }
ul.json-dict li:hover > .json-string, ol.json-array li:hover > .json-string {
color: #fd3995;
font-weight: bold; }
.json-tree > .json-toggle:before {
display: none; }
.json-string {
color: #179c8e; }
.json-literal {
color: #1a01cc;
font-weight: bold; }
a.json-toggle {
position: relative;
color: #886ab5;
text-decoration: none;
padding: 0.25rem 0;
display: inline-block;
font-weight: bold; }
a.json-toggle:focus {
outline: 0; }
a.json-toggle:before {
font-family: 'Font Awesome 5 Pro';
font-weight: 900;
margin-right: 0.25rem;
color: #ffc241;
content: "\f07c"; }
a.json-toggle.collapsed:before {
font-family: 'Font Awesome 5 Pro';
content: "\f07b";
color: #1dc9b7; }
a.json-placeholder {
color: #aaa;
padding: 0 1em;
text-decoration: none; }
a.json-placeholder:hover {
color: #179c8e;
font-weight: bold; }
/*.pick-path {
color: lightgray;
cursor: pointer;
margin-left: 3px;
display:none;
&:hover {
color: darkgray;
}
}*/
/*# sourceMappingURL=json-path-picker.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,473 @@
@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900");
.jqvmap-label {
position: absolute;
display: none;
border-radius: 3px;
background: #292929;
color: white;
font-family: sans-serif, Verdana;
font-size: smaller;
padding: 3px;
pointer-events: none; }
.jqvmap-pin {
pointer-events: none; }
.jqvmap-zoomin, .jqvmap-zoomout {
position: absolute;
left: 10px;
border-radius: 3px;
background: #000000;
padding: 3px;
color: white;
width: 10px;
height: 10px;
cursor: pointer;
line-height: 10px;
text-align: center; }
.jqvmap-zoomin {
top: 10px; }
.jqvmap-zoomout {
top: 30px; }
.jqvmap-region {
cursor: pointer; }
.jqvmap-ajax_response {
width: 100%;
height: 500px; }
/* #BOOTSTRAP AND MIXINS - Base Unmodified Bootstrap file with theme mixins
========================================================================== */
/*---------------------------------------------------
SASS ELements (based on LESS Elements 0.9 http://lesselements.com)
-------------------------------- -------------------
LESS ELEMENTS made by Dmitry Fadeyev (http://fadeyev.net)
SASS port by Samuel Beek (http://samuelbeek.com)
---------------------------------------------------*/
/*------------------------
Usage
$color-white: hexToRGBString(#fff) => "255,255,255"
$color-white: hexToRGBString(rgb(255,255,255)) => "255,255,255"
$color-white: hexToRGBString(rgba(#fff,1)) => "255,255,255"
------------------------*/
/*------------------------
Usage
h1 {
font-size: rem(32);
}
OR:
h1 {
font-size: rem(32px);
}
------------------------*/
/*------------------------
FADE IN
e.g. @include fadeIn( 2s );
------------------------*/
/*------------------------
mixin that calculates if text needs to be light or dark
depending on the background color passed.
From this W3C document: http://www.webmasterworld.com/r.cgi?f=88&d=9769&url=http://www.w3.org/TR/AERT#color-contrast
usage:
@include text-contrast($bgcolor)
Color brightness is determined by the following formula:
((Red value X 299) + (Green value X 587) + (Blue value X 114)) / 1000
------------------------*/
/*------------------------
color factory
eg: contrast-ink($contrastvalue)
------------------------*/
/*------------------------
color factory
eg: @include paint($blue-grey-50, bg-blue-grey-50);
------------------------*/
/* backface visibility */
/* generate theme button */
/* #BASE - Base Variable file along with font library, and colors.
========================================================================== */
/* THEME COLORs
========================================================================== */
/* Looks good on chrome default color profile */
/* We will manually convert these primary colors to rgb for the dark mode option of the theme */
/* looks good in sRGB but washed up on chrome default
$color-primary: #826bb0;
$color-success: #31cb55;
$color-info: #5e93ec;
$color-warning: #eec559;
$color-danger: #dc4b92;
$color-fusion: darken(desaturate(adjust-hue($color-primary, 5), 80%), 25%); */
/* Color Polarity
========================================================================== */
/* PAINTBUCKET MIXER
========================================================================== */
/* the grays */
/* the sapphires */
/* the emeralds */
/* the amethyths */
/* the topaz */
/* the rubies */
/* the graphites */
/* Define universal border difition (div outlines, etc)
========================================================================== */
/* MOBILE BREAKPOINT & GUTTERS (contains some bootstrap responsive overrides)
========================================================================== */
/* define when mobile menu activates, here we are declearing (lg) so it targets the one after it */
/* bootstrap reference xs: 0, sm: 544px, md: 768px, lg: 992px, xl: 1200px*/
/* global var used for spacing*/
/* Uniform Padding variable */
/* Heads up! This is a global scoped variable - changing may impact the whole template */
/* BOOTSTRAP OVERRIDES (bootstrap variables)
========================================================================== */
/* usage: theme-colors("primary"); */
/* forms */
/*$input-height: calc(2.25rem + 1px); //I had to add this because the input gruops was having improper height for some reason... */
/* links */
/* checkbox */
/*$custom-file-height-inner: calc(2.25rem - 1px);*/
/* not part of bootstrap variable */
/* custom checkbox */
/* custom range */
/* custom file */
/* badge */
/* cards */
/*border radius*/
/* alert */
/* toast */
/* breadcrumb */
/* input button */
/* nav link */
/* nav, tabs, pills */
/* tables */
/* dropdowns */
/* dropdowns sizes */
/* popovers */
/* tooltips */
/* modal */
/* reference guide
http://www.standardista.com/px-to-rem-conversion-if-root-font-size-is-16px/
8px = 0.5rem
9px = 0.5625rem
10px = 0.625rem
11px = 0.6875rem
12px = 0.75rem
13px = 0.8125rem
14px = 0.875rem
15px = 0.9375rem
16px = 1rem (base)
17px = 1.0625rem
18px = 1.125rem
19px = 1.1875rem
20px = 1.25rem
21px = 1.3125rem
22px = 1.375rem
24px = 1.5rem
25px = 1.5625rem
26px = 1.625rem
28px = 1.75rem
30px = 1.875rem
32px = 2rem
34px = 2.125rem
36px = 2.25rem
38px = 2.375rem
40px = 2.5rem
*/
/* Fonts */
/* carousel */
/* BASE VARS
========================================================================== */
/* font vars below will auto change to rem values using function rem($value)*/
/* 11px */
/* 12px */
/* 12.5px */
/* 14px */
/* 15px */
/* 16px */
/* 28px */
/* Font Family
========================================================================== */
/*hint: you can also try the font called 'Poppins' by replacing the font 'Roboto' */
/* ANIMATIONS
========================================================================== */
/* this addresses all animation related to nav hide to nav minify */
/* Z-INDEX declearation
========================================================================== */
/* we adjust bootstrap z-index to be higher than our higest z-index*/
/* CUSTOM ICON PREFIX
========================================================================== */
/* PRINT CSS (landscape or portrait)
========================================================================== */
/* landscape or portrait */
/* auto, letter */
/* Common Element Variables
========================================================================== */
/* Z-index decleartion "birds eye view"
========================================================================== */
/* Components
========================================================================== */
/* PAGE HEADER STUFF
========================================================================== */
/* colors */
/* height */
/* logo */
/* try not to go beywond the width of $main_nav_width value */
/* you may need to change this depending on your logo design */
/* adjust this as you see fit : left, right, center */
/* icon font size (not button) */
/* search input box */
/* suggestion: #ccced0*/
/* btn */
/* dropdown: app list */
/* badge */
/* COMPONENTS & MODS */
/* NAVIGATION STUFF
Guide:
aside.page-sidebar ($nav-width, $nav-background)
.page-logo
.primary-nav
.info-card
ul.nav-menu
li
a (parent level-0..., $nav-link-color, $nav-link-hover-color, $nav-link-hover-bg-color, $nav-link-hover-left-border-color)
icon
span
collapse-sign
ul.nav-menu-sub-one
li
a ($nav-level-1... $nav-sub-link-height)
span
collapse-sign
ul.nav-menu-sub-two
li
a ($nav-level-2... $nav-sub-link-height)
span
p.nav-title ($nav-title-*...)
========================================================================== */
/* main navigation */
/* left panel */
/* nav footer */
/* nav parent level-0 */
/* nav link level-1 */
/* nav level-1 bg */
/* nav icon sizes */
/* badge default */
/* all child */
/* nav title */
/* nav Minify */
/* when the menu pops on hover */
/* navigation Width */
/* partial visibility of the menu */
/* top navigation */
/* nav Info Card (appears below the logo) */
/* width is auto */
/* nav DL labels for all child */
/* will be pulled to left as a negative value */
/* MISC Settings
========================================================================== */
/* List Table */
/* PAGE SETTINGS
========================================================================== */
/* PAGE BREADCRUMB
========================================================================== */
/* PAGE COMPONENT PANELS
========================================================================== */
/* PAGE COMPONENT PROGRESSBARS
========================================================================== */
/* PAGE COMPONENT MESSENGER
========================================================================== */
/* FOOTER
========================================================================== */
/* GLOBALS
========================================================================== */
/* ACCESSIBILITIES */
/* SHORTCUT BUTTON (appears on bottom right of the page) */
/* GULP WARNINGS */
body {
font-family: "Roboto", "Helvetica Neue", Helvetica, Arial;
font-size: 0.8125rem;
letter-spacing: 0.1px; }
.page-content {
color: #666666; }
h1, h2, h3, h4, h5, h6 {
line-height: 1.3;
font-weight: 400; }
strong {
font-weight: 500; }
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.h1 small,
.h2 small,
.h3 small,
.h4 small,
.h5 small,
.h6 small {
font-weight: 300;
display: block;
font-size: 0.9375rem;
line-height: 1.5;
margin: 2px 0 1.5rem; }
h2 small,
h3 small,
.h2 small,
.h3 small {
font-size: 0.9375rem; }
h4 small,
.h4 small {
font-size: 0.875rem; }
h5 small,
h6 small,
.h5 small,
.h6 small {
font-size: 0.8125rem; }
/* contrast text */
.text-contrast {
color: #333333; }
/* text-gradient */
.text-gradient {
background: -webkit-gradient(linear, left top, left bottom, color-stop(25%, #6e4e9e), color-stop(50%, #62468d), color-stop(75%, #0c7cd5), to(#0960a5));
background: linear-gradient(180deg, #6e4e9e 25%, #62468d 50%, #0c7cd5 75%, #0960a5 100%);
color: #886ab5;
background-clip: text;
text-fill-color: transparent;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: none; }
/* looking for font size? Check _helpers.scss */
/* PLACEHOLDER
=============================================
EXAMPLE:
%bg-image {
width: 100%;
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
}
.image-one {
@extend %bg-image;
background-image:url(/img/image-one.jpg");
}
RESULT:
.image-one, .image-two {
width: 100%;
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
}
*/
/*
%shadow-hover {
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 0 2px rgba(0,0,0,0.24);
transition: all 0.2s ease-in-out;
&:hover {
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 -1px 6px rgba(0,0,0,0.23);
}
}
*/
/*%fixed-header-shadow {
@include box-shadow(0 2px 2px -1px rgba(0,0,0,.1));
}*/
/* %selected-dot {
&:before {
content: " ";
display: block;
border-radius: 50%;
background: inherit;
background-image: none;
border: 2px solid rgba(0,0,0,0.2);
position: absolute;
top: 15px;
left: 15px;
height: 20px;
width: 20px;
}
&:after {
content: " ";
height: inherit;
width: inherit;
border: 5px solid rgba(0,0,0,0.1);
position: absolute;
left: 0;
top: 0;
border-radius: 50%;
}
}*/
/* patterns */
.jqvmap-zoomin, .jqvmap-zoomout {
width: 1.6rem;
height: 1.6rem;
text-align: center;
font-size: 1.2rem;
font-weight: bold;
border-radius: 3px;
background-image: -webkit-gradient(linear, left bottom, left top, from(#f5f5f5), to(#f1f1f1));
background-image: linear-gradient(to top, #f5f5f5, #f1f1f1);
color: #444;
border: 1px solid rgba(0, 0, 0, 0.1);
-webkit-box-shadow: none;
box-shadow: none;
left: 0;
top: 0;
color: #333;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center; }
.jqvmap-zoomout {
top: 1rem; }
.p-0 .jqvmap-zoomin,
.p-0 .jqvmap-zoomout {
left: 1rem;
top: 1rem; }
.p-0 .jqvmap-zoomout {
top: 3rem; }
.jqvmap-bg-ocean {
background-color: #eafeff; }
/*# sourceMappingURL=jqvmap.bundle.css.map */

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More