Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
SeriaWei committed Nov 6, 2022
2 parents ce15a37 + 9864d18 commit e049e3f
Show file tree
Hide file tree
Showing 138 changed files with 3,975 additions and 10,258 deletions.
6 changes: 3 additions & 3 deletions src/EasyFrameWork/EasyFrameWork.csproj
Expand Up @@ -19,9 +19,9 @@
<ItemGroup>
<PackageReference Include="DocumentFormat.OpenXml" Version="2.18.0" />
<PackageReference Include="IdGen" Version="3.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.10" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.10" />
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="6.0.0" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageReference Include="System.Reflection.Extensions" Version="4.3.0" />
Expand Down
7 changes: 1 addition & 6 deletions src/EasyFrameWork/Image/ImageHelper.cs
Expand Up @@ -13,12 +13,7 @@ public class ImageHelper
{
public static bool IsImage(string extension)
{
extension = extension.ToLower();
if (extension == ".gif" || extension == ".jpg" || extension == ".png" || extension == ".jpeg" || extension == ".bmp")
{
return true;
}
else return false;
return Mvc.Common.IsImage(extension);
}
}
}
4 changes: 2 additions & 2 deletions src/EasyFrameWork/Mvc/Common.cs
Expand Up @@ -17,9 +17,9 @@ public static class Common
/// </summary>
/// <param name="ext">文件扩展名</param>
/// <returns></returns>
public static bool FileCanUp(string ext)
public static bool IsExecuteableFile(string ext)
{
return !_dangerFiles.Contains(ext);
return _dangerFiles.Contains(ext);
}

/// <summary>
Expand Down
16 changes: 11 additions & 5 deletions src/EasyFrameWork/Mvc/Extend/ExHttpRequest.cs
Expand Up @@ -38,7 +38,11 @@ public static string SaveImage(this HttpRequest request)
if (Common.IsImage(ext))
{
IStorage storage = request.HttpContext.RequestServices.GetService<IStorage>();
return storage.SaveFile(request.Form.Files[0].OpenReadStream(), string.Format("{0}{1}", new Easy.IDGenerator().CreateStringId(), ext));
using (Stream stream = request.Form.Files[0].OpenReadStream())
{
return storage.SaveFile(stream, string.Format("{0}{1}", new Easy.IDGenerator().CreateStringId(), ext));
}

}
}
return string.Empty;
Expand All @@ -54,12 +58,14 @@ public static string SaveFile(this HttpRequest request)
{
string fileName = request.Form.Files[0].FileName;
string ext = Path.GetExtension(fileName);
if (Common.FileCanUp(ext))
{
IStorage storage = request.HttpContext.RequestServices.GetService<IStorage>();
return storage.SaveFile(request.Form.Files[0].OpenReadStream(), string.Format("{0}{1}", new Easy.IDGenerator().CreateStringId(), ext));
if (Common.IsExecuteableFile(ext)) return string.Empty;

IStorage storage = request.HttpContext.RequestServices.GetService<IStorage>();
using (Stream stream = request.Form.Files[0].OpenReadStream())
{
return storage.SaveFile(stream, string.Format("{0}{1}", new Easy.IDGenerator().CreateStringId(), ext));
}

}
return string.Empty;
}
Expand Down
5 changes: 5 additions & 0 deletions src/EasyFrameWork/RepositoryPattern/ServiceResult.cs
Expand Up @@ -52,6 +52,11 @@ public string ErrorMessage
}
public class ServiceResult<T> : ServiceResult
{
public ServiceResult() { }
public ServiceResult(T result)
{
Result = result;
}

public T Result { get; set; }
}
Expand Down
1 change: 1 addition & 0 deletions src/EasyFrameWork/Storage/IStorage.cs
Expand Up @@ -15,6 +15,7 @@ public interface IStorage
Task<string> SaveFileAsync(Stream stream, string directory, string fileName);
void AppendFile(Stream stream, string filePath);
Task AppendFileAsync(Stream stream, string filePath);
Stream GetFile(string filePath);
void Delete(string filePath);
void DeleteDirectory(string path);
}
Expand Down
4 changes: 4 additions & 0 deletions src/EasyFrameWork/Storage/LocalStorage.cs
Expand Up @@ -76,5 +76,9 @@ public virtual void DeleteDirectory(string path)
Directory.Delete(MapPath(path), true);
}

