소스 검색

添加redis操作
改造提交表单页面

lcl 2 년 전
부모
커밋
d6fa1b9f50

+ 318 - 0
AppStart/Redis/CustomRedisDbconn.cs

@@ -0,0 +1,318 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using CSRedis;
+using Library;
+using System.Linq;
+
+namespace MySystem
+{
+    public class CustomRedisDbconn
+    {
+        public CSRedis.CSRedisClient csredis;
+        public CustomRedisDbconn(string key, int Database = 0)
+        {
+            string connstr = Library.ConfigurationManager.AppSettings[key].ToString();
+            csredis = new CSRedis.CSRedisClient(connstr);
+        }
+
+        #region 设置单个字段
+        public bool Set(string key, object value, int sec = -1)
+        {
+            return csredis.Set(key, value, sec);
+            // return false;
+        }
+        #endregion
+
+        #region 整数累加
+        public long AddInt(string key, long value = 1)
+        {
+            return csredis.IncrBy(key, value);
+            // return 0;
+        }
+        #endregion
+
+        #region 数字累加
+        public decimal AddNumber(string key, decimal value = 1)
+        {
+            return csredis.IncrByFloat(key, value);
+            // return 0;
+        }
+        #endregion
+
+        #region 获取单个字段
+        public T Get<T>(string key)
+        {
+            return csredis.Get<T>(key);
+        }
+        #endregion
+
+        #region 设置散列字段
+        public bool HSet(string key, string field, object value)
+        {
+            return csredis.HSet(key, field, value);
+            // return false;
+        }
+        #endregion
+
+        #region 散列整数累加
+        public long HAddInt(string key, string field, long value = 1)
+        {
+            return csredis.HIncrBy(key, field, value);
+            // return 0;
+        }
+        #endregion
+
+        #region 散列数字累加
+        public decimal HAddNumber(string key, string field, decimal value = 1)
+        {
+            return csredis.HIncrByFloat(key, field, value);
+            // return 0;
+        }
+        #endregion
+
+        #region 获取散列元素
+        public T HGet<T>(string key, string field)
+        {
+            return csredis.HGet<T>(key, field);
+        }
+        #endregion
+
+        #region 获取散列所有元素
+        public Dictionary<string, T> HGetAll<T>(string key)
+        {
+            return csredis.HGetAll<T>(key);
+        }
+        #endregion
+
+        #region 添加列表对象
+        public long AddList(string key, object value)
+        {
+            return csredis.LPush(key, value);
+            // return 0;
+        }
+        public long AddList(string key, object[] value)
+        {
+            return csredis.LPush(key, value);
+            // return 0;
+        }
+        public long AddRightList(string key, object value)
+        {
+            return csredis.RPush(key, value);
+            // return 0;
+        }
+        public T RPop<T>(string key)
+        {
+            return csredis.RPop<T>(key);
+        }
+        #endregion
+
+        #region 添加集合对象
+        public long SAdd(string key, object value)
+        {
+            return csredis.SAdd(key, value);
+            // return 0;
+        }
+        public long SAdd(string key, object[] value)
+        {
+            return csredis.SAdd(key, value);
+            // return 0;
+        }
+        #endregion
+
+        #region 获取集合对象
+        public T[] SGetList<T>(string key)
+        {
+            return csredis.SMembers<T>(key);
+        }
+        #endregion
+
+        #region 判断元素是否存在
+        public bool SIsMember(string key, object value)
+        {
+            return csredis.SIsMember(key, value);
+        }
+        #endregion
+
+        #region 修改列表对象
+        public bool SetList(string key, int index, object value)
+        {
+            long itemindex = csredis.LLen(key) - index - 1;
+            return csredis.LSet(key, itemindex, value);
+            // return false;
+        }
+        #endregion
+
+        #region 删除列表对象
+        public long DelFromList(string key, object value)
+        {
+            return csredis.LRem(key, 0, value);
+            // return false;
+        }
+        #endregion
+
+        #region 获取列表
+        public List<T> GetList<T>(string key, int pageNum = 1, int pageSize = 10)
+        {
+            int start = (pageNum - 1) * pageSize;
+            int end = start + pageSize - 1;
+            T[] list = csredis.LRange<T>(key, start, end);
+            return list.ToList();
+        }
+        #endregion
+
+        #region 添加排序列表对象
+        public long AddSort(string key, object value, decimal score)
+        {
+            return csredis.ZAdd(key, (score, value));
+            // return 0;
+        }
+        #endregion
+
+        #region 获取排序列表
+        public List<T> GetSort<T>(string key, int pageNum = 1, int pageSize = 10)
+        {
+            int start = (pageNum - 1) * pageSize;
+            int end = start + pageSize;
+            string[] list = csredis.ZRangeByScore(key, start, end);
+            List<T> lists = new List<T>();
+            foreach (string record in list)
+            {
+                lists.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<T>(record));
+            }
+            return lists;
+        }
+        public List<T> GetSortDesc<T>(string key, int pageNum = 1, int pageSize = 10)
+        {
+            int start = (pageNum - 1) * pageSize;
+            int end = start + pageSize;
+            string[] list = csredis.ZRevRangeByScore(key, start, end);
+            List<T> lists = new List<T>();
+            foreach (string record in list)
+            {
+                lists.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<T>(record));
+            }
+            return lists;
+        }
+        #endregion
+
+        public bool Remove(string key, long start, long end)
+        {
+            return csredis.LTrim(key, start, end);
+        }
+
+        public bool RemoveTop(string key, long count)
+        {
+            return RedisDbconn.Instance.Remove(key, count, RedisDbconn.Instance.Count(key) - 1); ;
+        }
+
+        public long Count(string key)
+        {
+            return csredis.LLen(key);
+        }
+
+        public void Clear(string pattern)
+        {
+            string[] keys = csredis.Keys(pattern);
+            csredis.Del(keys);
+        }
+
+        public string[] GetKeys(string pattern)
+        {
+            string[] keys = csredis.Keys(pattern);
+            return keys;
+        }
+
+        public bool Exists(string key)
+        {
+            return csredis.Exists(key);
+        }
+
+        public bool HExists(string key, string field)
+        {
+            return csredis.HExists(key, field);
+        }        
+
+        public void SetExpire(string key, int expire)
+        {
+            csredis.Expire(key, expire); //秒为单位
+        }
+
+
+
+
+        /// <summary>
+        /// 锁key
+        /// </summary>
+        private readonly string lockKey = "RedisLock";
+        /// <summary>
+        /// 锁的过期秒数
+        /// </summary>
+        private readonly int lockTime = 20;
+        /// <summary>
+        /// 续命线程取消令牌
+        /// </summary>
+        private CancellationTokenSource tokenSource = new CancellationTokenSource();
+
+        /// <summary>
+        /// 获取锁
+        /// </summary>
+        /// <param name="requestId">请求id保证释放锁时的客户端和加锁的客户端一致</param>
+        /// <returns></returns>
+        public bool GetLock(string requestId)
+        {
+            //设置key 设置过期时间20s
+            while (true)
+            {
+                //设置key Redis2.6.12以上版本,可以用set获取锁。set可以实现setnx和expire,这个是原子操作
+                if (csredis.Set(lockKey, requestId, lockTime, RedisExistence.Nx))
+                {
+                    //设置成功后开启子线程为key续命
+                    CreateThredXm();
+                    return true;
+                }
+            }
+        }
+        /// <summary>
+        /// 为锁续命(防止业务操作时间大于锁自动释放时间,锁被自动释放掉)
+        /// </summary>
+        void CreateThredXm()
+        {
+            Task.Run(() =>
+            {
+                while (true)
+                {
+                    Thread.Sleep(10);
+                    //外部取消 退出子线程
+                    if (tokenSource.IsCancellationRequested)
+                    {
+                        return;
+                    }
+                    //查询key还有多少秒释放
+                    var Seconds = csredis.PTtl(lockKey) / 1000;
+                    //key还剩1/3秒时重设过期时间
+                    if (Seconds < (lockTime / 3))
+                    {
+                        //小于5秒则自动 重设过期时间
+                        csredis.Expire(lockKey, lockTime);
+                    }
+                }
+            }, tokenSource.Token);
+        }
+        /// <summary>
+        /// 释放锁操作
+        /// </summary>
+        /// <param name="requestId">请求id保证释放锁时的客户端和加锁的客户端一致</param>
+        public void ReleaseLock(string requestId)
+        {
+            //这里使用Lua脚本保证原子性操作
+            string script = "if  redis.call('get', KEYS[1]) == ARGV[1] then " +
+                    "return redis.call('del', KEYS[1]) " +
+                    "else return 0 end";
+            csredis.Eval(script, lockKey, requestId);
+            //取消续命线程
+            tokenSource.Cancel();
+        }
+    }
+}

