commits列表 30 项
提交内容 13/13
丰富redis接口
example/ExampleApeart.Application.Contracts/usermodels/UserGradeDto.cs
diff --git a/example/ExampleApeart.Application.Contracts/usermodels/UserGradeDto.cs b/example/ExampleApeart.Application.Contracts/usermodels/UserGradeDto.cs
index 6b754cc..70a9252 100644
--- a/example/ExampleApeart.Application.Contracts/usermodels/UserGradeDto.cs
+++ b/example/ExampleApeart.Application.Contracts/usermodels/UserGradeDto.cs
@@ -91,6 +91,7 @@ namespace ExampleApeart.usermodels
     ///用户绑定角色 解绑的直接删除数据
     ///</summary>
     [Description("用户绑定角色 解绑的直接删除数据")]
+    [PasteBatch("批量禁用","func_batch_disable_usergrade(this);")]
     public class UserGradeListDto : EntityDto<int>
     {
         ///<summary>
example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
diff --git a/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs b/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
index ab81e7a..de8fed6 100644
--- a/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
+++ b/example/ExampleApeart.Application/usermodels/RoleInfoAppService.cs
@@ -7,6 +7,7 @@ using PasteApeart;
 using PasteApeart.Application.Contracts;
 using PasteApeart.Handler;
 using PasteApeart.Handler.Extensions;
+using PasteApeart.Handler.Level;
 using PasteApeart.Helper;
 using System.Linq.Dynamic.Core;
 
example/ExampleApeart.Handler/SerilogCustomHandler.cs
diff --git a/example/ExampleApeart.Handler/SerilogCustomHandler.cs b/example/ExampleApeart.Handler/SerilogCustomHandler.cs
index eee13dd..ed2cf8d 100644
--- a/example/ExampleApeart.Handler/SerilogCustomHandler.cs
+++ b/example/ExampleApeart.Handler/SerilogCustomHandler.cs
@@ -1,5 +1,6 @@
 using Microsoft.Extensions.DependencyInjection;
 using PasteApeart;
+using PasteApeart.Handler;
 using Serilog.Core;
 using Serilog.Events;
 
example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.xml
diff --git a/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.xml b/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.xml
index 409f8e4..fca88b9 100644
--- a/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.xml
+++ b/example/ExampleApeart.HttpApi.Host/ExampleApeart.Application.xml
@@ -90,7 +90,7 @@
             
             </summary>
         </member>
-        <member name="M:ExampleApeart.Application.ExampleApeartDefaultService.#ctor(PasteApeart.Application.IPasteDefaultHelper,PasteApeart.IChannelHelper,ExampleApeart.EntityFrameworkCore.IExampleApeartDbContext)">
+        <member name="M:ExampleApeart.Application.ExampleApeartDefaultService.#ctor(PasteApeart.Application.IPasteDefaultHelper,PasteApeart.Handler.IChannelHelper,ExampleApeart.EntityFrameworkCore.IExampleApeartDbContext)">
             <summary>
             
             </summary>
example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
diff --git a/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml b/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
index 7c70fd4..4a8a077 100644
--- a/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
+++ b/example/ExampleApeart.HttpApi.Host/ExampleApeart.HttpApi.Host.xml
@@ -444,7 +444,7 @@
             系统初始化
             </summary>
         </member>
-        <member name="M:ExampleApeart.StartHostedService.#ctor(System.IServiceProvider,Microsoft.Extensions.Options.IOptions{PasteApeart.Application.Contracts.RabbitConfig},PasteApeart.Handler.rabbit.IRabbitMultiConsumerHandler,Microsoft.Extensions.Logging.ILogger{ExampleApeart.StartHostedService},PasteApeart.IChannelHelper,PasteApeart.Handler.IEventActionHandler,Microsoft.Extensions.Options.IOptions{ExampleApeart.AppConfig})">
+        <member name="M:ExampleApeart.StartHostedService.#ctor(System.IServiceProvider,Microsoft.Extensions.Options.IOptions{PasteApeart.Application.Contracts.RabbitConfig},PasteApeart.Handler.rabbit.IRabbitMultiConsumerHandler,Microsoft.Extensions.Logging.ILogger{ExampleApeart.StartHostedService},PasteApeart.Handler.IChannelHelper,PasteApeart.Handler.IEventActionHandler,Microsoft.Extensions.Options.IOptions{ExampleApeart.AppConfig})">
             <summary>
             
             </summary>
framework/Directory.Build.props
diff --git a/framework/Directory.Build.props b/framework/Directory.Build.props
index a19d739..6250c4d 100644
--- a/framework/Directory.Build.props
+++ b/framework/Directory.Build.props
@@ -1,7 +1,7 @@
 <Project>
   <PropertyGroup>
-    <Version>26.9.23</Version>
-    <FileVersion>26.9.23</FileVersion>
-    <AssemblyVersion>26.9.23</AssemblyVersion>
+    <Version>26.9.24</Version>
+    <FileVersion>26.9.24</FileVersion>
+    <AssemblyVersion>26.9.24</AssemblyVersion>
   </PropertyGroup>
 </Project>
\ No newline at end of file
framework/PasteApeart.Handler/redis/IAppCache.cs
diff --git a/framework/PasteApeart.Handler/redis/IAppCache.cs b/framework/PasteApeart.Handler/redis/IAppCache.cs
index ab93a2e..8942cb7 100644
--- a/framework/PasteApeart.Handler/redis/IAppCache.cs
+++ b/framework/PasteApeart.Handler/redis/IAppCache.cs
@@ -645,6 +645,130 @@ namespace PasteApeart.Handler.redis
 
 
 
+        #region -----------------------blog---------------------------------
+
+
+
+        /// <summary>
+        /// 添加某一个数据
+        /// </summary>
+        /// <param name="key"></param>
+        /// <param name="felid"></param>
+        /// <param name="num"></param>
+        Task HashIncrementAsync(string key, string felid, int num = 1);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        Task<string> ReadStringAsync(string key);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        Task<T> ReadObjectAsync<T>(string key);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="val"></param>
+        /// <returns></returns>
+        Task<bool> SetAddAsync(string skey, int val);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="filed"></param>
+        /// <returns></returns>
+        Task<bool> SetContainsAsync(string skey, int filed);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="filed"></param>
+        /// <returns></returns>
+        Task<bool> SetRemoveAsync(string skey, int filed);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        Task<long> SetRandomMemberAsync(string skey);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        Task<long> SetLengthAsync(string skey);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="sval"></param>
+        /// <returns></returns>
+        Task<long> ListRightPushAsync(string skey, string sval);
+
+        /// <summary>
+        /// 返回最小的一个 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="score">时间戳秒</param>
+        /// <returns></returns>
+        Task<string> SortedSetRangeByScoreAsync(string skey, long score);
+
+        /// <summary>
+        /// 获取当前排期最长的任务时间戳 如果没有则返回当前时间戳
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns>时间戳秒</returns>
+        Task<long> SortedSetRangeByRankWithScoresAsync(string skey);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        Task<long> ListLengthAsync(string skey);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        Task<string> ListLeftPopAsync(string skey);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="start"></param>
+        /// <param name="stop"></param>
+        /// <returns></returns>
+        Task<List<string>> ListRangeAsync(string skey, int start = 0, int stop = 30);
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="start"></param>
+        /// <param name="stop"></param>
+        /// <returns></returns>
+        Task<List<T>> ListRangeAsync<T>(string skey, int start = 0, int stop = 30);
+
+
+        #endregion
+
+
     }
 
 }
