@@ -139,6 +169,13 @@ const beforeUpload: UploadProps['beforeUpload'] = file => {
+
diff --git a/admin-client/src/views/Login.vue b/admin-client/src/views/Login.vue
index 7e70eb7..e7c62e8 100644
--- a/admin-client/src/views/Login.vue
+++ b/admin-client/src/views/Login.vue
@@ -9,8 +9,10 @@ import LanguageComponent from "@/locale/components/LanguageComponent.vue";
import i18n from "@/locale/Main.js";
const state = reactive({
- userName: "admin",
- userPassword: "123456",
+ // userName: "admin",
+ // userPassword: "123456",
+ userName: "MiaoYu",
+ userPassword: "MiaoYu",
});
const inputPassword = ref
(null);
const loading = ref(false);
diff --git a/admin-client/vite.config.ts b/admin-client/vite.config.ts
index 643207f..bd171f9 100644
--- a/admin-client/vite.config.ts
+++ b/admin-client/vite.config.ts
@@ -17,7 +17,7 @@ export default defineConfig({
* 生产环境默认:client 文件夹包起来
* 开发环境默认:/
*/
- base: process.env.NODE_ENV == "production" ? "/client/" : "/",
+ base: process.env.VITE_BASE, // process.env.NODE_ENV == "production" ? "/client/" : "/",
server: {
port: 5501,
host: true,
diff --git a/admin-server/MiaoYu.Api.Admin/ApplicationServices/Apps/MiaoYuChat/TImageConfigService.cs b/admin-server/MiaoYu.Api.Admin/ApplicationServices/Apps/MiaoYuChat/TImageConfigService.cs
index 82d3230..91f8d87 100644
--- a/admin-server/MiaoYu.Api.Admin/ApplicationServices/Apps/MiaoYuChat/TImageConfigService.cs
+++ b/admin-server/MiaoYu.Api.Admin/ApplicationServices/Apps/MiaoYuChat/TImageConfigService.cs
@@ -1,9 +1,14 @@
+using HZY.Framework.Repository.EntityFramework.Extensions;
+
using IdGen;
+using MiaoYu.Api.Admin.Models.Dtos.Apps.Cos;
+using MiaoYu.Core.Cos.Models;
using MiaoYu.Core.Cos.Services;
using MiaoYu.Repository.ChatAI.Admin.Entities;
using NPOI.SS.Formula.Functions;
+using NPOI.Util;
namespace MiaoYu.Api.Admin.ApplicationServices.Apps;
///
@@ -28,6 +33,7 @@ public class TImageConfigService : ApplicationService w.Name.Contains(pagingSearchInput.Search.Name ?? ""))
+ .WhereIf(pagingSearchInput.Search?.ImageType > -1, w => w.ImageType == pagingSearchInput.Search.ImageType)
.OrderByDescending(w => w.Id)
.Select(w => new
{
@@ -40,6 +46,7 @@ public class TImageConfigService : ApplicationService
/// form
///
- public async Task SaveFormAsync(T_Image_Config form)
+ public async Task SaveFormAsync(T_Image_Config form, bool isUpdate)
{
form.UpdateAt = DateTime.Now;
- form.CreateAt = DateTime.Now;
- var isUpdate = false;
- if (form.Id != 0)
+ if (form.CreateAt == DateTime.MinValue)
{
- var _tempform = this._defaultRepository.FindById(form.Id);
- if (_tempform != null)
- {
- form.CreateAt = _tempform.CreateAt;
- isUpdate = true;
- }
+ form.CreateAt = DateTime.Now;
}
+
+ //var isUpdate = false;
+ //if (form.Id != 0)
+ //{
+ // var _tempform = this._defaultRepository.FindById(form.Id);
+ // if (_tempform != null)
+ // {
+ // form.CreateAt = _tempform.CreateAt;
+ // isUpdate = true;
+ // }
+ //}
var x = await this._defaultRepository.InsertOrUpdateAsync(form);
if (x.ImageId == 0 && !isUpdate)
{
@@ -130,10 +141,48 @@ public class TImageConfigService : ApplicationService
///
- public string GetCosSign() {
- var (sign,ex) = codeCosService.GenerateSignURL(new MiaoYu.Core.Cos.Models.CosGenerateSign());
+ public string GetCosSign()
+ {
+ var (sign, ex) = codeCosService.GenerateSignURL(new MiaoYu.Core.Cos.Models.CosGenerateSign());
return sign;
}
+ ///
+ /// 获取临时签名
+ ///
+ ///
+ public GenerateTemporaryModel GetGenerateTemporaryKey(string fileName = "", string modelName = "")
+ {
+ var t = new CosGenerateSign()
+ {
+ Prefixes = "miaoyu"
+ };
+ if (string.IsNullOrEmpty(modelName))
+ {
+ modelName = $"images";
+ }
+ var tempFile = fileName;
+ if (!string.IsNullOrEmpty(tempFile))
+ {
+ var ext = Path.GetExtension(tempFile);
+ if (!string.IsNullOrEmpty(ext))
+ {
+ Random random = new Random();
+
+ tempFile = $"{DateTime.Now.ToUnixTimeSeconds()}{ext}";
+ }
+ }
+ var model = codeCosService.GenerateTemporaryKey(t);
+ //
+ GenerateTemporaryModel generateTemporaryModel = model.CopyObject() ?? new GenerateTemporaryModel();
+ generateTemporaryModel.Bucket = t.Bucket + "-" + t.AppId;
+ generateTemporaryModel.Region = t.Region;
+ generateTemporaryModel.Prefixes = t.Prefixes;
+ generateTemporaryModel.FilePath = $"{t.Prefixes}/{modelName}/{DateTime.Now.ToString("yyyMMdd")}/{tempFile}";
+ generateTemporaryModel.DomainName = "https://cos.shhuanmeng.com/";
+ return generateTemporaryModel;
+
+ }
+
}
\ No newline at end of file
diff --git a/admin-server/MiaoYu.Api.Admin/Controllers/Apps/MiaoYuChat/TImageConfigController.cs b/admin-server/MiaoYu.Api.Admin/Controllers/Apps/MiaoYuChat/TImageConfigController.cs
index bf4cf99..27e875d 100644
--- a/admin-server/MiaoYu.Api.Admin/Controllers/Apps/MiaoYuChat/TImageConfigController.cs
+++ b/admin-server/MiaoYu.Api.Admin/Controllers/Apps/MiaoYuChat/TImageConfigController.cs
@@ -1,4 +1,6 @@
using MiaoYu.Api.Admin.ApplicationServices.Apps;
+using MiaoYu.Api.Admin.Models.Dtos.Apps.Cos;
+using MiaoYu.Core.Cos.Models;
using MiaoYu.Repository.ChatAI.Admin.Entities;
namespace MiaoYu.Api.Admin.Controllers.Apps;
@@ -60,9 +62,13 @@ public class TImageConfigController : AdminControllerBase
[ActionDescriptor(PermissionFunctionConsts.Function_Insert, DisplayName = "创建表单")]
[HttpPost]
[ApiCheckModel]
- public Task CreateAsync([FromBody] T_Image_Config form)
+ public async Task CreateAsync([FromBody] T_Image_Config form)
{
- return this._defaultService.SaveFormAsync(form);
+
+ form.UpdateAt = DateTime.Now;
+ form.CreateAt = DateTime.Now;
+ var image = await this._defaultService.SaveFormAsync(form,false);
+ return image?.ImageId ?? 0;
}
///
@@ -74,9 +80,11 @@ public class TImageConfigController : AdminControllerBase
[ActionDescriptor(PermissionFunctionConsts.Function_Update, DisplayName = "编辑表单")]
[HttpPost]
[ApiCheckModel]
- public Task UpdateAsync([FromBody] T_Image_Config form)
+ public async Task UpdateAsync([FromBody] T_Image_Config form)
{
- return this._defaultService.SaveFormAsync(form);
+ form.UpdateAt = DateTime.Now;
+ var image = await this._defaultService.SaveFormAsync(form, true);
+ return image?.ImageId ?? 0;
}
///
@@ -94,7 +102,7 @@ public class TImageConfigController : AdminControllerBase
base.HttpContext.DownLoadFile(data, Tools.GetFileContentType[".xls"].ToStr(), name);
}
-
+
///
///
///
@@ -106,5 +114,17 @@ public class TImageConfigController : AdminControllerBase
return this._defaultService.GetCosSign();
}
+ ///
+ /// 获取临时密钥
+ ///
+ ///
+ [HttpGet]
+ [AllowAnonymous]
+ [ActionDescriptor(DisplayName = "获取cos临时密钥")]
+ public GenerateTemporaryModel GetGenerateTemporaryKey(string fileName = "", string modelName = "")
+ {
+ return this._defaultService.GetGenerateTemporaryKey(fileName, modelName);
+ }
+
}
\ No newline at end of file
diff --git a/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml b/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml
index 56408bb..b5db5f6 100644
--- a/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml
+++ b/admin-server/MiaoYu.Api.Admin/MiaoYu.Api.Admin.xml
@@ -195,7 +195,7 @@
id
-
+
保存数据
@@ -215,6 +215,12 @@
+
+
+ 获取临时签名
+
+
+
人物表 服务 T_CharacterService
@@ -1531,6 +1537,12 @@
+
+
+ 获取临时密钥
+
+
+
人物表 控制器
@@ -2489,6 +2501,36 @@
+
+
+ cos临时密钥
+
+
+
+
+ 存储桶名称
+
+
+
+
+ 关于地域的详情见
+
+
+
+
+ 前缀
+
+
+
+
+ 文件路径
+
+
+
+
+ 域名
+
+
生成代码上下文
diff --git a/admin-server/MiaoYu.Api.Admin/Models/Dtos/Apps/Cos/GenerateTemporaryModel.cs b/admin-server/MiaoYu.Api.Admin/Models/Dtos/Apps/Cos/GenerateTemporaryModel.cs
new file mode 100644
index 0000000..d9480d7
--- /dev/null
+++ b/admin-server/MiaoYu.Api.Admin/Models/Dtos/Apps/Cos/GenerateTemporaryModel.cs
@@ -0,0 +1,36 @@
+using MiaoYu.Core.Cos.Models;
+
+namespace MiaoYu.Api.Admin.Models.Dtos.Apps.Cos
+{
+ ///
+ /// cos临时密钥
+ ///
+ public class GenerateTemporaryModel : CodeCosGenerateTemporaryKeyEntity
+ {
+ ///
+ /// 存储桶名称
+ ///
+ public string Bucket { get; set; }
+
+ ///
+ /// 关于地域的详情见
+ ///
+ public string Region { get; set; }
+
+ ///
+ /// 前缀
+ ///
+ public string Prefixes { get; set; }
+
+ ///
+ /// 文件路径
+ ///
+ public string FilePath { get; set; }
+
+
+ ///
+ /// 域名
+ ///
+ public string DomainName { get; set; }
+ }
+}
diff --git a/admin-server/MiaoYu.Api.Admin/appsettings.json b/admin-server/MiaoYu.Api.Admin/appsettings.json
index 964849d..3e6c541 100644
--- a/admin-server/MiaoYu.Api.Admin/appsettings.json
+++ b/admin-server/MiaoYu.Api.Admin/appsettings.json
@@ -44,8 +44,8 @@
},
//腾讯云配置
"TencentCloud": {
- "SecretId": "AKIDLbhdP0Vs57yd7QZWu8A2jFbno8JKBUp6",
- "SecretKey": "MlP5tcUG6mdj7TwOpDWnZNFGIrJY8eH4",
+ "SecretId": "AKIDVyMfzKZdZP8zkNyOdsFuSsBJDB7EScs0",
+ "SecretKey": "89GWr7JPWYTL8ueHlAYowGZnvzKZjqs9",
"AppId": "1308826010",
"SMSCode": {
//请求方式
@@ -61,8 +61,8 @@
},
"CosConfig": {
"AppId": "1308826010",
- "SecretId": "AKIDLbhdP0Vs57yd7QZWu8A2jFbno8JKBUp6",
- "SecretKey": "MlP5tcUG6mdj7TwOpDWnZNFGIrJY8eH4",
+ "SecretId": "AKIDVyMfzKZdZP8zkNyOdsFuSsBJDB7EScs0",
+ "SecretKey": "89GWr7JPWYTL8ueHlAYowGZnvzKZjqs9",
"DurationSecond": "300",
"Region": "ap-shanghai",
"Bucket": "miaoyu"
diff --git a/admin-server/MiaoYu.Core.Cos/MiaoYu.Core.Cos.csproj b/admin-server/MiaoYu.Core.Cos/MiaoYu.Core.Cos.csproj
index 790a5b2..ffe6060 100644
--- a/admin-server/MiaoYu.Core.Cos/MiaoYu.Core.Cos.csproj
+++ b/admin-server/MiaoYu.Core.Cos/MiaoYu.Core.Cos.csproj
@@ -9,6 +9,7 @@
+
diff --git a/admin-server/MiaoYu.Core.Cos/Models/CodeCosGenerateSignEntity.cs.cs b/admin-server/MiaoYu.Core.Cos/Models/CodeCosGenerateSignEntity.cs.cs
index 4fdec7e..bd5e8e6 100644
--- a/admin-server/MiaoYu.Core.Cos/Models/CodeCosGenerateSignEntity.cs.cs
+++ b/admin-server/MiaoYu.Core.Cos/Models/CodeCosGenerateSignEntity.cs.cs
@@ -11,8 +11,13 @@ namespace MiaoYu.Core.Cos.Models
///
/// 生成签名
///
- public class CosGenerateSign: TencentCosConfig
+ public class CosGenerateSign : TencentCosConfig
{
-
+ ///
+ /// 允许的前缀
+ ///
+ public string Prefixes { get; set; }
}
+
+
}
diff --git a/admin-server/MiaoYu.Core.Cos/Models/CodeCosGenerateTemporaryKeyEntity.cs b/admin-server/MiaoYu.Core.Cos/Models/CodeCosGenerateTemporaryKeyEntity.cs
new file mode 100644
index 0000000..f7f3e08
--- /dev/null
+++ b/admin-server/MiaoYu.Core.Cos/Models/CodeCosGenerateTemporaryKeyEntity.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MiaoYu.Core.Cos.Models
+{
+ ///
+ /// 获取临时访问凭证
+ ///
+ public class CodeCosGenerateTemporaryKeyEntity
+ {
+ ///
+ /// 临时访问凭证
+ ///
+ public Credentials Credentials { get; set; }
+ ///
+ /// 临时访问凭证有效的时间,返回 Unix 时间戳,精确到秒
+ ///
+ public string Expiration { get; set; }
+ ///
+ /// 临时访问凭证有效的时间,以 iso8601 格式的 UTC 时间表示 注意:此字段可能返回 null,表示取不到有效值。
+ ///
+ public long ExpiredTime { get; set; }
+
+ ///
+ /// 开始时间
+ ///
+ public long StartTime { get; set; }
+ ///
+ /// 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。
+ ///
+ public string RequestId { get; set; }
+ }
+
+ ///
+ /// 临时访问凭证
+ ///
+ public class Credentials
+ {
+ ///
+ /// Token
+ ///
+ public string Token { get; set; }
+ ///
+ /// SecretId
+ ///
+ public string TmpSecretId { get; set; }
+ ///
+ /// SecretKey
+ ///
+ public string TmpSecretKey { get; set; }
+ }
+
+}
diff --git a/admin-server/MiaoYu.Core.Cos/Services/ICodeCosService.cs b/admin-server/MiaoYu.Core.Cos/Services/ICodeCosService.cs
index fd93656..61670f5 100644
--- a/admin-server/MiaoYu.Core.Cos/Services/ICodeCosService.cs
+++ b/admin-server/MiaoYu.Core.Cos/Services/ICodeCosService.cs
@@ -4,7 +4,7 @@ namespace MiaoYu.Core.Cos.Services;
///
///
///
-public interface ICodeCosService:ISingletonDependency //:ITransientDependency: IScopedDependency
+public interface ICodeCosService : ISingletonDependency //:ITransientDependency: IScopedDependency
{
///
/// 返回签名地址
@@ -12,5 +12,11 @@ public interface ICodeCosService:ISingletonDependency //:ITransientDependency: I
///
/// sign签名值,过期时间
(string sign, int expiredSeconds) GenerateSignURL(CosGenerateSign cosGenerateSign);
+ ///
+ /// 生成临时密钥
+ ///
+ ///
+ CodeCosGenerateTemporaryKeyEntity GenerateTemporaryKey(CosGenerateSign cosGenerateSign);
+
}
diff --git a/admin-server/MiaoYu.Core.Cos/Services/Impl/TencentCodeCosService.cs b/admin-server/MiaoYu.Core.Cos/Services/Impl/TencentCodeCosService.cs
index bb555ac..20a3e94 100644
--- a/admin-server/MiaoYu.Core.Cos/Services/Impl/TencentCodeCosService.cs
+++ b/admin-server/MiaoYu.Core.Cos/Services/Impl/TencentCodeCosService.cs
@@ -10,6 +10,10 @@ using System.Threading.Tasks;
using COSXML.Auth;
using MiaoYu.Core.Cos.Configs;
using NPOI.SS.Formula.Functions;
+using COSSTS;
+using Newtonsoft.Json;
+using System.Collections;
+using TencentCloud.Tci.V20190318.Models;
namespace MiaoYu.Core.Cos.Services.Impl
{
@@ -77,5 +81,70 @@ namespace MiaoYu.Core.Cos.Services.Impl
}
throw new NotImplementedException();
}
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public CodeCosGenerateTemporaryKeyEntity GenerateTemporaryKey(CosGenerateSign cosGenerateSign)
+ {
+ #region 验证区域
+ if (string.IsNullOrEmpty(cosGenerateSign.Bucket))
+ {
+ cosGenerateSign.Bucket = tencentCosConfig.Bucket;
+ }
+ if (string.IsNullOrEmpty(cosGenerateSign.AppId))
+ {
+ cosGenerateSign.AppId = tencentCosConfig.AppId;
+ }
+ if (string.IsNullOrEmpty(cosGenerateSign.Region))
+ {
+ cosGenerateSign.Region = tencentCosConfig.Region;
+ }
+ #endregion
+
+ string bucket = cosGenerateSign.Bucket + "-" + cosGenerateSign.AppId; // 您的 bucket
+
+ string region = cosGenerateSign.Region;// bucket 所在区域
+
+ // 改成允许的路径前缀,根据自己网站的用户判断允许上传的路径,例子:a.jpg 或者 a/* 或者 * (通配符*存在重大安全风险, 谨慎评估使用)
+ string allowPrefix = "*";
+ /*
+ * 密钥的权限列表。必须在这里指定本次临时密钥所需要的权限。权限列表请参见 https://cloud.tencent.com/document/product/436/31923
+ * 规则为 {project}:{interfaceName}
+ * project : 产品缩写 cos相关授权为值为cos,数据万象(数据处理)相关授权值为ci
+ * 授权所有接口用*表示,例如 cos:*,ci:*
+ */
+ string[] allowActions = new string[]
+ {
+ "name/cos:PutObject",
+ "name/cos:PostObject",
+ "name/cos:InitiateMultipartUpload",
+ "name/cos:ListMultipartUploads",
+ "name/cos:ListParts",
+ "name/cos:UploadPart",
+ "name/cos:CompleteMultipartUpload"
+ };
+
+ //设置参数
+ Dictionary values = new Dictionary();
+ values.Add("bucket", bucket);
+ values.Add("region", region);
+ values.Add("allowPrefix", allowPrefix);
+ // 也可以通过 allowPrefixes 指定路径前缀的集合
+ values.Add("allowPrefixes", new string[] {
+ string.IsNullOrEmpty(cosGenerateSign.Prefixes)?"miaoyu/*":cosGenerateSign.Prefixes,
+ });
+ values.Add("allowActions", allowActions);
+ values.Add("durationSeconds", 600);//指定临时证书的有效期, 参考 https://cloud.tencent.com/document/product/1312/48195
+ values.Add("secretId", tencentCosConfig.SecretId);
+ values.Add("secretKey", tencentCosConfig.SecretKey);
+
+ Dictionary credential = STSClient.genCredential(values); //返回值说明见README.md
+ var json = JsonConvert.SerializeObject(credential);
+ var person = JsonConvert.DeserializeObject(json);
+ return person;
+ }
}
}
diff --git a/admin-server/MiaoYu.Core/MiaoYu.Core.xml b/admin-server/MiaoYu.Core/MiaoYu.Core.xml
index 2360eb8..e97d823 100644
--- a/admin-server/MiaoYu.Core/MiaoYu.Core.xml
+++ b/admin-server/MiaoYu.Core/MiaoYu.Core.xml
@@ -657,6 +657,13 @@
+
+
+ 复制对象
+
+
+
+
转 json string
diff --git a/admin-server/MiaoYu.Core/Tools.cs b/admin-server/MiaoYu.Core/Tools.cs
index 07ae439..ca57802 100644
--- a/admin-server/MiaoYu.Core/Tools.cs
+++ b/admin-server/MiaoYu.Core/Tools.cs
@@ -862,6 +862,16 @@ public static class Tools
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(sourceObj));
}
+ ///
+ /// 复制对象
+ ///
+ ///
+ ///
+ public static T1? CopyObject(this T sourceObj)
+ {
+ return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(sourceObj));
+ }
+
///
/// 转 json string
///
diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/Entities/T_Image_Config.cs b/admin-server/MiaoYu.Repository.ChatAI.Admin/Entities/T_Image_Config.cs
index bbed8a4..3ad8ac2 100644
--- a/admin-server/MiaoYu.Repository.ChatAI.Admin/Entities/T_Image_Config.cs
+++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/Entities/T_Image_Config.cs
@@ -19,6 +19,9 @@ namespace MiaoYu.Repository.ChatAI.Admin.Entities
public partial class T_Image_Config : DefaultEntityV4
{
+
+
+
///
/// 图片Id
///
@@ -27,13 +30,12 @@ namespace MiaoYu.Repository.ChatAI.Admin.Entities
///
/// 图片名称
///
- public string Name { get; set; }
+ public string Name { get; set; } = null!;
///
- /// 图片url
+ /// 图片地址
///
-
- public string Url { get; set; }
+ public string Url { get; set; } = null!;
///
/// 创建时间
@@ -60,6 +62,11 @@ namespace MiaoYu.Repository.ChatAI.Admin.Entities
///
public string? Region { get; set; }
+ ///
+ /// 图片类型
+ ///
+ public int ImageType { get; set; }
+
}
}
diff --git a/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml b/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml
index 833e66f..477ce9d 100644
--- a/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml
+++ b/admin-server/MiaoYu.Repository.ChatAI.Admin/MiaoYu.Repository.ChatAI.Admin.xml
@@ -134,7 +134,7 @@
- 图片url
+ 图片地址
@@ -162,5 +162,10 @@
地域
+
+
+ 图片类型
+
+