+ 214 - 0
Areas/Admin/Controllers/MainServer/CustomQueryController.cs

@@ -16,6 +16,8 @@ using MySystem.Models;
 using Library;
 using LitJson;
 using MySystemLib;
+using System.Text.RegularExpressions;
+using System.Data;
 
 namespace MySystem.Areas.Admin.Controllers
 {
@@ -316,5 +318,217 @@ namespace MySystem.Areas.Admin.Controllers
 
         #endregion
 
+
+
+        
+        #region 自定义提交
+
+        /// <summary>
+        /// 自定义提交
+        /// </summary>
+        /// <returns></returns>
+        public IActionResult Confirm(string right, int Id)
+        {
+            ViewBag.RightInfo = RightInfo;
+            ViewBag.right = right;
+            ViewBag.Id = Id.ToString();
+
+            CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
+            if(SysUserName != "admin")
+            {
+                string checkString = "," + item.AdminNames + ",";
+                if(!checkString.Contains("," + SysUserName + ","))
+                {
+                    return Content("无权限");
+                }
+            }
+            Dictionary<string, string> query = new Dictionary<string, string>();
+            string sql = item.SqlContent;
+            MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
+            foreach(Match m in mc)
+            {
+                string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                string fieldName = fieldData[0];
+                string Title = fieldData[1];
+                if(!query.ContainsKey(fieldName))
+                {
+                    query.Add(fieldName, Title);
+                }
+            }
+            List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
+            foreach(CustomQuerySub sub in subItems)
+            {
+                sql = sub.SqlContent;
+                mc = Regex.Matches(sql, @"\$\{.*?\}\$");
+                foreach(Match m in mc)
+                {
+                    string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                    string fieldName = fieldData[0];
+                    string Title = fieldData[1];
+                    if(!query.ContainsKey(fieldName))
+                    {
+                        query.Add(fieldName, Title);
+                    }
+                }
+            }
+            ViewBag.query = query;
+
+            return View();
+        }
+
+        #endregion
+
+        #region 自定义提交
+
+        /// <summary>
+        /// 自定义提交
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public string Confirm(int Id)
+        {
+            var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
+            CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
+            string ConnectStr = "";
+            Dictionary<string, string> dicVals = new Dictionary<string, string>();
+            List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
+            foreach(CustomQuerySub sub in subItems)
+            {
+                ConnectStr = sub.DatabaseConnect;
+                if(!string.IsNullOrEmpty(ConnectStr))
+                {
+                    ConnectStr = GetConnectStr(sub.DatabaseConnect);
+                }
+                else
+                {
+                    if(item.ExcuteFlag == 2)
+                    {
+                        ConnectStr = MysqlConn.RedisConnStr;
+                    }
+                    else
+                    {
+                        ConnectStr = MysqlConn.ReadSqlConnStr;
+                    }
+                }
+
+                string sqlstr = sub.SqlContent;
+                MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
+                foreach(Match m in mcsub)
+                {
+                    string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                    string fieldName = fieldData[0];
+                    sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
+                }
+
+                mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
+                foreach(Match m in mcsub)
+                {
+                    string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+                    if(dicVals.ContainsKey(fieldName))
+                    {
+                        sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
+                    }
+                }
+
+                DataTable dtsub = CustomerSqlConn.dtable(sqlstr, ConnectStr);
+                if(dtsub.Rows.Count > 0)
+                {
+                    if(dtsub.Rows.Count > 1)
+                    {
+                        string val = "";
+                        foreach(DataRow dr in dtsub.Rows)
+                        {
+                            val += dr[0].ToString() + ",";
+                        }
+                        val = val.TrimEnd(',');
+                        dicVals.Add(sub.Alias + "." + dtsub.Columns[0].ColumnName, val);
+                    }
+                    else
+                    {
+                        DataRow dr = dtsub.Rows[0];
+                        foreach(DataColumn dc in dtsub.Columns)
+                        {
+                            dicVals.Add(sub.Alias + "." + dc.ColumnName, dr[dc.ColumnName].ToString());
+                        }
+                    }
+                }
+            }
+            ConnectStr = item.DatabaseConnect;
+            if(!string.IsNullOrEmpty(ConnectStr))
+            {
+                ConnectStr = GetConnectStr(item.DatabaseConnect);
+            }
+            else
+            {
+                if(item.ExcuteFlag == 2)
+                {
+                    ConnectStr = MysqlConn.RedisConnStr;
+                }
+                else
+                {
+                    ConnectStr = MysqlConn.ReadSqlConnStr;
+                }
+            }
+            string sql = item.SqlContent;
+            MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
+            foreach(Match m in mc)
+            {
+                string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                string fieldName = fieldData[0];
+                sql = sql.Replace(m.Value, Request.Form[fieldName].ToString());
+            }
+            mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
+            foreach(Match m in mc)
+            {
+                string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
+                string str = fieldData[0];
+                string oldStr = fieldData[1];
+                string newStr = fieldData[2];
+                str = str.Replace(oldStr, newStr);
+                sql = sql.Replace(m.Value, str);
+            }
+            if(item.ExcuteFlag == 1)
+            {
+                string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"执行\",\"MaxCount\":\"" + item.ExcuteFlag + "\",\"ConnectStr\":\"" + ConnectStr + "\"}";
+                RedisDbconn.Instance.AddList("ExportQueue", SendData);
+            }
+            else if(item.ExcuteFlag == 2)
+            {
+                string redisCommand = sql;
+                string[] redisCommandList = redisCommand.Split(' ');
+                string kind = redisCommandList[0];
+                string key = redisCommandList[1];
+                string val = redisCommandList[2];
+                if(kind == "lpush")
+                {
+                    new CustomRedisDbconn(ConnectStr).AddList(key, val);
+                }
+                else if(kind == "set")
+                {
+                    new CustomRedisDbconn(ConnectStr).Set(key, val);
+                }
+                else if(kind == "set")
+                {
+                    new CustomRedisDbconn(ConnectStr).AddInt(key, int.Parse(val));
+                }
+                else if(kind == "set")
+                {
+                    new CustomRedisDbconn(ConnectStr).AddNumber(key, decimal.Parse(val));
+                }
+            }
+            return "success";
+        }
+
+        #endregion
+
+        #region 获取链接数据库字符串
+
+        public string GetConnectStr(string key)
+        {
+            return Library.ConfigurationManager.AppSettings[key].ToString();
+        }
+
+        #endregion
+
     }
 }

