/// <summary> /// APP通用数据访问接口(CRUD) /// </summary> /// <param name="parameters">请求接口所带的参数模型对象</param> /// <returns>请求结果</returns> public JsonResult Index(CommonApiModel parameters) { var bllEntity = BllFactory.GetBllInstance(parameters.TableName); var entityType = bllEntity.GetType(); var methodName = parameters.Operate.ToString(); var invokeParameters = PrepareInvokeParameters(parameters); try { if (parameters.Operate == DbOperateType.BulkInsert) { entityType.InvokeMember(methodName, BindingFlags.InvokeMethod, null, bllEntity, invokeParameters); return Json(ErrorModel.BulkInsertSuccess); } var result = entityType.InvokeMember(methodName, BindingFlags.InvokeMethod, null, bllEntity, invokeParameters); var jsonObj = ErrorModel.GetDataSuccess(result, parameters.TableName); return new CustomJsonResult { Data = jsonObj, MaxJsonLength = int.MaxValue, FormateStr = "yyyy-MM-dd HH:mm:ss" }; } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence("AppController.cs", "AppController", ex); return Json(ErrorModel.InputError, JsonRequestBehavior.AllowGet); } }
/// <summary> /// 对上传的试题题库进行分析 /// </summary> /// <param name="examFiles"></param> /// <returns></returns> public static object AnalysisExamQuestion(ExamFiles examFiles) { //var absolutePath = HttpContext.Current.Server.MapPath(examFiles.FilePath); // @FrancisTan 20170208 var absolutePath = PathExtension.MapPath(examFiles.FilePath); try { using (var fileStream = new FileStream(absolutePath, FileMode.Open, FileAccess.Read)) { var workBook = new HSSFWorkbook(fileStream); var qaList = AnalysisQuestions(workBook); if (qaList.Count == 0) { return(ErrorModel.OperateFailed); } return(InsertQuestionsToDb(examFiles, qaList)); } } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence("ExamController.cs", "ExamController", ex); return(ErrorModel.OperateFailed); } }
/// <summary> /// 对数据的批量更新 /// </summary> /// <param name="tableName">目标表格名称</param> /// <param name="startId">当前更新记录开始位置(不包括所传入的id)</param> /// <param name="updateType">更新类型枚举</param> public static void BulkUpdate(string tableName, int startId, DataUpdateType updateType = DataUpdateType.Insert) { var bllEntity = BllFactory.GetBllInstance(tableName); var bllType = bllEntity.GetType(); try { var whereStr = "Id>" + startId; var idList = (IEnumerable <object>)bllType.InvokeMember("QuerySingleColumn", BindingFlags.InvokeMethod, null, bllEntity, new object[] { whereStr, "Id" }); var updateModelList = idList.Select(id => new DbUpdateLog { TableName = tableName, TargetId = (int)id, UpdateType = (int)updateType, UpdateTime = DateTime.Now }); UpdateBll.BulkInsert(updateModelList); } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence("DataUpdateLog.cs", "DataUpdateLog", ex); } }
/// <summary> /// 获取数据列表的公共方法(通过表名反映获取) /// </summary> /// <returns></returns> public JsonResult GetList() { var instructorId = Request["instructorId"].ToInt32(); var month = Request["month"].ToDateTime(); var tableName = Request["target"]; if (string.IsNullOrEmpty(tableName)) { return(Json(ErrorModel.InputError)); } var json = JqueryDataTableAjaxHelper.GetPageListJson( Request, (pageIndex, pageSize) => { var bllInstance = BllFactory.GetBllInstance(tableName); if (bllInstance != null) { var type = bllInstance.GetType(); try { // build condition var conditionList = new List <string>(); if (instructorId > 0) { conditionList.Add("InstructorId=" + instructorId); } if (month != default(DateTime)) { var start = month.AddDays(-1); var end = month.AddMonths(1); conditionList.Add($"UploadTime>'{start}' AND UploadTime<'{end}'"); } var condition = string.Join(" AND ", conditionList); var orderField = Request["order"] ?? "UploadTime"; var arguments = new object[] { pageIndex, pageSize, condition, orderField, true, 0 }; var list = type.InvokeMember("QueryPageList", BindingFlags.InvokeMethod, null, bllInstance, arguments); return(new KeyValuePair <int, object>((int)arguments[5], list)); } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence("InstructorController.cs", "InstructorController", ex); return(new KeyValuePair <int, object>()); } } return(new KeyValuePair <int, object>()); }); return(Json(json)); }
/// <summary> /// 将上传的文件进行格式转换处理,若文件格式符合处理条件,则在文件处理完成之后会将处理后得到的新文件地址赋值给 fileModel 的 FilePath 字段并返回 /// </summary> /// <param name="fileModel"><see cref="TraficFiles"/>类的实体对象</param> public static TraficFiles Format(TraficFiles fileModel) { try { var fileName = PathExtension.MapPath(fileModel.FilePath); var path = Path.GetDirectoryName(fileName); var htmlFilesPath = Path.Combine(path, Guid.NewGuid().ToString()); var ext = Path.GetExtension(fileName).ToLower(); switch (ext) { case ".doc": case ".docx": FileHelper.Word2Html(fileName, htmlFilesPath); break; //case ".pdf": // FileHelper.Pdf2Html(fileName, htmlFilesPath); // break; default: //throw new NotImplementedException(); return(fileModel); } // 将 __html 中的文件打包压缩成 zip 格式的文件 var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); var zipFileName = Path.Combine(path, fileNameWithoutExtension + ".zip"); FileHelper.Zip(zipFileName, htmlFilesPath); // 删除 __html 目录 Directory.Delete(htmlFilesPath, true); // 将 zip 文件路径处理成相对路径 fileName = fileName.Replace("\\", "/"); var webDir = fileName.Replace(fileModel.FilePath, ""); fileModel.FilePath = zipFileName.Replace("\\", "/").Replace(webDir, ""); fileModel.FilePath = fileModel.FilePath.StartsWith("/") ? fileModel.FilePath : $"/{fileModel.FilePath}"; var n = fileModel.FileName; fileModel.FileExtension = ".zip"; fileModel.FileName = Path.GetFileNameWithoutExtension(n) + fileModel.FileExtension; return(fileModel); } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence(nameof(FileProcesser), nameof(FileProcesser), ex); return(fileModel); } }
/// <summary> /// 针对新增文件搜索所有关键字 /// </summary> /// <param name="fileId"></param> private static void SearchForNewFile(int fileId) { var fileBll = new TraficFilesBll(); var file = fileBll.QuerySingle(fileId); if (file != null && file.FileExtension.ToLower() == ".zip") { var keywordsBll = new TraficKeywordsBll(); var keywordsList = keywordsBll.QueryAll(); var zipFileName = PathExtension.MapPath(file.FilePath); var zipTempFileName = Path.Combine(ZipTempPath, Path.GetFileName(file.FilePath)); if (!Directory.Exists(ZipTempPath)) { Directory.CreateDirectory(ZipTempPath); } if (File.Exists(zipFileName)) { FileHelper.ExtractZip(zipFileName, ExtractPath); var html = GetHtmlStr(ExtractPath, out string htmlFileName, out Encoding encoding); html = AddIdForHtmlDom(html); var tasks = new List <Task>(); foreach (var keywords in keywordsList) { tasks.Add(Task.Factory.StartNew(() => { try { var searchResult = SearchFromHtml(keywords.Keywords, html); SearchResultEnqueue(searchResult, fileId, keywords.Id); } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence(nameof(SearchHelper), nameof(SearchHelper), ex); } })); } Task.WaitAll(tasks.ToArray()); ClearSearchResultQueue(); FileHelper.Write(htmlFileName, html, encoding); SearchCompleted(zipTempFileName, zipFileName, ExtractPath); tasks = null; GC.Collect(); } } }
/// <summary> /// 添加搜索关键字,此任务仅在数据库中关键字条目数少于100个时才会执行 /// </summary> public static void AddSearchKeywords() { // 判断数据库中关键字个数 var keywordsBll = new TraficKeywordsBll(); var totalCount = keywordsBll.GetTotalCount(); if (totalCount < 100) { // 读取文件中的关键字列表 var filePath = PathExtension.MapPath(AppSettings.KeywordsFilePath); try { using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (var streamReader = new StreamReader(fileStream)) { var text = streamReader.ReadToEnd(); var keywords = text.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); // @FrancisTan 2017-10-27 // 批量插入关键字 var modelList = keywords.Select(k => new TraficKeywords { Keywords = k, AddTime = DateTime.Now }); keywordsBll.BulkInsert(modelList); DataUpdateLog.BulkUpdate(nameof(TraficKeywords), 0); // 依次对单个文件执行关键字搜索 var fileBll = new TraficFilesBll(); var idList = fileBll.QueryList("IsDelete=0", new string[] { "Id" }).Select(t => t.Id).ToList(); idList.ForEach(id => { SearchHelper.AddSearchTask(1, id); }); } // end streamreader } // end filestream } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence(nameof(TempTask), nameof(TempTask), ex); } } else { // Ignore } }
public JsonResult GetList(GetListParams parameters) { if (ModelState.IsValid) { try { var bllInstance = BllFactory.GetBllInstance(parameters.TableName); if (bllInstance == null) { return(Json(ErrorModel.InputError)); } var condition = string.IsNullOrEmpty(parameters.Conditions) ? string.Empty : parameters.Conditions.Replace("###", " AND "); var fields = string.IsNullOrEmpty(parameters.Fields) ? null : parameters.Fields.Split(new[] { "###" }, StringSplitOptions.RemoveEmptyEntries); object data; var type = bllInstance.GetType(); if (parameters.PageIndex <= 0 || parameters.PageSize <= 0) { data = type.InvokeMember("QueryList", BindingFlags.InvokeMethod, null, bllInstance, new object[] { condition, fields, null, parameters.OrderField, parameters.Desending }); } else { data = type.InvokeMember("QueryPageList", BindingFlags.InvokeMethod, null, bllInstance, new object[] { parameters.PageIndex, parameters.PageSize, condition, fields, null, parameters.OrderField, parameters.Desending }); } return(Json(ErrorModel.GetDataSuccess(data))); } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence(nameof(CommonController), nameof(CommonController), ex); return(Json(ErrorModel.InputError)); } } return(Json(ErrorModel.InputError)); }
/// <summary> /// 将未经处理的异常信息持久化 /// </summary> /// <param name="filterContext">上下文对象</param> public override void OnException(ExceptionContext filterContext) { var exception = filterContext.Exception; ExceptionLogBll.ExceptionPersistence("", "", exception); base.OnException(filterContext); if (RequestHelper.IsAsyncRequest()) { HttpContext.Current.Response.Write(JsonHelper.Serialize(ErrorModel.InputError)); HttpContext.Current.Response.End(); } else { HttpContext.Current.Response.Redirect("/Home/Index"); } }
/// <summary> /// 开启搜索任务 /// </summary> private static void StartTask() { Task.Factory.StartNew(() => { while (true) { if (SearchQueue.Count > 0) { try { var keyPair = SearchQueue.Dequeue(); var type = keyPair.Key; var targetId = keyPair.Value; if (type == 1) { SearchForNewFile(targetId); } else { SearchForNewKeywords(targetId); } } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence("SearchHelper.cs", "SearchHelper", ex); } } else { _isTaskRunning = false; using (var fs = new FileStream("D:\\finish.txt", FileMode.OpenOrCreate, FileAccess.Write)) { using (var writer = new StreamWriter(fs)) { writer.Write("finished"); } } break; } } }); }
public JsonResult Upgrade(string version) { var latest = new AppUpdateBll().QueryAll().LastOrDefault(); if (latest == null) { return(Json(ErrorModel.AppNotUpgraded)); } if (string.IsNullOrEmpty(version)) { // 版本号为空且数据库不为空,则返回最新版本信息 return(Json(ErrorModel.AppUpgraded(latest))); } // 验证版本号格式 if (!Regex.IsMatch(version, @"^\d+\.\d+\.\d+\.\d+$")) { return(Json(ErrorModel.InputError)); } try { if (version != latest.Version) { // 版本号与最新发布的版本号不一致 // 说明发布了最新版本 return(Json(ErrorModel.AppUpgraded(latest))); } return(Json(ErrorModel.AppNotUpgraded)); } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence(nameof(AppController), nameof(AppController), ex); return(Json(ErrorModel.InputError)); } }
/// <summary> /// 处理文件上传 /// </summary> /// <returns>上传成功则返回文件在服务器上的存储信息,否则返回上传失败的提示信息</returns> public static object FileUpload() { var request = HttpContext.Current.Request; try { if (request.Files.Count > 0) { var receptFile = request.Files[0]; var fileName = receptFile.FileName; var fileSize = receptFile.ContentLength / 1024; var fileType = request["fileType"].ToInt32(); var savePath = AppSettings.GetFileSavePath(fileType); if (string.IsNullOrEmpty(savePath)) { return(ErrorModel.UnknownUploadFileType); } var filePathInfo = new FilePathInfo(fileName, fileSize, savePath); filePathInfo.CreateDirectory(); receptFile.SaveAs(filePathInfo.FileAbsolutePath); return(filePathInfo); } return(ErrorModel.FileUploadFailed); } catch (Exception ex) { ExceptionLogBll.ExceptionPersistence("UploadHelper.cs", "UploadHelper", ex); return(ErrorModel.FileUploadFailed); } }