framework/PasteApeart.Handler/redis/MemoryClient.cs
diff --git a/framework/PasteApeart.Handler/redis/MemoryClient.cs b/framework/PasteApeart.Handler/redis/MemoryClient.cs
index 48a088e..229d2a2 100644
--- a/framework/PasteApeart.Handler/redis/MemoryClient.cs
+++ b/framework/PasteApeart.Handler/redis/MemoryClient.cs
@@ -1447,6 +1447,81 @@ namespace PasteApeart.Handler.redis
             }
         }
 
+        public Task HashIncrementAsync(string key, string felid, int num = 1)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<string> ReadStringAsync(string key)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<T> ReadObjectAsync<T>(string key)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<bool> SetAddAsync(string skey, int val)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<bool> SetContainsAsync(string skey, int filed)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<bool> SetRemoveAsync(string skey, int filed)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<long> SetRandomMemberAsync(string skey)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<long> SetLengthAsync(string skey)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<long> ListRightPushAsync(string skey, string sval)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<string> SortedSetRangeByScoreAsync(string skey, long score)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<long> SortedSetRangeByRankWithScoresAsync(string skey)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<long> ListLengthAsync(string skey)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<string> ListLeftPopAsync(string skey)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<List<string>> ListRangeAsync(string skey, int start = 0, int stop = 30)
+        {
+            throw new NotImplementedException();
+        }
+
+        public Task<List<T>> ListRangeAsync<T>(string skey, int start = 0, int stop = 30)
+        {
+            throw new NotImplementedException();
+        }
+
         #endregion
 
 