+ 236 - 119
Areas/Admin/Controllers/MainServer/CustomQueryDoController.cs

@@ -103,6 +103,7 @@ namespace MySystem.Areas.Admin.Controllers
         public JsonResult IndexData(int Id, int page = 1, int limit = 30)
         {
             Dictionary<string, string> dicVals = new Dictionary<string, string>();
+            Dictionary<string, Dictionary<string, string>> dicValsJson = new Dictionary<string, Dictionary<string, string>>();
             string ConnectStr = "";
             List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
             foreach(CustomQuerySub sub in subItems)
@@ -144,20 +145,36 @@ namespace MySystem.Areas.Admin.Controllers
                 {
                     if(dtsub.Rows.Count > 1)
                     {
-                        string val = "";
-                        foreach(DataRow dr in dtsub.Rows)
+                        if(!string.IsNullOrEmpty(sub.DataKey))
                         {
-                            val += dr[0].ToString() + ",";
+                            string[] TextFields = sub.DataText.Split(',');
+                            Dictionary<string, string> vals = new Dictionary<string, string>();
+                            foreach(DataRow dr in dtsub.Rows)
+                            {
+                                foreach(string key in TextFields)
+                                {
+                                    vals.Add(key, dr[key].ToString());
+                                }
+                            }
+                            dicValsJson.Add(sub.Alias + "." + sub.DataKey, vals);
+                        }
+                        else
+                        {
+                            string val = "";
+                            foreach(DataRow dr in dtsub.Rows)
+                            {
+                                val += dr[0].ToString() + ",";
+                            }
+                            val = val.TrimEnd(',');
+                            dicVals.Add(sub.Alias + "." + dtsub.Columns[0].ColumnName, val);
                         }
-                        val = val.TrimEnd(',');
-                        dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
                     }
                     else
                     {
                         DataRow dr = dtsub.Rows[0];
                         foreach(DataColumn dc in dtsub.Columns)
                         {
-                            dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
+                            dicVals.Add(sub.Alias + "." + dc.ColumnName, dr[dc.ColumnName].ToString());
                         }
                     }
                 }
@@ -170,7 +187,14 @@ namespace MySystem.Areas.Admin.Controllers
             }
             else
             {
-                ConnectStr = MysqlConn.ReadSqlConnStr;
+                if(item.ExcuteFlag == 2 || item.ExcuteFlag == 3)
+                {
+                    ConnectStr = MysqlConn.RedisConnStr;
+                }
+                else
+                {
+                    ConnectStr = MysqlConn.ReadSqlConnStr;
+                }
             }
             string sql = item.SqlContent;
             MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