public Stream GetFile(string filePath)
{
return File.OpenRead(MapPath(filePath));
}
}
}
4 changes: 4 additions & 0 deletions src/EasyFrameWork/Storage/WebStorage.cs
Expand Up @@ -97,5 +97,9 @@ public virtual void DeleteDirectory(string path)
Directory.Delete(MapPath(path), true);
}

public Stream GetFile(string filePath)
{
return File.OpenRead(MapPath(filePath));
}
}
}
17 changes: 6 additions & 11 deletions src/ZKEACMS.Mail/Queue/BlockedEmailQueueReader.cs
Expand Up @@ -10,27 +10,22 @@ namespace ZKEACMS.Mail.Queue
{
public class BlockedEmailQueueReader
{
private readonly PersistentEmailQueue _emailQueue;
private EmailContext emailContext;
public BlockedEmailQueueReader(PersistentEmailQueue emailQueue, CancellationToken cancellationToken)
private EmailContext _emailContext;
public BlockedEmailQueueReader(CancellationToken cancellationToken)
{
_emailQueue = emailQueue;
Task = new Task<EmailContext>(GetCurrentContext, cancellationToken);
Task = new Task<EmailContext>(GetCurrentContext, cancellationToken, TaskCreationOptions.LongRunning);
}

public async Task<bool> TryDequeueAsync()
public void ContinueWithResult(EmailContext emailContext)
{
emailContext = await _emailQueue.ReceiveFromFileAsync();
if (emailContext == null) return false;

_emailContext = emailContext;
Task.Start();
return true;
}

public Task<EmailContext> Task { get; private set; }
EmailContext GetCurrentContext()
{
return emailContext;
return _emailContext;
}
}
}
51 changes: 36 additions & 15 deletions src/ZKEACMS.Mail/Queue/PersistentEmailQueue.cs
Expand Up @@ -21,26 +21,34 @@ namespace ZKEACMS.Mail.Queue
public class PersistentEmailQueue : PluginData<MailPlug>, IEmailQueue
{
private Stack<BlockedEmailQueueReader> _queueReaders = new Stack<BlockedEmailQueueReader>();
private System.Timers.Timer _blockedQueueReaderTrigger;

public PersistentEmailQueue(ILogger<MailPlug> logger) : base(logger)
{
_blockedQueueReaderTrigger = new System.Timers.Timer(2000);
_blockedQueueReaderTrigger.Elapsed += Elapsed;
}

private void Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Dequeue();
}

private ILiteCollection<T> GetMailCollection<T>() where T : EmailContext
{
return GetCollection<T>("Emails");
}
public async Task<EmailContext> Receive(CancellationToken cancellationToken = default)
public Task<EmailContext> Receive(CancellationToken cancellationToken = default)
{
var result = await ReceiveFromFileAsync();
if (result != null) return result;
var result = ReceiveFromFile();
if (result != null) return Task.FromResult(result);

BlockedEmailQueueReader queueReader = new BlockedEmailQueueReader(this, cancellationToken);
BlockedEmailQueueReader queueReader = new BlockedEmailQueueReader(cancellationToken);
_queueReaders.Push(queueReader);
return await queueReader.Task;
return queueReader.Task;
}

public async Task<EmailContext> ReceiveFromFileAsync()
public EmailContext ReceiveFromFile()
{
var collection = GetMailCollection<EmailContextQueueItem>();
if (collection.Count() == 0) return null;
Expand All @@ -49,23 +57,36 @@ public async Task<EmailContext> ReceiveFromFileAsync()
if (result == null) return null;

collection.Delete(result.Id);
return await Task.FromResult(result);
return result;
}