framework/PasteApeart.Handler/redis/RedisClient.cs
diff --git a/framework/PasteApeart.Handler/redis/RedisClient.cs b/framework/PasteApeart.Handler/redis/RedisClient.cs
index 65faf29..7f68d6d 100644
--- a/framework/PasteApeart.Handler/redis/RedisClient.cs
+++ b/framework/PasteApeart.Handler/redis/RedisClient.cs
@@ -1,4 +1,5 @@
 using Microsoft.Extensions.Options;
+using PasteApeart.Handler.Extend;
 using StackExchange.Redis;
 using System.Text.Json;
 
@@ -833,18 +834,6 @@ namespace PasteApeart.Handler.redis
         /// <param name="key"></param>
         /// <param name="start"></param>
         /// <param name="end"></param>
-        /// <param name="bit"></param>   
-        /// <returns></returns>
-        public long StringBitPosition(string key, int start, int end, bool bit)
-        {
-            return _database.StringBitPosition(setKey(key), bit, start, end);
-        }
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="key"></param>
-        /// <param name="start"></param>
-        /// <param name="end"></param>
         /// <param name="bit"></param>
         /// <returns></returns>
         public async Task<long> StringBitPositionAsync(string key, int start, int end, bool bit)
@@ -852,43 +841,6 @@ namespace PasteApeart.Handler.redis
             return await _database.StringBitPositionAsync(setKey(key), bit, start, end);
         }
 
-
-        /// <summary>
-        /// 获取个数?
-        /// </summary>
-        /// <param name="deskey"></param>
-        /// <param name="key"></param>
-        /// <returns></returns>
-        public long StringBitOperation(string deskey, string key)
-        {
-            return _database.StringBitOperation(Bitwise.And, setKey(deskey), setKey(key));
-        }
-
-
-        /// <summary>
-        /// 设置值
-        /// </summary>
-        /// <param name="key"></param>
-        /// <param name="offset"></param>
-        /// <param name="bit"></param>
-        /// <returns></returns>
-        public bool StringSetBit(string key, long offset, bool bit)
-        {
-            return _database.StringSetBit(setKey(key), offset, bit);
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="key"></param>
-        /// <param name="start"></param>
-        /// <param name="end"></param>
-        /// <returns></returns>
-        public long StringBitCount(string key, long start = 0, long end = -1)
-        {
-            return _database.StringBitCount(setKey(key), start, end);
-        }
-
         /// <summary>
         /// 
         /// </summary>
@@ -1205,7 +1157,328 @@ namespace PasteApeart.Handler.redis
         }
 
 