@@ -203,32 +227,110 @@ namespace MySystem.Areas.Admin.Controllers
                 str = str.Replace(oldStr, newStr);
                 sql = sql.Replace(m.Value, str);
             }
-            if(page > 1)
-            {
-                int skip = (page - 1) * limit;
-                sql += " limit " + skip + "," + limit;
-            }
-            else
+            List<Dictionary<string, string>> diclist = new List<Dictionary<string, string>>();
+            if(item.ExcuteFlag == 0)
             {
-                sql += " limit " + limit;
+                if(page > 1)
+                {
+                    int skip = (page - 1) * limit;
+                    sql += " limit " + skip + "," + limit;
+                }
+                else
+                {
+                    sql += " limit " + limit;
+                }
+                DataTable dt = CustomerSqlConn.dtable(sql, ConnectStr);
+                foreach(DataRow dr in dt.Rows)
+                {
+                    Dictionary<string, string> row = new Dictionary<string, string>();
+                    foreach(DataColumn dc in dt.Columns)
+                    {
+                        Match m = Regex.Match(dr[dc.ColumnName].ToString(), @"\#\{.*?\}\#");
+                        if(m.Success)
+                        {
+                            string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+                            Dictionary<string, string> fieldVals = dicValsJson[fieldName];
+                            foreach(string field in fieldVals.Keys)
+                            {
+                                row.Add(dc.ColumnName + field, fieldVals[field]);
+                            }
+                        }
+                        else
+                        {
+                            if (dc.DataType == typeof(DateTime))
+                            {
+                                row.Add(dc.ColumnName, string.IsNullOrEmpty(dr[dc.ColumnName].ToString()) ? "" : DateTime.Parse(dr[dc.ColumnName].ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
+                            }
+                            else
+                            {
+                                row.Add(dc.ColumnName, dr[dc.ColumnName].ToString());
+                            }
+                        }
+                    }
+                    diclist.Add(row);
+                }
             }
-            DataTable dt = CustomerSqlConn.dtable(sql, ConnectStr);
-            List<Dictionary<string, string>> diclist = new List<Dictionary<string, string>>();
-            foreach(DataRow dr in dt.Rows)
+            else if(item.ExcuteFlag == 2)
             {
-                Dictionary<string, string> row = new Dictionary<string, string>();
-                foreach(DataColumn dc in dt.Columns)
-                {                 
-                    if (dc.DataType == typeof(DateTime))
+                string redisCommand = sql;
+                string[] redisCommandList = redisCommand.Split(' ');
+                string kind = redisCommandList[0];
+                string key = redisCommandList[1];
+                if(kind == "lrange_json")
+                {
+                    List<Dictionary<string, string>> list = new CustomRedisDbconn(ConnectStr).GetList<Dictionary<string, string>>(key, page, limit);
+                    foreach(Dictionary<string, string> dr in list)
                     {
-                        row.Add(dc.ColumnName, string.IsNullOrEmpty(dr[dc.ColumnName].ToString()) ? "" : DateTime.Parse(dr[dc.ColumnName].ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
+                        Dictionary<string, string> row = new Dictionary<string, string>();
+                        foreach(string ColumnName in dr.Keys)
+                        {
+                            Match m = Regex.Match(dr[ColumnName], @"\#\{.*?\}\#");
+                            if(m.Success)
+                            {
+                                string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+                                Dictionary<string, string> fieldVals = dicValsJson[fieldName];
+                                foreach(string field in fieldVals.Keys)
+                                {
+                                    row.Add(ColumnName + field, fieldVals[field]);
+                                }
+                            }
+                            else
+                            {
+                                row.Add(ColumnName, dr[ColumnName]);
+                            }
+                        }
+                        diclist.Add(row);
                     }
-                    else
+                }
+                else if(kind == "lrange_str")
+                {
+                    List<string> list = new CustomRedisDbconn(ConnectStr).GetList<string>(key, page, limit);
+                    foreach(string val in list)
                     {
-                        row.Add(dc.ColumnName, dr[dc.ColumnName].ToString());
+                        Dictionary<string, string> row = new Dictionary<string, string>();
+                        Match m = Regex.Match(val, @"\#\{.*?\}\#");
+                        if(m.Success)
+                        {
+                            string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+                            Dictionary<string, string> fieldVals = dicValsJson[fieldName];
+                            foreach(string field in fieldVals.Keys)
+                            {
+                                row.Add(field, fieldVals[field]);
+                            }
+                        }
+                        else
+                        {
+                            row.Add("值", val);
+                        }
+                        diclist.Add(row);
                     }
                 }
-                diclist.Add(row);
+                else if (kind == "get")
+                {
+                    Dictionary<string, string> row = new Dictionary<string, string>();
+                    row.Add("值", new CustomRedisDbconn(ConnectStr).Get<string>(key));
+                    diclist.Add(row);
+                }
             }
             Dictionary<string, object> obj = new Dictionary<string, object>();
             obj.Add("code", 0);
@@ -251,9 +353,12 @@ namespace MySystem.Areas.Admin.Controllers
             var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
 
             Dictionary<string, string> dicVals = new Dictionary<string, string>();
+            List<Dictionary<string, string>> subJson = new List<Dictionary<string, string>>();
             List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
             foreach(CustomQuerySub sub in subItems)
             {
+                Dictionary<string, string> subJsonItem = new Dictionary<string, string>();
+
                 string ConnectStr = sub.DatabaseConnect;
                 if(!string.IsNullOrEmpty(ConnectStr))
                 {
@@ -283,7 +388,7 @@ namespace MySystem.Areas.Admin.Controllers
                     }
                 }
 
-                DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
+                DataTable dtsub = CustomerSqlConn.dtable(sqlstr, ConnectStr);
                 if(dtsub.Rows.Count > 0)
                 {
                     if(dtsub.Rows.Count > 1)
@@ -294,17 +399,24 @@ namespace MySystem.Areas.Admin.Controllers
                             val += dr[0].ToString() + ",";
                         }
                         val = val.TrimEnd(',');
-                        dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
+                        dicVals.Add(sub.Alias + "." + dtsub.Columns[0].ColumnName, val);
                     }
                     else
                     {
                         DataRow dr = dtsub.Rows[0];
                         foreach(DataColumn dc in dtsub.Columns)
                         {
-                            dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
+                            dicVals.Add(sub.Alias + "." + dc.ColumnName, dr[dc.ColumnName].ToString());
                         }
                     }
                 }
+
+                subJsonItem.Add("DatabaseConnect", sub.DatabaseConnect);
+                subJsonItem.Add("SqlContent", sqlstr);
+                subJsonItem.Add("DataKey", sub.DataKey);
+                subJsonItem.Add("DataText", sub.DataText);
+                subJsonItem.Add("Alias", sub.Alias);
+                subJson.Add(subJsonItem);
             }
             CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
             string sql = item.SqlContent;
@@ -326,7 +438,12 @@ namespace MySystem.Areas.Admin.Controllers
                 sql = sql.Replace(m.Value, str);
             }
             var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
-            string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"" + FileName + "\",\"MaxCount\":\"0\"}";
+            string SubSqlString = "";
+            if(subJson.Count > 0)
+            {
+                SubSqlString = ",\"SubSqlString\":" + Newtonsoft.Json.JsonConvert.SerializeObject(subJson);
+            }
+            string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"" + FileName + "\",\"MaxCount\":\"0\"" + SubSqlString + "}";
             RedisDbconn.Instance.AddList("ExportQueue", SendData);
             return "success";
         }