public async Task Send(EmailContext emailMessage)
public Task Send(EmailContext emailMessage)
{
GetMailCollection<EmailContext>().Insert(emailMessage);
BlockedEmailQueueReader reader;
lock (_queueReaders)
if (!_blockedQueueReaderTrigger.Enabled)
{
_queueReaders.TryPop(out reader);
_blockedQueueReaderTrigger.Start();
}
if (reader != null)
return Task.CompletedTask;
}
private void Dequeue()
{
lock (_queueReaders)
{
bool success = await reader.TryDequeueAsync();
if (!success)
while (_queueReaders.Count > 0)
{
_queueReaders.Push(reader);
var result = ReceiveFromFile();
if (result == null)
{
_blockedQueueReaderTrigger.Stop();
return;
}

BlockedEmailQueueReader queueReader;
if (_queueReaders.TryPop(out queueReader))
{
queueReader.ContinueWithResult(result);
}
}
}
}
Expand Down
10 changes: 7 additions & 3 deletions src/ZKEACMS.SectionWidget/Controllers/SectionGroupController.cs
Expand Up @@ -10,6 +10,7 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.IO;
using ZKEACMS.PackageManger;
using ZKEACMS.SectionWidget.Models;
using ZKEACMS.SectionWidget.Service;
Expand Down Expand Up @@ -110,9 +111,12 @@ public JsonResult UploadTemplate()
{
try
{
Package package;
var installer = _packageInstallerProvider.CreateInstaller(Request.Form.Files[0].OpenReadStream(), out package);
installer.Install(package);
using(Stream stream = Request.Form.Files[0].OpenReadStream())
{
Package package;
var installer = _packageInstallerProvider.CreateInstaller(stream, out package);
installer.Install(package);
}
}
catch (Exception ex)
{
Expand Down
2 changes: 2 additions & 0 deletions src/ZKEACMS.SectionWidget/Models/SectionGroup.cs
Expand Up @@ -168,6 +168,8 @@ protected override void ViewConfigure()
ViewConfig(m => m.SectionImages).AsHidden().Ignore();
ViewConfig(m => m.Paragraph).AsHidden().Ignore();
ViewConfig(m => m.Paragraphs).AsHidden().Ignore();
ViewConfig(m => m.Video).AsHidden().Ignore();
ViewConfig(m => m.Videos).AsHidden().Ignore();
}
}
}
4 changes: 2 additions & 2 deletions src/ZKEACMS.SectionWidget/SectionPlug.cs
Expand Up @@ -35,8 +35,8 @@ public override IEnumerable<RouteDescriptor> RegistRoute()
yield return new RouteDescriptor
{
RouteName = "video-play",
Template = "VideoPlayer/Play",
Defaults = new { controller = "SectionContentVideo", action = "Play" },
Template = "VideoPlayer/Play/{Id}",
Defaults = new { controller = "SectionContentVideo", action = "Play", module = "Section" },
Priority = 10
};
}
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
35 changes: 35 additions & 0 deletions src/ZKEACMS.SectionWidget/Thumbnail/SectionTemplate.Banner.xml
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" ?>
<required>
<item type="SectionContentImage">
<property name="ImageSrc"><![CDATA[http://cdn.zkeasoft.com/BuilderDemo/banner/p1.jpg]]></property>
<property name="ImageAlt"><![CDATA[]]></property>
<property name="ImageTitle"><![CDATA[iPhone 7 在此]]></property>
<property name="Href"><![CDATA[http://www.zkea.net]]></property>
<property name="Width"><![CDATA[]]></property>
<property name="Height"><![CDATA[]]></property>
</item>
<item type="SectionContentImage">
<property name="ImageSrc"><![CDATA[http://cdn.zkeasoft.com/BuilderDemo/banner/p2.jpg]]></property>
<property name="ImageAlt"><![CDATA[]]></property>
<property name="ImageTitle"><![CDATA[MacBook Pro 一身才华一触即发]]></property>
<property name="Href"><![CDATA[http://www.zkea.net]]></property>
<property name="Width"><![CDATA[]]></property>
<property name="Height"><![CDATA[]]></property>
</item>
<item type="SectionContentImage">
<property name="ImageSrc"><![CDATA[http://cdn.zkeasoft.com/BuilderDemo/banner/p3.jpg]]></property>
<property name="ImageAlt"><![CDATA[]]></property>
<property name="ImageTitle"><![CDATA[种种元素,款款显风格,精彩 Apple 配件]]></property>
<property name="Href"><![CDATA[http://www.zkea.net]]></property>
<property name="Width"><![CDATA[]]></property>
<property name="Height"><![CDATA[]]></property>
</item>
<item type="SectionContentImage">
<property name="ImageSrc"><![CDATA[http://cdn.zkeasoft.com/BuilderDemo/banner/p4.jpg]]></property>
<property name="ImageAlt"><![CDATA[]]></property>
<property name="ImageTitle"><![CDATA[Clips 全新登场,有话说,短片来]]></property>
<property name="Href"><![CDATA[http://www.zkea.net]]></property>
<property name="Width"><![CDATA[]]></property>
<property name="Height"><![CDATA[]]></property>
</item>
</required>
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<required>
<item type="SectionContentParagraph">
<property name="HtmlContent">
<![CDATA[<h4 style="word-break:break-all">2017</h4><p>3 / 1</p>]]>
</property>
</item>
<item type="SectionContentParagraph">
<property name="HtmlContent">
<![CDATA[<p><strong>轻松创建美观强大的网站,无需专业技术知识与设计经验。</strong></p><div class="text-muted">无需代码也可以同时拥有电脑网站、手机网站、微信网站。 拖拽建站,懒人建站神器!</div>]]>
</property>
</item>
</required>
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8" ?>
<required>
<item type="SectionContentTitle">
<property name="InnerText"><![CDATA[ZKEASOFT]]></property>
<property name="Href"><![CDATA[]]></property>
<property name="TitleLevel"><![CDATA[h1]]></property>
</item>
<item type="SectionContentTitle">
<property name="InnerText"><![CDATA[Be part of the team]]></property>
<property name="Href"><![CDATA[]]></property>
<property name="TitleLevel"><![CDATA[h2]]></property>
</item>
<item type="SectionContentParagraph">
<property name="HtmlContent"><![CDATA[<p>HyperX is a leading sponsor of top gaming organizations worldwide including America, Europe and Asia, with plans to expand our coverage across multiple game benners and platforms. </p>]]></property>
</item>
<item type="SectionContentImage">
<property name="ImageSrc"><![CDATA[http://cdn.zkeasoft.com/BuilderDemo/Header/ddr3-lg.jpg]]></property>
<property name="ImageAlt"><![CDATA[]]></property>
<property name="ImageTitle"><![CDATA[电脑使用这个图片显示]]></property>
<property name="Href"><![CDATA[http://www.zkea.net]]></property>
<property name="Width"><![CDATA[]]></property>
<property name="Height"><![CDATA[]]></property>
</item>
<item type="SectionContentImage">
<property name="ImageSrc"><![CDATA[http://cdn.zkeasoft.com/BuilderDemo/Header/ddr3-md.jpg]]></property>
<property name="ImageAlt"><![CDATA[]]></property>
<property name="ImageTitle"><![CDATA[平板使用这个图片显示]]></property>
<property name="Href"><![CDATA[http://www.zkea.net]]></property>
<property name="Width"><![CDATA[]]></property>
<property name="Height"><![CDATA[]]></property>
</item>
<item type="SectionContentImage">
<property name="ImageSrc"><![CDATA[http://cdn.zkeasoft.com/BuilderDemo/Header/ddr3-sm.jpg]]></property>
<property name="ImageAlt"><![CDATA[]]></property>
<property name="ImageTitle"><![CDATA[手机将用这个图片显示]]></property>
<property name="Href"><![CDATA[http://www.zkea.net]]></property>
<property name="Width"><![CDATA[]]></property>
<property name="Height"><![CDATA[]]></property>
</item>
</required>
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions src/ZKEACMS.SectionWidget/Thumbnail/SectionTemplate.SalePrice.xml
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<required>
<item type="SectionContentTitle">
<property name="InnerText"><![CDATA[ZKEACMS]]></property>
<property name="TitleLevel"><![CDATA[h3]]></property>
<property name="Href"><![CDATA[]]></property>
</item>
<item type="SectionContentParagraph">
<property name="HtmlContent">
<![CDATA[<h1>完全免费</h1><p>&nbsp;</p><p>ZKEACMS的绝大部分代码都是开源的</p><p>您可以自由地下载它来进行学习</p><p>二次开发或者商用</p><p>&nbsp;</p><p><a class="btn btn-default" href="http://www.zkea.net/zkeacms/download">立即下载</a></p>]]></property>
</item>
</required>
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit e049e3f

Please sign in to comment.