siked %!s(int64=2) %!d(string=hai) anos
pai
achega
c361fb0ede

BIN=BIN
Cold_Api6200


BIN=BIN
Cold_Api6201


+ 1 - 0
Nats/NatsServer/NatsMqtt.go

@@ -22,6 +22,7 @@ func Read_DeviceSensorParameter(T_SN string) {
 		logs.Println("Nats =>", lib.FuncName(), err)
 	}
 }
+
 func Pu_DeviceParameter(v Device.DeviceParameter) {
 	logs.Println("Nats =>", lib.FuncName(), v)
 	b, err := msgpack.Marshal(&v)

+ 1 - 1
conf/app.conf

@@ -43,5 +43,5 @@ Oss = "../../../static"
 Oss_file = "C:\\Users\\Administrator\\Pictures\\oss"
 
 # Panel
-Panel_url = "http://127.0.0.1:6204/Cold_Panel"
+# Panel_url = "http://127.0.0.1:6204/Cold_Panel"
 

+ 116 - 46
controllers/Device.go

@@ -673,7 +673,7 @@ func (c *DeviceController) Device_v2_List() {
 	}
 
 	if len(c.GetString("User_uuid")) > 1 {
-		s_, user_r := Admin.Read_Admin_ByAdmin_uuid(c.GetString("Admin_uuid"))
+		s_, user_r := Admin.Read_Admin_ByAdmin_uuid(c.GetString("User_uuid"))
 		if s_ != nil {
 			c.Data["json"] = lib.JSONS{Code: 202, Msg: "Admin_uuid Err!"}
 			c.ServeJSON()
@@ -1271,6 +1271,12 @@ func (c *DeviceController) DeviceSensor_v2_Parameter_Pu() {
 	T_en, _ := c.GetInt("T_en")
 	T_free, _ := c.GetInt("T_free")
 
+	T_enprel, _ := c.GetInt("T_enprel")
+	T_tprel, _ := c.GetFloat("T_tprel")
+	T_tpreu, _ := c.GetFloat("T_tpreu")
+	T_hprel, _ := c.GetFloat("T_hprel")
+	T_hpreu, _ := c.GetFloat("T_hpreu")
+
 	// 权限 过滤
 	Admin_Power_, _ := Admin.Read_AdminPower_ById(admin_r.Admin_power)
 	if Admin_Power_.Power_DeviceSensor_Parameter_e == 0 {
@@ -1304,6 +1310,12 @@ func (c *DeviceController) DeviceSensor_v2_Parameter_Pu() {
 		T_en:      T_en,
 		T_free:    T_free,
 
+		T_enprel: T_enprel,
+		T_tprel:  float32(T_tprel),
+		T_tpreu:  float32(T_tpreu),
+		T_hprel:  float32(T_hprel),
+		T_hpreu:  float32(T_hpreu),
+
 		T_uuid:      admin_r.Admin_uuid,
 		T_SendState: 0,
 		T_State:     2,
@@ -1526,6 +1538,7 @@ func (c *DeviceController) V2_DeviceWarning_List() {
 	T_title := c.GetString("T_title")
 	Time_start := c.GetString("Time_start")
 	Time_end := c.GetString("Time_end")
+	T_handle, _ := c.GetInt("T_handle")
 
 	//r_jsons.DeviceWarningclass = Device.Read_DeviceWarningList_All_1()
 	//T_Title := ""
@@ -1533,7 +1546,7 @@ func (c *DeviceController) V2_DeviceWarning_List() {
 	//	T_Title = Device.Read_DeviceWarningList_ById(Class_1).T_name
 	//}
 
-	r_jsons.Data, r_jsons.Num = Device.Read_DeviceWarning(admin_r, T_sn, T_id, T_title, Time_start, Time_end, page, page_z)
+	r_jsons.Data, r_jsons.Num = Device.Read_DeviceWarning(admin_r, T_sn, T_id, T_title, T_handle, Time_start, Time_end, page, page_z)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
 
@@ -1652,8 +1665,9 @@ func (c *DeviceController) V2_DeviceWarning_Data_Excel() {
 	T_title := c.GetString("T_title")
 	Time_start := c.GetString("Time_start")
 	Time_end := c.GetString("Time_end")
+	T_handle, _ := c.GetInt("T_handle")
 
-	Device_data, _ := Device.Read_DeviceWarning(admin_r, T_sn, T_id, T_title, Time_start, Time_end, 0, 9999)
+	Device_data, _ := Device.Read_DeviceWarning(admin_r, T_sn, T_id, T_title, T_handle, Time_start, Time_end, 0, 9999)
 
 	f := excelize.NewFile() // 设置单元格的值
 	// 这里设置表头
@@ -2399,15 +2413,16 @@ func (c *DeviceController) V2_Class_Get() {
 	r_jsons.T_Notice_mailbox = T.T_Notice_mailbox
 	r_jsons.T_Notice_mechanism = T.T_Notice_mechanism
 
-	T_calss_id_str, _ := NatsServer.Wx_GenerateQRCode("-|" + lib.AesEncryptCBC(strconv.Itoa(T.Id), "0123456789012345") + "|- @宝智达 微信公众号通知")
-	if len(T_calss_id_str) > 0 {
-		r_jsons.T_QRCode = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + T_calss_id_str
-	}
-
-	T_calss_id_str, _ = NatsServer.Wx_GenerateQRCode2("-|" + lib.AesEncryptCBC(strconv.Itoa(T.Id), "0123456789012345") + "|- @宝智达 微信公众号通知")
-	if len(T_calss_id_str) > 0 {
-		r_jsons.T_QRCode2 = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + T_calss_id_str
-	}
+	// 测试环境!!!!!!!!!!!!!!!!!!!
+	//T_calss_id_str, _ := NatsServer.Wx_GenerateQRCode("-|" + lib.AesEncryptCBC(strconv.Itoa(T.Id), "0123456789012345") + "|- @宝智达 微信公众号通知")
+	//if len(T_calss_id_str) > 0 {
+	//	r_jsons.T_QRCode = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + T_calss_id_str
+	//}
+	//
+	//T_calss_id_str, _ = NatsServer.Wx_GenerateQRCode2("-|" + lib.AesEncryptCBC(strconv.Itoa(T.Id), "0123456789012345") + "|- @宝智达 微信公众号通知")
+	//if len(T_calss_id_str) > 0 {
+	//	r_jsons.T_QRCode2 = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + T_calss_id_str
+	//}
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
 	c.ServeJSON()
@@ -2481,10 +2496,15 @@ func (c *DeviceController) V2_Class_Add() {
 	System.Add_UserLogs_T(admin_r.Admin_uuid, "分类管理", "分类添加", t_c)
 
 	// 同步分类
-	DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
-	for _, v := range DataList {
-		V2_Class_Syn(admin_r, v)
-	}
+	go func() {
+		DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
+		for _, v := range DataList {
+			if v.Admin_power > 6 {
+				V2_Class_Syn(admin_r, v)
+			}
+
+		}
+	}()
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -2522,23 +2542,42 @@ func (c *DeviceController) V2_Class_Edit() {
 	}
 
 	R_DeviceClass.Id = Id
-	R_DeviceClass.T_name = T_name
-	R_DeviceClass.T_Notice_wx = T_Notice_wx
-	R_DeviceClass.T_Notice_wx2 = T_Notice_wx2
-	R_DeviceClass.T_Notice_phone = T_Notice_phone
-	R_DeviceClass.T_Notice_message = T_Notice_message
-	R_DeviceClass.T_Notice_mailbox = T_Notice_mailbox
-	R_DeviceClass.T_Notice_mechanism = T_Notice_mechanism
+	if len(T_name) > 0 {
+		R_DeviceClass.T_name = T_name
+	}
+	if len(T_Notice_wx) > 0 {
+		R_DeviceClass.T_Notice_wx = T_Notice_wx
+	}
+	if len(T_Notice_wx2) > 0 {
+		R_DeviceClass.T_Notice_wx2 = T_Notice_wx2
+	}
+	if len(T_Notice_phone) > 0 {
+		R_DeviceClass.T_Notice_phone = T_Notice_phone
+	}
+	if len(T_Notice_message) > 0 {
+		R_DeviceClass.T_Notice_message = T_Notice_message
+	}
+	if len(T_Notice_mailbox) > 0 {
+		R_DeviceClass.T_Notice_mailbox = T_Notice_mailbox
+	}
+	if len(T_Notice_mechanism) > 0 {
+		R_DeviceClass.T_Notice_mechanism = T_Notice_mechanism
+	}
 
 	Device.Update_Class(R_DeviceClass, "T_name", "T_Notice_wx", "T_Notice_wx2", "T_Notice_phone", "T_Notice_message", "T_Notice_mailbox", "T_Notice_mechanism")
 
 	System.Add_UserLogs_T(admin_r.Admin_uuid, "设备管理", "分类操作", R_DeviceClass)
 
 	// 同步分类
-	DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
-	for _, v := range DataList {
-		V2_Class_Syn(admin_r, v)
-	}
+	go func() {
+		DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
+		for _, v := range DataList {
+			if v.Admin_power > 6 {
+				V2_Class_Syn(admin_r, v)
+			}
+
+		}
+	}()
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -2624,10 +2663,15 @@ func (c *DeviceController) V2_Class_Del() {
 	System.Add_UserLogs(admin_r.Admin_uuid, "设备管理", "删除分类操作", strconv.Itoa(id))
 
 	// 同步分类
-	DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
-	for _, v := range DataList {
-		V2_Class_Syn(admin_r, v)
-	}
+	go func() {
+		DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
+		for _, v := range DataList {
+			if v.Admin_power > 6 {
+				V2_Class_Syn(admin_r, v)
+			}
+
+		}
+	}()
 
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
@@ -2704,19 +2748,6 @@ func (c *DeviceController) DeviceClass_Syn() {
 }
 
 func V2_Class_Syn(admin_r Admin.Admin, user_r Admin.Admin) {
-	//验证登录
-	//b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
-	//if !b_ {
-	//	c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
-	//	c.ServeJSON()
-	//	return
-	//}
-	//s_, user_r := Admin.Read_Admin_ByAdmin_uuid(c.GetString("T_uuid"))
-	//if s_ != nil {
-	//	c.Data["json"] = lib.JSONS{Code: 202, Msg: "Admin_uuid Err!"}
-	//	c.ServeJSON()
-	//	return
-	//}
 
 	// 先全部 清掉
 	Device.Device_Bind_ALL_Del(user_r)
@@ -2763,7 +2794,6 @@ func V2_Class_Syn(admin_r Admin.Admin, user_r Admin.Admin) {
 			T_Bind := Device.Device_Bind_Add(v_c.T_sn, user_r)
 			Device.DeviceSensor_T_Bind_ALL(v_c.T_sn, T_Bind)
 		}
-		//
 	}
 	System.Add_UserLogs(admin_r.Admin_uuid, "设备管理", "同步分类操作", "->"+user_r.Admin_uuid)
 
@@ -2877,6 +2907,24 @@ func (c *DeviceController) DeviceSensor_v2_List() {
 	T_sn := c.GetString("T_sn")
 	Name := c.GetString("T_name") //  包含 T_name、T_sn
 	T_calss_id, _ := c.GetInt("T_calssid")
+	T_give, T_give_err := c.GetInt("T_give") //0 :丢弃  1:正常    空:所有
+	if T_give_err != nil {
+		T_give = -1
+	}
+	T_datashow, T_datashow_err := c.GetInt("T_datashow") //空:正常显示   1:强制显示 屏蔽数据展示
+	if T_datashow_err != nil {
+		T_datashow = -1
+	}
+
+	if len(c.GetString("User_uuid")) > 1 {
+		s_, user_r := Admin.Read_Admin_ByAdmin_uuid(c.GetString("User_uuid"))
+		if s_ != nil {
+			c.Data["json"] = lib.JSONS{Code: 202, Msg: "Admin_uuid Err!"}
+			c.ServeJSON()
+			return
+		}
+		admin_r = user_r
+	}
 
 	if T_calss_id > 0 {
 		R_DeviceClass, err := Device.Read_Class_ById(T_calss_id)
@@ -2892,7 +2940,7 @@ func (c *DeviceController) DeviceSensor_v2_List() {
 		}
 	}
 
-	r_jsons.Data, r_jsons.Num = Device.Read_DeviceSensor_v2_List(admin_r, T_sn, Name, T_calss_id, page, page_z)
+	r_jsons.Data, r_jsons.Num = Device.Read_DeviceSensor_v2_List(admin_r, T_sn, Name, T_calss_id, T_give, T_datashow, page, page_z)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
 
@@ -2989,6 +3037,17 @@ func (c *DeviceController) V2_ClassBind_Add() {
 		c.ServeJSON()
 		return
 	}
+	// 同步分类
+	go func() {
+		DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
+		for _, v := range DataList {
+			if v.Admin_power > 6 {
+				V2_Class_Syn(admin_r, v)
+			}
+
+		}
+	}()
+
 	Device.DeviceSensor_T_Calss_Add(T_sn, T_id, T_class_id)
 	System.Add_UserLogs(admin_r.Admin_uuid, "设备管理", "分类绑定操作", strconv.Itoa(T_class_id)+"+>"+T_sn+"-"+strconv.Itoa(T_id))
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
@@ -3096,6 +3155,17 @@ func (c *DeviceController) V2_ClassBind_Del() {
 	Device.DeviceSensor_Bind_Del(T_sn, T_id, T_class_id)
 	System.Add_UserLogs(admin_r.Admin_uuid, "设备管理", "分类删除绑定操作", strconv.Itoa(T_class_id)+"->"+T_sn+"-"+strconv.Itoa(T_id))
 
+	// 同步分类
+	go func() {
+		DataList, _ := Admin.Read_v2_Admin_List(admin_r.Id, "", 0, 9999)
+		for _, v := range DataList {
+			if v.Admin_power > 6 {
+				V2_Class_Syn(admin_r, v)
+			}
+
+		}
+	}()
+
 	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
 	c.ServeJSON()
 	return

+ 30 - 0
controllers/DeviceReal.go

@@ -0,0 +1,30 @@
+package controllers
+
+import (
+	"Cold_Api/Nats/NatsServer"
+	"Cold_Api/controllers/lib"
+	"fmt"
+	"time"
+)
+
+// 循环刷新
+func DeviceRealTime() {
+	fmt.Println("=====================DeviceRealTime GO===============")
+	time.Sleep(time.Second * 10)
+	for true {
+		for k, v := range lib.DeviceRealSnMap {
+			fmt.Println("DeviceRealSnMap:", k, " num:", v)
+			NatsServer.Get_Device_Realtime(k)
+
+			v--
+			if v == 0 {
+				delete(lib.CountrySnMap, k)
+			}
+			time.Sleep(time.Millisecond * 100)
+		}
+		time.Sleep(time.Second * 10)
+
+	}
+}
+
+//  DeviceRealSnMap[sn] = 3

+ 22 - 19
controllers/GoodsOrder.go

@@ -12,6 +12,7 @@ import (
 	"math"
 	"os"
 	"strconv"
+	"strings"
 
 	"time"
 )
@@ -31,7 +32,7 @@ func (c *GoodsOrderController) GoodsOrder_List() {
 	}
 	type R_JSONS struct {
 		//必须的大写开头
-		Data      []Function.GoodsOrder
+		Data      []Function.GoodsOrderR
 		Num       int64
 		Page      int
 		Page_size int
@@ -52,7 +53,7 @@ func (c *GoodsOrderController) GoodsOrder_List() {
 	Name := c.GetString("T_name")
 	c.Data["Name"] = Name
 
-	r_jsons.Data, r_jsons.Num = Function.Read_GoodsOrder_List(admin_r.Admin_uuid, page, page_z, Name)
+	r_jsons.Data, r_jsons.Num = Function.Read_V2_GoodsOrder_List(admin_r.Admin_uuid, page, page_z, Name)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
 
@@ -287,14 +288,17 @@ func (c *GoodsOrderController) GoodsOrder_Add() {
 	T_outorderid := c.GetString("T_outorderid")
 	T_sn := c.GetString("T_sn")
 	T_receiving := c.GetString("T_receiving")
-	T_start_Ut := c.GetString("T_start_Ut")
-	T_end_Ut := c.GetString("T_end_Ut")
-	T_start_Ut_T, _ := c.GetFloat("T_start_Ut_T")
-	T_end_Ut_T, _ := c.GetFloat("T_end_Ut_T")
+	T_time := c.GetString("T_time")
 	T_text := c.GetString("T_text")
+	T_time_s := strings.Split(T_time, "|")
+	if len(T_time_s) != 2 {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "时间参数异常!"}
+		c.ServeJSON()
+		return
+	}
 
-	T_start_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_start_Ut, time.Local)
-	T_end_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_end_Ut, time.Local)
+	T_start_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_time_s[0], time.Local)
+	T_end_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_time_s[1], time.Local)
 	var_ := Function.GoodsOrder{
 		T_uuid:       admin_r.Admin_uuid,
 		T_orderid:    T_orderid,
@@ -303,8 +307,6 @@ func (c *GoodsOrderController) GoodsOrder_Add() {
 		T_receiving:  T_receiving,
 		T_start_Ut:   T_start_Ut_,
 		T_end_Ut:     T_end_Ut_,
-		T_start_Ut_T: float32(T_start_Ut_T),
-		T_end_Ut_T:   float32(T_end_Ut_T),
 		T_text:       T_text,
 		T_State:      1,
 	}
@@ -348,14 +350,17 @@ func (c *GoodsOrderController) GoodsOrder_Edit() {
 	T_outorderid := c.GetString("T_outorderid")
 	T_sn := c.GetString("T_sn")
 	T_receiving := c.GetString("T_receiving")
-	T_start_Ut := c.GetString("T_start_Ut")
-	T_end_Ut := c.GetString("T_end_Ut")
-	T_start_Ut_T, _ := c.GetFloat("T_start_Ut_T")
-	T_end_Ut_T, _ := c.GetFloat("T_end_Ut_T")
+	T_time := c.GetString("T_time")
 	T_text := c.GetString("T_text")
-
-	T_start_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_start_Ut, time.Local)
-	T_end_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_end_Ut, time.Local)
+	T_time_s := strings.Split(T_time, "|")
+	if len(T_time_s) != 2 {
+		c.Data["json"] = lib.JSONS{Code: 207, Msg: "时间参数异常!"}
+		c.ServeJSON()
+		return
+	}
+	println("T_time_s:", T_time_s)
+	T_start_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_time_s[0], time.Local)
+	T_end_Ut_, err := time.ParseInLocation("2006-01-02 15:04:05", T_time_s[1], time.Local)
 	var_ := Function.GoodsOrder{
 		T_uuid:       admin_r.Admin_uuid,
 		T_orderid:    T_orderid,
@@ -364,8 +369,6 @@ func (c *GoodsOrderController) GoodsOrder_Edit() {
 		T_receiving:  T_receiving,
 		T_start_Ut:   T_start_Ut_,
 		T_end_Ut:     T_end_Ut_,
-		T_start_Ut_T: float32(T_start_Ut_T),
-		T_end_Ut_T:   float32(T_end_Ut_T),
 		T_text:       T_text,
 		T_State:      1,
 	}

+ 1 - 1
controllers/Login.go

@@ -27,7 +27,7 @@ func (c *AdminController) Login_verification() {
 	err, admin_r := Admin.ReadLogin_verification(Admin_user, Admin_pass)
 
 	if err != nil {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "E!"}
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "账号密码错误!"}
 	} else {
 		User_tokey := Admin.Add_Tokey_Set(admin_r.Admin_uuid)
 		c.Ctx.SetCookie("User_tokey", User_tokey, time.Second*60*60)

+ 3 - 2
controllers/Logs.go

@@ -6,6 +6,7 @@ import (
 	"Cold_Api/models/System"
 	beego "github.com/beego/beego/v2/server/web"
 	"math"
+	"strings"
 )
 
 type LogsController struct {
@@ -105,7 +106,7 @@ func (c *LogsController) V2_UserLogs() {
 	}
 
 	Class_1 := c.GetString("T_class")
-
+	Class_1 = strings.Replace(Class_1, "\"", "", -1)
 	r_jsons.Data, r_jsons.Num = System.Read_V2_UserLogs_ALL(admin_r.Admin_uuid, Class_1, page, page_z)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
@@ -171,7 +172,7 @@ func (c *LogsController) LogsList() {
 	}
 
 	Class_1 := c.GetString("T_class")
-
+	Class_1 = strings.Replace(Class_1, "\"", "", -1)
 	r_jsons.Data, r_jsons.Num = System.Read_V2_Logs_ALL(Class_1, page, page_z)
 	r_jsons.Page = page
 	r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))

+ 221 - 0
controllers/RawSql.go

@@ -0,0 +1,221 @@
+package controllers
+
+import (
+	"Cold_Api/conf"
+	"Cold_Api/controllers/lib"
+	"Cold_Api/models/Device"
+	"Cold_Api/models/RawSql"
+	"fmt"
+	beego "github.com/beego/beego/v2/server/web"
+	"math"
+	"strings"
+)
+
+//Handle
+type RawSqlController struct {
+	beego.Controller
+}
+
+func (c *RawSqlController) RawSql_html() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Ctx.Redirect(302, "Login")
+		return
+	}
+
+	if admin_r.Id != 1 {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "e!"}
+		c.ServeJSON()
+		return
+
+	}
+
+	page, _ := c.GetInt("page")
+
+	println(page)
+	if page < 1 {
+		page = 1
+	}
+
+	page_z, _ := c.GetInt("Page_size")
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+
+	List, cnt := RawSql.Read_RawSql_List(page, page_z)
+
+	page_size := math.Ceil(float64(cnt) / float64(conf.Page_size))
+
+	c.Data["List"] = List
+	c.Data["Page"] = page
+	c.Data["Page_size"] = page_size
+	c.Data["Pages"] = lib.Func_page(int64(page), int64(page_size))
+	c.Data["cnt"] = cnt
+
+	c.TplName = "RawSql/RawSql.html"
+}
+
+func (c *RawSqlController) RawSql__html() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Ctx.Redirect(302, "Login")
+		return
+	}
+	if admin_r.Id != 1 {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "e!"}
+		c.ServeJSON()
+		return
+
+	}
+
+	c.Data["Device_lite"] = Device.Read_Device_ALL_bind(admin_r)
+
+	//c.Data["Admin_Power"], _ = Admin.Read_AdminPower_ById(admin_r.Admin_power)
+	id, _ := c.GetInt("id")
+	c.Data["id"] = id
+	if id > 0 {
+		rs := RawSql.Read_RawSql_ById(id)
+		c.Data["Date"] = rs
+	}
+
+	c.TplName = "RawSql/RawSql-.html"
+}
+
+func (c *RawSqlController) List_Post() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Ctx.Redirect(302, "Login")
+		return
+	}
+	if admin_r.Id != 1 {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "e!"}
+		c.ServeJSON()
+		return
+
+	}
+
+	var id int64
+	var err error
+
+	id, _ = c.GetInt64("id")
+	T_name := c.GetString("T_name")
+	T_text := c.GetString("T_text")
+
+	var_ := RawSql.RawSql{
+		T_name: T_name,
+		T_text: T_text,
+	}
+	T_SQL_ := strings.ToLower(T_text)
+	if strings.Contains(T_SQL_, "show") ||
+		strings.Contains(T_SQL_, "create") ||
+		strings.Contains(T_SQL_, "drop") ||
+		strings.Contains(T_SQL_, "desc") ||
+		strings.Contains(T_SQL_, "alter") ||
+		strings.Contains(T_SQL_, "insert") ||
+		strings.Contains(T_SQL_, "update") ||
+		strings.Contains(T_SQL_, "delete") {
+
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "添加失败,有违禁 语法!"}
+		c.ServeJSON()
+		return
+	}
+	if id > 0 {
+		var_.Id = int(id)
+		is := RawSql.Update_TRawSql(var_, "T_name", "T_text")
+		if !is {
+			c.Data["json"] = lib.JSONS{Code: 302, Msg: "修改失败!"}
+			c.ServeJSON()
+			return
+		}
+	} else {
+		_, err = RawSql.Add_RawSql(var_)
+		if err != nil {
+			c.Data["json"] = lib.JSONS{Code: 301, Msg: "添加失败!"}
+			c.ServeJSON()
+			return
+		}
+
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+
+}
+
+func (c *RawSqlController) List_Del() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Ctx.Redirect(302, "Login")
+		return
+	}
+	if admin_r.Id != 1 {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "e!"}
+		c.ServeJSON()
+		return
+
+	}
+
+	Id, _ := c.GetInt("Id")
+	if Id > 0 {
+		RawSql_r := RawSql.Read_RawSql_ById(Id)
+		RawSql.Delete_RawSql(RawSql_r)
+	} else {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "e!"}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
+	c.ServeJSON()
+	return
+
+}
+
+//  执行 SQL
+func (c *RawSqlController) Rawv3() {
+	// 验证登录
+	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	if !b_ {
+		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_id := c.GetString("T_id")
+	if len(T_id) != 5 {
+		c.Data["json"] = lib.JSONS{Code: 203, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+	RawSql_r := RawSql.Read_RawSql_ByT_id(T_id)
+	if RawSql_r.Id == 0 {
+		c.Data["json"] = lib.JSONS{Code: 204, Msg: "T_id Err!"}
+		c.ServeJSON()
+		return
+	}
+
+	T_data := c.GetString("T_data")
+	fmt.Println(" 执行SQL:", T_id, " => [", T_data, "] ", admin_r.Admin_uuid, admin_r.Admin_name)
+	var T_dataL []string
+	for _, v := range strings.Split(T_data, "|") {
+		if len(v) > 0 {
+			T_dataL = append(T_dataL, v)
+		}
+
+	}
+	str_, Params := Device.Read_SqlRawL(RawSql_r.T_text, T_dataL)
+	if len(str_) > 0 {
+		c.Data["json"] = lib.JSONS{Code: 202, Msg: "ok!", Data: str_}
+		c.ServeJSON()
+		return
+	}
+
+	c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Params}
+	c.ServeJSON()
+	return
+}

+ 7 - 11
controllers/User.go

@@ -986,22 +986,18 @@ func (c *UserController) Power_html() {
 // 权限管理
 func (c *UserController) Power_List() {
 	// 验证登录
-	b_, admin_r := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
+	b_, _ := lib.Verification(c.Ctx.GetCookie("User_tokey"), c.GetString("User_tokey"))
 	if !b_ {
 		c.Data["json"] = lib.JSONS{Code: 201, Msg: "User_tokey Err!"}
 		c.ServeJSON()
 		return
 	}
-	if admin_r.Id != 1 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "没有权限!"}
-		c.ServeJSON()
-		return
-	}
-	if admin_r.Admin_master != 0 {
-		c.Data["json"] = lib.JSONS{Code: 202, Msg: "没有权限!"}
-		c.ServeJSON()
-		return
-	}
+	//
+	//if admin_r.Admin_master != 0 {
+	//	c.Data["json"] = lib.JSONS{Code: 202, Msg: "没有权限!"}
+	//	c.ServeJSON()
+	//	return
+	//}
 	type R_JSONS struct {
 		//必须的大写开头
 		Data      []Admin.AdminPower

+ 12 - 1
controllers/lib/lib.go

@@ -23,11 +23,13 @@ type Cl_ struct {
 	Uuid_list map[string]string // 泛型
 }
 
-var CountrySnMap map[string]Cl_ /*创建集合 */
+var CountrySnMap map[string]Cl_    /*创建集合 */
+var DeviceRealSnMap map[string]int /*创建集合 */
 var Nats *nats.Conn
 
 func init() {
 	CountrySnMap = make(map[string]Cl_)
+	DeviceRealSnMap = make(map[string]int)
 
 }
 
@@ -52,6 +54,15 @@ type R_JSONS struct {
 	Page_size int
 }
 
+type R1_JSONS struct {
+	//必须的大写开头
+	List      interface{}
+	Num       int
+	Page      int
+	Page_size int
+	Pages     []Page_T
+}
+
 // 登录验证
 func Verification(GetCookie string, GetString string) (bool, Admin.Admin) {
 	Run_My_Server = true // 运行当期服务

+ 0 - 2
go.mod

@@ -11,7 +11,6 @@ require (
 	github.com/nats-io/nats.go v1.16.0
 	github.com/satori/go.uuid v1.2.0
 	github.com/signintech/gopdf v0.13.0
-	github.com/vmihailenco/msgpack v4.0.4+incompatible
 	github.com/vmihailenco/msgpack/v5 v5.3.5
 	github.com/xuri/excelize/v2 v2.6.0
 )
@@ -47,7 +46,6 @@ require (
 	golang.org/x/text v0.3.7 // indirect
 	golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58 // indirect
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
-	google.golang.org/appengine v1.4.0 // indirect
 	google.golang.org/protobuf v1.23.0 // indirect
 	gopkg.in/yaml.v2 v2.2.8 // indirect
 )

+ 0 - 3
go.sum

@@ -191,8 +191,6 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
-github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
-github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
 github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
 github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
 github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
@@ -303,7 +301,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=

+ 1 - 1
lastupdate.tmp

@@ -1 +1 @@
-{"C:\\BZD\\Cold\\Cold_Api\\controllers":1668583856553654400}
+{"C:\\BZD\\Cold\\Cold_Api\\controllers":1669105254735913900}

+ 22 - 0
logs/logx/logx.log

@@ -10,3 +10,25 @@
 2022/11/14 09:54:57.757 [I]  2022-11-14 09:54:57>%!(EXTRA []interface {}=[nats OK!])
 2022/11/14 09:55:59.235 [I]  2022-11-14 09:55:59>%!(EXTRA []interface {}=[============Nats init============])
 2022/11/14 09:55:59.378 [I]  2022-11-14 09:55:59>%!(EXTRA []interface {}=[nats OK!])
+2022/11/16 15:35:09.590 [I]  2022-11-16 15:35:09>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/16 15:35:09.990 [I]  2022-11-16 15:35:09>%!(EXTRA []interface {}=[nats OK!])
+2022/11/18 16:02:46.940 [I]  2022-11-18 16:02:46>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/18 16:03:33.805 [I]  2022-11-18 16:03:33>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:22:27.153 [I]  2022-11-22 15:22:27>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:24:42.241 [I]  2022-11-22 15:24:42>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:24:42.441 [I]  2022-11-22 15:24:42>%!(EXTRA []interface {}=[nats OK!])
+2022/11/22 15:29:49.210 [I]  2022-11-22 15:29:49>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:29:49.354 [I]  2022-11-22 15:29:49>%!(EXTRA []interface {}=[nats OK!])
+2022/11/22 15:36:37.210 [I]  2022-11-22 15:36:37>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:36:37.419 [I]  2022-11-22 15:36:37>%!(EXTRA []interface {}=[nats OK!])
+2022/11/22 15:46:45.760 [I]  2022-11-22 15:46:45>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:52:00.878 [I]  2022-11-22 15:52:00>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:52:01.008 [I]  2022-11-22 15:52:01>%!(EXTRA []interface {}=[nats OK!])
+2022/11/22 15:54:36.101 [I]  2022-11-22 15:54:36>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 15:54:36.224 [I]  2022-11-22 15:54:36>%!(EXTRA []interface {}=[nats OK!])
+2022/11/22 16:12:45.151 [I]  2022-11-22 16:12:45>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 16:12:45.279 [I]  2022-11-22 16:12:45>%!(EXTRA []interface {}=[nats OK!])
+2022/11/22 16:21:06.629 [I]  2022-11-22 16:21:06>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/22 16:21:06.808 [I]  2022-11-22 16:21:06>%!(EXTRA []interface {}=[nats OK!])
+2022/11/23 11:15:10.751 [I]  2022-11-23 11:15:10>%!(EXTRA []interface {}=[============Nats init============])
+2022/11/23 11:15:10.928 [I]  2022-11-23 11:15:10>%!(EXTRA []interface {}=[nats OK!])

+ 3 - 0
main.go

@@ -3,6 +3,7 @@ package main
 import (
 	_ "Cold_Api/Nats"
 	"Cold_Api/conf"
+	"Cold_Api/controllers"
 	"Cold_Api/controllers/lib"
 	"Cold_Api/models/Device"
 	_ "Cold_Api/routers"
@@ -55,6 +56,8 @@ func main() {
 	beego.AddFuncMap("convertm", convertM)
 	beego.AddFuncMap("IsYD", IsYD)
 
+	go controllers.DeviceRealTime() // 实时 数据
+
 	fmt.Println("======= beego.Run ======")
 	beego.Run()
 

+ 24 - 1
models/Device/Device.go

@@ -99,6 +99,23 @@ func init() {
 
 }
 
+func DeviceToR2_Device(r Device) (t R2_Device) {
+	t.T_sn = r.T_sn
+	t.T_MSISDN = r.T_MSISDN
+	t.T_devName = r.T_devName
+	t.T_sensor = r.T_sensor
+	t.T_monitor = r.T_monitor
+	t.T_give = r.T_give
+	t.T_online = r.T_online
+	t.T_online_4g = r.T_online_4g
+	t.T_Dattery = r.T_Dattery
+	t.T_protocol = r.T_protocol
+	t.UpdateTime = r.UpdateTime
+	//
+
+	return
+}
+
 // ---------------- Redis -------------------
 //Redis_Set(m.T_sn,m) // Redis 更新缓存
 func Redis_Set(r Device) (err error) {
@@ -366,9 +383,15 @@ func Read_Device_v2_List(user_ Admin.Admin, T_name string, T_monitor string, T_o
 		cond1 = cond1.AndCond(cond.And("T_give", 1))
 	}
 
-	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("Id").OrderBy("-T_give").All(&r)
+	var rx []Device
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("Id").OrderBy("-T_give").All(&rx)
 	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
 
+	for _, v := range rx {
+		r = append(r, DeviceToR2_Device(v))
+	}
+
 	return r, cnt
 }
 

+ 14 - 0
models/Device/DeviceData.go

@@ -301,6 +301,20 @@ func Read_SqlRaw(T_SQL string) []orm2.Params {
 	return lists
 }
 
+//
+func Read_SqlRawL(T_SQL string, T_data []string) (string, []orm2.Params) {
+	o := orm.NewOrm()
+	var lists []orm2.Params
+	fmt.Println(T_SQL)
+	_, err := o.Raw(T_SQL, T_data).Values(&lists)
+	if err != nil {
+
+		return err.Error(), lists
+	}
+
+	return "", lists
+}
+
 // 获取最新数据
 func Read_DeviceSensorData_ById_New(SN string, T_id int) (DeviceData_New, bool) {
 	o := orm.NewOrm()

+ 20 - 13
models/Device/DeviceSensor.go

@@ -2,6 +2,7 @@ package Device
 
 import (
 	"Cold_Api/conf"
+	"Cold_Api/controllers/lib"
 	"Cold_Api/models/Admin"
 	"encoding/json"
 	"fmt"
@@ -151,6 +152,7 @@ func Redis_DeviceSensor_DelK(r DeviceSensor) (err error) {
 }
 
 func DeviceSensorToDeviceSensor_R(DeviceSensor_ DeviceSensor) (DeviceSensor_r DeviceSensor_R) {
+	lib.DeviceRealSnMap[DeviceSensor_r.T_sn] = 3 // 连续请求 实时数据
 
 	DeviceSensor_r.T_sn = DeviceSensor_.T_sn
 	DeviceSensor_r.T_id = DeviceSensor_.T_id
@@ -497,7 +499,7 @@ func Read_DeviceSensor_class_ALL_1(user_ Admin.Admin, T_Calss_id int, page int,
 }
 
 // 获取列表
-func Read_DeviceSensor_v2_List(user_ Admin.Admin, T_sn string, T_name string, T_Calss_id int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
+func Read_DeviceSensor_v2_List(user_ Admin.Admin, T_sn string, T_name string, T_Calss_id int, T_give int, T_datashow int, page int, page_z int) (DeviceSensor_r []DeviceSensor_R, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -522,29 +524,34 @@ func Read_DeviceSensor_v2_List(user_ Admin.Admin, T_sn string, T_name string, T_
 
 	var r []DeviceSensor
 	cond := orm.NewCondition()
-	cond1 := cond.And("T_Bind__icontains", T_Bind).And("T_name__icontains", T_name).And("T_datashow", 1) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
+	cond1 := cond.And("T_Bind__icontains", T_Bind) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
 
 	if T_Calss_id > 0 {
 		T_Calss := "C" + strconv.Itoa(T_Calss_id) + "|"
 		fmt.Println("T_Calss:", T_Calss)
-		cond1 = cond1.AndCond(cond.And("T_Calss__icontains", T_Calss))
+		cond1 = cond1.And("T_Calss__icontains", T_Calss)
 	}
 
-	if len(T_sn) < 6 {
-		cond1 = cond1.AndCond(cond.And("T_sn__icontains", T_sn))
+	if len(T_sn) > 0 {
+		cond1 = cond1.And("T_sn__icontains", T_sn)
 	}
 
-	if len(T_sn) < 6 {
-		cond1 = cond1.AndCond(cond.And("T_sn__icontains", T_sn))
+	if len(T_name) > 0 {
+		cond1 = cond1.AndCond(cond.Or("T_name__icontains", T_name).Or("T_sn__icontains", T_name))
 	}
 
-	if len(T_sn) < 6 {
-		cond1 = cond.AndCond(cond1).AndCond(cond.And("T_give", 1))
+	if T_give != -1 { // 0 :丢弃  1:正常    空:所有
+		cond1 = cond1.And("T_give", T_give)
+	} else {
+		// 非内部权限
+		println("user_.Admin_power:", user_.Admin_power)
+		if user_.Admin_power < 6 {
+			cond1 = cond1.And("T_give", 1)
+		}
 	}
-	// 非内部权限
-	println("user_.Admin_power:", user_.Admin_power)
-	if len(T_sn) < 6 {
-		cond1 = cond.AndCond(cond1).AndCond(cond.And("T_give", 1))
+
+	if T_datashow != -1 { // 空:正常显示   1:强制显示 屏蔽数据展示
+		cond1 = cond1.And("T_datashow", 1)
 	}
 
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort", "T_id").All(&r)

+ 6 - 0
models/Device/DeviceSensorParameter.go

@@ -25,6 +25,12 @@ type DeviceSensorParameter struct {
 	T_en      int     `orm:"size(2);1"`      // en:是否启用传感器,
 	T_free    int     `orm:"size(2);1"`      // free:监测点是否为闲置状态(空库,只监测不报警)
 
+	T_enprel int     `orm:"size(2);1"`      // 是否启用预警
+	T_tprel  float32 `orm:"size(200);null"` //  温度预警下限
+	T_tpreu  float32 `orm:"size(200);null"` //  温度预警上限
+	T_hprel  float32 `orm:"size(200);null"` //  湿度预警下限
+	T_hpreu  float32 `orm:"size(200);null"` //  温度预警上限
+
 	T_uuid      string `orm:"size(256);null"` //处理 人员
 	T_Msid      int64  `orm:"size(50);0"`     // 消息识别ID
 	T_SendState int    `orm:"size(2);0"`      // 发送状态  0 待发送   1 发送成功  2 失败  3 覆盖

+ 22 - 14
models/Device/DeviceWarning.go

@@ -35,25 +35,25 @@ type DeviceWarning struct {
 	T_Text string    `orm:"size(256);null"`        // 备注
 	T_Log  string    `orm:"type(text);null"`       // 处理日志
 
-	T_State    int       `orm:"size(2);1"`                                             // 0 删除   1 正常
+	T_State    int       `orm:"size(2);1"`                                             // 0 删除    1 已处理   2 未处理
 	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 
 // 模板
 type DeviceWarning_R struct {
-	T_sn     string    `orm:"size(256);null"`        // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
-	T_Id     int       `orm:"size(200);null"`        //  传感器 ID
-	T_Name   string    `orm:"size(256);null"`        // 传感器  温度探头1
-	T_T      float32   `orm:"size(20);null"`         //  湿度下限
-	T_RH     float32   `orm:"size(20);null"`         //  湿度上限
-	T_Title  string    `orm:"size(256);null"`        // 报警标题 温度超上限报警
-	T_Addr   string    `orm:"size(256);null"`        //  地址    车载环境监测仪
-	T_Remark string    `orm:"size(256);null"`        // 备注
-	T_Ut     time.Time `orm:"type(timestamp);null;"` // 采集时间
-	T_Text   string    `orm:"size(256);null"`        // 备注
-	T_Log    []string  `orm:"type(text);null"`       // 处理日志
-
+	T_sn     string    // 设备序列号 KF开头,环境监测主机。 YD开头,温途监测主机
+	T_Id     int       //  传感器 ID
+	T_Name   string    // 传感器  温度探头1
+	T_T      float32   //  湿度下限
+	T_RH     float32   //  湿度上限
+	T_Title  string    // 报警标题 温度超上限报警
+	T_Addr   string    //  地址    车载环境监测仪
+	T_Remark string    // 备注
+	T_Ut     time.Time // 采集时间
+	T_Text   string    // 备注
+	T_Log    []string  // 处理日志
+	T_State  int       // 0 删除   1 未处理   2 已处理
 }
 
 func (t *DeviceWarning) TableName() string {
@@ -78,6 +78,7 @@ func DeviceWarningToDeviceWarning_R(t DeviceWarning) (r DeviceWarning_R) {
 	r.T_Remark = t.T_Remark
 	r.T_Ut = t.T_Ut
 	r.T_Text = t.T_Text
+	r.T_State = t.T_State
 	r.T_Log = strings.Split(t.T_Log, "\n")
 	return r
 }
@@ -219,7 +220,7 @@ func Read_DeviceWarning_1(user_ Admin.Admin, page int, T_sn string, T_Name strin
 }
 
 // 获取列表
-func Read_DeviceWarning(user_ Admin.Admin, T_sn string, T_id string, T_title string, Time_start_ string, Time_end_ string, page int, page_z int) (r []DeviceWarning, cnt int64) {
+func Read_DeviceWarning(user_ Admin.Admin, T_sn string, T_id string, T_title string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []DeviceWarning, cnt int64) {
 
 	o := orm.NewOrm()
 	// 也可以直接使用 Model 结构体作为表名
@@ -265,6 +266,13 @@ func Read_DeviceWarning(user_ Admin.Admin, T_sn string, T_id string, T_title str
 	if len(Time_end_) > 0 {
 		cond1 = cond1.And("T_Ut__lte", Time_end_)
 	}
+	//不填或0:所有      1:已处理     2:未处理
+	if T_handle == 1 {
+		cond1 = cond1.And("T_Text__isnull", true)
+	}
+	if T_handle == 2 {
+		cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
+	}
 
 	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&r)
 	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()

+ 65 - 36
models/Function/GoodsOrder.go

@@ -2,6 +2,7 @@ package Function
 
 import (
 	"Cold_Api/conf"
+	"Cold_Api/models/Device"
 	"fmt"
 	"github.com/beego/beego/v2/adapter/orm"
 	orm2 "github.com/beego/beego/v2/client/orm"
@@ -11,8 +12,8 @@ import (
 
 // 模板
 type GoodsOrder struct {
-	Id     int    `orm:"column(ID);size(11);auto;pk"`
-	T_id   string `orm:"size(50);null"` // 订单唯一ID
+	Id int `orm:"column(ID);size(11);auto;pk"`
+	//T_id   string `orm:"size(50);null"` // 订单唯一ID
 	T_uuid string `orm:"size(50);null"` // 用户
 
 	T_orderid    string `orm:"size(256);null"` // 订单号
@@ -33,9 +34,10 @@ type GoodsOrder struct {
 	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
 }
 type GoodsOrderR struct {
-	T_id         string    // ID
+	Id           int       // ID
 	T_orderid    string    // 订单号
 	T_outorderid string    // 出库订单号
+	T_name       string    // 设备名称
 	T_sn         string    // 设备sn
 	T_receiving  string    // 收货单位
 	T_start_Ut   time.Time // 起运时间
@@ -57,16 +59,22 @@ func init() {
 }
 
 func GoodsOrderToGoodsOrderR(t GoodsOrder) (r GoodsOrderR) {
-	r.T_id = r.T_id
-	r.T_orderid = r.T_orderid
-	r.T_outorderid = r.T_outorderid
-	r.T_sn = r.T_sn
-	r.T_receiving = r.T_receiving
-	r.T_start_Ut = r.T_start_Ut
-	r.T_start_Ut_T = r.T_start_Ut_T
-	r.T_end_Ut = r.T_end_Ut
-	r.T_end_Ut_T = r.T_end_Ut_T
-	r.T_text = r.T_text
+	r.Id = t.Id
+	r.T_orderid = t.T_orderid
+	r.T_outorderid = t.T_outorderid
+	Device_r, err := Device.Read_Device_ByT_sn(t.T_sn)
+	r.T_name = t.T_sn
+	if err == nil {
+		r.T_name = Device_r.T_devName
+	}
+
+	r.T_sn = t.T_sn
+	r.T_receiving = t.T_receiving
+	r.T_start_Ut = t.T_start_Ut
+	r.T_start_Ut_T = t.T_start_Ut_T
+	r.T_end_Ut = t.T_end_Ut
+	r.T_end_Ut_T = t.T_end_Ut_T
+	r.T_text = t.T_text
 	return
 }
 
@@ -82,33 +90,21 @@ func Read_GoodsOrder_ById(id int) (r GoodsOrder) {
 	return r
 }
 
-// 获取 ById
-func Read_GoodsOrder_ByT_id(T_id string) (r GoodsOrder) {
-	o := orm.NewOrm()
-	r = GoodsOrder{T_id: T_id}
-	err := o.Read(&r, "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
-	if err != nil {
-		fmt.Println(err)
-	}
-	return r
-}
+//// 获取 ById
+//func Read_GoodsOrder_ByT_id(T_id string) (r GoodsOrder) {
+//	o := orm.NewOrm()
+//	r = GoodsOrder{T_id: T_id}
+//	err := o.Read(&r, "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+//	if err != nil {
+//		fmt.Println(err)
+//	}
+//	return r
+//}
 
 // 添加
 func Add_GoodsOrder(m GoodsOrder) (id int64, err error) {
 	o := orm.NewOrm()
-	//T_id := ""
-	//var rand_x int64
-	//for true {
-	//	var rx GoodsOrder
-	//	rx.T_id = lib.GetRandstring(8, "", rand_x)
-	//	err = o.Read(&rx, "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
-	//	if err != nil {
-	//		T_id = rx.T_id
-	//		break
-	//	}
-	//	rand_x++
-	//}
-	//m.T_id = T_id
+
 	id, err = o.Insert(&m)
 	if err != nil {
 		fmt.Println(err)
@@ -143,6 +139,39 @@ func Delete_GoodsOrder(m GoodsOrder) (err error) {
 }
 
 // 获取列表
+func Read_V2_GoodsOrder_List(Admin_uuid string, page int, page_z int, Name string) (t []GoodsOrderR, cnt int64) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(GoodsOrder))
+	var offset int64
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	var r []GoodsOrder
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	cond := orm.NewCondition()
+	cond1 := cond.And("T_uuid", Admin_uuid).And("T_State", 1)
+
+	if len(Name) > 0 {
+		cond1 = cond.AndCond(cond1).AndCond(cond.Or("T_sn__icontains", Name).Or("T_orderid__icontains", Name).Or("T_outorderid__icontains", Name))
+	}
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("Id").All(&r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
+
+	for _, v := range r {
+		t = append(t, GoodsOrderToGoodsOrderR(v))
+	}
+	return t, cnt
+}
+
+// 获取列表
 func Read_GoodsOrder_List(Admin_uuid string, page int, page_z int, Name string) (r []GoodsOrder, cnt int64) {
 	o := orm.NewOrm()
 

+ 129 - 0
models/RawSql/RawSql.go

@@ -0,0 +1,129 @@
+package RawSql
+
+import (
+	"Cold_Api/conf"
+	"Cold_Api/controllers/lib"
+	"fmt"
+	"github.com/beego/beego/v2/adapter/orm"
+	_ "github.com/go-sql-driver/mysql"
+	"time"
+)
+
+// 模板
+type RawSql struct {
+	Id         int       `orm:"column(ID);size(11);auto;pk"`
+	T_id       string    `orm:"size(10);null"`                                         // 订单唯一ID
+	T_name     string    `orm:"size(256);null"`                                        // 设备名称
+	T_text     string    `orm:"type(text);null"`                                       // 详情
+	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
+}
+type RawSqlR struct {
+	T_id   string // ID
+	T_name string // SQL 名称
+	T_text string // 详情
+}
+
+func (t *RawSql) TableName() string {
+	return "RawSql" // 数据库名称   // ************** 替换 FormulaList **************
+}
+
+func init() {
+	//注册模型
+	orm.RegisterModel(new(RawSql))
+
+}
+
+// ---------------- 特殊方法 -------------------
+
+func RawSqlToRawSqlR(t RawSql) (r RawSqlR) {
+	r.T_id = t.T_id
+	r.T_name = t.T_name
+	r.T_text = t.T_text
+	return
+}
+
+// 获取 ById
+func Read_RawSql_ById(id int) (r RawSql) {
+	o := orm.NewOrm()
+	r = RawSql{Id: id}
+	err := o.Read(&r) // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+	if err != nil {
+		fmt.Println(err)
+	}
+	return r
+}
+
+// 获取 ById
+func Read_RawSql_ByT_id(T_id string) (r RawSql) {
+	o := orm.NewOrm()
+	r = RawSql{T_id: T_id}
+	err := o.Read(&r, "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+	if err != nil {
+		fmt.Println(err)
+	}
+	return r
+}
+
+// 添加
+func Add_RawSql(m RawSql) (id int64, err error) {
+	o := orm.NewOrm()
+	T_id := ""
+	var rand_x int64
+	for true {
+		var rx RawSql
+		rx.T_id = lib.GetRandstring(5, "", rand_x)
+		err = o.Read(&rx, "T_id") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
+		if err != nil {
+			T_id = rx.T_id
+			break
+		}
+		rand_x++
+	}
+	m.T_id = T_id
+	id, err = o.Insert(&m)
+	if err != nil {
+		fmt.Println(err)
+	}
+	return id, err
+}
+
+// 修改
+func Update_TRawSql(r RawSql, cols ...string) bool {
+	o := orm.NewOrm()
+	if num, err := o.Update(&r, cols...); err == nil {
+		fmt.Println("Number of records updated in database:", num)
+		return true
+	}
+	return false
+}
+
+// 删除
+func Delete_RawSql(m RawSql) (err error) {
+	o := orm.NewOrm()
+	if num, err := o.Delete(&m); err == nil {
+		fmt.Println("Number of records deleted in database:", num)
+	}
+	return
+}
+
+// 获取列表
+func Read_RawSql_List(page int, page_z int) (t []RawSql, cnt int64) {
+	o := orm.NewOrm()
+
+	// 也可以直接使用 Model 结构体作为表名
+	qs := o.QueryTable(new(RawSql))
+	var offset int64
+	if page_z == 0 {
+		page_z = conf.Page_size
+	}
+	if page <= 1 {
+		offset = 0
+	} else {
+		offset = int64((page - 1) * page_z)
+	}
+
+	qs.Limit(page_z, offset).OrderBy("Id").All(&t)
+	cnt, _ = qs.Count()
+
+	return t, cnt
+}

+ 8 - 2
models/System/Logs.go

@@ -68,8 +68,14 @@ func Read_V2_Logs_ALL(Logs_class string, page int, page_z int) (r []Logs, cnt in
 		offset = int64((page - 1) * page_z)
 	}
 
-	qs.Limit(page_z, offset).Filter("Logs_class", Logs_class).OrderBy("-Id").All(&r)
-	cnt, _ = qs.Filter("Logs_class", Logs_class).Count()
+	cond := orm.NewCondition()
+	cond1 := cond
+	if len(Logs_class) > 0 {
+		cond1 = cond1.And("Logs_class", Logs_class)
+	}
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("Id").All(&r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
 
 	return r, cnt
 }

+ 8 - 2
models/System/UserLogs.go

@@ -80,8 +80,14 @@ func Read_V2_UserLogs_ALL(Logs_uuid string, Logs_class string, page int, page_z
 		offset = int64((page - 1) * page_z)
 	}
 
-	qs.Limit(page_z, offset).Filter("Logs_uuid", Logs_uuid).Filter("Logs_class", Logs_class).OrderBy("-Id").All(&r)
-	cnt, _ = qs.Filter("Logs_uuid", Logs_uuid).Filter("Logs_class", Logs_class).Count()
+	cond := orm.NewCondition()
+	cond1 := cond.And("Logs_uuid", Logs_uuid)
+	if len(Logs_class) > 0 {
+		cond1 = cond1.And("Logs_class", Logs_class)
+	}
+
+	qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-Id").All(&r)
+	cnt, _ = qs.SetCond((*orm2.Condition)(cond1)).Count()
 
 	return r, cnt
 }

+ 1 - 1
routers/Data.go

@@ -33,7 +33,7 @@ func init() {
 	beego.Router("/Data/DeviceSensor_Data_Print", &controllers.DataController{}, "*:DeviceSensor_Data_Print") // 设置 设备参数
 	beego.Router("/Data/DataScreen_Map", &controllers.DataController{}, "*:DataScreen_Map")                   // 设置 设备参数
 
-	beego.Router("/Data/Raw", &controllers.DataController{}, "*:Raw") // 设置 设备参数
+	//beego.Router("/Data/Raw", &controllers.DataController{}, "*:Raw") // 设置 设备参数
 	// 3D
 	beego.Router("/Data/DataView3d_html", &controllers.DataController{}, "*:DataView3d_html")
 	beego.Router("/Data/UpDataView3d", &controllers.DataController{}, "*:UpDataView3d")

+ 3 - 5
routers/Function.go

@@ -8,9 +8,7 @@ import (
 func init() {
 	beego.Router("/GoodsOrder/GoodsOrder_html", &controllers.GoodsOrderController{}, "*:GoodsOrder_html")   // 获取未读消息
 	beego.Router("/GoodsOrder/GoodsOrder__html", &controllers.GoodsOrderController{}, "*:GoodsOrder__html") // 获取未读消息
-	//beego.Router("/GoodsOrder/List", &controllers.TemplateController{}, "*:List")           // 获取未读消息
-	//beego.Router("/GoodsOrder/List_", &controllers.TemplateController{}, "*:List_")         // 获取未读消息
-	beego.Router("/GoodsOrder/List_Post", &controllers.GoodsOrderController{}, "*:List_Post") // 获取未读消息
-	beego.Router("/GoodsOrder/List_Del", &controllers.GoodsOrderController{}, "*:List_Del")   // 获取未读消息
-	beego.Router("/GoodsOrder/Data_PDF", &controllers.GoodsOrderController{}, "*:Data_PDF")   // 获取未读消息
+	beego.Router("/GoodsOrder/List_Post", &controllers.GoodsOrderController{}, "*:List_Post")               // 获取未读消息
+	beego.Router("/GoodsOrder/List_Del", &controllers.GoodsOrderController{}, "*:List_Del")                 // 获取未读消息
+	beego.Router("/GoodsOrder/Data_PDF", &controllers.GoodsOrderController{}, "*:Data_PDF")                 // 获取未读消息
 }

+ 5 - 0
routers/router.go

@@ -38,6 +38,11 @@ func init() {
 	//beego.Router("/Wx/Wx_handler", &controllers.WxController{}, "*:Wx_handler")  // 获取未读消息
 	//beego.Router("/Wx/Wx_handler", &controllers.WxController{}, "*:Wx")  // 获取未读消息
 
+	beego.Router("/RawSql/Raw_html", &controllers.RawSqlController{}, "*:RawSql_html")   // 获取未读消息
+	beego.Router("/RawSql/Raw__html", &controllers.RawSqlController{}, "*:RawSql__html") // 获取未读消息
+	beego.Router("/RawSql/List_Post", &controllers.RawSqlController{}, "*:List_Post")    // 获取未读消息
+	beego.Router("/RawSql/List_Del", &controllers.RawSqlController{}, "*:List_Del")      // 获取未读消息
+
 	// 模板路由
 	beego.Router("/Template/List", &controllers.TemplateController{}, "*:List")           // 获取未读消息
 	beego.Router("/Template/List_", &controllers.TemplateController{}, "*:List_")         // 获取未读消息

+ 11 - 2
routers/v3.go

@@ -85,6 +85,15 @@ func init() {
 	beego.Router(version+"/Data/Excel", &controllers.DataController{}, "*:Device_Sensor_Data_Excel")  // 获取未读消息
 	beego.Router(version+"/Data/PDF", &controllers.DataController{}, "*:Device_Sensor_Data_PDF")      // 获取未读消息
 
+	// 2D
+	//beego.Router(version+"/Data/DataView3d_html", &controllers.DataController{}, "*:DataView3d_html")
+	//beego.Router(version+"/Data/UpDataView3d", &controllers.DataController{}, "*:UpDataView3d")
+	// 3D
+	beego.Router(version+"/Data/DataView3d_html", &controllers.DataController{}, "*:DataView3d_html")
+	beego.Router(version+"/Data/UpDataView3d", &controllers.DataController{}, "*:UpDataView3d")
+	// 执行 SQL
+	beego.Router(version+"/Data/Raw", &controllers.RawSqlController{}, "*:Rawv3") // 执行 SQL
+
 	// 订单管理
 	beego.Router(version+"/GoodsOrder/List", &controllers.GoodsOrderController{}, "*:GoodsOrder_List") // 获取未读消息
 	beego.Router(version+"/GoodsOrder/Get", &controllers.GoodsOrderController{}, "*:GoodsOrder_Get")   // 获取未读消息
@@ -94,7 +103,7 @@ func init() {
 	beego.Router(version+"/GoodsOrder/PDF", &controllers.GoodsOrderController{}, "*:GoodsOrder_PDF")   // 获取未读消息
 
 	// 系统日志
-	beego.Router("/System/LogsClass", &controllers.LogsController{}, "*:LogsClass") // 获取未读消息
-	beego.Router("/System/LogsList", &controllers.LogsController{}, "*:LogsList")   // 获取未读消息
+	beego.Router(version+"/System/LogsClass", &controllers.LogsController{}, "*:LogsClass") // 获取未读消息
+	beego.Router(version+"/System/LogsList", &controllers.LogsController{}, "*:LogsList")   // 获取未读消息
 
 }

+ 1 - 1
server.pid

@@ -1 +1 @@
-20148
+99966

+ 5 - 1
tests/default_test.go

@@ -2,12 +2,16 @@ package test
 
 import (
 	"fmt"
+	"strings"
 	"testing"
+	"time"
 )
 
 // TestBeego is a sample to run an endpoint test
 func TestBeego(t *testing.T) {
 
-	fmt.Println(len("你")) //打印结果:2017-04-11 13:24:04
+	T_time_s := strings.Split("2022-11-15 00:00:00|2822-11-23 00:00:00", "|")
 
+	println("T_time_s:", T_time_s[0])
+	fmt.Println(time.ParseInLocation("2006-01-02 15:04:05", T_time_s[0], time.Local))
 }

+ 119 - 0
views/RawSql/RawSql-.html

@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html class="x-admin-sm" style="overflow-y: hidden;" xmlns="http://www.w3.org/1999/html">
+    
+    <head>
+        <meta charset="UTF-8">
+        <meta name="renderer" content="webkit">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
+        <link rel="shortcut icon" href="https://osscold.baozhida.cn/favicon.ico">
+        <link rel="bookmark" href="https://osscold.baozhida.cn/favicon.ico">
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/css/font.css">
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/css/xadmin.css">
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/layui/css/layui.css">
+        <script type="text/javascript" src="https://osscold.baozhida.cn/layui/layui.js" charset="utf-8"></script>
+        <script type="text/javascript" src="https://osscold.baozhida.cn/js/xadmin.js"></script>
+        <script src="https://osscold.baozhida.cn/js/jquery.min.js"></script>
+        <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
+        <!--[if lt IE 9]>
+            <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
+            <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
+        <![endif]--></head>
+
+    <body>
+        <div class="layui-fluid">
+            <div class="layui-row">
+                <form class="layui-form" lay-filter="example1">
+                    <div class="layui-form-item" style="margin-top: 20px">
+                        <label for="T_name" class="layui-form-label">名称</label>
+                        <div class="layui-input-inline">
+                            <input {{if gt .id 0 }} value="{{.Date.T_name}}" {{end}}
+                                   type="text" id="T_name" name="T_name" required="" autocomplete="off" class="layui-input"></div>
+                    </div>
+
+
+                    <div class="layui-form-item layui-form-text">
+                        <label for="T_text" class="layui-form-label">详情</label>
+                        <div class="layui-input-block">
+
+                            <textarea name="T_text" id="T_text" class="layui-textarea">{{.Date.T_text}}</textarea>
+                        </div>
+                    </div>
+                    <div class="layui-form-item" style="text-align: center;margin-top: 20px">
+<!--                        <label for="L_repass" class="layui-form-label"></label>-->
+                        <button class="layui-btn  layui-btn-normal" lay-filter="add" lay-submit="">提交</button></div>
+
+                    <blockquote class="layui-elem-quote">SELECT * FROM user WHERE `ID` > ? AND `uuid` LIKE ? LIMIT 0,1000</blockquote>
+                    <blockquote class="layui-elem-quote">POST: 地址/v3/Data/Raw</br> T_id:FTxZ8 </br> T_data:250|%c8%|</blockquote>
+
+                </form>
+            </div>
+        </div>
+        <script>
+
+            layui.use(['form', 'layer',"layedit","laydate"],
+
+                function() {
+                    $ = layui.jquery;
+
+                    var form = layui.form;
+                    var layer = layui.layer;
+                    var layedit = layui.layedit
+                    var laydate = layui.laydate
+                    laydate.render({
+                        elem: '#T_start_Ut' //指定元素
+                        ,type: 'datetime'
+                        ,range: true
+                        ,trigger: 'click', // 新增这一行以解决
+                    });
+
+
+                    //监听提交
+                    form.on('submit(add)',
+                        function(data) {
+                            console.log("=== submit(add) ==");
+                            console.log(data);
+
+                            $.ajax({
+                                type: 'POST',
+                                url: 'List_Post',//发送请求
+                                data: {
+                                    id:"{{.id}}",
+                                    T_name:data.field.T_name,
+                                    T_text:data.field.T_text,
+                                },
+                                success: function(result) {
+                                    console.log(result)
+                                    if(result.Code == 200){
+                                        layer.msg("操作成功", {
+                                            icon: 1,
+                                            time: 2000
+                                        });
+                                        //关闭当前frame
+                                        parent.layer.close(parent.layer.getFrameIndex(window.name));
+                                        parent.location.reload();
+
+                                        form.render('select');
+                                        // return false;
+                                    }else {
+                                        layer.msg("错误:"+result.Msg, {
+                                            icon: 2,
+                                            time: 2000
+                                        });
+                                    }
+
+
+
+                                }
+                            });
+
+                            return false;
+                        });
+
+                });
+        </script>
+
+
+    </body>
+
+</html>

+ 156 - 0
views/RawSql/RawSql.html

@@ -0,0 +1,156 @@
+<!DOCTYPE html>
+<html class="x-admin-sm">
+    
+    <head>
+        <meta charset="UTF-8">
+        <meta name="renderer" content="webkit">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
+        <link rel="shortcut icon" href="https://osscold.baozhida.cn/favicon.ico">
+        <link rel="bookmark" href="https://osscold.baozhida.cn/favicon.ico">
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/css/font.css">
+        <link rel="stylesheet" href="https://osscold.baozhida.cn/css/xadmin.css">
+        <script src="https://osscold.baozhida.cn/lib/layui/layui.js" charset="utf-8"></script>
+        <script type="text/javascript" src="https://osscold.baozhida.cn/js/xadmin.js"></script>
+    </head>
+    
+    <body>
+        <div class="x-nav">
+            <span class="layui-breadcrumb">
+                <a href="">首页</a>
+               <a><cite>宝智达</cite></a>
+            </span>
+            <a class="layui-btn layui-btn-normal" style="line-height:1.6em;margin-top:3px;float:right" onclick="location.reload()" title="刷新">
+                <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i>
+            </a>
+        </div>
+        <div class="layui-fluid">
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+                    <div class="layui-card">
+
+                        <div class="layui-card-header">
+<!--                            <button class="layui-btn layui-btn-danger" onclick="delAll()">-->
+<!--                                <i class="layui-icon"></i>批量删除</button>-->
+                            <button class="layui-btn  layui-btn-normal" onclick="xadmin.open('添加','Raw__html',650,600,false);">
+                                <i class="layui-icon"></i>添加</button></div>
+                        <div class="layui-card-body ">
+                            <table class="layui-table layui-form">
+                                <thead>
+                                    <tr>
+                                        <th>T_id</th>
+                                        <th>标题</th>
+                                        <th>SQL</th>
+                                        <th style="width: 122.7px;">操作</th></tr>
+                                </thead>
+                                <tbody>
+                                {{range $index, $elem := .List}}
+                                    <tr>
+
+                                        <td>{{$elem.T_id}}</td>
+                                        <td>{{$elem.T_name}}</td>
+                                        <td>{{$elem.T_text}}</td>
+                                        <td class="td-manage">
+                                            <a title="编辑" onclick="xadmin.open('编辑','Raw__html?id={{$elem.Id}}',650,600,false);" href="javascript:;">
+                                                <i class="layui-icon">&#xe63c;</i>编辑</a>
+                                            <a title="删除" onclick="member_del(this,'{{$elem.Id}}')" href="javascript:;">
+                                                <i class="layui-icon">&#xe640;</i>删除</a>
+                                        </td>
+                                    </tr>
+                                {{end}}
+
+
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="layui-card-body ">
+                            <div class="page">
+                                <div>
+
+                                    {{range $index, $elem := .Pages}}
+                                        {{if eq $elem.A 1}}
+                                        <a class="prev" href="?page={{$elem.V}}">&lt;&lt;</a>
+                                        {{end}}
+                                        {{if eq $elem.A 2}}
+                                        <a class="num" href="?page={{$elem.V}}">{{$elem.V}}</a>
+                                        {{end}}
+                                        {{if eq $elem.A 3}}
+                                        <span class="current">{{$elem.V}}</span>
+                                        {{end}}
+                                        {{if eq $elem.A 4}}
+                                        <a class="num" href="?page={{$elem.V}}">{{$elem.V}}</a>
+                                        {{end}}
+                                        {{if eq $elem.A 5}}
+                                        <a class="next" href="?page={{$elem.V}}">&gt;&gt;</a>
+                                        {{end}}
+
+
+
+                                    {{end}}
+
+
+
+                                </div>
+                                Page:{{.Page}}-
+                                Page_size:{{.Page_size}}-
+                                cnt:{{.cnt}}
+                            </div>
+                        </div>
+
+
+                    </div>
+                </div>
+            </div>
+        </div>
+    </body>
+    <script>
+        layui.use(['laydate', 'form'],
+            function() {
+                var laydate = layui.laydate;
+
+                //执行一个laydate实例
+                laydate.render({
+                    elem: '#start' //指定元素
+                });
+
+                //执行一个laydate实例
+                laydate.render({
+                    elem: '#end' //指定元素
+            });
+        });
+
+        /*用户-删除*/
+        function member_del(obj, id) {
+            layer.confirm('确认要删除吗?',
+            function(index) {
+                //发异步删除数据
+                $(obj).parents("tr").remove();
+
+                $.ajax({
+                    type: 'POST',
+                    url: 'List_Del',//发送请求
+                    data: {Id:id},
+                    success: function(result) {
+                        console.log(result)
+                        if (result.Code == 200 ){
+                            layer.msg('已删除!', {
+                                icon: 1,
+                                time: 2000
+                            });
+                            window.location.reload();
+                        }else {
+                            layer.msg('删除失败!', {
+                                time: 2000
+                            });
+                        }
+
+                    }
+                });
+
+
+
+            });
+        }
+    </script>
+
+</html>

+ 6 - 0
views/index.html

@@ -293,6 +293,12 @@
                                     <i class="iconfont">&#xe6a7;</i>
                                     <cite>系统日志</cite></a>
                             </li>
+
+                            <li class="open">
+                                <a onclick="xadmin.del_all();xadmin.add_tab('sql','/RawSql/Raw_html')">
+                                    <i class="iconfont">&#xe6a7;</i>
+                                    <cite>sql</cite></a>
+                            </li>
                             {{end}}
 
                             {{if and