@@ -339,99 +456,99 @@ namespace MySystem.Areas.Admin.Controllers
         /// 执行
         /// </summary>
         /// <returns></returns>
-        public string Excute(int Id)
-        {
-            var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
-            string ConnectStr = "";
-            Dictionary<string, string> dicVals = new Dictionary<string, string>();
-            List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
-            foreach(CustomQuerySub sub in subItems)
-            {
-                ConnectStr = sub.DatabaseConnect;
-                if(!string.IsNullOrEmpty(ConnectStr))
-                {
-                    ConnectStr = GetConnectStr(sub.DatabaseConnect);
-                }
-                else
-                {
-                    ConnectStr = MysqlConn.ReadSqlConnStr;
-                }
+        // public string Excute(int Id)
+        // {
+        //     var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
+        //     string ConnectStr = "";
+        //     Dictionary<string, string> dicVals = new Dictionary<string, string>();
+        //     List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
+        //     foreach(CustomQuerySub sub in subItems)
+        //     {
+        //         ConnectStr = sub.DatabaseConnect;
+        //         if(!string.IsNullOrEmpty(ConnectStr))
+        //         {
+        //             ConnectStr = GetConnectStr(sub.DatabaseConnect);
+        //         }
+        //         else
+        //         {
+        //             ConnectStr = MysqlConn.ReadSqlConnStr;
+        //         }
 
-                string sqlstr = sub.SqlContent;
-                MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
-                foreach(Match m in mcsub)
-                {
-                    string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
-                    string fieldName = fieldData[0];
-                    sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
-                }
+        //         string sqlstr = sub.SqlContent;
+        //         MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
+        //         foreach(Match m in mcsub)
+        //         {
+        //             string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+        //             string fieldName = fieldData[0];
+        //             sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
+        //         }
 
-                mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
-                foreach(Match m in mcsub)
-                {
-                    string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
-                    if(dicVals.ContainsKey(fieldName))
-                    {
-                        sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
-                    }
-                }
+        //         mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
+        //         foreach(Match m in mcsub)
+        //         {
+        //             string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+        //             if(dicVals.ContainsKey(fieldName))
+        //             {
+        //                 sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
+        //             }
+        //         }
 
-                DataTable dtsub = CustomerSqlConn.dtable(sqlstr, ConnectStr);
-                if(dtsub.Rows.Count > 0)
-                {
-                    if(dtsub.Rows.Count > 1)
-                    {
-                        string val = "";
-                        foreach(DataRow dr in dtsub.Rows)
-                        {
-                            val += dr[0].ToString() + ",";
-                        }
-                        val = val.TrimEnd(',');
-                        dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
-                    }
-                    else
-                    {
-                        DataRow dr = dtsub.Rows[0];
-                        foreach(DataColumn dc in dtsub.Columns)
-                        {
-                            dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
-                        }
-                    }
-                }
-            }
-            CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
-            ConnectStr = item.DatabaseConnect;
-            if(!string.IsNullOrEmpty(ConnectStr))
-            {
-                ConnectStr = GetConnectStr(item.DatabaseConnect);
-            }
-            else
-            {
-                ConnectStr = MysqlConn.ReadSqlConnStr;
-            }
-            string sql = item.SqlContent;
-            MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
-            foreach(Match m in mc)
-            {
-                string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
-                string fieldName = fieldData[0];
-                sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
-            }
-            mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
-            foreach(Match m in mc)
-            {
-                string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
-                string str = fieldData[0];
-                string oldStr = fieldData[1];
-                string newStr = fieldData[2];
-                str = str.Replace(oldStr, newStr);
-                sql = sql.Replace(m.Value, str);
-            }
-            var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
-            string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"执行\",\"MaxCount\":\"" + item.ExcuteFlag + "\",\"ConnectStr\":\"" + ConnectStr + "\"}";
-            RedisDbconn.Instance.AddList("ExportQueue", SendData);
-            return "success";
-        }
+        //         DataTable dtsub = CustomerSqlConn.dtable(sqlstr, ConnectStr);
+        //         if(dtsub.Rows.Count > 0)
+        //         {
+        //             if(dtsub.Rows.Count > 1)
+        //             {
+        //                 string val = "";
+        //                 foreach(DataRow dr in dtsub.Rows)
+        //                 {
+        //                     val += dr[0].ToString() + ",";
+        //                 }
+        //                 val = val.TrimEnd(',');
+        //                 dicVals.Add(sub.Alias + "." + dtsub.Columns[0].ColumnName, val);
+        //             }
+        //             else
+        //             {
+        //                 DataRow dr = dtsub.Rows[0];
+        //                 foreach(DataColumn dc in dtsub.Columns)
+        //                 {
+        //                     dicVals.Add(sub.Alias + "." + dc.ColumnName, dr[dc.ColumnName].ToString());
+        //                 }
+        //             }
+        //         }
+        //     }
+        //     CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
+        //     ConnectStr = item.DatabaseConnect;
+        //     if(!string.IsNullOrEmpty(ConnectStr))
+        //     {
+        //         ConnectStr = GetConnectStr(item.DatabaseConnect);
+        //     }
+        //     else
+        //     {
+        //         ConnectStr = MysqlConn.ReadSqlConnStr;
+        //     }
+        //     string sql = item.SqlContent;
+        //     MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
+        //     foreach(Match m in mc)
+        //     {
+        //         string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+        //         string fieldName = fieldData[0];
+        //         sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
+        //     }
+        //     mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
+        //     foreach(Match m in mc)
+        //     {
+        //         string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
+        //         string str = fieldData[0];
+        //         string oldStr = fieldData[1];
+        //         string newStr = fieldData[2];
+        //         str = str.Replace(oldStr, newStr);
+        //         sql = sql.Replace(m.Value, str);
+        //     }
+        //     var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+        //     string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"执行\",\"MaxCount\":\"" + item.ExcuteFlag + "\",\"ConnectStr\":\"" + ConnectStr + "\"}";
+        //     RedisDbconn.Instance.AddList("ExportQueue", SendData);
+        //     return "success";
+        // }
 
         #endregion
 

