暂时注释实体控制器的高级功能,仅保留添删改查
This commit is contained in:
parent
b63c8d9d37
commit
ad674ce9e4
|
@ -1,33 +0,0 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace NewLife.Cube2.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("[controller]")]
|
||||
public class WeatherForecastController : ControllerBase
|
||||
{
|
||||
private static readonly string[] Summaries = new[]
|
||||
{
|
||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||
};
|
||||
|
||||
private readonly ILogger<WeatherForecastController> _logger;
|
||||
|
||||
public WeatherForecastController(ILogger<WeatherForecastController> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
[HttpGet(Name = "GetWeatherForecast")]
|
||||
public IEnumerable<WeatherForecast> Get()
|
||||
{
|
||||
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
|
||||
{
|
||||
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
|
||||
TemperatureC = Random.Shared.Next(-20, 55),
|
||||
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
|
||||
})
|
||||
.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -32,4 +32,8 @@
|
|||
<ProjectReference Include="..\NewLife.Cube\NewLife.Cube.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Controllers\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -336,21 +336,21 @@ public class EntityController<TEntity> : ReadOnlyEntityController<TEntity> where
|
|||
return att;
|
||||
}
|
||||
|
||||
/// <summary>批量启用</summary>
|
||||
/// <param name="keys">主键集合</param>
|
||||
/// <param name="reason">操作原因</param>
|
||||
/// <returns></returns>
|
||||
[EntityAuthorize(PermissionFlags.Update)]
|
||||
[HttpPost]
|
||||
public virtual ActionResult EnableSelect(String keys, String reason) => EnableOrDisableSelect(true, reason);
|
||||
///// <summary>批量启用</summary>
|
||||
///// <param name="keys">主键集合</param>
|
||||
///// <param name="reason">操作原因</param>
|
||||
///// <returns></returns>
|
||||
//[EntityAuthorize(PermissionFlags.Update)]
|
||||
//[HttpPost]
|
||||
//public virtual ActionResult EnableSelect(String keys, String reason) => EnableOrDisableSelect(true, reason);
|
||||
|
||||
/// <summary>批量禁用</summary>
|
||||
/// <param name="keys">主键集合</param>
|
||||
/// <param name="reason">操作原因</param>
|
||||
/// <returns></returns>
|
||||
[EntityAuthorize(PermissionFlags.Update)]
|
||||
[HttpPost]
|
||||
public virtual ActionResult DisableSelect(String keys, String reason) => EnableOrDisableSelect(false, reason);
|
||||
///// <summary>批量禁用</summary>
|
||||
///// <param name="keys">主键集合</param>
|
||||
///// <param name="reason">操作原因</param>
|
||||
///// <returns></returns>
|
||||
//[EntityAuthorize(PermissionFlags.Update)]
|
||||
//[HttpPost]
|
||||
//public virtual ActionResult DisableSelect(String keys, String reason) => EnableOrDisableSelect(false, reason);
|
||||
|
||||
/// <summary>
|
||||
/// 批量启用或禁用
|
||||
|
@ -388,162 +388,162 @@ public class EntityController<TEntity> : ReadOnlyEntityController<TEntity> where
|
|||
#endregion
|
||||
|
||||
#region 高级Action
|
||||
/// <summary>导入Excel</summary>
|
||||
/// 当前采用前端解析的excel,表头第一行数据无效,从第二行开始处理
|
||||
/// <returns></returns>
|
||||
[EntityAuthorize(PermissionFlags.Insert)]
|
||||
[DisplayName("导入Excel")]
|
||||
[HttpPost]
|
||||
public virtual ActionResult ImportExcel(String data)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(data)) return Json(500, null, $"“{nameof(data)}”不能为 null 或空白。");
|
||||
try
|
||||
{
|
||||
var fact = Factory;
|
||||
var dal = fact.Session.Dal;
|
||||
var type = Activator.CreateInstance(fact.EntityType);
|
||||
var json = new JsonParser(data);
|
||||
var dataList = json.Decode() as IList<Object>;
|
||||
///// <summary>导入Excel</summary>
|
||||
///// 当前采用前端解析的excel,表头第一行数据无效,从第二行开始处理
|
||||
///// <returns></returns>
|
||||
//[EntityAuthorize(PermissionFlags.Insert)]
|
||||
//[DisplayName("导入Excel")]
|
||||
//[HttpPost]
|
||||
//public virtual ActionResult ImportExcel(String data)
|
||||
//{
|
||||
// if (String.IsNullOrWhiteSpace(data)) return Json(500, null, $"“{nameof(data)}”不能为 null 或空白。");
|
||||
// try
|
||||
// {
|
||||
// var fact = Factory;
|
||||
// var dal = fact.Session.Dal;
|
||||
// var type = Activator.CreateInstance(fact.EntityType);
|
||||
// var json = new JsonParser(data);
|
||||
// var dataList = json.Decode() as IList<Object>;
|
||||
|
||||
|
||||
//解析json
|
||||
//var dataList = JArray.Parse(data);
|
||||
var errorString = String.Empty;
|
||||
Int32 okSum = 0, fiSum = 0;
|
||||
// //解析json
|
||||
// //var dataList = JArray.Parse(data);
|
||||
// var errorString = String.Empty;
|
||||
// Int32 okSum = 0, fiSum = 0;
|
||||
|
||||
//using var tran = Entity<TEntity>.Meta.CreateTrans();
|
||||
foreach (var itemD in dataList)
|
||||
{
|
||||
var item = itemD.ToDictionary();
|
||||
if (item[fact.Fields[1].Name].ToString() == fact.Fields[1].DisplayName) //判断首行是否为标体列
|
||||
continue;
|
||||
// //using var tran = Entity<TEntity>.Meta.CreateTrans();
|
||||
// foreach (var itemD in dataList)
|
||||
// {
|
||||
// var item = itemD.ToDictionary();
|
||||
// if (item[fact.Fields[1].Name].ToString() == fact.Fields[1].DisplayName) //判断首行是否为标体列
|
||||
// continue;
|
||||
|
||||
//检查主字段是否重复
|
||||
if (Entity<TEntity>.Find(fact.Master.Name, item[fact.Master.Name].ToString()) == null)
|
||||
{
|
||||
//var entity = item.ToJson().ToJsonEntity(fact.EntityType);
|
||||
var entity = fact.Create();
|
||||
// //检查主字段是否重复
|
||||
// if (Entity<TEntity>.Find(fact.Master.Name, item[fact.Master.Name].ToString()) == null)
|
||||
// {
|
||||
// //var entity = item.ToJson().ToJsonEntity(fact.EntityType);
|
||||
// var entity = fact.Create();
|
||||
|
||||
foreach (var fieldsItem in fact.Fields)
|
||||
{
|
||||
if (!item.ContainsKey(fieldsItem.Name))
|
||||
{
|
||||
if (!fieldsItem.IsNullable)
|
||||
fieldsItem.FromExcelToEntity(item, entity);
|
||||
}
|
||||
else
|
||||
fieldsItem.FromExcelToEntity(item, entity);
|
||||
}
|
||||
// foreach (var fieldsItem in fact.Fields)
|
||||
// {
|
||||
// if (!item.ContainsKey(fieldsItem.Name))
|
||||
// {
|
||||
// if (!fieldsItem.IsNullable)
|
||||
// fieldsItem.FromExcelToEntity(item, entity);
|
||||
// }
|
||||
// else
|
||||
// fieldsItem.FromExcelToEntity(item, entity);
|
||||
// }
|
||||
|
||||
if (fact.FieldNames.Contains("CreateTime"))
|
||||
entity["CreateTime"] = DateTime.Now;
|
||||
// if (fact.FieldNames.Contains("CreateTime"))
|
||||
// entity["CreateTime"] = DateTime.Now;
|
||||
|
||||
if (fact.FieldNames.Contains("CreateIP"))
|
||||
entity["CreateIP"] = "--";
|
||||
// if (fact.FieldNames.Contains("CreateIP"))
|
||||
// entity["CreateIP"] = "--";
|
||||
|
||||
okSum += fact.Session.Insert(entity);
|
||||
}
|
||||
else
|
||||
{
|
||||
errorString += $"<br>{item[fact.Master.Name]}重复";
|
||||
fiSum++;
|
||||
}
|
||||
}
|
||||
// okSum += fact.Session.Insert(entity);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// errorString += $"<br>{item[fact.Master.Name]}重复";
|
||||
// fiSum++;
|
||||
// }
|
||||
// }
|
||||
|
||||
//tran.Commit();
|
||||
// //tran.Commit();
|
||||
|
||||
WriteLog("导入Excel", true, $"导入Excel[{data}]({dataList.Count()}行)成功!");
|
||||
// WriteLog("导入Excel", true, $"导入Excel[{data}]({dataList.Count()}行)成功!");
|
||||
|
||||
return Json(0, $"导入成功:({okSum}行),失败({fiSum}行)!{errorString}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
XTrace.WriteException(ex);
|
||||
// return Json(0, $"导入成功:({okSum}行),失败({fiSum}行)!{errorString}");
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// XTrace.WriteException(ex);
|
||||
|
||||
WriteLog("导入Excel", false, ex.GetMessage());
|
||||
// WriteLog("导入Excel", false, ex.GetMessage());
|
||||
|
||||
return Json(500, ex.GetMessage(), ex);
|
||||
}
|
||||
}
|
||||
// return Json(500, ex.GetMessage(), ex);
|
||||
// }
|
||||
//}
|
||||
#endregion
|
||||
|
||||
#region 批量删除
|
||||
/// <summary>删除选中</summary>
|
||||
/// <returns></returns>
|
||||
[EntityAuthorize(PermissionFlags.Delete)]
|
||||
[DisplayName("删除选中")]
|
||||
[HttpPost]
|
||||
public virtual ActionResult DeleteSelect()
|
||||
{
|
||||
var count = 0;
|
||||
var keys = SelectKeys;
|
||||
if (keys != null && keys.Length > 0)
|
||||
{
|
||||
using var tran = Entity<TEntity>.Meta.CreateTrans();
|
||||
var list = new List<IEntity>();
|
||||
foreach (var item in keys)
|
||||
{
|
||||
var entity = Entity<TEntity>.FindByKey(item);
|
||||
if (entity != null)
|
||||
{
|
||||
// 验证数据权限
|
||||
if (Valid(entity, DataObjectMethodType.Delete, true)) list.Add(entity);
|
||||
///// <summary>删除选中</summary>
|
||||
///// <returns></returns>
|
||||
//[EntityAuthorize(PermissionFlags.Delete)]
|
||||
//[DisplayName("删除选中")]
|
||||
//[HttpPost]
|
||||
//public virtual ActionResult DeleteSelect()
|
||||
//{
|
||||
// var count = 0;
|
||||
// var keys = SelectKeys;
|
||||
// if (keys != null && keys.Length > 0)
|
||||
// {
|
||||
// using var tran = Entity<TEntity>.Meta.CreateTrans();
|
||||
// var list = new List<IEntity>();
|
||||
// foreach (var item in keys)
|
||||
// {
|
||||
// var entity = Entity<TEntity>.FindByKey(item);
|
||||
// if (entity != null)
|
||||
// {
|
||||
// // 验证数据权限
|
||||
// if (Valid(entity, DataObjectMethodType.Delete, true)) list.Add(entity);
|
||||
|
||||
count++;
|
||||
}
|
||||
}
|
||||
list.Delete();
|
||||
tran.Commit();
|
||||
}
|
||||
return JsonRefresh($"共删除{count}行数据");
|
||||
}
|
||||
// count++;
|
||||
// }
|
||||
// }
|
||||
// list.Delete();
|
||||
// tran.Commit();
|
||||
// }
|
||||
// return JsonRefresh($"共删除{count}行数据");
|
||||
//}
|
||||
|
||||
/// <summary>删除全部</summary>
|
||||
/// <returns></returns>
|
||||
[EntityAuthorize(PermissionFlags.Delete)]
|
||||
[DisplayName("删除全部")]
|
||||
[HttpPost]
|
||||
public virtual ActionResult DeleteAll()
|
||||
{
|
||||
var url = Request.GetReferer();
|
||||
///// <summary>删除全部</summary>
|
||||
///// <returns></returns>
|
||||
//[EntityAuthorize(PermissionFlags.Delete)]
|
||||
//[DisplayName("删除全部")]
|
||||
//[HttpPost]
|
||||
//public virtual ActionResult DeleteAll()
|
||||
//{
|
||||
// var url = Request.GetReferer();
|
||||
|
||||
var count = 0;
|
||||
var p = Session[CacheKey] as Pager;
|
||||
p = new Pager(p);
|
||||
if (p != null)
|
||||
{
|
||||
// 循环多次删除
|
||||
for (var i = 0; i < 10; i++)
|
||||
{
|
||||
p.PageIndex = i + 1;
|
||||
p.PageSize = 100_000;
|
||||
// 不要查记录数
|
||||
p.RetrieveTotalCount = false;
|
||||
// var count = 0;
|
||||
// var p = Session[CacheKey] as Pager;
|
||||
// p = new Pager(p);
|
||||
// if (p != null)
|
||||
// {
|
||||
// // 循环多次删除
|
||||
// for (var i = 0; i < 10; i++)
|
||||
// {
|
||||
// p.PageIndex = i + 1;
|
||||
// p.PageSize = 100_000;
|
||||
// // 不要查记录数
|
||||
// p.RetrieveTotalCount = false;
|
||||
|
||||
var list = SearchData(p).ToList();
|
||||
if (list.Count == 0) break;
|
||||
// var list = SearchData(p).ToList();
|
||||
// if (list.Count == 0) break;
|
||||
|
||||
count += list.Count;
|
||||
//list.Delete();
|
||||
using var tran = Entity<TEntity>.Meta.CreateTrans();
|
||||
var list2 = new List<IEntity>();
|
||||
foreach (var entity in list)
|
||||
{
|
||||
// 验证数据权限
|
||||
if (Valid(entity, DataObjectMethodType.Delete, true)) list2.Add(entity);
|
||||
}
|
||||
list2.Delete();
|
||||
tran.Commit();
|
||||
}
|
||||
}
|
||||
// count += list.Count;
|
||||
// //list.Delete();
|
||||
// using var tran = Entity<TEntity>.Meta.CreateTrans();
|
||||
// var list2 = new List<IEntity>();
|
||||
// foreach (var entity in list)
|
||||
// {
|
||||
// // 验证数据权限
|
||||
// if (Valid(entity, DataObjectMethodType.Delete, true)) list2.Add(entity);
|
||||
// }
|
||||
// list2.Delete();
|
||||
// tran.Commit();
|
||||
// }
|
||||
// }
|
||||
|
||||
if (Request.IsAjaxRequest())
|
||||
return JsonRefresh($"共删除{count}行数据");
|
||||
else if (!url.IsNullOrEmpty())
|
||||
return Redirect(url);
|
||||
else
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
// if (Request.IsAjaxRequest())
|
||||
// return JsonRefresh($"共删除{count}行数据");
|
||||
// else if (!url.IsNullOrEmpty())
|
||||
// return Redirect(url);
|
||||
// else
|
||||
// return RedirectToAction("Index");
|
||||
//}
|
||||
#endregion
|
||||
|
||||
#region 实体操作重载
|
||||
|
@ -564,121 +564,121 @@ public class EntityController<TEntity> : ReadOnlyEntityController<TEntity> where
|
|||
#endregion
|
||||
|
||||
#region 同步/还原
|
||||
/// <summary>同步数据</summary>
|
||||
/// <returns></returns>
|
||||
[EntityAuthorize(PermissionFlags.Insert)]
|
||||
[DisplayName("同步{type}")]
|
||||
[HttpPost]
|
||||
public async Task<ActionResult> Sync()
|
||||
{
|
||||
//if (id.IsNullOrEmpty()) return RedirectToAction(nameof(Index));
|
||||
///// <summary>同步数据</summary>
|
||||
///// <returns></returns>
|
||||
//[EntityAuthorize(PermissionFlags.Insert)]
|
||||
//[DisplayName("同步{type}")]
|
||||
//[HttpPost]
|
||||
//public async Task<ActionResult> Sync()
|
||||
//{
|
||||
// //if (id.IsNullOrEmpty()) return RedirectToAction(nameof(Index));
|
||||
|
||||
// 读取系统配置
|
||||
var ps = Parameter.FindAllByUserID(ManageProvider.User.ID); // UserID=0 && Category=Sync
|
||||
ps = ps.Where(e => e.Category == "Sync").ToList();
|
||||
var server = ps.FirstOrDefault(e => e.Name == "Server")?.Value;
|
||||
var token = ps.FirstOrDefault(e => e.Name == "Token")?.Value;
|
||||
var models = ps.FirstOrDefault(e => e.Name == "Models")?.Value;
|
||||
// // 读取系统配置
|
||||
// var ps = Parameter.FindAllByUserID(ManageProvider.User.ID); // UserID=0 && Category=Sync
|
||||
// ps = ps.Where(e => e.Category == "Sync").ToList();
|
||||
// var server = ps.FirstOrDefault(e => e.Name == "Server")?.Value;
|
||||
// var token = ps.FirstOrDefault(e => e.Name == "Token")?.Value;
|
||||
// var models = ps.FirstOrDefault(e => e.Name == "Models")?.Value;
|
||||
|
||||
if (server.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Server");
|
||||
if (token.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Token");
|
||||
if (models.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Models");
|
||||
// if (server.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Server");
|
||||
// if (token.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Token");
|
||||
// if (models.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Models");
|
||||
|
||||
var mds = models.Split(",");
|
||||
// var mds = models.Split(",");
|
||||
|
||||
//// 创建实体工厂
|
||||
//var etype = mds.FirstOrDefault(e => e.Replace(".", "_") == id);
|
||||
//var fact = etype.GetTypeEx()?.AsFactory();
|
||||
//if (fact == null) throw new ArgumentNullException(nameof(id), "未找到模型 " + id);
|
||||
// //// 创建实体工厂
|
||||
// //var etype = mds.FirstOrDefault(e => e.Replace(".", "_") == id);
|
||||
// //var fact = etype.GetTypeEx()?.AsFactory();
|
||||
// //if (fact == null) throw new ArgumentNullException(nameof(id), "未找到模型 " + id);
|
||||
|
||||
// 找到控制器,以识别动作地址
|
||||
var cs = GetControllerAction();
|
||||
var ctrl = cs[0].IsNullOrEmpty() ? cs[1] : $"{cs[0]}/{cs[1]}";
|
||||
if (!mds.Contains(ctrl)) throw new InvalidOperationException($"[{ctrl}]未配置为允许同步 Sync:Models");
|
||||
// // 找到控制器,以识别动作地址
|
||||
// var cs = GetControllerAction();
|
||||
// var ctrl = cs[0].IsNullOrEmpty() ? cs[1] : $"{cs[0]}/{cs[1]}";
|
||||
// if (!mds.Contains(ctrl)) throw new InvalidOperationException($"[{ctrl}]未配置为允许同步 Sync:Models");
|
||||
|
||||
// 创建客户端,准备发起请求
|
||||
var url = server.EnsureEnd("/") + $"{ctrl}/Json/{token}?PageSize=100000";
|
||||
// // 创建客户端,准备发起请求
|
||||
// var url = server.EnsureEnd("/") + $"{ctrl}/Json/{token}?PageSize=100000";
|
||||
|
||||
var http = new HttpClient
|
||||
{
|
||||
BaseAddress = new Uri(url)
|
||||
};
|
||||
// var http = new HttpClient
|
||||
// {
|
||||
// BaseAddress = new Uri(url)
|
||||
// };
|
||||
|
||||
var sw = Stopwatch.StartNew();
|
||||
// var sw = Stopwatch.StartNew();
|
||||
|
||||
var list = await http.InvokeAsync<TEntity[]>(HttpMethod.Get, null);
|
||||
// var list = await http.InvokeAsync<TEntity[]>(HttpMethod.Get, null);
|
||||
|
||||
sw.Stop();
|
||||
// sw.Stop();
|
||||
|
||||
var fact = Factory;
|
||||
XTrace.WriteLine("[{0}]共同步数据[{1:n0}]行,耗时{2:n0}ms,数据源:{3}", fact.EntityType.FullName, list.Length, sw.ElapsedMilliseconds, url);
|
||||
// var fact = Factory;
|
||||
// XTrace.WriteLine("[{0}]共同步数据[{1:n0}]行,耗时{2:n0}ms,数据源:{3}", fact.EntityType.FullName, list.Length, sw.ElapsedMilliseconds, url);
|
||||
|
||||
var arrType = fact.EntityType.MakeArrayType();
|
||||
if (list.Length > 0)
|
||||
{
|
||||
XTrace.WriteLine("[{0}]准备覆盖写入[{1}]行数据", fact.EntityType.FullName, list.Length);
|
||||
using var tran = fact.Session.CreateTrans();
|
||||
// var arrType = fact.EntityType.MakeArrayType();
|
||||
// if (list.Length > 0)
|
||||
// {
|
||||
// XTrace.WriteLine("[{0}]准备覆盖写入[{1}]行数据", fact.EntityType.FullName, list.Length);
|
||||
// using var tran = fact.Session.CreateTrans();
|
||||
|
||||
// 清空
|
||||
try
|
||||
{
|
||||
fact.Session.Truncate();
|
||||
}
|
||||
catch (Exception ex) { XTrace.WriteException(ex); }
|
||||
// // 清空
|
||||
// try
|
||||
// {
|
||||
// fact.Session.Truncate();
|
||||
// }
|
||||
// catch (Exception ex) { XTrace.WriteException(ex); }
|
||||
|
||||
// 插入
|
||||
//ms.All(e => { e.AllChilds = new List<Menu>(); return true; });
|
||||
fact.AllowInsertIdentity = true;
|
||||
//ms.Insert();
|
||||
//var empty = typeof(List<>).MakeGenericType(fact.EntityType).CreateInstance();
|
||||
foreach (IEntity entity in list)
|
||||
{
|
||||
if (entity is IEntityTree tree) tree.AllChilds.Clear();
|
||||
// // 插入
|
||||
// //ms.All(e => { e.AllChilds = new List<Menu>(); return true; });
|
||||
// fact.AllowInsertIdentity = true;
|
||||
// //ms.Insert();
|
||||
// //var empty = typeof(List<>).MakeGenericType(fact.EntityType).CreateInstance();
|
||||
// foreach (IEntity entity in list)
|
||||
// {
|
||||
// if (entity is IEntityTree tree) tree.AllChilds.Clear();
|
||||
|
||||
entity.Insert();
|
||||
}
|
||||
fact.AllowInsertIdentity = false;
|
||||
// entity.Insert();
|
||||
// }
|
||||
// fact.AllowInsertIdentity = false;
|
||||
|
||||
tran.Commit();
|
||||
}
|
||||
// tran.Commit();
|
||||
// }
|
||||
|
||||
return Index();
|
||||
}
|
||||
// return Index();
|
||||
//}
|
||||
|
||||
/// <summary>从服务器本地目录还原</summary>
|
||||
/// <returns></returns>
|
||||
[EntityAuthorize(PermissionFlags.Insert)]
|
||||
[DisplayName("还原")]
|
||||
[HttpPost]
|
||||
public virtual ActionResult Restore()
|
||||
{
|
||||
try
|
||||
{
|
||||
var fact = Factory;
|
||||
var dal = fact.Session.Dal;
|
||||
///// <summary>从服务器本地目录还原</summary>
|
||||
///// <returns></returns>
|
||||
//[EntityAuthorize(PermissionFlags.Insert)]
|
||||
//[DisplayName("还原")]
|
||||
//[HttpPost]
|
||||
//public virtual ActionResult Restore()
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// var fact = Factory;
|
||||
// var dal = fact.Session.Dal;
|
||||
|
||||
var name = GetType().Name.TrimEnd("Controller");
|
||||
var fileName = $"{name}_*.gz";
|
||||
// var name = GetType().Name.TrimEnd("Controller");
|
||||
// var fileName = $"{name}_*.gz";
|
||||
|
||||
var di = NewLife.Setting.Current.BackupPath.GetBasePath().AsDirectory();
|
||||
//var fi = di?.GetFiles(fileName)?.LastOrDefault();
|
||||
var fi = di?.GetFiles(fileName)?.OrderByDescending(e => e.Name).FirstOrDefault();
|
||||
if (fi == null || !fi.Exists) throw new XException($"找不到[{fileName}]的备份文件");
|
||||
// var di = NewLife.Setting.Current.BackupPath.GetBasePath().AsDirectory();
|
||||
// //var fi = di?.GetFiles(fileName)?.LastOrDefault();
|
||||
// var fi = di?.GetFiles(fileName)?.OrderByDescending(e => e.Name).FirstOrDefault();
|
||||
// if (fi == null || !fi.Exists) throw new XException($"找不到[{fileName}]的备份文件");
|
||||
|
||||
var rs = dal.Restore(fi.FullName, fact.Table.DataTable);
|
||||
// var rs = dal.Restore(fi.FullName, fact.Table.DataTable);
|
||||
|
||||
WriteLog("恢复", true, $"恢复[{fileName}]({rs:n0}行)成功!");
|
||||
// WriteLog("恢复", true, $"恢复[{fileName}]({rs:n0}行)成功!");
|
||||
|
||||
return Json(0, $"恢复[{fileName}]({rs:n0}行)成功!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
XTrace.WriteException(ex);
|
||||
// return Json(0, $"恢复[{fileName}]({rs:n0}行)成功!");
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// XTrace.WriteException(ex);
|
||||
|
||||
WriteLog("恢复", false, ex.GetMessage());
|
||||
// WriteLog("恢复", false, ex.GetMessage());
|
||||
|
||||
return Json(500, null, ex);
|
||||
}
|
||||
}
|
||||
// return Json(500, null, ex);
|
||||
// }
|
||||
//}
|
||||
#endregion
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,110 +1,105 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using NewLife.Cube.Common;
|
||||
using NewLife.Cube.Common;
|
||||
|
||||
namespace NewLife.Cube.ViewModels
|
||||
namespace NewLife.Cube.ViewModels;
|
||||
|
||||
/// <summary>
|
||||
/// 字段模型
|
||||
/// </summary>
|
||||
public class FieldModel
|
||||
{
|
||||
private String _name;
|
||||
private String _columnName;
|
||||
|
||||
/// <summary>
|
||||
/// 字段模型
|
||||
/// 默认CamelCase小驼峰
|
||||
/// </summary>
|
||||
public class FieldModel
|
||||
readonly FormatType _FormatType = FormatType.CamelCase;
|
||||
|
||||
/// <summary>
|
||||
/// 默认CamelCase小驼峰
|
||||
/// </summary>
|
||||
public FieldModel() { }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="formatType">0-小驼峰,1-小写,2-保持默认</param>
|
||||
public FieldModel(FormatType formatType) => _FormatType = formatType;
|
||||
|
||||
/// <summary>备注</summary>
|
||||
public String Description { get; set; }
|
||||
|
||||
/// <summary>说明</summary>
|
||||
public String DisplayName { get; set; }
|
||||
|
||||
/// <summary>属性名</summary>
|
||||
public String Name
|
||||
{
|
||||
private String _name;
|
||||
private String _columnName;
|
||||
|
||||
/// <summary>
|
||||
/// 默认CamelCase小驼峰
|
||||
/// </summary>
|
||||
public FormatType FormatType = FormatType.CamelCase;
|
||||
|
||||
/// <summary>
|
||||
/// 默认CamelCase小驼峰
|
||||
/// </summary>
|
||||
public FieldModel() { }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="formatType">0-小驼峰,1-小写,2-保持默认</param>
|
||||
public FieldModel(FormatType formatType) => FormatType = formatType;
|
||||
|
||||
/// <summary>备注</summary>
|
||||
public String Description { get; set; }
|
||||
|
||||
/// <summary>说明</summary>
|
||||
public String DisplayName { get; set; }
|
||||
|
||||
/// <summary>属性名</summary>
|
||||
public String Name
|
||||
{
|
||||
get => _name.FormatName(FormatType);
|
||||
internal set => _name = value;
|
||||
}
|
||||
|
||||
/// <summary>是否允许空</summary>
|
||||
public Boolean IsNullable { get; internal set; }
|
||||
|
||||
/// <summary>长度</summary>
|
||||
public Int32 Length { get; internal set; }
|
||||
|
||||
/// <summary>是否数据绑定列</summary>
|
||||
public Boolean IsDataObjectField { get; set; }
|
||||
|
||||
/// <summary>是否动态字段</summary>
|
||||
public Boolean IsDynamic { get; set; }
|
||||
|
||||
/// <summary>用于数据绑定的字段名</summary>
|
||||
/// <remarks>
|
||||
/// 默认使用BindColumn特性中指定的字段名,如果没有指定,则使用属性名。
|
||||
/// 字段名可能两边带有方括号等标识符
|
||||
/// </remarks>
|
||||
public String ColumnName
|
||||
{
|
||||
get => _columnName.FormatName(FormatType);
|
||||
set => _columnName = value;
|
||||
}
|
||||
|
||||
/// <summary>是否只读</summary>
|
||||
/// <remarks>set { _ReadOnly = value; } 放出只读属性的设置,比如在编辑页面的时候,有的字段不能修改 如修改用户时 不能修改用户名</remarks>
|
||||
public Boolean ReadOnly { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 字段类型
|
||||
/// </summary>
|
||||
public String TypeStr { get; set; } = nameof(String);
|
||||
|
||||
#region 用于定制字段
|
||||
|
||||
/// <summary>
|
||||
/// 是否定制字段
|
||||
/// </summary>
|
||||
public Boolean IsCustom { get; set; }
|
||||
|
||||
/// <summary>前缀名称。放在某字段之前</summary>
|
||||
public String BeforeName { get; set; }
|
||||
|
||||
/// <summary>后缀名称。放在某字段之后</summary>
|
||||
public String AfterName { get; set; }
|
||||
|
||||
/// <summary>链接</summary>
|
||||
public String Url { get; set; }
|
||||
|
||||
/// <summary>标题。数据单元格上的提示文字</summary>
|
||||
public String Title { get; set; }
|
||||
|
||||
/// <summary>头部文字</summary>
|
||||
public String Header { get; set; }
|
||||
|
||||
/// <summary>头部链接。一般是排序</summary>
|
||||
public String HeaderUrl { get; set; }
|
||||
|
||||
/// <summary>头部标题。数据移上去后显示的文字</summary>
|
||||
public String HeaderTitle { get; set; }
|
||||
|
||||
/// <summary>数据动作。设为action时走ajax请求</summary>
|
||||
public String DataAction { get; set; }
|
||||
#endregion
|
||||
get => _name.FormatName(_FormatType);
|
||||
internal set => _name = value;
|
||||
}
|
||||
|
||||
/// <summary>是否允许空</summary>
|
||||
public Boolean IsNullable { get; internal set; }
|
||||
|
||||
/// <summary>长度</summary>
|
||||
public Int32 Length { get; internal set; }
|
||||
|
||||
/// <summary>是否数据绑定列</summary>
|
||||
public Boolean IsDataObjectField { get; set; }
|
||||
|
||||
/// <summary>是否动态字段</summary>
|
||||
public Boolean IsDynamic { get; set; }
|
||||
|
||||
/// <summary>用于数据绑定的字段名</summary>
|
||||
/// <remarks>
|
||||
/// 默认使用BindColumn特性中指定的字段名,如果没有指定,则使用属性名。
|
||||
/// 字段名可能两边带有方括号等标识符
|
||||
/// </remarks>
|
||||
public String ColumnName
|
||||
{
|
||||
get => _columnName.FormatName(_FormatType);
|
||||
set => _columnName = value;
|
||||
}
|
||||
|
||||
/// <summary>是否只读</summary>
|
||||
/// <remarks>set { _ReadOnly = value; } 放出只读属性的设置,比如在编辑页面的时候,有的字段不能修改 如修改用户时 不能修改用户名</remarks>
|
||||
public Boolean ReadOnly { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 字段类型
|
||||
/// </summary>
|
||||
public String TypeStr { get; set; } = nameof(String);
|
||||
|
||||
#region 用于定制字段
|
||||
|
||||
/// <summary>
|
||||
/// 是否定制字段
|
||||
/// </summary>
|
||||
public Boolean IsCustom { get; set; }
|
||||
|
||||
/// <summary>前缀名称。放在某字段之前</summary>
|
||||
public String BeforeName { get; set; }
|
||||
|
||||
/// <summary>后缀名称。放在某字段之后</summary>
|
||||
public String AfterName { get; set; }
|
||||
|
||||
/// <summary>链接</summary>
|
||||
public String Url { get; set; }
|
||||
|
||||
/// <summary>标题。数据单元格上的提示文字</summary>
|
||||
public String Title { get; set; }
|
||||
|
||||
/// <summary>头部文字</summary>
|
||||
public String Header { get; set; }
|
||||
|
||||
/// <summary>头部链接。一般是排序</summary>
|
||||
public String HeaderUrl { get; set; }
|
||||
|
||||
/// <summary>头部标题。数据移上去后显示的文字</summary>
|
||||
public String HeaderTitle { get; set; }
|
||||
|
||||
/// <summary>数据动作。设为action时走ajax请求</summary>
|
||||
public String DataAction { get; set; }
|
||||
#endregion
|
||||
}
|
Loading…
Reference in New Issue