PageController.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using CZFW.CMS.Admin;
  2. using CZFW.Core;
  3. using CZFW.Framework.Model.ViewModel;
  4. using CZFW.Framework.Tools;
  5. using CZFW.MDB;
  6. using CZFW.MDB.Interface;
  7. using CZFW.MDB.Util;
  8. using Microsoft.AspNetCore.Mvc;
  9. using MongoDB.Bson;
  10. using Newtonsoft.Json.Linq;
  11. using System.Collections.Generic;
  12. using System.IO;
  13. namespace CZFW.CMS.Admin.Controllers
  14. {
  15. public class PageController : AdminControllerBase
  16. {
  17. ISchemaRepository _schemaLogic;
  18. IPage _pageLogic;
  19. IMongoRepository _repository;
  20. ICMSCategory _categoryRepository;
  21. public PageController(ISchemaRepository schemaLogic, IPage page, IMongoRepository repository, ICMSCategory category)
  22. {
  23. _repository = repository;
  24. _categoryRepository = category;
  25. _pageLogic = page;
  26. _schemaLogic = schemaLogic;
  27. }
  28. public IActionResult List(string id = null, string pageName = null, string query = "{}", string type = "backend.table", string projection = "{}", int pageIndex = 1, int pageSize = 20, string sort = "{}")
  29. {
  30. var data = new BsonArray();
  31. if (string.IsNullOrWhiteSpace(pageName))
  32. data = _pageLogic.GetList(Site.SiteName, id, type, query, projection, pageIndex, pageSize, sort);
  33. else
  34. {
  35. pageName = $"{Site.TplName}_{pageName}";
  36. data = _pageLogic.GetListByName(Site.SiteName, pageName, type, query, projection, pageIndex, pageSize, sort);
  37. }
  38. var json = data.CZToJson();
  39. return Content(json, "application/json");
  40. }
  41. public IActionResult GetHeader(string key, string type = "backend.table")
  42. {
  43. var data = _schemaLogic.GetHeader(key, type, out string name);
  44. var json = data.CZToJson();
  45. return Content(json, "application/json");
  46. }
  47. public ResultModel GetCount(string pageName, string query = "{}")
  48. {
  49. if (!pageName.Contains(Site.TplName))
  50. pageName = $"{Site.TplName}_{pageName}";
  51. _repository.SetCurrentTable(pageName);
  52. var qry = JObject.Parse(query);
  53. if (!qry.ContainsKey(Constants.SITE_NAME_FIELD))
  54. qry[Constants.SITE_NAME_FIELD] = Site.SiteName;
  55. else
  56. qry.Add(Constants.SITE_NAME_FIELD, Site.SiteName);
  57. query = qry.ToString();
  58. var count = _repository.GetCount(query);
  59. var res = new ResultModel { Success = true, Data = count };
  60. return res;
  61. }
  62. public IActionResult Get(string pageId, string dataId, string projection = null, string type = "backend.view")
  63. {
  64. var header = _schemaLogic.GetHeader(pageId, type, out string name);
  65. var json = header.CZToJson();
  66. if (string.IsNullOrWhiteSpace(projection))
  67. {
  68. projection = json;
  69. }
  70. _repository.SetCurrentTable(name);
  71. var res = _repository.Get(dataId, projection);
  72. var jsonRes = res.CZToJson();
  73. return Content(jsonRes, "application/json");
  74. }
  75. public IActionResult GetOne(string id = null, string pageName = null, string query = "{}", string type = "", string projection = "{}", string sort = "{}")
  76. {
  77. var data = new BsonArray();
  78. if (string.IsNullOrWhiteSpace(pageName))
  79. data = _pageLogic.GetList(Site.SiteName, id, type, query, projection, 1, 1, sort);
  80. else
  81. {
  82. pageName = $"{Site.TplName}_{pageName}";
  83. data = _pageLogic.GetListByName(Site.SiteName, pageName, type, query, projection, 1, 1, sort);
  84. }
  85. var json = "{}";
  86. if (data != null)
  87. if (data.Count > 0)
  88. json = data[0].AsBsonDocument.CZToJson();
  89. return Content(json, "application/json");
  90. }
  91. public ResultModel Create(string pageId, [FromBody]string objJson)
  92. {
  93. var name = _schemaLogic.GetNameById(pageId);
  94. var jobj = JObject.Parse(objJson);
  95. if (jobj.ContainsKey(Constants.SITE_NAME_FIELD))
  96. jobj[Constants.SITE_NAME_FIELD] = Site.SiteName;
  97. else
  98. jobj.Add(Constants.SITE_NAME_FIELD, Site.SiteName);
  99. if (jobj.ContainsKey(Constants.SORT_ORDER_FIELD))
  100. {
  101. if (jobj[Constants.SORT_ORDER_FIELD] == null)
  102. jobj[Constants.SORT_ORDER_FIELD] = AutoInc.GetNext(Site.SiteName, name, Site.TplName);
  103. else if (!int.TryParse(jobj[Constants.SORT_ORDER_FIELD].ToString(), out int sort))
  104. {
  105. jobj[Constants.SORT_ORDER_FIELD] = AutoInc.GetNext(Site.SiteName, name, Site.TplName);
  106. }
  107. }
  108. objJson = jobj.ToString();
  109. _repository.SetCurrentTable(name);
  110. var res = _repository.Insert(objJson);
  111. return res;
  112. }
  113. public ResultModel Replace(string pageId, string dataId, [FromBody]string objJson)
  114. {
  115. var name = _schemaLogic.GetNameById(pageId);
  116. _repository.SetCurrentTable(name);
  117. var jobj = JObject.Parse(objJson);
  118. if (jobj.ContainsKey(Constants.SITE_NAME_FIELD))
  119. jobj[Constants.SITE_NAME_FIELD] = Site.SiteName;
  120. else
  121. jobj.Add(Constants.SITE_NAME_FIELD, Site.SiteName);
  122. objJson = jobj.ToString();
  123. var res = _repository.Replace(dataId, objJson);
  124. return res;
  125. }
  126. public ResultModel Remove(string pageId, string dataId)
  127. {
  128. var name = _schemaLogic.GetNameById(pageId);
  129. _repository.SetCurrentTable(name);
  130. var res = _repository.Remove(dataId);
  131. return res;
  132. }
  133. public ResultModel SyncCate()
  134. {
  135. var res = _categoryRepository.SyncTplCategorySource(Site.TplName, Site.SiteName);
  136. return res;
  137. }
  138. /// <summary>
  139. /// 导出Excel
  140. /// </summary>
  141. /// <param name="pageName">页面名称</param>
  142. /// <param name="data">标题key/value对象</param>
  143. /// <param name="query">查询条件</param>
  144. /// <param name="projection">查询列</param>
  145. /// <param name="pageIndex">页码</param>
  146. /// <param name="pageSize">每页条数</param>
  147. /// <param name="sort">排序条件</param>
  148. /// <returns>文件二进制流</returns>
  149. public ResultModel Export(string pageName, [FromBody]JObject data, string query = "{}", string projection = "{}", int pageIndex = 1, int pageSize = 20, string sort = "{}")
  150. {
  151. // 设置页面名称
  152. if (!pageName.Contains(Site.TplName))
  153. pageName = $"{Site.TplName}_{pageName}";
  154. _repository.SetCurrentTable(pageName);
  155. var titleList = data.Value<JArray>("data");
  156. var titleKeys = new List<string>();
  157. var titleValues = new List<string>();
  158. foreach (var item in titleList)
  159. {
  160. titleKeys.Add(item.Value<string>("key"));
  161. titleValues.Add(item.Value<string>("value"));
  162. }
  163. var list = _repository.GetList(query, projection, pageIndex, pageSize, sort);
  164. var dataList = new List<BsonDocument>();
  165. foreach (var item in list)
  166. {
  167. dataList.Add(item.AsBsonDocument);
  168. }
  169. var res = NPOIHelper.OutputExcel(dataList, titleKeys, titleValues);
  170. var fileName = Utility.GetUnixTimeTick().ToString() + ".xlsx";
  171. var filePathRoot = ConfigHelper.GetValue<string>("ResourcePathRoot");
  172. var destPath = Path.Combine(filePathRoot, Site.SiteName, "export", fileName);
  173. using (FileStream fs = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
  174. {
  175. fs.Write(res, 0, res.Length);
  176. }
  177. return Result(data: $"/{Constants.RESOURCE_FILE_URL_PREFIX}/{Site.SiteName}/export/{fileName}");
  178. }
  179. }
  180. }