+ 100 - 0
Areas/Admin/Views/MainServer/CustomQuery/Confirm.cshtml

@@ -0,0 +1,100 @@
+@{
+    string RightInfo = ViewBag.RightInfo as string;
+    string right = ViewBag.right as string;
+    string Id = ViewBag.Id as string;
+    Dictionary<string, string> query = ViewBag.query as Dictionary<string, string>;
+}
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>自定义提交</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="/layuiadmin/layui/css/layui.css" media="all">
+    <script src="/admin/js/jquery-1.10.1.min.js"></script>
+</head>
+<body>
+
+    <div class="layui-form" lay-filter="layuiadmin-form-useradmin" id="layuiadmin-form-useradmin">
+        <input type="hidden" name="Id" value="@Id" />
+        <div class="layui-card">
+          <div class="layui-card-body">
+            <div class="layui-tab" lay-filter="mytabbar">
+                <ul class="layui-tab-title">
+                    <li class="layui-this" lay-id="1">基本信息</li>
+                </ul>
+                <div class="layui-tab-content mt20">
+                    <div class="layui-tab-item layui-show">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">标题</label>
+                            <div class="layui-input-inline">
+                                <input class="layui-input" type="text" id="Title" name="Title" maxlength="50"
+                                    lay-verify="required|" autocomplete="off" placeholder="请输入标题">
+                            </div>
+                        </div>
+                        @foreach(string key in query.Keys)
+                        {
+                            <div class="layui-form-item">
+                                <label class="layui-form-label">@(query[key])</label>
+                                <div class="layui-input-block">
+                                    <input class="layui-input" type="text" id="@(key)" name="@(key)" lay-verify="required|" autocomplete="off" placeholder="请输入@(query[key])">
+                                </div>
+                            </div>
+                        }
+                    </div>
+
+                    </div>
+            </div>
+            <div class="layui-form-item layui-hide">
+                <input type="button" lay-submit lay-filter="LAY-list-front-submit" id="LAY-list-front-submit" value="确认">
+            </div>
+          </div>
+        </div>
+    </div>
+
+    <script src="/layuiadmin/layui/layui.js"></script>
+    <script src="/other/mybjq/lang/zh_CN.js"></script>
+    <script>
+        
+        layui.config({
+            base: '/layuiadmin/' //静态资源所在路径
+        }).extend({
+            index: 'lib/index' //主入口模块
+        }).use(['index', 'form', 'upload', 'layedit', 'laydate', 'element', 'croppers', 'transfer', 'tree', 'util'], function () {
+            var $ = layui.$
+                , form = layui.form
+                , layer = layui.layer
+                , layedit = layui.layedit
+                , laydate = layui.laydate
+                , croppers = layui.croppers
+                , transfer = layui.transfer
+                , util = layui.util;
+        
+            //Hash地址的定位
+            var layid = location.hash.replace(/^#test=/, '');
+            element.tabChange('test', layid);
+            element.on('tab(test)', function (elem) {
+                location.hash = 'test=' + $(this).attr('lay-id');
+            });
+    
+            //日期
+            
+
+            //上传文件
+            
+
+            //穿梭框
+            
+
+            //TreeView,比如权限管理
+            
+
+            //省市区
+            
+        })
+
+    </script>
+</body>
+</html>

+ 5 - 0
Areas/Admin/Views/MainServer/CustomQuery/Index.cshtml

@@ -82,7 +82,12 @@
                     {
                     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
                     }
+                    @("{{#if (d.ExcuteFlag == 0 || d.ExcuteFlag == 2 || d.ExcuteFlag == 4){ }}")
                     <a class="layui-btn layui-btn-normal layui-btn-xs" lay-href="/Admin/CustomQueryDo/Index?right=@right&Id=@("{{d.Id}}")"><i class="layui-icon layui-icon-edit"></i>查询</a>
+                    @("{{#} }}")                    
+                    @("{{#if (d.ExcuteFlag == 1 || d.ExcuteFlag == 3){ }}")
+                    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="confirm"><i class="layui-icon layui-icon-edit"></i>提交</a>
+                    @("{{#} }}")
                     @if (RightInfo.Contains("," + right + "_edit,"))
                     {
                     }

+ 0 - 4
Areas/Admin/Views/MainServer/CustomQueryDo/Index.cshtml

@@ -61,10 +61,6 @@
             <div class="layui-card-body">
                 <div style="padding-bottom: 10px;">
                     <button class="layui-btn" data-type="ExportExcel"><i class="layui-icon layui-icon-export layuiadmin-button-btn"></i>导出</button>
-                    @if (RightInfo.Contains("," + right + "_edit,"))
-                    {
-                    <button class="layui-btn" data-type="Excute"><i class="layui-icon layui-icon-add-1 layuiadmin-button-btn"></i>执行</button>
-                    }
                 </div>
                 
                 <table id="LAY-list-manage" lay-filter="LAY-list-manage"></table>

+ 2 - 1
Config/MysqlConn.cs

@@ -10,6 +10,7 @@ namespace MySystem
         public static string connstr = ConfigurationManager.AppSettings["SqlConnStr"].ToString();
         public static string SqlConnStr = ConfigurationManager.AppSettings["SqlConnStr"].ToString();
         public static string ReadSqlConnStr = ConfigurationManager.AppSettings["ReadSqlConnStr"].ToString();
-
+        public static string RedisConnStr = ConfigurationManager.AppSettings["RedisConnStr"].ToString();
+        
     }
 }