+        #region -----------------blog--------------------------------
+
+
+        #region Hash模块
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        public async Task<string[]> HashKeysAsync(string key)
+        {
+            var keys = await _database.HashKeysAsync(setKey(key));
+            var list = new List<string>();
+            foreach (var item in keys)
+            {
+                list.Add(item.ToString());
+            }
+            return list.ToArray();
+        }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        public Task<string> ReadStringAsync(string key)
+        {
+            return Task.Run<string>((Func<Task<string>>)(async () =>
+            {
+                return await this._database.StringGetAsync(setKey(key));
+            }));
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        public async Task<T> ReadObjectAsync<T>(string key)
+        {
+
+            string str = await _database.StringGetAsync(setKey(key));
+            if (!string.IsNullOrEmpty(str))
+            {
+                return JsonSerializer.Deserialize<T>(str, JsonConfig.Options);// Newtonsoft.Json.JsonConvert.DeserializeObject<T>(str);
+            }
+            return default(T);
+
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="val"></param>
+        /// <returns></returns>
+        public async Task<bool> SetAddAsync(string skey, int val)
+        {
+            return await _database.SetAddAsync(setKey(skey), val);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="filed"></param>
+        /// <returns></returns>
+        public async Task<bool> SetContainsAsync(string skey, int filed)
+        {
+            return await _database.SetContainsAsync(setKey(skey), filed);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="filed"></param>
+        /// <returns></returns>
+        public async Task<bool> SetRemoveAsync(string skey, int filed)
+        {
+            return await _database.SetRemoveAsync(setKey(skey), filed);
+        }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        public async Task<long> SetRandomMemberAsync(string skey)
+        {
+            (await _database.SetRandomMemberAsync(setKey(skey))).TryParse(out long val);
+            return val;
+        }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        public async Task<long> SetLengthAsync(string skey)
+        {
+            return (await _database.SetLengthAsync(setKey(skey)));
+        }
+
+        /// <summary>
+        /// 获取排序中的第一个field并删除
+        /// type.action.randcode.id
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        public async Task<string> SortedSetRangeByRankAsync(string skey)
+        {
+            var _read = await _database.SortedSetRangeByRankAsync(setKey(skey), 0, 1);
+            if (_read != null && _read.Length > 0)
+            {
+                var _current = _read[0];
+                await _database.SortedSetRemoveAsync(setKey(skey), _current);
+                return _current.ToString();
+            }
+            return String.Empty;
+        }
+
+        /// <summary>
+        /// 返回最近的一个!并删除
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="_time"></param>
+        /// <returns></returns>
+        public async Task<string> SortedSetRangeByScoreWithScoresAsync(string skey, long _time)
+        {
+            var reads = await _database.SortedSetRangeByScoreWithScoresAsync(setKey(skey), 0, _time, take: 1);
+            if (reads != null && reads.Length > 0)
+            {
+                var _field = reads[0].Element.ToString();
+                await _database.SortedSetRemoveAsync(setKey(skey), _field);
+                return _field;
+            }
+            return String.Empty;
+        }
+
+        /// <summary>
+        /// 返回最近的一个!并删除
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="_time">yyyyMMddHHmmss</param>
+        /// <returns></returns>
+        public async Task<string> SortedSetRangeByScoreAsync(string skey, long _time)
+        {
+            var reads = await _database.SortedSetRangeByScoreAsync(setKey(skey), 0, _time, take: 1);
+            if (reads != null && reads.Length > 0)
+            {
+                var _field = reads[0].ToString();
+                await _database.SortedSetRemoveAsync(setKey(skey), _field);
+                return _field;
+            }
+            return String.Empty;
+        }
+
+        /// <summary>
+        /// 获取当前排期最长的任务时间戳 如果没有则返回当前时间戳
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns>时间戳秒</returns>
+        public async Task<long> SortedSetRangeByRankWithScoresAsync(string skey)
+        {
+            var _read = await _database.SortedSetRangeByRankWithScoresAsync(setKey(skey), 0, 1, Order.Descending);
+            if (_read != null && _read.Length > 0)
+            {
+                var _current = _read[0];
+                return (long)_current.Score;
+            }
+            return DateTime.Now.ToUnixTimeSeconds();
+        }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="start"></param>
+        /// <param name="stop"></param>
+        /// <returns></returns>
+        public List<string> ListRange(string skey, int start = 0, int stop = 30)
+        {
+            var vals = _database.ListRange(setKey(skey), start, stop);
+            if (vals != null && vals.Length > 0)
+            {
+                var strs = new List<string>();
+                foreach (var item in vals)
+                {
+                    if (item.HasValue)
+                    {
+                        strs.Add(item.ToString());
+                    }
+                }
+                return strs;
+            }
+            return new List<string>();
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="start"></param>
+        /// <param name="stop"></param>
+        /// <returns></returns>
+        public async Task<List<string>> ListRangeAsync(string skey, int start = 0, int stop = 30)
+        {
+            var vals = await _database.ListRangeAsync(setKey(skey), start, stop);
+            if (vals != null && vals.Length > 0)
+            {
+                var strs = new List<string>();
+                foreach (var item in vals)
+                {
+                    if (item.HasValue)
+                    {
+                        strs.Add(item.ToString());
+                    }
+                }
+                return strs;
+            }
+            return new List<string>();
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="start"></param>
+        /// <param name="stop"></param>
+        /// <returns></returns>
+        public List<T> ListRange<T>(string skey, int start = 0, int stop = 30)
+        {
+            var vals = _database.ListRange(setKey(skey), start, stop);
+            if (vals != null && vals.Length > 0)
+            {
+                var strs = new List<T>();
+                foreach (var item in vals)
+                {
+                    if (item.HasValue)
+                    {
+                        strs.Add(JsonSerializer.Deserialize<T>(item.ToString(), JsonConfig.Options));// Newtonsoft.Json.JsonConvert.DeserializeObject<T>(item.ToString()));
+                    }
+                }
+                return strs;
+            }
+            return new List<T>();
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="start"></param>
+        /// <param name="stop"></param>
+        /// <returns></returns>
+        public async Task<List<T>> ListRangeAsync<T>(string skey, int start = 0, int stop = 30)
+        {
+            var vals = await _database.ListRangeAsync(setKey(skey), start, stop);
+            if (vals != null && vals.Length > 0)
+            {
+                var strs = new List<T>();
+                foreach (var item in vals)
+                {
+                    if (item.HasValue)
+                    {
+                        strs.Add(JsonSerializer.Deserialize<T>(item.ToString(), JsonConfig.Options));
+                    }
+                }
+                return strs;
+            }
+            return new List<T>();
+        }
+
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <param name="sval"></param>
+        /// <returns></returns>
+        public async Task<long> ListRightPushAsync(string skey, string sval)
+        {
+            return await _database.ListRightPushAsync(setKey(skey), sval);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        public async Task<long> ListLengthAsync(string skey)
+        {
+            return await _database.ListLengthAsync(setKey(skey));
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="skey"></param>
+        /// <returns></returns>
+        public async Task<string> ListLeftPopAsync(string skey)
+        {
+            return await _database.ListLeftPopAsync(setKey(skey));
+        }
+
+
+
+
+        #endregion
+
+
+
+        #endregion
 
 
 
manage/page/pasteform/index.css
diff --git a/manage/page/pasteform/index.css b/manage/page/pasteform/index.css
index 18d42da..0d60a9f 100644
--- a/manage/page/pasteform/index.css
+++ b/manage/page/pasteform/index.css
@@ -44,7 +44,7 @@ body {
   display: flex;
   flex-direction: column;
   position: relative;
-  height: 400px;
+  height: 200px;
 }
 .table_wrap,
 .mt-20 {
manage/page/pasteform/index.js
diff --git a/manage/page/pasteform/index.js b/manage/page/pasteform/index.js
index e1788cb..5fa89a6 100644
--- a/manage/page/pasteform/index.js
+++ b/manage/page/pasteform/index.js
@@ -984,6 +984,17 @@ function handlerReadRowData(elc) {
         rowData[dataName] = value;
     });
 
+    if(!rowData.hasOwnProperty('id')) {
+        rowData.id = $(row).attr('dataid'); // 从tr的dataid属性获取id
+        //关键在于如何获得类型???
+        const idProperty = findPropertyByName(_global_list_properties, 'id');
+        if(idProperty) {
+            if(IsNumberDataType(idProperty.dataType)) {
+                rowData.id = Number(rowData.id);
+            }
+        }
+    }
+
     if (rowData.id) {
         if (global_page_data) {
             for (let item of global_page_data) {
@@ -1006,6 +1017,26 @@ function handlerReadRowData(elc) {
 }
 
 /**
+ * 判断是否是Number类型
+ * @param {*} dataType 
+ * @returns 
+ */
+function IsNumberDataType(dataType) {
+    const numberTypes = ["Int32", "Int64", "UInt32", "UInt64", "number", "Double"];
+    return numberTypes.includes(dataType);
+}
+
+/**
+ * 判断是否是Number数组类型
+ * @param {*} dataType 
+ * @returns 
+ */
+function IsNumberArrayDataType(dataType) {
+    const numberTypes = ["Int32[]", "Int64[]", "UInt32[]", "UInt64[]", "number[]", "Double[]"];
+    return numberTypes.includes(dataType);
+}
+
+/**
  * 查询模型信息
  */
 function QueryModel() {
@@ -1493,13 +1524,7 @@ function findExistsPropertyByName(properties, targetName) {
  * @returns 
  */
 function findPropertyByName(properties, propertyName) {
-    //这里后续要做优化 做成map的形式,或者是用一些更高效的查找方式,现在先这样简单实现
-    for (const property of properties) {
-        if (property.name == propertyName) {
-            return property;
-        }
-    }
-    return false;
+    return properties.find(p => p.name === propertyName) ?? null;
 }
 
 /**
@@ -2250,7 +2275,7 @@ function HandlerQueryItem(listproperties, pageData) {
 
         if (item.name == "next_key") {
             _config.next.key = item.name;
-            if (item.dataType == "Int32" || item.dataType == "Int64" || item.dataType == "UInt32" || item.dataType == "UInt64") {
+            if (IsNumberDataType(item.dataType)) {
                 _config.next.type = "number";
             } else {
                 _config.next.type = "string";
@@ -2487,7 +2512,7 @@ function handlerInputValue(_info) {
                                 _array.push($(_elcs[k]).attr('value'));
                             }
                             if (item.dataFrom.indexOf("[]") >= 0) {
-                                if (item.dataFrom == "Int32[]" || item.dataFrom == "Int64[]" || item.dataFrom == "UInt32[]" || item.dataFrom == "UInt64[]") {
+                                if ( IsNumberArrayDataType(item.dataFrom)) {
                                     var _newarray = new Array();
                                     _array.forEach(_ary => {
                                         _newarray.push(Number(_ary));
@@ -2499,7 +2524,7 @@ function handlerInputValue(_info) {
                             } else {
                                 //string
 
-                                if (item.dataFrom == 'Int32' || item.dataFrom == 'Int64' || item.dataFrom == 'UInt32' || item.dataFrom == 'UInt64') {
+                                if ( IsNumberDataType(item.dataFrom)) {
                                     _info[item.name] = Number(_array[0]);
                                 } else {
                                     var _splitchar = ',';
@@ -2532,7 +2557,7 @@ function handlerInputValue(_info) {
                             var _val = _info[item.name];
                             if (_val) {
                                 _val = _val.replace(/,/g, _split_char);
-                                if (item.dataFrom == "Int32[]" || item.dataFrom == "Int64[]" || item.dataFrom == "UInt32[]" || item.dataFrom == "UInt64[]") {
+                                if (IsNumberArrayDataType(item.dataFrom)) {
                                     var strs = _val.split(_split_char);
                                     var arr = new Array();
                                     for (var ia of strs) {
manage/page/pasteform/index.less
diff --git a/manage/page/pasteform/index.less b/manage/page/pasteform/index.less
index 655496a..d2b844b 100644
--- a/manage/page/pasteform/index.less
+++ b/manage/page/pasteform/index.less
@@ -52,7 +52,7 @@ body {
     display: flex;
     flex-direction: column;
     position: relative;
-    height: 400px;
+    height: 200px;
 }
 
 .table_wrap,
manage/page/welcome.html
diff --git a/manage/page/welcome.html b/manage/page/welcome.html
index 9fdb486..b8828f5 100644
--- a/manage/page/welcome.html
+++ b/manage/page/welcome.html
@@ -43,10 +43,12 @@
             background-color: #f5f7fa;
             color: #333;
             padding: 20px;
+            height:100%;
+            overflow-y:auto;
         }
         
         .dashboard {
-            max-width: 1200px;
+            max-width: 1900px;
             margin: 0 auto;
             display: grid;
             grid-template-columns: repeat(4, 1fr);
@@ -101,8 +103,8 @@
         }
         
         .chart-container {
-            height: 300px;
-            margin-top: 20px;
+            height: 240px;
+            padding:20px 20px 40px 40px;
             position: relative;
         }
         
@@ -148,11 +150,13 @@
             text-align: right;
             padding-right: 5px;
         }
-        
+
         .conversion-rate {
-            display: flex;
+            display: grid;
             justify-content: space-between;
             margin-top: 20px;
+            grid-gap: 20px;
+            grid-template-columns: repeat(4, 1fr);
         }
         
         .conversion-item {
@@ -161,13 +165,14 @@
         }
         
         .conversion-item .label {
-            font-size: 14px;
+            font-size: 16px;
             color: #7f8c8d;
             margin-bottom: 5px;
+            background:#fff;
         }
         
         .conversion-item .value {
-            font-size: 18px;
+            font-size: 20px;
             font-weight: 600;
             color: #2c3e50;
         }
@@ -372,6 +377,22 @@
                     <div class="label">时间</div>
                     <div class="value">15:30</div>
                 </div>
+                <div class="conversion-item">
+                    <div class="label">老客户</div>
+                    <div class="value">32.5%</div>
+                </div>
+                <div class="conversion-item">
+                    <div class="label">注册率</div>
+                    <div class="value">18.3%</div>
+                </div>
+                <div class="conversion-item">
+                    <div class="label">环比</div>
+                    <div class="value">+21.1%</div>
+                </div>
+                <div class="conversion-item">
+                    <div class="label">日期</div>
+                    <div class="value">09-20</div>
+                </div>
             </div>
         </div>
         
​ ​