+ 2 - 0
Models/CustomQuerySub.cs

@@ -24,5 +24,7 @@ namespace MySystem.Models
         public string AdminNames { get; set; }
         public string Title { get; set; }
         public string DatabaseConnect { get; set; }
+        public string DataKey { get; set; }
+        public string DataText { get; set; }
     }
 }

+ 12 - 1
Models/WebCMSEntities.cs

@@ -2875,6 +2875,18 @@ namespace MySystem.Models
                     .HasCharSet("utf8")
                     .HasCollation("utf8_general_ci");
 
+                entity.Property(e => e.DataKey)
+                    .HasColumnType("varchar(50)")
+                    .HasComment("key字段")
+                    .HasCharSet("utf8")
+                    .HasCollation("utf8_general_ci");
+
+                entity.Property(e => e.DataText)
+                    .HasColumnType("varchar(200)")
+                    .HasComment("text字段")
+                    .HasCharSet("utf8")
+                    .HasCollation("utf8_general_ci");
+
                 entity.Property(e => e.DatabaseConnect)
                     .HasColumnType("varchar(50)")
                     .HasComment("链接数据库")
@@ -13425,7 +13437,6 @@ namespace MySystem.Models
                     .HasCollation("utf8_general_ci");
 
                 entity.Property(e => e.OprInviteCode)
-                    .HasColumnName("oprInviteCode")
                     .HasColumnType("varchar(50)")
                     .HasComment("邀请码")
                     .HasCharSet("utf8")

+ 1 - 0
MySystem.csproj

@@ -2,6 +2,7 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
   <PropertyGroup>
     <TargetFramework>netcoreapp3.0</TargetFramework>
+    <SatelliteResourceLanguages>e</SatelliteResourceLanguages>
   </PropertyGroup>
   <ItemGroup>
     <DotNetCliToolReference Include="dotnet-svcutil" Version="1.0.*"/>

+ 0 - 5
global.json

@@ -1,5 +0,0 @@
-{
-  "sdk": {
-    "version": "3.0.100"
-  }
-}

+ 48 - 0
wwwroot/layuiadmin/modules_main/CustomQuery_Admin.js

@@ -164,6 +164,54 @@ layui.config({
                 }
             });
             layer.full(perContent);
+        } else if (obj.event === 'confirm') {
+            var tr = $(obj.tr);
+            var perContent = layer.open({
+                type: 2
+                , title: '自定义提交'
+                , content: 'Confirm?Id=' + data.Id + ''
+                , maxmin: true
+                , area: ['500px', '450px']
+                , btn: ['确定', '取消']
+                , yes: function (index, layero) {
+                    var iframeWindow = window['layui-layer-iframe' + index]
+                        , submitID = 'LAY-list-front-submit'
+                        , submit = layero.find('iframe').contents().find('#' + submitID);
+
+                    
+                    //监听提交
+                    iframeWindow.layui.form.on('submit(' + submitID + ')', function (data) {
+                        var field = data.field; //获取提交的字段
+                        var userdata = "";
+                        for (var prop in field) {
+                            userdata += prop + "=" + encodeURIComponent(field[prop]) + "&";
+                        }
+                        //提交 Ajax 成功后,静态更新表格中的数据
+                        //$.ajax({});
+                        
+                        $.ajax({
+                            type: "POST",
+                            url: "/Admin/CustomQuery/Confirm?r=" + Math.random(1),
+                            data: userdata,
+                            dataType: "text",
+                            success: function (data) {
+                                layer.close(index); //关闭弹层
+                                if (data == "success") {
+                                    layer.msg("提交成功!等待结果");
+                                } else {
+                                    layer.msg(data);
+                                }
+                            }
+                        });
+                    });
+
+                    submit.trigger('click');
+                }
+                , success: function (layero, index) {
+
+                }
+            });
+            layer.full(perContent);
         }
     });