(301,3,'mqtt 客户端类','package models\r\n\r\nimport (\r\n	\"bytes\"\r\n	\"fmt\"\r\n	\"log\"\r\n	\"sync\"\r\n	\"time\"\r\n\r\n	mqtt \"github.com/eclipse/paho.mqtt.golang\"\r\n)\r\n\r\ntype MqttClient struct {\r\n	Client        mqtt.Client\r\n	opts          *mqtt.ClientOptions\r\n	Username      string\r\n	Password      string\r\n	ClientId      string\r\n	Broker        string\r\n	Reconnecting  bool            // 是否正在重连\r\n	Subscriptions map[string]byte // 存储已订阅的主题和QoS\r\n	reconnectLock sync.Mutex\r\n}\r\n\r\nfunc (ggg *MqttClient) Setup() *MqttClient {\r\n	ggg.opts = mqtt.NewClientOptions().AddBroker(ggg.Broker) //tcp://192.168.1.2:1883\r\n	ggg.opts.SetUsername(ggg.Username)\r\n	ggg.opts.SetPassword(ggg.Password)\r\n	ggg.opts.SetClientID(ggg.ClientId)\r\n	ggg.opts.SetDefaultPublishHandler(func(c mqtt.Client, m mqtt.Message) {\r\n		log.Printf(\"[%s] 收到消息: 主题=%s, 内容=%s\\n\", ggg.Username, m.Topic(), m.Payload())\r\n	})\r\n	// 设置连接回调\r\n	ggg.opts.OnConnect = func(client mqtt.Client) {\r\n		log.Printf(\"设备 %s 连接成功\\n\", ggg.Username)\r\n		ggg.Reconnecting = false\r\n		// 重连后恢复订阅\r\n		ggg.reconnectLock.Lock()\r\n		defer ggg.reconnectLock.Unlock()\r\n		if ggg.Subscriptions != nil {\r\n			for topic, qos := range ggg.Subscriptions {\r\n				token := client.Subscribe(topic, qos, nil)\r\n				token.Wait()\r\n				if token.Error() != nil {\r\n					log.Printf(\"恢复订阅失败 %s: %v\\n\", topic, token.Error())\r\n				} else {\r\n					log.Printf(\"恢复订阅成功 %s\\n\", topic)\r\n				}\r\n			}\r\n		}\r\n	}\r\n\r\n	// 设置断开连接回调\r\n	ggg.opts.OnConnectionLost = func(client mqtt.Client, err error) {\r\n		log.Printf(\"设备 %s 连接丢失: %v\\n\", ggg.Username, err)\r\n		ggg.startReconnect()\r\n	}\r\n\r\n	ggg.Client = mqtt.NewClient(ggg.opts)\r\n	//连接并等待连接成功\r\n	if token := ggg.Client.Connect(); token.WaitTimeout(3 * time.Second) {\r\n		if token.Error() != nil {\r\n			return nil\r\n		}\r\n	} else {\r\n		return nil\r\n	}\r\n\r\n	return ggg\r\n}\r\nfunc (ggg *MqttClient) Publish(topic string, qos int, retained bool, payload interface{}) error {\r\n	if !ggg.Client.IsConnected() {\r\n		return fmt.Errorf(\"MQTT客户端未连接\")\r\n	}\r\n	// 校验 QoS 合法性\r\n	if qos < 0 || qos > 2 {\r\n		return fmt.Errorf(\"invalid QoS level: %d\", qos)\r\n	}\r\n\r\n	var pubPayload interface{}\r\n	switch p := payload.(type) {\r\n	case string:\r\n		pubPayload = p\r\n	case []byte:\r\n		pubPayload = p\r\n	case bytes.Buffer:\r\n		pubPayload = p.Bytes()\r\n	default:\r\n		return fmt.Errorf(\"unknown payload type\")\r\n	}\r\n\r\n	// 校验 payload 长度（最大 268,435,455 字节）\r\n	if b, ok := pubPayload.([]byte); ok {\r\n		if len(b) > 268435455 {\r\n			return fmt.Errorf(\"payload too large for MQTT publish\")\r\n		}\r\n	} else if s, ok := pubPayload.(string); ok {\r\n		if len(s) > 268435455 {\r\n			return fmt.Errorf(\"payload too large for MQTT publish\")\r\n		}\r\n	}\r\n\r\n	token := ggg.Client.Publish(topic, byte(qos), retained, payload)\r\n\r\n	// 等待发布结果，最多等待 3 秒\r\n	if !token.WaitTimeout(3 * time.Second) {\r\n		return fmt.Errorf(\"publish timeout\")\r\n	}\r\n\r\n	if err := token.Error(); err != nil {\r\n		return fmt.Errorf(\"publish failed: %v\", err)\r\n	}\r\n\r\n	return nil\r\n}\r\nfunc (ggg *MqttClient) Subscribe(topic string, qos int, callback mqtt.MessageHandler) error {\r\n	if !ggg.Client.IsConnected() {\r\n		return fmt.Errorf(\"MQTT客户端未连接\")\r\n	}\r\n	// 校验 QoS 合法性\r\n	if qos < 0 || qos > 2 {\r\n		return fmt.Errorf(\"invalid QoS level: %d\", qos)\r\n	}\r\n	// 如果没有提供回调函数，使用默认处理\r\n	if callback == nil {\r\n		callback = func(client mqtt.Client, msg mqtt.Message) {\r\n			opts1 := client.OptionsReader()\r\n			log.Printf(\"[%s] 收到订阅消息: 主题=%s, 内容=%s\\n\", opts1.Username(), msg.Topic(), msg.Payload())\r\n		}\r\n	}\r\n	if ggg.Subscriptions == nil {\r\n		ggg.Subscriptions = make(map[string]byte)\r\n	}\r\n	// 存储订阅信息以便重连后恢复\r\n	ggg.reconnectLock.Lock()\r\n	ggg.Subscriptions[topic] = byte(qos)\r\n	ggg.reconnectLock.Unlock()\r\n\r\n	token := ggg.Client.Subscribe(topic, byte(qos), callback)\r\n	if token.Wait() && token.Error() != nil {\r\n		return fmt.Errorf(\"订阅失败: %v\", token.Error())\r\n	}\r\n\r\n	return nil\r\n}\r\nfunc (m *MqttClient) Unsubscribe(topic string) error {\r\n	m.reconnectLock.Lock()\r\n	delete(m.Subscriptions, topic)\r\n	m.reconnectLock.Unlock()\r\n\r\n	token := m.Client.Unsubscribe(topic)\r\n	token.Wait()\r\n	return token.Error()\r\n}\r\nfunc (ggg *MqttClient) Disconnect() { // 断开连接\r\n	ggg.reconnectLock.Lock()\r\n	defer ggg.reconnectLock.Unlock()\r\n	ggg.Reconnecting = false\r\n\r\n	if ggg.Client.IsConnected() {\r\n		ggg.Client.Disconnect(250) // 优雅断开连接，等待250ms\r\n		log.Printf(\"客户端 %s 已断开连接\\n\", ggg.Username)\r\n	}\r\n}\r\n\r\n// 开始重连逻辑\r\nfunc (m *MqttClient) startReconnect() {\r\n	m.reconnectLock.Lock()\r\n	defer m.reconnectLock.Unlock()\r\n\r\n	// 防止重复启动重连\r\n	if m.Reconnecting {\r\n		return\r\n	}\r\n\r\n	m.Reconnecting = true\r\n\r\n	// 启动重连协程\r\n	go func() {\r\n		retryCount := 0\r\n		maxRetries := 10\r\n\r\n		for {\r\n			// 指数退避策略\r\n			retryCount++\r\n			d := 0\r\n			if retryCount*2 < 30 {\r\n				d = retryCount * 2\r\n			} else {\r\n				d = 30\r\n			}\r\n			backoffTime := time.Second * time.Duration(d)\r\n			log.Printf(\"重连尝试 %d/%d，%s 后重试\\n\", retryCount, maxRetries, backoffTime)\r\n			time.Sleep(backoffTime)\r\n\r\n			m.reconnectLock.Lock()\r\n			if !m.Reconnecting {\r\n				m.reconnectLock.Unlock()\r\n				return\r\n			}\r\n			m.reconnectLock.Unlock()\r\n\r\n			log.Printf(\"尝试重连到 %s...\\n\", m.Broker)\r\n\r\n			// 创建新客户端实例\r\n			m.Client = mqtt.NewClient(m.opts)\r\n			token := m.Client.Connect()\r\n			token.Wait()\r\n\r\n			if token.Error() == nil {\r\n				log.Printf(\"重连成功\\n\")\r\n				m.Reconnecting = false\r\n				return\r\n			}\r\n\r\n			log.Printf(\"重连失败: %v\\n\", token.Error())\r\n\r\n			if retryCount >= maxRetries {\r\n				log.Printf(\"达到最大重连次数，停止重连\\n\")\r\n				m.Reconnecting = false\r\n				return\r\n			}\r\n		}\r\n	}()\r\n}\r\n','',1),
(302,3,'电脑客户端服务器定时','package main\r\n\r\nimport (\r\n	\"log\"\r\n	\"net\"\r\n	\"os/exec\"\r\n	\"pcmqtt/models\"\r\n	\"strings\"\r\n	\"syscall\"\r\n	\"time\"\r\n	\"unsafe\"\r\n\r\n	mqtt \"github.com/eclipse/paho.mqtt.golang\"\r\n)\r\n\r\nvar windowsAlert = WindowsAlert{}\r\nvar mqttClient = models.MqttClient{}\r\n\r\nfunc main() {\r\n	mac := GetMac()\r\n	mac = strings.TrimSpace(mac)\r\n	mqttClient := models.MqttClient{\r\n		Broker:        \"tcp://192.168.0.254:1883\",\r\n		ClientId:      \"pcmqtt-\" + mac,\r\n		Username:      mac,\r\n		Password:      mac,\r\n		Reconnecting:  false,\r\n		Subscriptions: map[string]byte{\"computer/control\": 0},\r\n	}\r\n	mqttClient.Setup()\r\n	mqttClient.Subscribe(\"computer/control\", 0, func(client mqtt.Client, msg mqtt.Message) {\r\n		message := string(msg.Payload())\r\n		log.Println(message)\r\n		if message == mqttClient.Username+\":shutdown\" {\r\n			arg := []string{\"-s\", \"-t\", \"0\"}\r\n			cmd := exec.Command(\"shutdown\", arg...)\r\n			cmd.CombinedOutput()\r\n		} else {\r\n			go func() {\r\n				windowsAlert.ShowMessage(\"服务器提示\", message)\r\n			}()\r\n		}\r\n	})\r\n	for {\r\n	}\r\n}\r\nfunc GetMac() string {\r\n	netInterfaces, err := net.Interfaces()\r\n	if err != nil {\r\n		return \"\"\r\n	}\r\n	for _, i2 := range netInterfaces {\r\n		//fmt.Println(i2.Name)\r\n		mac := i2.HardwareAddr\r\n		//fmt.Println(mac)\r\n		return mac.String()\r\n	}\r\n	return \"\"\r\n}\r\n\r\ntype WindowsAlert struct {\r\n}\r\n\r\nfunc (ggg *WindowsAlert) StrPtr(s string) uintptr {\r\n	utf16Ptr, _ := syscall.UTF16PtrFromString(s)\r\n	return uintptr(unsafe.Pointer(utf16Ptr))\r\n}\r\nfunc (ggg *WindowsAlert) ShowMessage(title, text string) {\r\n	user32dll, _ := syscall.LoadLibrary(\"user32.dll\")\r\n	user32 := syscall.NewLazyDLL(\"user32.dll\")\r\n	MessageBoxW := user32.NewProc(\"MessageBoxW\")\r\n	defer syscall.FreeLibrary(user32dll)\r\n	MessageBoxW.Call(uintptr(0), ggg.StrPtr(text), ggg.StrPtr(title), uintptr(0))\r\n	time.Sleep(time.Second * 3)\r\n}\r\n','',1),
(303,3,'golang gin  接受json','type mqttJSON struct {\r\n	Id             int\r\n	Username       string\r\n	Password       string\r\n	PublishTopic   string\r\n	SubscribeTopic string\r\n	Nickname       string\r\n}\r\n\r\nfunc (ggg KeepInTouch) MqttUsersAdd(ctx *gin.Context) {\r\n	var mqttUsersJson = &mqttJSON{}\r\n	if err := ctx.ShouldBindJSON(&mqttUsersJson); err != nil {\r\n		ctx.String(200, \"接收失败\")\r\n		return\r\n	}\r\n	username := mqttUsersJson.Username\r\n	password := mqttUsersJson.Password\r\n	publishTopic := mqttUsersJson.PublishTopic\r\n	subscribeTopic := mqttUsersJson.SubscribeTopic\r\n	nickname := mqttUsersJson.Nickname\r\n	fmt.Println(username)\r\n结构体 里面的 变量 首字母必须要大写','',1),
(307,3,'mqttOverWs(mqttServer 结构体)','package models\r\n\r\nimport (\r\n	\"context\"\r\n	\"crypto/tls\"\r\n	\"errors\"\r\n	\"fmt\"\r\n	\"io\"\r\n	\"net\"\r\n	\"net/http\"\r\n	\"os\"\r\n	\"os/signal\"\r\n	\"strings\"\r\n	\"syscall\"\r\n	\"time\"\r\n\r\n	\"github.com/DrmagicE/gmqtt\"\r\n	_ \"github.com/DrmagicE/gmqtt/persistence\"\r\n	\"github.com/DrmagicE/gmqtt/pkg/packets\"\r\n	mqttServer \"github.com/DrmagicE/gmqtt/server\"\r\n	_ \"github.com/DrmagicE/gmqtt/topicalias/fifo\"\r\n)\r\n\r\ntype MqttServerZ struct {\r\n	CertFile string\r\n	KeyFile  string\r\n}\r\n\r\nvar postUrl = \"http://localhost/api/mqttserver_state\"\r\n\r\nfunc (ggg *MqttServerZ) MqttServerTLS() {\r\n	// 加载TLS证书和私钥\r\n	cert, err := tls.LoadX509KeyPair(ggg.CertFile, ggg.KeyFile)\r\n	if err != nil {\r\n		fmt.Printf(\"加载TLS证书失败: %v\\n\", err)\r\n		return\r\n	}\r\n\r\n	// 创建TLS配置\r\n	tlsConfig := &tls.Config{\r\n		Certificates: []tls.Certificate{cert},\r\n		ClientAuth:   tls.NoClientCert, // 单向认证\r\n		MinVersion:   tls.VersionTLS12, // 最低TLS版本\r\n	}\r\n\r\n	//创建TLS监听器，监听8083端口\r\n	ln, err := tls.Listen(\"tcp\", \":8883\", tlsConfig)\r\n	if err != nil {\r\n		fmt.Printf(\"创建TLS监听器失败: %v\\n\", err)\r\n		return\r\n	}\r\n	// 设置MQTT钩子\r\n	hooks := mqttServer.Hooks{\r\n		//账号密码认证\r\n		OnBasicAuth: func(ctx context.Context, client mqttServer.Client, req *mqttServer.ConnectRequest) error {\r\n			username := string(req.Connect.Username)\r\n			password := string(req.Connect.Password)\r\n			clientId := string(req.Connect.ClientID)\r\n			fmt.Println(username, password, clientId)\r\n			if Db.conn != nil {\r\n				fmt.Println(\"数据库连接成功\")\r\n				id := 0\r\n				Db.Sql(\"SELECT id FROM MqttServer WHERE username=? AND password=?\", username, password).Row(&id)\r\n				if id == 0 {\r\n					client.Close()\r\n					return fmt.Errorf(\"账号密码错误\")\r\n				} else {\r\n					client.ClientOptions().Username = username\r\n					ggg.RequestPost(postUrl, \"username=\"+username+\"&message=connect\")\r\n					return nil\r\n				}\r\n			} else {\r\n				client.Close()\r\n				fmt.Println(\"数据库连接失败\")\r\n				return fmt.Errorf(\"数据库连接失败\")\r\n			}\r\n\r\n		},\r\n		// 连接处理钩子（可访问完整的ConnectRequest）\r\n		OnConnected: func(ctx context.Context, client mqttServer.Client) {\r\n			fmt.Printf(\"客户端已连接: %s\\n\", client.ClientOptions().ClientID)\r\n		},\r\n\r\n		OnClosed: func(ctx context.Context, client mqttServer.Client, err error) {\r\n			fmt.Printf(\"客户端已断开: %s, 错误: %v\\n\", client.ClientOptions().Username, err)\r\n			ggg.RequestPost(postUrl, \"username=\"+client.ClientOptions().Username+\"&message=disconnect\")\r\n		},\r\n	}\r\n\r\n	// 创建MQTT服务器\r\n	srv := mqttServer.New(\r\n		mqttServer.WithTCPListener(ln),\r\n		mqttServer.WithHook(hooks),\r\n	)\r\n\r\n	// 添加保留消息\r\n	retainedService := srv.RetainedService()\r\n	retainedService.AddOrReplace(&gmqtt.Message{\r\n		QoS:      packets.Qos1,\r\n		Retained: true,\r\n		Topic:    \"a/b/c\",\r\n		Payload:  []byte(\"retained message\"),\r\n	})\r\n\r\n	// 启动服务器\r\n	go func() {\r\n		signalCh := make(chan os.Signal, 1)\r\n		signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)\r\n		<-signalCh\r\n		srv.Stop(context.Background())\r\n	}()\r\n\r\n	fmt.Println(\"MQTT服务器已启动，监听TLS端口: 8083\")\r\n	if err := srv.Run(); err != nil {\r\n		panic(fmt.Sprintf(\"服务器运行失败: %v\", err))\r\n	}\r\n}\r\nfunc (ggg *MqttServerZ) MqttServer() {\r\n\r\n	ln, err := net.Listen(\"tcp\", \":1883\")\r\n	if err != nil {\r\n		fmt.Printf(\"创建TLS监听器失败: %v\\n\", err)\r\n		return\r\n	}\r\n	defer ln.Close()\r\n	// 设置MQTT钩子\r\n	hooks := mqttServer.Hooks{\r\n		//账号密码认证\r\n		OnBasicAuth: func(ctx context.Context, client mqttServer.Client, req *mqttServer.ConnectRequest) error {\r\n			username := string(req.Connect.Username)\r\n			password := string(req.Connect.Password)\r\n			clientId := string(req.Connect.ClientID)\r\n			fmt.Println(username, password, clientId)\r\n			if Db.conn != nil {\r\n				fmt.Println(\"数据库连接成功\")\r\n				id := 0\r\n				Db.Sql(\"SELECT id FROM MqttServer WHERE username=? AND password=?\", username, password).Row(&id)\r\n				if id == 0 {\r\n					client.Close()\r\n					return fmt.Errorf(\"账号密码错误\")\r\n				} else {\r\n					// 保存用户名到客户端属性\r\n					client.ClientOptions().Username = username\r\n					ggg.RequestPost(postUrl, \"username=\"+username+\"&message=connect\")\r\n					return nil\r\n				}\r\n			} else {\r\n				client.Close()\r\n				fmt.Println(\"数据库连接失败\")\r\n				return fmt.Errorf(\"数据库连接失败\")\r\n			}\r\n		},\r\n		OnConnected: func(ctx context.Context, client mqttServer.Client) {\r\n			fmt.Printf(\"客户端已连接: %s\\n\", client.ClientOptions().ClientID)\r\n		},\r\n\r\n		OnClosed: func(ctx context.Context, client mqttServer.Client, err error) {\r\n			fmt.Printf(\"客户端已断开: %s, 错误: %v\\n\", client.ClientOptions().Username, err)\r\n			ggg.RequestPost(postUrl, \"username=\"+client.ClientOptions().Username+\"&message=disconnect\")\r\n		},\r\n	}\r\n\r\n	// 创建MQTT服务器\r\n	srv := mqttServer.New(\r\n		mqttServer.WithTCPListener(ln),\r\n		mqttServer.WithHook(hooks),\r\n	)\r\n\r\n	// 添加保留消息\r\n	retainedService := srv.RetainedService()\r\n	retainedService.AddOrReplace(&gmqtt.Message{\r\n		QoS:      packets.Qos1,\r\n		Retained: true,\r\n		Topic:    \"a/b/c\",\r\n		Payload:  []byte(\"retained message\"),\r\n	})\r\n\r\n	// 启动服务器\r\n	go func() {\r\n		signalCh := make(chan os.Signal, 1)\r\n		signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)\r\n		<-signalCh\r\n		srv.Stop(context.Background())\r\n	}()\r\n\r\n	fmt.Println(\"MQTT服务器已启动，监听TLS端口: 1883\")\r\n	if err := srv.Run(); err != nil {\r\n		panic(fmt.Sprintf(\"服务器运行失败: %v\", err))\r\n	}\r\n}\r\nfunc (ggg *MqttServerZ) RequestPost(url string, KVstring string) (string, error) {\r\n	myhttp := &http.Client{}\r\n	myhttp.Timeout = time.Duration(3 * time.Second)\r\n	resp, err1 := myhttp.Post(url, \"application/x-www-form-urlencoded; charset=UTF-8\", strings.NewReader(KVstring))\r\n	if err1 != nil {\r\n		return \"\", errors.New(\"服务器未响应\")\r\n	}\r\n	defer resp.Body.Close()\r\n	body, err2 := io.ReadAll(resp.Body)\r\n	if err2 != nil {\r\n		return \"\", errors.New(\"读取数据fail\")\r\n	}\r\n	return string(body), nil\r\n}\r\nfunc IsValidMAC(mac string) bool {\r\n	_, err := net.ParseMAC(mac)\r\n	return err == nil\r\n}\r\n','',1),
(308,3,'mqttOverWs(mqttServer 启动)','// 启动MQTT服务器\r\n	go func() {\r\n		// 命令行参数\r\n		certFile := flag.String(\"cert\", \"wulian.nobiggie.cn_bundle.crt\", \"TLS证书文件路径\")\r\n		keyFile := flag.String(\"key\", \"wulian.nobiggie.cn.key\", \"TLS私钥文件路径\")\r\n		flag.Parse()\r\n		// 启动MQTT服务器\r\n		mqttServer := models.MqttServerZ{\r\n			CertFile: *certFile,\r\n			KeyFile:  *keyFile,\r\n		}\r\n		//mqttServer.MqttServerTLS()  //启动TLS服务器\r\n		mqttServer.MqttServer() //启动非TLS服务器\r\n	}()','',1),
(309,3,'mqttOverWs(mqtt解析 结构体)','package models\r\n\r\nimport (\r\n	\"encoding/binary\"\r\n	\"fmt\"\r\n)\r\n\r\n// MQTT解析\r\ntype MqttAnalysis struct {\r\n}\r\n\r\n// 解析MQTT剩余长度\r\nfunc (ggg *MqttAnalysis) DecodeRemainingLength(buf []byte) (int, int, error) {\r\n	multiplier := 1\r\n	value := 0\r\n	index := 0\r\n	for {\r\n		if index >= len(buf) {\r\n			return 0, 0, fmt.Errorf(\"剩余长度解析不完整\")\r\n		}\r\n		digit := int(buf[index])\r\n		value += (digit & 127) * multiplier\r\n		if multiplier > 128*128*128 {\r\n			return 0, 0, fmt.Errorf(\"剩余长度过大\")\r\n		}\r\n		multiplier *= 128\r\n		index++\r\n		if (digit & 128) == 0 {\r\n			break\r\n		}\r\n	}\r\n	return value, index, nil\r\n}\r\n\r\n// 解析MQTT CONNECT报文\r\nfunc (ggg *MqttAnalysis) ParseConnectPacket(data []byte) (map[string]string, error) {\r\n	result := make(map[string]string)\r\n	// 跳过固定报头和剩余长度\r\n	pos := 2\r\n	// 解析协议名\r\n	protocolLen := binary.BigEndian.Uint16(data[pos : pos+2])\r\n	pos += 2\r\n	protocolName := string(data[pos : pos+int(protocolLen)])\r\n	pos += int(protocolLen)\r\n	result[\"ProtocolName\"] = protocolName\r\n	// 解析协议级别\r\n	protocolLevel := data[pos]\r\n	pos++\r\n	result[\"ProtocolLevel\"] = fmt.Sprintf(\"%d\", protocolLevel)\r\n	// 解析连接标志\r\n	connectFlags := data[pos]\r\n	pos++\r\n	// 解析保持活动时间\r\n	keepAlive := binary.BigEndian.Uint16(data[pos : pos+2])\r\n	pos += 2\r\n	result[\"KeepAlive\"] = fmt.Sprintf(\"%d\", keepAlive)\r\n	// 解析客户端ID\r\n	clientIDLen := binary.BigEndian.Uint16(data[pos : pos+2])\r\n	pos += 2\r\n	clientID := string(data[pos : pos+int(clientIDLen)])\r\n	pos += int(clientIDLen)\r\n	result[\"ClientID\"] = clientID\r\n	// 解析用户名和密码\r\n	if connectFlags&0x80 != 0 {\r\n		usernameLen := binary.BigEndian.Uint16(data[pos : pos+2])\r\n		pos += 2\r\n		username := string(data[pos : pos+int(usernameLen)])\r\n		pos += int(usernameLen)\r\n		result[\"Username\"] = username\r\n	}\r\n\r\n	if connectFlags&0x40 != 0 {\r\n		passwordLen := binary.BigEndian.Uint16(data[pos : pos+2])\r\n		pos += 2\r\n		password := string(data[pos : pos+int(passwordLen)])\r\n		pos += int(passwordLen)\r\n		result[\"Password\"] = password\r\n	}\r\n\r\n	return result, nil\r\n}\r\n\r\n// 生成MQTT CONNACK报文\r\nfunc (ggg *MqttAnalysis) GenerateConnackPacket(sessionPresent bool, returnCode byte) []byte {\r\n	connack := make([]byte, 4)\r\n	connack[0] = 0x20 // 固定报头：CONNACK\r\n	connack[1] = 0x02 // 剩余长度\r\n	if sessionPresent {\r\n		connack[2] = 0x01 // 会话存在标志\r\n	} else {\r\n		connack[2] = 0x00 // 会话不存在标志\r\n	}\r\n	connack[3] = returnCode // 返回码\r\n	return connack\r\n}\r\n\r\n// 生成MQTT PUBLISH报文\r\nfunc (ggg *MqttAnalysis) GeneratePublishPacket(topic string, payload []byte, qos byte, retain bool, packetID uint16) ([]byte, error) {\r\n	// 验证参数有效性\r\n	if qos > 2 {\r\n		return nil, fmt.Errorf(\"无效的QoS级别: %d\", qos)\r\n	}\r\n\r\n	topicLength := len(topic)\r\n	if topicLength > 65535 {\r\n		return nil, fmt.Errorf(\"主题名长度超出限制\")\r\n	}\r\n\r\n	// 计算剩余长度\r\n	variableHeaderLength := 2 + topicLength // 主题长度字段(2字节) + 主题名\r\n	if qos > 0 {\r\n		variableHeaderLength += 2 // 包ID\r\n	}\r\n	remainingLength := variableHeaderLength + len(payload)\r\n\r\n	// 构建固定报头 (类型 + 标志位)\r\n	fixedHeader := byte(0x30) // PUBLISH类型\r\n	// 设置QoS级别\r\n	fixedHeader |= (qos << 1) & 0x06\r\n	// 设置保留标志\r\n	if retain {\r\n		fixedHeader |= 0x01\r\n	}\r\n\r\n	// 编码剩余长度\r\n	remainingBytes := ggg.EncodeRemainingLength(remainingLength)\r\n\r\n	// 构建可变报头\r\n	variableHeader := make([]byte, variableHeaderLength)\r\n	binary.BigEndian.PutUint16(variableHeader[0:2], uint16(topicLength))\r\n	copy(variableHeader[2:], topic)\r\n\r\n	// QoS>0时添加PacketID\r\n	if qos > 0 {\r\n		binary.BigEndian.PutUint16(variableHeader[2+topicLength:], packetID)\r\n	}\r\n\r\n	// 组合完整报文\r\n	message := make([]byte, 1+len(remainingBytes)+len(variableHeader)+len(payload))\r\n	message[0] = fixedHeader\r\n	copy(message[1:], remainingBytes)\r\n	copy(message[1+len(remainingBytes):], variableHeader)\r\n	copy(message[1+len(remainingBytes)+len(variableHeader):], payload)\r\n\r\n	return message, nil\r\n}\r\n\r\n// 构建MQTT PUBLISH消息\r\nfunc (ggg *MqttAnalysis) BuildPublishMessage(topic string, payload []byte, qos byte, retain bool) ([]byte, error) {\r\n	// 验证QoS值\r\n	if qos > 2 {\r\n		return nil, fmt.Errorf(\"无效的QoS级别: %d\", qos)\r\n	}\r\n\r\n	topicLength := len(topic) // 计算主题名长度\r\n	if topicLength > 65535 {\r\n		return nil, fmt.Errorf(\"主题名长度超出限制\")\r\n	}\r\n\r\n	// 计算剩余长度\r\n	// 剩余长度 = 主题名长度(2字节) + 主题名 + 可选PacketID(2字节) + 载荷长度\r\n	remainingLength := 2 + topicLength + len(payload)\r\n	if qos > 0 {\r\n		remainingLength += 2 // 包含PacketID\r\n	}\r\n\r\n	// 构建固定报头\r\n	fixedHeader := byte(0x30) // PUBLISH类型\r\n	// 设置QoS级别\r\n	fixedHeader |= (qos << 1) & 0x06\r\n	// 设置保留标志\r\n	if retain {\r\n		fixedHeader |= 0x01\r\n	}\r\n\r\n	// 编码剩余长度\r\n	remainingBytes := ggg.EncodeRemainingLength(remainingLength)\r\n\r\n	// 构建可变报头\r\n	variableHeader := make([]byte, 2+topicLength)\r\n	binary.BigEndian.PutUint16(variableHeader[0:2], uint16(topicLength))\r\n	copy(variableHeader[2:], topic)\r\n\r\n	// 如果QoS>0，添加PacketID\r\n	var packetIDBytes []byte\r\n	if qos > 0 {\r\n		packetIDBytes = make([]byte, 2)\r\n		// 这里应该使用唯一的PacketID，示例中使用固定值\r\n		binary.BigEndian.PutUint16(packetIDBytes, uint16(1234))\r\n	}\r\n\r\n	// 组装完整消息\r\n	message := make([]byte, 1+len(remainingBytes)+len(variableHeader)+len(packetIDBytes)+len(payload))\r\n	message[0] = fixedHeader\r\n	copy(message[1:], remainingBytes)\r\n	copy(message[1+len(remainingBytes):], variableHeader)\r\n	if qos > 0 {\r\n		copy(message[1+len(remainingBytes)+len(variableHeader):], packetIDBytes)\r\n	}\r\n	copy(message[1+len(remainingBytes)+len(variableHeader)+len(packetIDBytes):], payload)\r\n\r\n	return message, nil\r\n}\r\n\r\n// 生成MQTT SUBACK报文\r\nfunc (ggg *MqttAnalysis) GenerateSubackPacket(packetID uint16, returnCodes []byte) []byte {\r\n	// 计算剩余长度\r\n	remainingLength := 2 + len(returnCodes)\r\n\r\n	// 构建固定报头\r\n	fixedHeader := []byte{\r\n		0x90, // SUBACK报文类型\r\n		byte(remainingLength),\r\n	}\r\n\r\n	// 构建可变报头\r\n	variableHeader := make([]byte, 2)\r\n	binary.BigEndian.PutUint16(variableHeader, packetID)\r\n\r\n	// 组合完整报文\r\n	return append(append(fixedHeader, variableHeader...), returnCodes...)\r\n}\r\n\r\n// 编码剩余长度字段（MQTT协议特有变长编码）\r\nfunc (ggg *MqttAnalysis) EncodeRemainingLength(length int) []byte {\r\n	var result []byte\r\n	for {\r\n		digit := byte(length % 128)\r\n		length = length / 128\r\n		if length > 0 {\r\n			digit |= 0x80\r\n		}\r\n		result = append(result, digit)\r\n		if length == 0 {\r\n			break\r\n		}\r\n	}\r\n	return result\r\n}\r\n','',1),
(310,3,'mqttOverWs(ws桥接mqtt 结构体)','package models\r\n\r\nimport (\r\n	\"encoding/binary\"\r\n	\"errors\"\r\n	\"fmt\"\r\n	\"log\"\r\n	\"net\"\r\n	\"sync\"\r\n	\"time\"\r\n\r\n	mqtt \"github.com/eclipse/paho.mqtt.golang\"\r\n	\"github.com/gorilla/websocket\"\r\n)\r\n\r\n// MqttServerOrWs\r\ntype MqttServerOrWs struct {\r\n	Client     *websocket.Conn\r\n	User       string\r\n	Fd         uint32\r\n	ClientId   string\r\n	MqttClient MqttClientZ\r\n}\r\n\r\nvar (\r\n	MqttA        = &MqttAnalysis{}\r\n	WsConnetPool = make(map[uint32]*MqttServerOrWs) // WebSocket连接池\r\n	RWlock       = sync.RWMutex{}                   // 读写锁\r\n	MqttHost     = \"localhost:1883\"\r\n)\r\n\r\nfunc NewMqttServerOrWs(conn *websocket.Conn, fd uint32, mc MqttClientZ) *MqttServerOrWs {\r\n	client := &MqttServerOrWs{\r\n		Client:     conn,\r\n		User:       \"\",\r\n		Fd:         fd,\r\n		ClientId:   \"\",\r\n		MqttClient: mc,\r\n	}\r\n	return client\r\n}\r\n\r\nfunc (ggg *MqttServerOrWs) HandleMessages() {\r\n	bytesAdd := make([]byte, 0) //  用于存储读取的二进制数据\r\n	defer func() {\r\n		if r := recover(); r != nil {\r\n			log.Println(\"Recovered from panic:\", r)\r\n			// 确保所有锁都被释放\r\n			if RWlock.TryRLock() {\r\n				RWlock.RUnlock()\r\n			}\r\n			// 清理WebSocket连接池中的资源\r\n			if wsClient, exists := WsConnetPool[ggg.Fd]; exists {\r\n				fmt.Println(\"清理WebSocket连接\")\r\n				if wsClient.Client != nil {\r\n					wsClient.Client.Close()\r\n				}\r\n				delete(WsConnetPool, ggg.Fd)\r\n			}\r\n			// 清理MQTT客户端\r\n			if ggg.MqttClient.Client != nil {\r\n				ggg.MqttClient.Client.Disconnect(250) // 给MQTT客户端250ms时间完成操作\r\n				ggg.MqttClient.Client = nil\r\n			}\r\n			// 标记连接状态为关闭\r\n			ggg.Client = nil\r\n		}\r\n	}()\r\n	for {\r\n		if ggg.Client == nil {\r\n			RWlock.RUnlock()\r\n			log.Println(\"连接已关闭，退出处理循环\")\r\n			break\r\n		}\r\n		// 设置读取超时\r\n		if err := ggg.Client.SetReadDeadline(time.Now().Add(90 * time.Second)); err != nil {\r\n			if errors.Is(err, net.ErrClosed) {\r\n				log.Println(\"连接已关闭，退出处理循环1\")\r\n			} else {\r\n				log.Printf(\"设置读取超时失败: %v\", err)\r\n			}\r\n			ggg.clearup()\r\n			break\r\n		}\r\n		// 读取消息\r\n		RWlock.RLock()\r\n		if ggg.Client == nil {\r\n			RWlock.RUnlock()\r\n			log.Println(\"连接已关闭，退出处理循环\")\r\n			break\r\n		}\r\n		tmpClient := ggg.Client\r\n		RWlock.RUnlock()\r\n		// 读取消息\r\n		_, message, err := tmpClient.ReadMessage()\r\n\r\n		if err != nil {\r\n			// 清理连接\r\n			if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {\r\n				log.Printf(\"意外关闭错误: %v\", err)\r\n				ggg.clearup()\r\n				break\r\n			}\r\n			continue\r\n		}\r\n\r\n		bytesAdd = append(bytesAdd, message...)\r\n		if len(bytesAdd) < 2 {\r\n			//固定报头 log.Println(\"MQTT报文不完整，继续读取\")\r\n			continue\r\n		}\r\n		// 解析报文类型\r\n		header := bytesAdd[0] >> 4\r\n		remainingLength := int(bytesAdd[1])\r\n\r\n		// 检查剩余长度是否足够解析可变报头\r\n		if len(bytesAdd) < 2+remainingLength {\r\n			//log.Println(\"MQTT报文不完整，继续读取\")\r\n			continue\r\n		}\r\n		//fmt.Printf(\"报文读取完整, 报文类型: %d 剩余长度:%d \\n\", packetType, remainingLength)\r\n		// 解析剩余长度\r\n		remainingLength, lengthBytes, err := MqttA.DecodeRemainingLength(bytesAdd[1:])\r\n		if err != nil {\r\n			log.Printf(\"解析剩余长度失败: %v\", err)\r\n			bytesAdd = make([]byte, 0)\r\n			continue\r\n		}\r\n		payloadStart := 1 + lengthBytes\r\n		// 处理不同类型的MQTT报文\r\n		switch header {\r\n		case 1: // CONNECT\r\n			connectData, err := MqttA.ParseConnectPacket(bytesAdd)\r\n			if err != nil {\r\n				log.Printf(\"解析CONNECT报文失败: %v\", err)\r\n				connack := MqttA.GenerateConnackPacket(false, 0x01) // 不支持的协议版本\r\n				ggg.Client.WriteMessage(websocket.BinaryMessage, connack)\r\n				bytesAdd = make([]byte, 0)\r\n				continue\r\n			}\r\n\r\n			//log.Printf(\"收到CONNECT报文: %v\", connectData)\r\n			ggg.ClientId = connectData[\"ClientID\"]\r\n			ggg.User = connectData[\"Username\"]\r\n			password := connectData[\"Password\"]\r\n			//log.Printf(\"账号:%s 密码:%s\", ggg.User, password, WsConnetPool)\r\n			bytesAdd = make([]byte, 0)\r\n			mqttClient := ggg.MqttClient.Connect(MqttHost, ggg.ClientId, ggg.User, password)\r\n			if mqttClient != nil {\r\n				fmt.Println(\"账号密码错误\")\r\n				connack := MqttA.GenerateConnackPacket(false, 0x01) //发送CONNACK响应 连接断开\r\n				ggg.Client.WriteMessage(websocket.BinaryMessage, connack)\r\n				return\r\n			}\r\n			connack := MqttA.GenerateConnackPacket(false, 0x00) //发送CONNACK响应 连接已接受\r\n			if err := ggg.Client.WriteMessage(websocket.BinaryMessage, connack); err != nil {\r\n				fmt.Printf(\"发送CONNACK失败: %v\", err)\r\n				return\r\n			}\r\n			log.Println(\"MQTT连接成功\")\r\n			RWlock.Lock()\r\n			WsConnetPool[ggg.Fd] = ggg\r\n			RWlock.Unlock()\r\n		case 3:\r\n			// 解析PUBLISH报文\r\n			pos := payloadStart\r\n			// 解析主题名长度\r\n			topicLength := binary.BigEndian.Uint16(bytesAdd[pos : pos+2])\r\n			pos += 2\r\n			// 解析主题名\r\n			topic := string(bytesAdd[pos : pos+int(topicLength)])\r\n			pos += int(topicLength)\r\n\r\n			// 解析包ID（如果QoS > 0）\r\n			var packetID uint16\r\n			qos := (header >> 1) & 0x03\r\n			if qos > 0 {\r\n				packetID = binary.BigEndian.Uint16(bytesAdd[pos : pos+2])\r\n			}\r\n			// 解析负载\r\n			payload := bytesAdd[pos : payloadStart+remainingLength]\r\n			log.Printf(\"收到 推送 报文: 主题:%s, QoS:%d, 包ID:%d, 内容=%s\", topic, qos, packetID, string(payload))\r\n\r\n			// 处理QoS确认\r\n			if qos == 1 {\r\n				// 发送PUBACK\r\n				puback := []byte{\r\n					0x40, // PUBACK报文类型\r\n					0x02, // 剩余长度\r\n					byte(packetID >> 8),\r\n					byte(packetID & 0xFF),\r\n				}\r\n				if err := ggg.Client.WriteMessage(websocket.BinaryMessage, puback); err != nil {\r\n					log.Printf(\"发送PUBACK失败: %v\", err)\r\n				}\r\n			} else if qos == 2 {\r\n				// TODO: 处理QoS 2流程\r\n				log.Println(\"收到QoS 2的PUBLISH，暂不处理\")\r\n			}\r\n\r\n			// 转发消息到订阅者\r\n			ggg.forwardMessageToSubscribers(topic, payload, 0)\r\n			bytesAdd = make([]byte, 0)\r\n\r\n		case 8: //订阅主题\r\n			// 解析SUBSCRIBE报文\r\n			pos := payloadStart\r\n			// 解析包ID\r\n			packetID := binary.BigEndian.Uint16(bytesAdd[pos : pos+2])\r\n			pos += 2\r\n			topic := \"\"\r\n			// 解析订阅列表\r\n			for pos < payloadStart+remainingLength {\r\n				// 解析主题过滤器长度\r\n				filterLength := binary.BigEndian.Uint16(bytesAdd[pos : pos+2])\r\n				pos += 2\r\n				// 解析主题过滤器\r\n				topic = string(bytesAdd[pos : pos+int(filterLength)])\r\n				pos += int(filterLength)\r\n				// 解析最大QoS\r\n				maxQoS := bytesAdd[pos] & 0x03\r\n				pos++\r\n				log.Printf(\"收到订阅报文: 包ID:%d, 主题:%s, QoS=%d\",\r\n					packetID, topic, maxQoS)\r\n				if ggg.MqttClient.Topic == \"\" { // 处理订阅逻辑\r\n					ggg.MqttClient.Topic = topic\r\n					ggg.ServerMsg()\r\n				}\r\n			}\r\n\r\n			suback := MqttA.GenerateSubackPacket(packetID, []byte{0x00}) // 发送订阅成功响应\r\n			if err := ggg.Client.WriteMessage(websocket.BinaryMessage, suback); err != nil {\r\n				log.Printf(\"发送SUBACK失败: %v\", err)\r\n			}\r\n			bytesAdd = make([]byte, 0)\r\n\r\n		case 12:\r\n			//fmt.Println(\"PINGREQ\", header)\r\n			pingresp := []byte{0xD0, 0x00} //发送PINGRESP响应 PINGRESP报文\r\n			if err := ggg.Client.WriteMessage(websocket.BinaryMessage, pingresp); err != nil {\r\n				log.Printf(\"发送PINGRESP失败: %v\", err)\r\n			}\r\n			bytesAdd = make([]byte, 0)\r\n\r\n		case 14: // DISCONNECT\r\n			log.Printf(\"收到DISCONNECT关闭连接报文: ClientID=%s\", ggg.ClientId)\r\n			connack := MqttA.GenerateConnackPacket(false, 0x01) //发送CONNACK响应 连接断开\r\n			RWlock.Lock()\r\n			if err := ggg.Client.WriteMessage(websocket.BinaryMessage, connack); err != nil {\r\n				log.Printf(\"发送DISCONNECT失败: %v\", err)\r\n			}\r\n			RWlock.Unlock()\r\n			ggg.clearup()\r\n			return\r\n\r\n		default:\r\n			log.Printf(\"未知MQTT报文类型: %d\", header)\r\n			bytesAdd = make([]byte, 0)\r\n		}\r\n	}\r\n}\r\n\r\n// 转发消息到订阅者\r\nfunc (ggg *MqttServerOrWs) forwardMessageToSubscribers(topic string, payload []byte, qos byte) {\r\n	RWlock.Lock()\r\n	if ggg.Client == nil {\r\n		RWlock.Unlock()\r\n		return\r\n	}\r\n	// 这里应该实现实际的消息转发逻辑\r\n	a, _ := MqttA.BuildPublishMessage(topic, payload, qos, false) // 生成MQTT PUBLISH报文\r\n	err := ggg.Client.WriteMessage(websocket.BinaryMessage, a)\r\n	if err != nil {\r\n		RWlock.Unlock()\r\n		log.Println(\"转发消息到订阅者失败\")\r\n		ggg.clearup()\r\n		return\r\n	}\r\n	err1 := ggg.MqttClient.PublishZ(topic, payload, 0, false)\r\n	if err1 != nil {\r\n		RWlock.Unlock()\r\n		log.Println(\"推送往MQTT服务器失败\", err1.Error())\r\n		ggg.clearup()\r\n		return\r\n	}\r\n	log.Println(\"推送往MQTT服务器成功\")\r\n	RWlock.Unlock()\r\n}\r\n\r\nfunc (ggg *MqttServerOrWs) ServerMsg() {\r\n	// 启动消息订阅处理\r\n	go func(ggg *MqttServerOrWs) {\r\n		// 处理goroutine内的panic\r\n		defer func() {\r\n			if err := recover(); err != nil {\r\n				log.Printf(\"MQTT订阅goroutine发生panic: %v\", err)\r\n				ggg.clearup()\r\n			}\r\n		}()\r\n\r\n		// 检查MQTT客户端是否已连接\r\n		if !ggg.MqttClient.Client.IsConnected() {\r\n			log.Println(\"MQTT客户端未连接，无法订阅主题\")\r\n			ggg.clearup()\r\n			return\r\n		}\r\n\r\n		// 执行订阅并处理错误\r\n		token := ggg.MqttClient.Client.Subscribe(ggg.MqttClient.Topic, 0, func(client mqtt.Client, msg mqtt.Message) {\r\n			// 处理回调函数内的panic\r\n			defer func() {\r\n				if err := recover(); err != nil {\r\n					log.Printf(\"MQTT消息处理回调发生panic: %v\", err)\r\n					ggg.clearup()\r\n				}\r\n			}()\r\n\r\n			// 构建并发送消息到WebSocket客户端\r\n			payload, err := MqttA.BuildPublishMessage(ggg.MqttClient.Topic, msg.Payload(), 0, false)\r\n\r\n			if err != nil {\r\n				log.Printf(\"构建发布消息失败: %v\", err)\r\n				ggg.clearup()\r\n				return\r\n			}\r\n\r\n			// 写入WebSocket并检查错误\r\n			if err := ggg.Client.WriteMessage(websocket.BinaryMessage, payload); err != nil {\r\n				log.Printf(\"发送消息到WebSocket失败: %v\", err)\r\n				// 通常发生错误时应该关闭连接\r\n				ggg.clearup()\r\n				return\r\n			}\r\n\r\n			log.Printf(\"收到订阅消息: %s\", string(msg.Payload()))\r\n		},\r\n		)\r\n\r\n		// 等待订阅完成并检查结果\r\n		if token.Wait() && token.Error() != nil {\r\n			log.Printf(\"订阅主题失败: %v\", token.Error())\r\n			ggg.clearup()\r\n			return\r\n		}\r\n\r\n		log.Printf(\"成功订阅主题: %s\", ggg.MqttClient.Topic)\r\n\r\n	}(ggg)\r\n\r\n}\r\nfunc (ggg *MqttServerOrWs) clearup() {\r\n	RWlock.Lock()\r\n	defer RWlock.Unlock()\r\n\r\n	if wsClient, exists := WsConnetPool[ggg.Fd]; exists {\r\n		if wsClient.Client != nil {\r\n			wsClient.Client.Close()\r\n		}\r\n		delete(WsConnetPool, ggg.Fd)\r\n	}\r\n	if ggg.MqttClient.Client != nil {\r\n		ggg.MqttClient.Client.Disconnect(0)\r\n	}\r\n}\r\n','',1),
(311,3,'mqttOverWs(ws桥接mqtt ctx)','package controllers\r\n\r\nimport (\r\n	\"fmt\"\r\n	\"log\"\r\n	\"net/http\"\r\n	\"wss/models\"\r\n\r\n	\"github.com/gin-gonic/gin\"\r\n	\"github.com/gorilla/websocket\"\r\n)\r\n\r\nvar proxy *models.MqttServerOrWs\r\nvar (\r\n	Fd      = uint32(1) // 连接唯一标识\r\n	mclient = models.MqttClientZ{}\r\n)\r\n\r\ntype WsServer struct {\r\n}\r\n\r\nfunc (ggg WsServer) Get(ctx *gin.Context) {\r\n	upgrader := websocket.Upgrader{\r\n		WriteBufferSize: 1024,\r\n		ReadBufferSize:  1024,\r\n		CheckOrigin: func(r *http.Request) bool {\r\n			return true\r\n		},\r\n	}\r\n\r\n	// 升级为WebSocket连接\r\n	conn, err := upgrader.Upgrade(ctx.Writer, ctx.Request, http.Header{\"Sec-WebSocket-Protocol\": []string{\"mqtt\"}})\r\n	if err != nil {\r\n		log.Printf(\"WebSocket升级失败: %v\", err)\r\n		return\r\n	}\r\n	// 注册新连接\r\n	fmt.Println(\"升级为WebSocket连接成功\")\r\n	proxy = models.NewMqttServerOrWs(conn, Fd, mclient)\r\n	models.RWlock.Lock()\r\n	fmt.Println(Fd)\r\n	models.WsConnetPool[Fd] = proxy\r\n	Fd++\r\n	models.RWlock.Unlock()\r\n	log.Printf(\"客户端已连接: Fd=%d\", proxy.Fd)\r\n	// 设置关闭处理函数\r\n	conn.SetCloseHandler(func(code int, text string) error {\r\n		log.Printf(\"客户端已断开连接: Fd=%d\", proxy.Fd)\r\n		fmt.Println(models.WsConnetPool)\r\n		if wsClient, exists := models.WsConnetPool[proxy.Fd]; exists {\r\n			if wsClient.Client != nil {\r\n				wsClient.Client.Close()\r\n			}\r\n			delete(models.WsConnetPool, proxy.Fd)\r\n\r\n		}\r\n		fmt.Println(\"WsConnetPool\", models.WsConnetPool)\r\n		return nil\r\n	})\r\n\r\n	go proxy.HandleMessages() // 读取并处理MQTT控制报文\r\n}\r\n','',1),
(312,3,'mqttOverWs(wsOverMqtt 启动)','	// 启动HTTP服务器\r\n	var r *gin.Engine\r\n	if runtime.GOOS == \"windows\" {\r\n		gin.SetMode(gin.DebugMode)\r\n		r = gin.Default()\r\n	} else {\r\n		gin.SetMode(gin.ReleaseMode)\r\n		r = gin.New()\r\n	}\r\n\r\n	store := cookie.NewStore([]byte(\"nobiggie\"))\r\n	store.Options(sessions.Options{\r\n		MaxAge: 28800,\r\n		Path:   \"/\",\r\n	})\r\n	r.Use(sessions.Sessions(\"mysession\", store))\r\n	routers.GinRouterSetup(r)\r\n	if runtime.GOOS == \"windows\" || runtime.GOARCH == \"arm64\" {\r\n		r.Run(\":8084\")\r\n	} else {\r\n		r.Use(func(ctx *gin.Context) {\r\n			secureMiddleware := secure.New(secure.Options{\r\n				SSLRedirect: true,\r\n				SSLHost:     \"localhost:8084\",\r\n			})\r\n			err := secureMiddleware.Process(ctx.Writer, ctx.Request)\r\n			if err != nil {\r\n				return\r\n			}\r\n			ctx.Next()\r\n		})\r\n		err7 := http.ListenAndServeTLS(\":8084\", fmt.Sprintf(\"%v\", \"wulian.nobiggie.cn_bundle.pem\"), fmt.Sprintf(\"%v\", \"wulian.nobiggie.cn.key\"), r)\r\n		if err7 != nil {\r\n			fmt.Println(err7.Error())\r\n		}\r\n	}','',1),
(313,7,'pdo static类','<?php\r\nnamespace myclass;\r\n\r\nclass Db {\r\n\r\n    private static $host = \"957lan.dnstoo.com\";\r\n    private static $user = \"jyan_f\";\r\n    private static $password = \"golang\";\r\n\r\n    private static $port = \"3306\";\r\n    private static $dbname = \"jyan\";\r\n    private static $instance = null;\r\n\r\n    // 获取PDO实例（单例模式）\r\n    private static function getConnection() {\r\n        if (self::$instance == null) {\r\n            $dsn = \"mysql:host=\".self::$host.\";port=\".self::$port.\";dbname=\".self::$dbname.\";charset=utf8mb4\";\r\n            self::$instance = new \\pdo($dsn, self::$user, self::$password);\r\n            self::$instance->setAttribute(\\PDO::ATTR_ERRMODE, \\PDO::ERRMODE_EXCEPTION);\r\n            self::$instance->setAttribute(\\PDO::ATTR_EMULATE_PREPARES, false);\r\n        }\r\n        return self::$instance;\r\n    }\r\n\r\n    // 查询单行数据\r\n    public static function Row($sql, array $arr = []): ?array {\r\n        $stmt = self::getConnection()->prepare($sql);\r\n        $stmt->execute($arr);\r\n        return $stmt->fetch(\\PDO::FETCH_ASSOC) ?: null;\r\n    }\r\n\r\n    // 查询多行数据\r\n    public static function Rows($sql, array $arr = []): ?array {\r\n        $stmt = self::getConnection()->prepare($sql);\r\n        $stmt->execute($arr);\r\n        $result = $stmt->fetchAll(\\PDO::FETCH_ASSOC);\r\n        return $result ?: null;\r\n    }\r\n\r\n    // 执行SQL语句（INSERT/UPDATE/DELETE）\r\n    public static function Exec($sql, array $arr = []): int {\r\n        $stmt = self::getConnection()->prepare($sql);\r\n        $stmt->execute($arr);\r\n        return $stmt->rowCount();\r\n    }\r\n\r\n    // 自动拼接INSERT语句并执行\r\n    public static function AutoInsert(string $table, array $arr): int {\r\n        if (empty($arr)) return 0;\r\n        \r\n        $keys = implode(\',\', array_keys($arr));\r\n        $placeholders = implode(\',\', array_fill(0, count($arr), \'?\'));\r\n        $sql = \"INSERT INTO $table ($keys) VALUES ($placeholders)\";\r\n        \r\n        $stmt = self::getConnection()->prepare($sql);\r\n        $stmt->execute(array_values($arr));\r\n        return $stmt->rowCount();\r\n    }\r\n\r\n    // 执行INSERT并返回最后插入ID\r\n    public static function lastInsertId(string $sql, array $arr = []): int {\r\n        $stmt = self::getConnection()->prepare($sql);\r\n        $stmt->execute($arr);\r\n        return (int)self::getConnection()->lastInsertId();\r\n    }\r\n\r\n    // 清空表数据（更高效的实现）\r\n    public static function deleteAll(string $table): bool {\r\n        if (empty($table)) return false;\r\n        \r\n        // 防止SQL注入，验证表名是否合法\r\n        if (!preg_match(\'/^[a-zA-Z0-9_]+$/\', $table)) {\r\n            return false;\r\n        }\r\n        \r\n        $stmt = self::getConnection()->prepare(\"DELETE FROM $table\");\r\n        return $stmt->execute();\r\n    }\r\n\r\n}','',1),
(314,7,'分页类','<?php\r\nnamespace myclass;\r\n\r\n\r\nclass Pages\r\n{\r\n    public $PageNo;     // 当前页\r\n    public $PageSize;   // 每页多少数据\r\n    public $TotalPage;  // 总共多少页\r\n    public $TotalCount; // 总共多少条数据\r\n    public $FirstPage;  // 第一页\r\n    public $LastPage;   // 最后一页\r\n    public $Url;        // 链接\r\n\r\n    public function __construct($PageNo, $PageSize, $TotalCount, $Url)\r\n    {\r\n        $this->PageNo = $PageNo;\r\n        $this->PageSize = $PageSize;\r\n        $this->TotalCount = $TotalCount;\r\n        $this->Url = $Url;\r\n    }\r\n\r\n    // 计算总页数\r\n    private function getPageCount()\r\n    {\r\n        if ($this->TotalCount == 0) {\r\n            $this->TotalPage = 1;\r\n        } else {\r\n            $this->TotalPage = ($this->TotalCount + $this->PageSize - 1) / $this->PageSize;\r\n            $this->TotalPage = intval($this->TotalPage);\r\n        }\r\n        $this->LastPage = $this->TotalPage;\r\n        $this->FirstPage = 1;\r\n        $this->execUrl();\r\n    }\r\n\r\n    // 格式化URL地址\r\n    private function execUrl()\r\n    {\r\n        if (strpos($this->Url, \'?\') !== false) {\r\n            $this->Url = $this->Url . \'&page=\';\r\n        } else {\r\n            $this->Url = $this->Url . \'?page=\';\r\n        }\r\n    }\r\n\r\n    // 获取URL\r\n    private function getUrl($page)\r\n    {\r\n        return sprintf(\"%s%d\", $this->Url, $page);\r\n    }\r\n\r\n    // 获取页码范围\r\n    private function getNumRange()\r\n    {\r\n        $maxVisiblePages = 3; // 最多显示的页码数\r\n\r\n        if ($this->TotalPage <= $maxVisiblePages) {\r\n            $k = 1;\r\n            $v = $this->TotalPage;\r\n        } else {\r\n            $k = $this->PageNo - intval(($maxVisiblePages-1)/2);\r\n            $v = $this->PageNo + intval($maxVisiblePages/2);\r\n\r\n            if ($k < 1) {\r\n                $k = 1;\r\n                $v = $maxVisiblePages;\r\n            } else if ($v > $this->TotalPage) {\r\n                $k = $this->TotalPage - $maxVisiblePages + 1;\r\n                $v = $this->TotalPage;\r\n            }\r\n        }\r\n\r\n        return array($k, $v);\r\n    }\r\n\r\n    // 获取分页起始位置\r\n    public function LimitStart()\r\n    {\r\n        return ($this->PageNo - 1) * $this->PageSize;\r\n    }\r\n\r\n    // 生成响应式分页HTML\r\npublic function Show()\r\n{\r\n    $this->getPageCount();\r\n\r\n    $style = \'\r\n        <link href=\"/static/css/font-awesome.css\" rel=\"stylesheet\">\r\n        <style>\r\n            /* 分页容器样式 */\r\n            .pagination-container {\r\n                display: flex;\r\n                justify-content: center;\r\n                margin: 1.5rem 0 1rem;\r\n            }\r\n            \r\n            /* 分页导航样式 */\r\n            .pagination {\r\n                display: inline-flex;\r\n                border-radius: 0.375rem;\r\n                box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\r\n                padding: 1rem;\r\n                background-color: white;\r\n                border: 1px solid #e5e7eb;\r\n                font-size: 1.25rem; /* 字体大小调整为20px (1.25rem) */\r\n            }\r\n            \r\n            /* 分页项通用样式 */\r\n            .pagination-item {\r\n                padding: 0.375rem 0.75rem;\r\n                border-radius: 0.375rem;\r\n                border: 1px solid #d1d5db;\r\n                color: #4b5563;\r\n                text-decoration: none;\r\n                transition: all 0.2s;\r\n                margin-left: 0.25rem;\r\n            }\r\n            \r\n            /* 分页项悬停效果 */\r\n            .pagination-item:hover:not(.pagination-item-disabled) {\r\n                background-color: #f3f4f6;\r\n            }\r\n            \r\n            /* 当前激活页样式 */\r\n            .pagination-active {\r\n                background-color: #3b82f6; /* 主色调蓝色 */\r\n                color: white;\r\n                border-color: #3b82f6;\r\n            }\r\n            \r\n            /* 禁用状态样式 */\r\n            .pagination-item-disabled {\r\n                opacity: 0.5;\r\n                cursor: not-allowed;\r\n            }\r\n            \r\n            /* 禁用状态悬停效果 */\r\n            .pagination-item-disabled:hover {\r\n                background-color: transparent;\r\n            }\r\n            \r\n            /* 屏幕阅读器隐藏文本 */\r\n            .sr-only {\r\n                position: absolute;\r\n                width: 1px;\r\n                height: 1px;\r\n                padding: 0;\r\n                margin: -1px;\r\n                overflow: hidden;\r\n                clip: rect(0, 0, 0, 0);\r\n                white-space: nowrap;\r\n                border-width: 0;\r\n            }\r\n        </style>\r\n    \';\r\n\r\n    $buf = \'\r\n        <div class=\"pagination-container\">\r\n            <nav class=\"pagination\" aria-label=\"Pagination\">\r\n    \';\r\n\r\n    // 首页和上一页\r\n    if ($this->PageNo > 1) {\r\n        $buf .= sprintf(\'\r\n            <a href=\"%s\" class=\"pagination-item\">\r\n                <span class=\"sr-only\">首页</span>\r\n                <i class=\"fa fa-angle-double-left\"></i>\r\n            </a>\r\n            <a href=\"%s\" class=\"pagination-item\">\r\n                <span class=\"sr-only\">上一页</span>\r\n                <i class=\"fa fa-angle-left\"></i>\r\n            </a>\r\n        \', $this->getUrl(1), $this->getUrl($this->PageNo-1));\r\n    } else {\r\n        $buf .= \'\r\n            <span class=\"pagination-item pagination-item-disabled\">\r\n                <span class=\"sr-only\">首页</span>\r\n                <i class=\"fa fa-angle-double-left\"></i>\r\n            </span>\r\n            <span class=\"pagination-item pagination-item-disabled\">\r\n                <span class=\"sr-only\">上一页</span>\r\n                <i class=\"fa fa-angle-left\"></i>\r\n            </span>\r\n        \';\r\n    }\r\n\r\n    // 页码\r\n    list($k, $v) = $this->getNumRange();\r\n\r\n    // 中间页码\r\n    for ($i = $k; $i <= $v; $i++) {\r\n        if ($i == $this->PageNo) {\r\n            $buf .= sprintf(\'\r\n                <span class=\"pagination-item pagination-active\">\r\n                    %s\r\n                </span>\r\n            \', sprintf(\"%d\", $i));\r\n        } else {\r\n            $buf .= sprintf(\'\r\n                <a href=\"%s\" class=\"pagination-item\">\r\n                    %s\r\n                </a>\r\n            \', $this->getUrl($i), sprintf(\"%d\", $i));\r\n        }\r\n    }\r\n\r\n    // 下一页和尾页\r\n    if ($this->PageNo < $this->TotalPage) {\r\n        $buf .= sprintf(\'\r\n            <a href=\"%s\" class=\"pagination-item\">\r\n                <span class=\"sr-only\">下一页</span>\r\n                <i class=\"fa fa-angle-right\"></i>\r\n            </a>\r\n            <a href=\"%s\" class=\"pagination-item\">\r\n                <span class=\"sr-only\">尾页</span>\r\n                <i class=\"fa fa-angle-double-right\"></i>\r\n            </a>\r\n        \', $this->getUrl($this->PageNo+1), $this->getUrl($this->TotalPage));\r\n    } else {\r\n        $buf .= \'\r\n            <span class=\"pagination-item pagination-item-disabled\">\r\n                <span class=\"sr-only\">下一页</span>\r\n                <i class=\"fa fa-angle-right\"></i>\r\n            </span>\r\n            <span class=\"pagination-item pagination-item-disabled\">\r\n                <span class=\"sr-only\">尾页</span>\r\n                <i class=\"fa fa-angle-double-right\"></i>\r\n            </span>\r\n        \';\r\n    }\r\n\r\n    $buf .= \'\r\n            </nav>\r\n        </div>\r\n    \';\r\n\r\n    if ($this->TotalPage <= 1) {\r\n        return \"\";\r\n    }\r\n\r\n    return $style . $buf;\r\n}\r\n}\r\n\r\n//$pages = new \\myclass\\Pages($_GET[\"page\"],$pageSise,$lenArr,\'?page={page}\');\r\n $pages->Show()','',1),
(315,4,'挖掘机','#include <Arduino.h>\r\n#include <WiFi.h>\r\n#include <WiFiMulti.h>\r\n#include <WiFiClientSecure.h>\r\n#include <WebSocketsClient.h>\r\n#include <ESP32Servo.h>\r\n#include <WebServer.h>\r\n#include <HTTPClient.h>\r\n#include <FS.h>\r\n#include \"SPIFFS.h\"\r\n#include \"ESPmDNS.h\"\r\n#include <Ticker.h>\r\n\r\n// 全局变量定义\r\nWiFiMulti WiFiMulti;\r\nWebSocketsClient webSocket;\r\nServo myServoLeft;   // 左车轮舵机\r\nServo myServoRight;  // 右车轮舵机\r\nServo myBig;         // 大臂舵机（180度）\r\nServo mySmall;       // 小臂舵机（180度）\r\nServo myWadb;        // 挖斗舵机（180度）\r\nServo servoJiuf;     // 机身舵机（改为180度）\r\n\r\n// 舵机参数（统一180度舵机配置）\r\nconst int minPulse = 500;   // 最小脉宽(微秒)\r\nconst int maxPulse = 2500;  // 最大脉宽(微秒)\r\nint servoPinLeft = 5;       // 左车轮引脚\r\nint servoPinRight = 6;      // 右车轮引脚\r\nconst int stopPos = 90;     // 所有180度舵机的停止位置（中间点）\r\nint baudRate = 115200;\r\n\r\n// 引脚定义\r\nint bigUpper = 18;    // 大臂上限限位开关（180度）\r\nint bigLower = 8;     // 大臂下限限位开关（0度）\r\nint smallUpper = 39;  // 小臂上限限位开关（180度）\r\nint smallLower = 38;  // 小臂下限限位开关（0度）\r\nint wadbUpper = 41;   // 挖斗上限限位开关（180度）\r\nint wadbLower = 40;   // 挖斗下限限位开关（0度）\r\nint bigExc = 7;       // 大臂舵机引脚\r\nint smallExc = 17;    // 小臂舵机引脚\r\nint wadb = 16;        // 挖斗舵机引脚\r\nint fuselage = 4;     // 机身舵机引脚（180度）\r\n\r\n// 状态变量\r\nint bigstate = 2;                 // 0:下限  1:上限  2:可活动（大臂）\r\nint smallstate = 2;               // 小臂状态（同上）\r\nint wadbstate = 2;                // 挖斗状态（同上）\r\n\r\nint bigAngle = 90;                // 大臂当前角度（初始停止位置）\r\nint smallAngle = 90;              // 小臂当前角度（初始停止位置）\r\nint wadbAngle = 90;               // 挖斗当前角度（初始停止位置）\r\nint fuselageAngle = 90;           // 机身当前角度（初始停止位置，180度范围）\r\nunsigned long extiTimeBig = 0;    // 大臂中断防抖时间\r\nunsigned long extiTimeSmall = 0;  // 小臂中断防抖时间\r\nunsigned long extiTimeWadb = 0;   // 挖斗中断防抖时间\r\nunsigned long extiTimeFuselage = 0; // 机身边界防抖时间（若有机身限位）\r\nint commandBig = -1;              // 大臂命令（0:下降 1:上升 -1:无）\r\nint commandSmall = -1;            // 小臂命令（0:收缩 1:伸展 -1:无）\r\nint commandWadb = -1;             // 挖斗命令（0:收 1:开 -1:无）\r\nint commandFuselage = -1;         // 机身命令（0:左转 1:右转 -1:无）\r\nbool extiBigOpen = false;         // 大臂上限 触发标志\r\nbool extiBigClose = false;        // 大臂下限 触发标志\r\nbool extiSmallOpen = false;       // 小臂上限 触发标志\r\nbool extiSmallClose = false;      // 小臂下限 触发标志\r\nbool extiWadbOpen = false;        // 挖斗上限 触发标志\r\nbool extiWadbClose = false;       // 挖斗下限 触发标志\r\nbool extiFuselageLeft = false;    // 机身左边界触发（若有机身限位）\r\nbool extiFuselageRight = false;   // 机身后边界触发（若有机身限位）\r\n\r\n// WiFi与设备信息\r\nTicker myTicker;\r\nString flashWifi = \"/wifi.txt\";     // WiFi配置文件\r\nWebServer webServer(80);            // WebServer端口\r\nString ssid = \"webserver\";          // WiFi名称\r\nString passwd = \"www.nobiggie.cn\";  // WiFi密码\r\nString html;\r\nWiFiClient wificlient;\r\nString deviceName = \"DYZKTEST0016\";\r\n\r\n\r\n// 工具函数：十六进制打印\r\nvoid hexdump(const void* mem, uint32_t len, uint8_t cols = 16) {\r\n  const uint8_t* src = (const uint8_t*)mem;\r\n  Serial.printf(\"\\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)\", (ptrdiff_t)src, len, len);\r\n  for (uint32_t i = 0; i < len; i++) {\r\n    if (i % cols == 0) {\r\n      Serial.printf(\"\\n[0x%08X] 0x%08X: \", (ptrdiff_t)src, i);\r\n    }\r\n    Serial.printf(\"%02X \", *src);\r\n    src++;\r\n  }\r\n  Serial.printf(\"\\n\");\r\n}\r\n\r\n// WebSocket事件处理\r\nvoid webSocketEvent(WStype_t type, uint8_t* payload, size_t length) {\r\n  String msg;\r\n  switch (type) {\r\n    case WStype_DISCONNECTED:\r\n      Serial.printf(\"[WSc] Disconnected!\\n\");\r\n      // 断开连接时复位所有舵机到停止位置\r\n      myServoLeft.write(stopPos);\r\n      myServoRight.write(stopPos);\r\n      myBig.write(stopPos);\r\n      mySmall.write(stopPos);\r\n      myWadb.write(stopPos);\r\n      servoJiuf.write(stopPos);  // 机身回到中间停止位置\r\n      commandBig = -1;\r\n      commandSmall = -1;\r\n      commandWadb = -1;\r\n      commandFuselage = -1;\r\n      break;\r\n\r\n    case WStype_CONNECTED:\r\n      Serial.printf(\"[WSc] Connected to url: %s\\n\", payload);\r\n      webSocket.sendTXT(\"+NET_\" + deviceName + \"-\");  // 发送设备标识\r\n      break;\r\n\r\n    case WStype_TEXT:\r\n      for (int i = 0; i < length; i++) {\r\n        msg += (char)payload[i];\r\n      }\r\n      if (msg.indexOf(\"heart#\") != -1) break;  // 忽略心跳包\r\n      Serial.println(\"收到指令: \" + msg);\r\n\r\n      // 车轮控制（保持不变）\r\n      if (msg.indexOf(\"ltw#\") != -1) {  // 左前进\r\n        myServoLeft.write(130);\r\n      }\r\n      if (msg.indexOf(\"rtw#\") != -1) {  // 右前进\r\n        myServoRight.write(130);\r\n      }\r\n      if (msg.indexOf(\"lts#\") != -1) {  // 左后退\r\n        myServoLeft.write(50);\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"rts#\") != -1) {  // 右后退\r\n        myServoRight.write(50);\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"mix#\") != -1) {  // 停止移动\r\n        myServoLeft.write(stopPos);\r\n        myServoRight.write(stopPos);\r\n        break;\r\n      }\r\n\r\n      // 机身旋转控制（改为180度角度控制）\r\n      if (msg.indexOf(\"cztz#\") != -1) {  // 机身左转（未到左边界0度）\r\n        fuselageAngle = constrain(fuselageAngle - 1, 0, 360);  // 角度减小（左转）\r\n        servoJiuf.write(fuselageAngle);\r\n        commandFuselage = 0;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"czty#\") != -1) {  // 机身右转（未到右边界180度）\r\n        fuselageAngle = constrain(fuselageAngle + 1, 0, 360);  // 角度增大（右转）\r\n        servoJiuf.write(fuselageAngle);\r\n        commandFuselage = 1;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"js#0\") != -1) {  // 机身停止（回到中间90度）\r\n        servoJiuf.write(stopPos);\r\n        fuselageAngle = stopPos;\r\n        commandFuselage = -1;\r\n        break;\r\n      }\r\n\r\n      // 大臂控制（180度范围：0-180，90度停止）\r\n      if (msg.indexOf(\"dbs#\") != -1 && bigstate != 1) {  // 大臂升（未到180度上限）\r\n        bigAngle = constrain(bigAngle + 1, 0, 180);       // 限制角度在0-180\r\n        myBig.write(bigAngle);\r\n        commandBig = 1;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"dbx#\") != -1 && bigstate != 0) {  // 大臂降（未到0度下限）\r\n        bigAngle = constrain(bigAngle - 1, 0, 180);\r\n        myBig.write(bigAngle);\r\n        commandBig = 0;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"db#0\") != -1) {  // 大臂停（回到90度）\r\n        myBig.write(stopPos);\r\n        bigAngle = stopPos;\r\n        commandBig = -1;\r\n        break;\r\n      }\r\n\r\n      // 小臂控制（180度范围：0-180，90度停止）\r\n      if (msg.indexOf(\"xbs#\") != -1 && smallstate != 1) {  // 小臂伸（未到180度上限）\r\n        smallAngle = constrain(smallAngle + 1, 0, 180);\r\n        mySmall.write(smallAngle);\r\n        commandSmall = 1;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"xbx#\") != -1 && smallstate != 0) {  // 小臂缩（未到0度下限）\r\n        smallAngle = constrain(smallAngle - 1, 0, 180);\r\n        mySmall.write(smallAngle);\r\n        commandSmall = 0;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"xb#0\") != -1) {  // 小臂停（回到90度）\r\n        mySmall.write(stopPos);\r\n        smallAngle = stopPos;\r\n        commandSmall = -1;\r\n        break;\r\n      }\r\n\r\n      // 挖斗控制（180度范围：0-180，90度停止）\r\n      if (msg.indexOf(\"wds#\") != -1 && wadbstate != 1) {  // 挖斗开（未到180度上限）\r\n        wadbAngle = constrain(wadbAngle + 1, 0, 180);\r\n        myWadb.write(wadbAngle);\r\n        commandWadb = 1;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"wdx#\") != -1 && wadbstate != 0) {  // 挖斗收（未到0度下限）\r\n        wadbAngle = constrain(wadbAngle - 1, 0, 180);\r\n        myWadb.write(wadbAngle);\r\n        commandWadb = 0;\r\n        break;\r\n      }\r\n      if (msg.indexOf(\"wd#0\") != -1) {  // 挖斗停（回到90度）\r\n        myWadb.write(stopPos);\r\n        wadbAngle = stopPos;\r\n        commandWadb = -1;\r\n        break;\r\n      }\r\n      break;\r\n\r\n    // 其他事件类型处理（保持不变）\r\n    case WStype_BIN:\r\n      Serial.printf(\"[WSc] 收到二进制数据，长度: %u\\n\", length);\r\n      hexdump(payload, length);\r\n      break;\r\n    case WStype_ERROR:\r\n    case WStype_FRAGMENT_TEXT_START:\r\n    case WStype_FRAGMENT_BIN_START:\r\n    case WStype_FRAGMENT:\r\n    case WStype_FRAGMENT_FIN:\r\n      break;\r\n    case WStype_PING:\r\n      Serial.printf(\"[WSc] 收到PING\\n\");\r\n      break;\r\n    case WStype_PONG:\r\n      Serial.printf(\"[WSc] 收到PONG\\n\");\r\n      break;\r\n  }\r\n}\r\n\r\n// 大臂上限 中断处理\r\nvoid IRAM_ATTR handleInterruptBigUpper() {\r\n  unsigned long currentTime = millis();\r\n  if (currentTime - extiTimeBig > 50) {  // 50ms防抖\r\n    extiTimeBig = currentTime;\r\n    if (digitalRead(bigUpper) == LOW) {  // 限位触发（低电平有效）\r\n      bigstate = 1;                      // 标记为上限 \r\n      extiBigOpen = true;\r\n    }\r\n  }\r\n}\r\n\r\n// 大臂下限 中断处理\r\nvoid IRAM_ATTR handleInterruptBigLower() {\r\n  unsigned long currentTime = millis();\r\n  if (currentTime - extiTimeBig > 50) {  // 50ms防抖\r\n    extiTimeBig = currentTime;\r\n    if (digitalRead(bigLower) == LOW) {  // 限位触发\r\n      bigstate = 0;                      // 标记为下限 \r\n      extiBigClose = true;\r\n    }\r\n  }\r\n}\r\n\r\n// 小臂上限 中断处理\r\nvoid IRAM_ATTR handleInterruptSmallUpper() {\r\n  unsigned long currentTime = millis();\r\n  if (currentTime - extiTimeSmall > 50) {  // 50ms防抖\r\n    extiTimeSmall = currentTime;\r\n    if (digitalRead(smallUpper) == LOW) {  // 限位触发\r\n      smallstate = 1;                      // 标记为上限 \r\n      extiSmallOpen = true;\r\n    }\r\n  }\r\n}\r\n\r\n// 小臂下限 中断处理\r\nvoid IRAM_ATTR handleInterruptSmallLower() {\r\n  unsigned long currentTime = millis();\r\n  if (currentTime - extiTimeSmall > 50) {  // 50ms防抖\r\n    extiTimeSmall = currentTime;\r\n    if (digitalRead(smallLower) == LOW) {  // 限位触发\r\n      smallstate = 0;                      // 标记为下限 \r\n      extiSmallClose = true;\r\n    }\r\n  }\r\n}\r\n\r\n// 挖斗上限中断处理\r\nvoid IRAM_ATTR handleInterruptWadbUpper() {\r\n  unsigned long currentTime = millis();\r\n  if (currentTime - extiTimeWadb > 50) {  // 50ms防抖\r\n    extiTimeWadb = currentTime;\r\n    if (digitalRead(wadbUpper) == LOW) {  // 限位触发\r\n      wadbstate = 1;                      // 标记为上限 \r\n      extiWadbOpen = true;\r\n    }\r\n  }\r\n}\r\n\r\n// 挖斗下限 中断处理\r\nvoid IRAM_ATTR handleInterruptWadbLower() {\r\n  unsigned long currentTime = millis();\r\n  if (currentTime - extiTimeWadb > 50) {  // 50ms防抖\r\n    extiTimeWadb = currentTime;\r\n    if (digitalRead(wadbLower) == LOW) {  // 限位触发\r\n      wadbstate = 0;                      // 标记为下限 \r\n      extiWadbClose = true;\r\n    }\r\n  }\r\n}\r\n\r\n\r\n\r\nvoid setup() {\r\n  Serial.begin(baudRate);\r\n  for (uint8_t t = 4; t > 0; t--) {\r\n    Serial.printf(\"[SETUP] 启动等待 %d...\\n\", t);\r\n    delay(1000);\r\n  }\r\n\r\n  // 初始化SPIFFS（如需读取WiFi配置）\r\n  if (!SPIFFS.begin(true)) {\r\n    Serial.println(\"SPIFFS初始化失败\");\r\n  }\r\n\r\n  // 连接WiFi（保持不变）\r\n  WiFiMulti.addAP(ssid.c_str(), passwd.c_str());\r\n  Serial.print(\"连接WiFi...\");\r\n  while (WiFiMulti.run() != WL_CONNECTED) {\r\n    delay(100);\r\n    Serial.print(\".\");\r\n  }\r\n  Serial.println(\"\\nWiFi已连接，IP: \" + WiFi.localIP().toString());\r\n\r\n  // 舵机初始化（分配PWM定时器）\r\n  ESP32PWM::allocateTimer(0);\r\n  myServoLeft.setPeriodHertz(50);\r\n  myServoLeft.attach(servoPinLeft, minPulse, maxPulse);\r\n  myServoLeft.write(stopPos);\r\n\r\n  ESP32PWM::allocateTimer(1);\r\n  myServoRight.setPeriodHertz(50);\r\n  myServoRight.attach(servoPinRight, minPulse, maxPulse);\r\n  myServoRight.write(stopPos);\r\n\r\n  ESP32PWM::allocateTimer(2);  // 大臂（180度）\r\n  myBig.setPeriodHertz(50);\r\n  myBig.attach(bigExc, minPulse, maxPulse);\r\n  myBig.write(stopPos);  // 初始停止在90度\r\n\r\n  ESP32PWM::allocateTimer(3);  // 小臂（180度）\r\n  mySmall.setPeriodHertz(50);\r\n  mySmall.attach(smallExc, minPulse, maxPulse);\r\n  mySmall.write(stopPos);  // 初始停止在90度\r\n\r\n  ESP32PWM::allocateTimer(4);  // 挖斗（180度）\r\n  myWadb.setPeriodHertz(50);\r\n  myWadb.attach(wadb, minPulse, maxPulse);\r\n  myWadb.write(stopPos);  // 初始停止在90度\r\n\r\n  // 机身舵机初始化（改为180度控制，与其他舵机统一）\r\n  ESP32PWM::allocateTimer(5);\r\n  servoJiuf.setPeriodHertz(50);  // 50Hz舵机标准频率\r\n  servoJiuf.attach(fuselage, minPulse, maxPulse);  // 共用脉宽参数\r\n  servoJiuf.write(stopPos);  // 初始位置：中间90度（停止状态）\r\n  Serial.println(\"所有舵机初始化完成\");\r\n\r\n  // 限位开关初始化（上拉输入，低电平触发）\r\n  pinMode(bigUpper, INPUT_PULLUP);    // 对应180度上限\r\n  pinMode(bigLower, INPUT_PULLUP);    // 对应0度下限\r\n  pinMode(smallUpper, INPUT_PULLUP);  // 对应180度上限\r\n  pinMode(smallLower, INPUT_PULLUP);  // 对应0度下限\r\n  pinMode(wadbUpper, INPUT_PULLUP);   // 对应180度上限\r\n  pinMode(wadbLower, INPUT_PULLUP);   // 对应0度下限\r\n  // 若有机身限位开关，添加引脚初始化（示例）：\r\n  // pinMode(fuselageLeftPin, INPUT_PULLUP);   // 机身左边界（0度）\r\n  // pinMode(fuselageRightPin, INPUT_PULLUP);  // 机身后边界（180度）\r\n\r\n  // 绑定限位中断（机身限位若有则添加）\r\n  attachInterrupt(digitalPinToInterrupt(bigUpper), handleInterruptBigUpper, CHANGE);\r\n  attachInterrupt(digitalPinToInterrupt(bigLower), handleInterruptBigLower, CHANGE);\r\n  attachInterrupt(digitalPinToInterrupt(smallUpper), handleInterruptSmallUpper, CHANGE);\r\n  attachInterrupt(digitalPinToInterrupt(smallLower), handleInterruptSmallLower, CHANGE);\r\n  attachInterrupt(digitalPinToInterrupt(wadbUpper), handleInterruptWadbUpper, CHANGE);\r\n  attachInterrupt(digitalPinToInterrupt(wadbLower), handleInterruptWadbLower, CHANGE);\r\n  // 若有机身限位，添加中断绑定（示例）：\r\n  // attachInterrupt(digitalPinToInterrupt(fuselageLeftPin), handleInterruptFuselageLeft, CHANGE);\r\n  // attachInterrupt(digitalPinToInterrupt(fuselageRightPin), handleInterruptFuselageRight, CHANGE);\r\n  Serial.println(\"限位中断初始化完成\");\r\n\r\n  // WebSocket初始化（保持不变）\r\n  webSocket.beginSSL(\"www.dyzk520.com\", 443, \"/ws\");\r\n  webSocket.onEvent(webSocketEvent);\r\n  webSocket.setReconnectInterval(5000);  // 重连间隔5秒\r\n  Serial.println(\"WebSocket初始化完成\");\r\n}\r\n\r\nvoid loop() {\r\n  webSocket.loop();  // 处理WebSocket通信\r\n\r\n  // 发送心跳包（每800ms）\r\n  static unsigned long lastPingTime = 0;\r\n  if (millis() - lastPingTime >= 800) {\r\n    webSocket.sendTXT(\"+NET_\" + deviceName + \"&111111-\");\r\n    lastPingTime = millis();\r\n  }\r\n\r\n  // 处理大臂限位触发\r\n  if (extiBigOpen) {\r\n    Serial.println(\"大臂到达180度上限\");\r\n    bigAngle = 180;  // 强制设为最大角度\r\n    myBig.write(bigAngle);\r\n    commandBig = -1;  // 停止动作\r\n    extiBigOpen = false;\r\n  }\r\n  if (extiBigClose) {\r\n    Serial.println(\"大臂到达0度下限\");\r\n    bigAngle = 0;  // 强制设为最小角度\r\n    myBig.write(bigAngle);\r\n    commandBig = -1;  // 停止动作\r\n    extiBigClose = false;\r\n  }\r\n\r\n  // 处理小臂限位触发\r\n  if (extiSmallOpen) {\r\n    Serial.println(\"小臂到达180度上限\");\r\n    smallAngle = 180;  // 强制设为最大角度\r\n    mySmall.write(smallAngle);\r\n    commandSmall = -1;  // 停止动作\r\n    extiSmallOpen = false;\r\n  }\r\n  if (extiSmallClose) {\r\n    Serial.println(\"小臂到达0度下限\");\r\n    smallAngle = 0;  // 强制设为最小角度\r\n    mySmall.write(smallAngle);\r\n    commandSmall = -1;  // 停止动作\r\n    extiSmallClose = false;\r\n  }\r\n\r\n  // 处理挖斗限位触发\r\n  if (extiWadbOpen) {\r\n    Serial.println(\"挖斗到达180度上限\");\r\n    wadbAngle = 180;  // 强制设为最大角度\r\n    myWadb.write(wadbAngle);\r\n    commandWadb = -1;  // 停止动作\r\n    extiWadbOpen = false;\r\n  }\r\n  if (extiWadbClose) {\r\n    Serial.println(\"挖斗到达0度下限\");\r\n    wadbAngle = 0;  // 强制设为最小角度\r\n    myWadb.write(wadbAngle);\r\n    commandWadb = -1;  // 停止动作\r\n    extiWadbClose = false;\r\n  }\r\n\r\n  // 处理机身限位触发（若有机身限位可启用）\r\n  if (extiFuselageLeft) {\r\n    Serial.println(\"机身到达0度左边界\");\r\n    fuselageAngle = 0;  // 强制设为最小角度\r\n    servoJiuf.write(fuselageAngle);\r\n    commandFuselage = -1;  // 停止动作\r\n    extiFuselageLeft = false;\r\n  }\r\n  if (extiFuselageRight) {\r\n    Serial.println(\"机身到达180度右边界\");\r\n    fuselageAngle = 180;  // 强制设为最大角度\r\n    servoJiuf.write(fuselageAngle);\r\n    commandFuselage = -1;  // 停止动作\r\n    extiFuselageRight = false;\r\n  }\r\n}\r\n','',1),
(316,4,'扫码播报器','#include <ESP8266WiFi.h>\r\n#include <PubSubClient.h>\r\n#include <ESP8266httpUpdate.h>\r\n#include <Hash.h>\r\n#include <ArduinoJson.h>\r\n\r\nWiFiClient wificlient;\r\nString wifiSsid = \"webserver\";\r\nString wifiPasswd = \"www.nobiggie.cn\";\r\n\r\nconst char* mqtt_server = \"www.nobiggie.cn\";\r\nconst char* mqtt_username = \"scan\";\r\nconst char* mqtt_password = \"abcdefg\";\r\nconst char* subTopic = \"wifi/dts33a/data\";\r\nconst char* pubshTopic = \"wifi/scan/data\";\r\nPubSubClient client(wificlient);\r\n\r\nvoid setup(void) {\r\n  Serial.begin(115200);\r\n  WiFi.begin(wifiSsid.c_str(), wifiPasswd.c_str());\r\n  WiFi.mode(WIFI_STA);\r\n\r\n  int ii = 0;\r\n  while (ii < 20 && WiFi.status() != WL_CONNECTED) {\r\n    delay(500);\r\n    Serial.print(\".\");\r\n    ii++;\r\n  }\r\n  Serial.println(\"wifi ok\");\r\n  client.setServer(mqtt_server, 1883);\r\n  client.setCallback(mqttCallback);\r\n}\r\n\r\nvoid loop(void) {\r\n  if (!client.connected()) {\r\n    reconnect();\r\n  }\r\n  client.loop();\r\n\r\n  if (Serial.available()) {\r\n    while (Serial.available()) {\r\n      String receivedString = Serial.readStringUntil(\'\\n\');  // 读取直到遇到换行符\r\n      client.publish(pubshTopic, receivedString.c_str());\r\n    }\r\n  }\r\n}\r\n\r\nvoid mqttCallback(char* topic, byte* payload, unsigned int length) {\r\n  String str;\r\n  for (int i = 0; i < length; i++) {\r\n    str += (char)payload[i];\r\n  }\r\n  if (str == \"updateBin\") {\r\n    while (1) {\r\n      ESPhttpUpdate.onStart(update_started);\r\n      ESPhttpUpdate.onEnd(update_finished);\r\n      ESPhttpUpdate.onProgress(update_progress);\r\n      ESPhttpUpdate.onError(update_error);\r\n      ESPhttpUpdate.update(wificlient, \"http://www.nobiggie.cn/tool/ota/GolangCpp/scan.bin\");\r\n    }\r\n    return;\r\n  }\r\n  Serial.write((const uint8_t*)payload, length);\r\n}\r\n\r\nvoid reconnect() {\r\n  while (!client.connected()) {\r\n    String clientId = \"ESP32Client-\";\r\n    clientId += String(random(0xffff), HEX);\r\n\r\n    if (client.connect(clientId.c_str(), mqtt_username, mqtt_password)) {  // 无认证时留空\r\n      Serial.println(\"MQTT 连接成功\");\r\n      client.subscribe(subTopic);\r\n    } else {\r\n      Serial.print(\"连接失败, rc=\");\r\n      Serial.print(client.state());\r\n      delay(5000);\r\n    }\r\n  }\r\n}\r\nvoid update_started() {\r\n  Serial.println(\"CALLBACK:  HTTP update process started\");\r\n}\r\n\r\nvoid update_finished() {\r\n  Serial.println(\"CALLBACK:  HTTP update process finished\");\r\n}\r\nvoid update_progress(int cur, int total) {\r\n  Serial.printf(\"CALLBACK:  HTTP update process at %d of %d bytes...\\n\", cur, total);\r\n}\r\n\r\nvoid update_error(int err) {\r\n  Serial.printf(\"CALLBACK:  HTTP update fatal error code %d\\n\", err);\r\n}\r\n','',1),
(317,4,'A7670  4G模块打电话 过程','ATD15677817648;    //返回 OK\r\n    +CGEV: NW ACT 8,10\r\n    +CLCC: 1,0,2,0,0,\"15677817648\",129,\"\"\r\n    +CLCC: 1,0,3,0,0,\"15677817648\",129,\"\"\r\n VOICE CALL: BEGIN     //对方已经接通电话\r\n    +CLCC: 1,0,0,0,0,\"15677817648\",129,\"\"\r\n    +COLP: \"15677817648\",129\r\n\r\n    +RXDTMF: 1\r\n    +RXDTMF: 2\r\n    +RXDTMF: 3\r\n    +RXDTMF: 4\r\n    +RXDTMF: 5\r\n    +RXDTMF: #  //对方按键 12345#\r\n\r\n    +CGEV: NW DEACT 8,10\r\n    +CLCC: 1,0,6,0,0,\"15677817648\",129,\"\"\r\n VOICE CALL: END: 000009     //通话结束','',1);

--
-- Table structure for table `WisdomRepair`
--

CREATE TABLE `WisdomRepair` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(20) NOT NULL DEFAULT '',
  `userid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=557 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;

--
-- Dumping data for table `WisdomRepair`
--

INSERT INTO `WisdomRepair` VALUES
(1,'电磁炉',1),
(2,'电压力锅',1),
(3,'洗衣机',1),
(4,'微波炉',1),
(5,'电脑',1),
(6,'冰箱/空调/饮水机',1),
(7,'电风扇',1),
(8,'液晶电视/显示器',1),
(9,'燃油汽车/电动车',1),
(10,'餐饮小吃店',1),
(11,'电热燃气',1),
(12,'手机维修',1),
(13,'网址收藏',1),
(14,'医学常识',1);

--
-- Table structure for table `WisdomRepairReply`
--

CREATE TABLE `WisdomRepairReply` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tid` int(11) NOT NULL DEFAULT 0,
  `title` varchar(64) NOT NULL DEFAULT 'null',
  `content` text NOT NULL,
  `imgtext` varchar(100) NOT NULL DEFAULT '',
  `userid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8077 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;

--
-- Dumping data for table `WisdomRepairReply`
--

INSERT INTO `WisdomRepairReply` VALUES
(107,1,'按键面板不显示,不通电','1.拆开,观察一下整体哪个部件有烧损的痕迹 \r\n2.测量保险丝开路 \r\n3.再测量IGBT管基极,集电极之间短路 \r\n4.拆下IGBT,在线测量整流桥,根据整流桥的原理可以在线测量,坏了更换 \r\n5.这个时候直接更换S8050,S8550三极管,如果是贴片的也必须要更换,直接更换0.3UF电容,避免再烧IGBT管 \r\n6.测量300V滤波电容两极是否存在短路,没有短路现象才能接通电源','',1),
(108,1,'电源板更换损坏','首先把300V直接电容正极断开,然后找到接大风扇的正负极接18V,找到7805输出极,拆下7805后5V电压接到该输出极,12V可以空着','',1),
(109,1,'按键时而失效,受潮失效','自来水刷子刷干净\r\n用电吹风吹干\r\n更换全部按键\r\n那就补焊一下每个焊点','',1),
(114,2,'维修时注意防护 非常重要','电压力锅和电饭锅，绝缘导线套里有石棉，不要去动它，粉尘极小看不见的，以够粉尘吸入有害','',1),
(115,2,'换板注意事项','交流220V直接出来接火线,另一根交流电源线经过发热盘一端的那根接地线,剩余一个接发热盘,两根交流电线接反会使发热盘不发热','',1),
(117,3,'开机就报警，显示故障代码','通常开机报警或者按启动就报警，都是水位开关问题。更换水位开关，检查连接线是否接触不良即可解决，如解决不了，再更换电脑板。','',1),
(118,3,'其他程序正常，不能脱水，脱水跟洗衣服一样慢','此故障为排水阀排水时候没有把离合器拉开故障，解决方法：调整离合器把手螺丝，把排水阀跟排水堵头之间距离调整短一点，把离合器把手拉开到位即可','',1),
(119,3,'其他程序正常，不能脱水，排水完了，等4分钟左右就报警，或者不报警','水位开关故障，解决方法：更换水位开关即可','',1),
(120,3,'进水，洗衣服正常，不能排水，不能脱水','排水阀烧坏，导致电脑板烧坏。解决方法：同时更换排水阀跟电脑板即可	\r\n删除\r\n','',1),
(121,3,'其他程序都正常，就是不能脱水，排水完了或者开始排水就报警，显示故','门开关坏，桶平衡开关坏。解决方法：短路电脑板门开关跟桶平衡开关插座即可（短路方法：找到电脑板对应插座，把插头插好在电脑板上面，在电脑板对应插座把线皮剥开，直接扭在一起即可）','',1),
(122,3,'一直洗衣服，不能到排水脱水程序','桶平衡故障，一般为衣服在桶里面偏一边问题。解决方法：短路电脑板桶平衡插座即可（短路方法：找到电脑板对应插座，把插头插好在电脑板上面，在电脑板对应插座把线皮剥开，直接扭在一起即可）','',1),
(123,3,'进水完了，洗衣服时候报警','一般桶平衡故障，其中LG.松下洗衣机有干簧管保护的，应该是盖子磁铁掉了，干簧管不能吸和故障，解决方法：调整桶平衡即可。干簧管问题的，把盖子上面的磁铁安装好即可解决。','',1),
(124,3,'开机没有按启动排水阀就打开，按启动后一边排水一边进水','排水阀坏，导致电脑板烧坏。解决方法：电脑板跟排水阀同时更换即可。','',1),
(125,3,'进水正常，洗衣服程序会排水时','此故障应该是有手搓功能洗衣机，排水牵引器都是三线的，是排水牵引器与排水阀堵头拉线距离太短问题。解决方法：调整离合器把手螺丝，让距离长一点即可，或者改单行程（把牵引器左右两边线并接，剪断接电脑板的手搓功能线即可解决故障。不需要更换电脑板','',1),
(126,3,'开机没有启动就转,进水完了，洗衣服一边转或者不能转','电脑板烧坏，电机局部短路或者烧坏，电容坏。解决方法：量电机阻值（正常阻值两个副绕组相加=主绕组），电机阻值正常，电容正常更换电脑板即可解决，如电机阻值不相等，需要电脑板跟电机。','',1),
(127,3,'打开电源，没有按启动就进水','水位开关故障，更换水位开关即可解决，如解决不了再更换电脑板','',1),
(128,3,'启动后进水不停不能洗衣服','水位开关坏，或者水位开关皮管漏气原因。解决方法：更换水位开关，用胶水密封皮管两头。如果还是解决不了，再更换电脑板','',1),
(129,3,'波轮式洗衣机 可以甩干排水','先测电容,再单独通电电机看是否转动,正反转,电机是正常的,更换电脑板故障排除','',1),
(130,3,'单筒波轮式洗衣机启动线圈和运行线圈','阻值一样，双筒不一样','',1),
(131,4,'微波炉通电不加热,或不通电','检测一下保险丝有没有断开,电阻测量微波管为1欧左右为正常,拆下高压二极管,用电阻200M档正向导通,在30M左右,反向为无穷大,为正常','',1),
(132,4,'微波炉电容','有时测量是正常的但其实是损坏了的,最好的办法是直接替换,测量正反向电容应该不差于0.003UF','',1),
(134,5,'电脑开10分钟左右突然断电','从散热不良方面考虑,如果换了散热风扇还是没有作用的话,请重新拔插一下CPU或更换CPU','',1),
(135,5,'电脑蓝屏死机','先从系统方面考虑,先重装一下系统,如果不行再考虑硬件问题 比如内存条有没有装好或者损坏','',1),
(136,5,'电脑改装通电后延时几秒自动开机,','开机器为5V供电,主板主供电插卡头朝上,从左边第四个黄线接5V正,第八根为黑线接负,继电器接机箱开关按钮','',1),
(137,5,'GHOST系统后不能从硬盘正常启动','首先看一下硬盘有没有拿来做移动U盘,事前装过装机PE系统,没有返还空间,','',1),
(145,1,'IGBT管测量好坏','电阻档200K,红接第三脚黑笔接中间脚,阻值在73K左右, 反向测量为无限大,为正常.电阻档200M档测正反电阻有跳动数字后变为无限大,为正常,如果导通为击穿损坏,第一脚和中间脚正反向电阻都为无限大为正常!','',1),
(147,2,'开机几秒后显示E4错误代码','一般为温度传感器损坏,还有一个可能就是压力开关断路了,正常时是导通的!','',1),
(148,8,'创维液晶电视能遥控开机,开机后有声音没图像没字符且灰屏!','首先 用遥控器试下能否待机,能待机遥控,问题应该不是主板\r\n\r\n用酒精清理一下排线,如还是不行故障可能出现在主板或显示屏驱动电路,因为有声音主板故障率不高,应该为屏驱动电路有问题,难修!','',1),
(149,1,'线圈盘中心感温二极管','阻值在73K左右为正常','',1),
(150,1,'2n3904用8050 2n3906用c8550替换','2n3904用8050 2n3906用c8550替换','',1),
(154,3,'波轮洗衣机一直进水且溢出，能单独排水','先用万用表测一下水位开关导线有无开路，在有装有水的状态下用牙签疏通一下水压导管进水处看到有明显水流出后，查看水压导管是否存在露气，插回水压导管','',1),
(157,1,'故障代码E2','拆开电磁炉,把锅盘感温器拆开不接,然后直接通电如果能正常,更换锅盘感温二极管故障排除','',1),
(181,1,'烧IGBT管,换后不加热几秒后面板闪烁','继续更换IGBT管两脚的稳压二极管,更新220V电源的2UF电容故障排除','',1),
(182,3,'滚筒洗衣机按键失灵','用电吹风加热某部位后就能正常使用,拆下电脑板对加热部位用酒精清洗,故障排除','',1),
(183,4,'微波炉不加热保险丝未断','拔开变压器初级,用万用表交流档测有无220V,如有220V测高压二极管,电容,更换微波管','',1),
(184,4,'微波炉测量变压器','检测时要把线先拔下来\r\n微波炉变压器的初级线圈阻值2欧,\r\n磁控管线圈电阻：约2Ω,\r\n高压保险丝对变压器外壳电阻250欧左右\r\n最后还应该检测 初级线圈,磁控管线圈都应该为无穷大才是正常的','',1),
(186,4,'微波炉电容好坏测量','用电容档测量是否跟标识容量一致,然后用电阻20M档测电阻会在1M逐渐上升至10M左右,正反向电阻测量效果都是这样且最大值都误差不大为正常','',1),
(187,4,'微波炉不加热','高压保险丝没有烧断,测高压二极管和电容都为正常,门开关正常(电阻档,一表笔放在220V输入保险丝那,另一表笔分别测量门开关),测量高压变压器输入端电压是否有220V,如果没有肯定是机械开关或电脑板问题,还有一种是有220v电压的也是机械或电脑板问题,里面接触不良引起的.','',1),
(189,5,'电脑屏幕重影','更换数据线','',1),
(190,3,'波轮洗衣机开机启动几秒后显示F1','为水位传感器问题!更换水位开关或水管','',1),
(191,5,'电脑时不时的卡，硬盘有声音','如果是装系统GHOST的时候没有停卡现像，有时候很正常，有时卡得动不了，请更换一个质量好的电脑电源！','',1),
(232,2,'电脑功能正常,但是不加热','仔细听一下按上煮饭键后,\r\n有没有听到继电器吸合的声音,\r\n如果有,再测一下连接发热盘的导航有没有开路,没有开路,更换继电器->更换驱动三极管','',1),
(233,1,'按键面板显示,按键无反应','先测量该按键连接铜泊线是否通,如通,酒精清洗一下集成电路各引脚,再补焊上一般都可以解决','',1),
(234,6,'空调加制冷剂','1.先查看空调制冷剂型号和量度\r\n2.先使压缩机运行\r\n3.打开制冷剂的伐门\r\n4.打开两通伐的阀门(排一下管里的空气,两次1秒开关操作)\r\n5.加注大概需要30分钟左右,当压力表 在0.5到0.6MP时为加注量合适(冬天压力会偏低,冬天小阀会有点结箱)\r\n6.关制冷剂阀门,关两通伐的阀门\r\n7.制冷剂过多时表现为,小阀和大阀都结箱,看表的压力不明显\r\n8.制冷剂不够,小阀结箱,压力表只有0.2MP左右','',1),
(235,6,'空调制冷剂过多放出制冷剂','1.不能直接放制冷剂,要连接表阀来放,防止冻伤手 2.放制冷剂时表阀变化不明显,所以只能通过观察,小阀大阀结箱的状态来控制放量 3.大阀,小阀箱冻水化状态时,说明制冷剂放出量合适了','',1),
(239,1,'开启3秒左右就停电','检查一下，cpu傍的5UF电容有没膨胀或直接拆下来测量','',1),
(249,6,'制冷原理','压缩机→冷凝器→节流(毛细管)→蒸发 ( 吸热 ) 的制冷循环\r\n压缩机一般由壳体、电动机、缸体、活塞、控制设备 ( 启动器和热保护器 ) 及冷却系统组成\r\n压缩机吸气管吸入低温低压的制冷剂气体\r\n压缩机排气管排出高温高压的制冷剂气体\r\n为制冷循环提供动力\r\n经过冷凝器散热变成高压中温\r\n经过毛细管 毛细管末端变为低压低温\r\n在蒸发器内 汽化时必须吸热，使冷媒水因失热而降低了温度\r\n又被制冷压缩机吸入压缩，这样周而复始\r\n','',1),
(250,6,'压缩机','压缩机一般由壳体、电动机、缸体、活塞、控制设备 ( 启动器和热保护器 ) 及冷却系统组成\r\n启动器基本上有两种，即重锤式和 PTC 式。其中后者较为先进\r\n冷却方式有油冷和自然冷却两种\r\n一般家用冰箱的压缩机是以单相交流电作为电源，压缩机功率较小，通常在 250W 以下','',1),
(251,6,'毛细管作用','毛细管供液量小，蒸发器内的制冷剂偏少，制冷效果差\r\n供液量过大，蒸发压力会很高，蒸发温度高、温度达不到相应的温度等级，严重的还会造成压缩机无法停机故障\r\n毛细管供液能力与尺寸有关。长度长、内径小，供液量越小,反之越大\r\n电冰箱中使用的毛细管，一般使用内径为0.5～1mm、长度2～4m的紫铜管。其尺寸主要由电冰箱采用的压缩机功率与其相应温度等级确定\r\n','',1),
(253,6,'压缩机好坏检测','排出雪种,拆下压缩机剪断低压和高压端,用手堵高压端如堵不住就是正常的\r\n还有交流电流法和电阻法可以判断压缩机是否正常!启动电容也要测量一下\r\n','',1),
(254,6,'打压检漏','用自身压缩机打压比较适合打低压管，不适合打高压管。在实际应用中一般仅打低压就够了，只要低压不漏便是漏高压。正常使用中的冰箱两侧同时漏的概率不高。\r\n   打低压的方法：\r\n1、割开回气管\r\n2、在回气管端接上压力表\r\n3、通电开机并观察表压，当表压到4至5kg时断电，此时表压会继续上升，约8至10kg才停止\r\n4、封死过滤器出口处毛细管\r\n5、观察表压即可','',1),
(256,6,'冰堵脏堵判断','断电并清理冰箱箱里使雪全部融化,一个小时以上\r\n再通电开机,如果刚开始一段时间制冷之后不制冷为冰堵\r\n一直不能制冷为脏堵','',1),
(257,6,'冰箱系统正常工作的压力','600高压0.5低压负0.05\r\n12高压0.9低压0.04\r\n以上为正常工作后的压力','',1),
(259,6,'焊堵检测方法','压力为0的状态下,接表,然后开启冰箱,运行30秒左右,停机过一时间看看压力表如果归0就是通的,为负压就是有焊堵','',1),
(264,6,'焊炬点火,停火顺序','1.点火,打开液化气瓶阀,打开氧气瓶阀,先打开焊枪燃气点火,慢慢调焊枪氧气到合适\r\n2.停火,先关焊枪氧气,再关液化瓶气阀,再关焊枪燃气开关,再关氧气瓶阀','',1),
(271,6,'冰箱维修步骤','1. 9成以上缺氟就是漏气\r\n2. 不管冰箱是否有雪种,切开干燥过滤器和毛细管焊接处(切开哦不要焊,安全)\r\n3. 启动压缩机吹干净从冷凝器里的雪种(安全方法)\r\n4. 焊封住毛细管,回气管焊接单向阀,然后连接压力表三通阀,连接外置打压机,打0.8MPA,观察两个小时左右\r\n5. 压缩机工艺管焊接单向阀(加雪种抽真空用)\r\n6. 压力正常直接外挂冷凝器,否则要开背修了!\r\n7. 焊接点要圆润光滑\r\n8. 充制冷剂时要慢慢的充!\r\n9. 30分钟内压缩机回气管必须要结露,不然很可能有,冰,脏,堵现象!\r\n10. 如果压缩机 出现嗡 停一秒 嗡 停一秒 反复这样肯定就是冰堵严重了!\r\n11. 冰堵就要连续带雪种抽两到三次真空,抽真空时用电热吹风吹一下干燥过滤器!\r\n12. 真空泵,抽真空最少20分钟左右','',1),
(272,6,'打压检漏','一般常用压缩机打压,也有用氮气打压,千万不能用氧气打压,氧气遇油会爆炸','',1),
(273,6,'空调压缩机参数','正常运行有5.3A交流电流\r\n空载电流在3.2A左右','',1),
(275,7,'风扇维修步骤','1. 在未通电状态下,用镙丝刀推动一下扇叶,看是否灵活!(卡住,电机就上机油)\r\n2. 手握风扇塑料,用手去感觉,是否点击开启后有轻微抖动,同时用耳朵注意听是否有交流声!(如有更换电容)\r\n3. 没有任何反应,拆开风扇,定时器开启,测量是否导通,(不导通更换定时器)\r\n4. 焊开电容一脚,用数字万用表测量一下电容值(电容容量正常,更换风扇电机)','',1),
(278,2,'时而按键失灵时而正常','更换78L05不行再更换470UF电解电容','',1),
(279,3,'波轮洗衣机边进水边自动放水','拆开底下管子，里面应该是有什么异物卡住了！','',1),
(280,7,'遥控风扇(遥控都正常,电机不转)','拆开电路板测量双向可控硅两脚是否短路!如短路更换可控硅\r\n通电测量交流电压,在操作123档时分别测量对应档位是否有220V电压\r\n对应三档档位中只能有一个档位有220V电压为电路正常,电路正常更换电机就好了','',1),
(290,5,'没有活动分区的固态硬盘','固态硬盘是新的GPT分区表格式，没有活动分区\r\n指定EPS一个分区盘付,然后用U修复把引导信息写到ESP分区','',1),
(291,1,'间断1秒反复加热','1.查检锅回路有无虚焊 \r\n2.查功率管\r\n更换->5UF->0.33UF->2UF->8050 8550三极管或贴片3904 3906                        ','',1),
(294,5,'启动电脑,CPU转了两秒就停了','重新擦干净一下内存条,重插一下CPU,不行直接更换电脑电源试下','',1),
(296,2,'当按下煮饭键后,显示板熄灭后无反应','供电主板上更换稳压二极管,或开关二极管,不行就把三极管全换了','',1),
(298,1,'开启一切显示都正常，就是不加热','更换开关二极管4148和18v稳压二极管，更换8050 8550,不行更换LM339','',1),
(300,1,'间断2秒反复加热','首先在插电源的时候仔细听一下,电磁炉有没有18v风扇运行两秒后停止 \r\n如果有,那就是CPU有问题了,不用再检测了','',1),
(302,1,'加热很慢','先更换电容5UF，故障依旧,更换0.33UF，2UF更换后故障依旧, \r\n更换推动管8050 8550三极管或贴片3904 3906 等三极管,看下周边有没有虚焊的电容,故障排除','',1),
(303,2,'感温电阻','阻值为74.5K 到100K','',1),
(305,1,'加热很慢(间歇性加热),按键开关时而失灵','按键开关是好的状态下 \r\n更换功率管(功率管线性不好,这种状态下测量不出好坏)','',1),
(307,5,'播放视频中不定时声音卡顿,振荡卡顿','更换电脑硬盘,为保护电脑硬盘养成完全关机后再拔电源','',1),
(308,2,'按键显示正常,不加热','在按下煮饭键后,仔细听一下没有有继电器吸合声,如没有,更换驱动三极管8050或继电器','',1),
(309,1,'E0故障代码','更换一下5UF/400V电容\r\n补焊大线圈电感\r\n不行的话 更换电源 IC 更换完成后\r\n用万用表测量一下5678脚对3.4脚的正反向电阻是否为短路，短路说明IC是坏的\r\n小功率电阻 200k 检查一下是否开路','',1),
(317,1,'E9故障代码','检查。检锅回路电阻。5uf/400v电容','',1),
(318,1,'能开机,无法关机','能开机说明面板单片机没有问题,(之前更换过单片机也一样),更换主板上78L05,故障排除','',1),
(319,1,'只能开关机,别的按键都失灵','电磁炉电感线圈可能脱焊了','',1),
(320,1,'加热一段时间后故障e3','更换8脚电源芯片','',1),
(321,1,'按开关键后，按键无效','仔细观察一下,开机后屏幕显示在哪个档位,故障原因为个别按键开关粘合,导致开机后按键失效','',1),
(322,1,'按开机键后E7','检测推动三极管周围的电阻,或三极管有问题,可以在线测量,(查看电阻阻值,在线测量如果阻值大于标识拆下来测量),','',1),
(323,5,'主机里面风扇呼呼响','风扇坏了，更换CPU风扇','',1),
(324,1,'面板按键失效','补焊->清洁->更换IC->更换78l05','',1),
(333,1,'按键有效果,但时而没有加热','测量功率管 发现 GE两脚踩有80欧,更好故障排除\r\n','',1),
(493,2,'旋钮带电源驱动定时器','插电就自动加热，触动压力开关动作后，跳到保压保温指示灯后，这时定时器电机才有供电，开始计时回旋，如中途压力不够会跳回加热，直到压力够了，又回保压保温，直到回到定时器起点，不会跳回加热为正常.更换定时器时按原来接线即可.','',1),
(497,3,'波轮洗衣机只一个方向转动','用钳表分别测量电脑板控制电机的两根控制线,在电流声间隔响声中,交流电流会随着一升一归0说明电脑板正常,更换电容故障排除','',1),
(521,1,'电磁炉漏电相关','电磁炉正常状态插电后没有按键启动,这时用220v电笔是不亮的,启动后用电笔测量会有一点暗亮是正常现像,如果很亮是真的漏电了','',1),
(523,9,'汽车发动机调气门','标准间隙排气的0.25毫米进气的0.20毫米\r\n顶筒的看筒内数字加+测量间隙再-标准间隙=新顶筒内数字厚度','',1),
(525,9,'发动机油水混合','有微型摄像机可以塞进火花塞查看气缸内部问题\r\n如果气门被顶,拆开发动机更换气门,调气门,活塞被顶坏了就更换活塞\r\n更换缸垫,更换水堵(很重要)','',1),
(527,9,'清洗废机油','用柴油或汽油清洗，化油器成本太高','',1),
(531,9,'更换发动机缸垫 ','直径大于缸头宽度的大砂轮片,厚度10毫米以上\r\n\r\n把缸头放水平整,从缸头 前双手用力向缸尾推\r\n\r\n再跑到缸头尾 双手用力向缸头前推,如此往复\r\n\r\n来回一共60次,即每边30次看到表面都被磨过即可\r\n\r\n如果是高温多次的缸体也要磨一次,往返一共30次即可','',1),
(533,9,'b12发动机凸轮轴固定标记','E0到E4代表排气\r\n1I到4I(不是11到41)为进气','',1),
(535,9,'汽车发动机调气门','标准间隙排气的0.25毫米进气的0.20毫米\r\n顶筒的看筒内数字加+测量间隙再-标准间隙=新顶筒内数字厚度\r\n排气最小不低于0.2毫米,最大不能超过0.4毫米\r\n进气最低就是有间隙就行,最大不能超过0.3毫米','',1),
(539,9,'发动机抖动','1.查看点火顺序连接是否正确\r\n2.缺缸运行检测,在运行的状态下,分别拔下连接火花塞的点火胶套,如果拔出后,发动机没有任何变化,此缸有问题\r\n3.在运行状态下,测量喷油嘴供电电源应有5v左右\r\n4.拔下喷油嘴,稍拔出点,在启动试机状态下,看喷油出口壁是否有油水印为正常','',1),
(541,9,'正常发动机关闭发动机后会有吸气声','正常发动机关闭发动机后会有吸气声','',1),
(545,9,'发动机启动咔咔声,有时启动几次才成功','两种原因\r\n1.电瓶老化,或者亏电\r\n2.启动器旁边的电磁开关或者继电器接触不良,拆下清理灰尘即可,时间太长的话连同启动马达一起清理灰尘','',1),
(547,9,'装正时链条时,注意事项','固定正时的螺丝不能拧太紧很容易断开\r\n正时没有对上千万不能转动曲轴,以免顶到气门\r\n装完后记得在正时链条和涨紧器上放机油润滑\r\n装好后,面朝正时链接条顺时针转动几圈,应有气缸气体压缩阻力感,能转动说明没有顶到气门,OK了','',1),
(549,9,'更换排气管','排气管连接是一个橡胶,拆时在橡胶上涂点机油,然后用长柄镙丝刀翘开','',1),
(551,9,'变速箱齿轮油不可用发动机油替换','手头上没齿轮油，变速箱加发动机机油暂时顶用最好不要超过50公里应马上换为齿轮油，这时排出来的油应该是黑色的了，如果是齿轮油几公里都是黄色的。','',1),
(557,9,' 更换水箱宝(防冷液)','1.水箱散热铝片下面有个塑料镙丝,逆时针拆转动取下来,排出里面的水\r\n\r\n2.节温器拆下排水排锈渣,然后装好(记得放点防油胶水)\r\n\r\n3.水箱加入水超过标记处两指\r\n\r\n4.找到排空气镙丝,逆时针松开排空气(会听到吱吱气流声)直到镙丝有水出来就拧紧\r\n\r\n5.空档启动车子20秒左右,然后再找到排空气镙丝,再次排空气','',1),
(563,9,'更换轮胎镙丝','有的车子前后轮镙丝是有区别的\r\n如果放不进镙丝的话,试下在镙丝头旁边切一刀,就可以放进去了\r\n后轮镙丝能直接拆拿出来的话,装上去时把轮盘后面4个镙丝拆了,用个长的镙丝或镙丝刀,从后面镙丝口伸进来敲好新镙丝','',1),
(567,9,'更换碟刹车片','1.把轮胎拆下后,把刹车油管固定的U型卡扣拆下 \r\n\r\n2.用一字镙丝刀,杠杆顶缩回油钳活塞,拧下固定刹车片镙丝,转动方向盘配合把油钳拆下\r\n\r\n3.把刹车片旧的拆下换新,装回油钳,拧紧镙丝 \r\n\r\n4.转动轮盘,如有卡紧现象,把排油镙母拧松放油,直到轮盘轻松转动为止,拧紧排油镙母,装回轮胎 \r\n\r\n5.在启动车子后踩刹车不太灵,踩很深才有点效果,管里有空气引起的.顶起车子,把排油镙母拧松滴油为止,把刹车油壶帽打开,然后启动车子,深踩5到6次刹车使刹车油跟空气一起喷出来,拧紧排油镙母','',1),
(569,9,'鼓刹片与碟刹片','一部分车，前碟刹后鼓刹，一般换两次碟刹后即第三次换碟刹时才连同鼓刹一起换。\r\n\r\n一般大货车都是鼓刹的多','',1),
(573,8,'液晶电视开机后约2分钟左右就自动黑屏','判断为电源升压电路故障或灯管问题,从故障发作时间很短判断是电路问题更换电源升压板后,故障排除','',1),
(577,3,'波轮洗衣机进水同时,排水管也出水','1.先在断电状态下倒两勺水进去,看排水口是否有水出来\r\n2.如果排水口这时有水出来,那么就是排水口有异物卡住了排水阀使它关不紧\r\n3.拧开排水阀塑料镙母,这个角度看不到里面的情况,用手机拍照看一下里面的异物.取出异物即可\r\n','',1),
(579,5,'usb供电不足','电脑电源老化更换好的电脑电源\r\n电源要选择CPU座旁有8口插座,即两条电源供电的,平常只要插一条也能点亮,但是如果供电不足最好是两根的都插','',1),
(581,5,'主机开机无任何反应','1.拔下电源开关线,万用表测量一下开关按键是否正常\r\n2.通电状态下,用镙丝刀直接短路主板电脑开关一,从个脚\r\n3.把BIOS电池取下,短接正负极放电,然后重新开机\r\n4.cpu拆了重装->更换电源->更换主板\r\n','',1),
(597,10,'油条利润计算','面粉/2元\r\n泡多源 15g(500g17元 每克0.034元)0.51元\r\n油条膨松剂 5g(400g 10元 每克0.025元) 0.125元\r\n食盐 8g \r\n色拉油 10g (500g 3元 每克0.006) 0.06元\r\n鸡蛋 0.5个 一个0.5元半个0.25元算\r\n油炸损耗3元\r\n面粉2元+1元<泡多源+膨松剂+食盐+色拉油+ 半个鸡蛋>=3元\r\n3元+油炸损耗3元=6元 每斤面至少要做出13根油条=13元\r\n13-6元=7元-1元电费燃气费=6\r\n一斤面至少要做出13根油条,不然是赚不到钱的','',1),
(599,10,'豆浆利润计算','大豆每斤3元左右\r\n1g水=1.166ml水\r\n1ml豆浆放0.08g白糖\r\n1杯豆浆放满是350ml留点空为320ml\r\n1斤(500g)大豆做9斤(4500g)豆浆\r\n那么4500g豆浆就是*1.166=5247ml\r\n5247ml / 320ml=16.39杯\r\n1杯子 1吸管费=0.1元成本费\r\n16杯=16元 -1.6元杯费=14.4元\r\n5247ml * 0.08=420g白糖(每斤4元算) =3.4元\r\n14.4-3.4=11 -3元/斤大豆=8元\r\n8-2元电费=6元利润\r\n一斤豆至少要做出9斤豆浆不然是赚不到钱的','',1),
(601,10,'豆浆与油条配对制作量','1斤大豆=16杯豆浆\r\n1斤面粉=13根油条\r\n2斤面=26根油条\r\n500g/16杯=31.25g 每杯需要的大豆量\r\n31.25g *26=812.5g /500= 1.625斤大豆','',1),
(603,6,'冰箱维修','1. 9成以上缺氟就是漏气\r\n2. 不管冰箱是否有雪种,距干燥过滤器8CM外切开毛细管(切开哦不要焊,安全)\r\n3. 启动压缩机吹干净从冷凝器里的雪种(安全方法)\r\n4. 封口钳封住低压路毛细管(封口钳能封住毛细管,别的封不紧)\r\n5. 启动自身压缩机抽真空20分钟左右,观察连接冷凝器刚切开的毛细管\r\n6. 如果有气出来说明是低压漏,如果没有气出来是高压漏(这个方法微漏不准确)\r\n7.留2个小时后把封号钳去掉让毛细管流通,这时有气流声说明低压正常\r\n8.压缩机连接冷凝器的管路不要割拆压缩机口,要留一段长度进行割焊(非常重要)','',1),
(605,6,'氧焊技巧','氧焊分三种火焰温度以小到大排列，碳化焰(三层火焰，中焰长），中性焰(三层火焰，短中焰锥形)，氧化焰(两层火焰，没有中焰且有强烈嘶嘶声)\r\n三种火焰又分大小，就是说虽然都是中性焰但是燃气，氧气开得大的中性焰温度比小的中性焰的温度差别很大(技巧就在这调大小中性焰)！\r\n焊接时用中性焰的中间火焰或内焰吹焊条，吹熔化的铜水，使均匀填在连接处，马上移开火焰','',1),
(607,1,'开启就报警且没有加热效果,面板灯有微闪','更换5UF','',1),
(748,11,'燃气热水器点火器停止点火后就熄灭','更换感应针,不行再更换煤气磁控阀','',1),
(890,9,'手动变速箱1档2档挂不进','检查挂档杆两线的固定镙母是否松动','',1),
(894,8,'更换背光灯条步骤与注意事项','仔细用电筒看一下屏幕表面，有内印不必修屏幕坏了\r\n液晶屏非常非常非常脆弱，一点不均匀平放都会使整个屏报废。\r\n拆开屏幕与主板连接线，\r\n准备一个可以平整而且无尘桌子（拆开后放屏幕用）\r\n把屏幕塑料框边的螺丝拆完\r\n带上塑料手套，防手摸到反光板弄脏了\r\n准备两条木条，屏幕左4分之1和右边4分之1分别竖放，用透明宽胶带粘屏幕跟木条，双手轻拉两木条取出屏幕','',1),
(898,4,'微波炉只有下面底盘不转别的都正常','更换220v转盘电机','',1),
(909,1,'插电有滴声且面板亮一下就熄，之后按键无效','把面板拆下来用水冲洗，刷子刷一下。\r\n电热吹风吹干\r\n把所有开关都更换。\r\n一般为开关潮湿漏电导致','',1),
(913,11,'燃气灶更换点火时注意事项','把两个风门关了，不然不易点火','',1),
(915,3,'波轮洗衣机，进水排水都正常，不能洗衣服','进水满后，有电机交替嗡嗡声就是不转，更换电机电容','',1),
(917,3,'滚筒,更换电脑板,进水没动作,开机几秒后报警','首先电脑板是新的可以排除问题\r\n进水阀没有动作.断电状态下测导线是否导通\r\n如导通以下操作\r\n查看门锁开关是否正常,可以短接的形式启动看\r\n短接开机正常,更换门锁开关\r\n','',1),
(941,8,'开机无图像，检修','拆开拔掉灯管连接线，用灯管测试仪加电，记得正负极别搞反，\r\n如果能点亮一般为电源板问题，不亮为灯管','',1),
(943,3,'维修滚筒洗衣机注意事项','更换电脑板前，一定要检查门锁是否短路，最后跟门锁一齐换了','',1),
(953,5,'笔记本电脑装系统时不认U盘','把读卡器换成usb3.0就行了','',1),
(964,1,'电磁炉线圈盘接法','螺旋外圈接功率管C极','',1),
(1127,7,'遥控电风扇不通电','测量105j400v降压电容,测量5.6v1w稳压二极管，如果保险丝烧断了。后路有短路，记得检查一下可控硅1-3脚是否短路','',1),
(1297,3,'滚筒洗衣机7脚门锁测量好坏','左4右3面向，5,6脚252欧。6,7脚248欧\r\n5,7脚应该是两个之合502殴左右','',1),
(1488,3,'滚筒洗衣机排水阀阻值','滚筒洗衣机排水阀阻值在170欧左右为正常，测到地电阻为无穷大为正常','',1),
(1489,3,'滚筒洗衣机三脚门锁检测好坏','1和3脚有200多欧，推开推卡，1和2脚导通为正常','',1),
(1490,5,'固态硬盘分区 esp msr分区方法','创建第一个分区时esp msr都默认\r\n然后在之后的分区c盘上装系统,装好系统\r\nUEFI修复一下,记得esp指定一个分区一般都是指派最后一个分区名\r\n\r\n也可以创建第一个分区时esp 不创建msr\r\n在C盘上装好系统,系统引导自动修复一下','',1),
(1701,11,'燃气热水器火烧黑旁边','用空压机吹通里面火路的灰尘','',1),
(2148,8,'更换灯条注意事项','找个大场地\r\n1.拆外壳\r\n2.拆排线\r\n3.贴胶布取屏幕\r\n4.拆荧光板\r\n5.单个测灯条,哪个坏换哪个\r\n6.过程反过来装回去','./public/upfiles/images/reply/QQ图片20210106082049.jpg',1),
(2610,5,'4线USB接线方法','接9线座，1排有5个的。多出的线算1 接线2345对应黑绿白红线','',1),
(2852,7,'风扇开几分钟就停 ，且是遥控风扇','查一下降压电容105j是否有1uf','',1),
(3089,1,'一通电没有按键就间断响','拆开把面板和主机连接线断开,通电看是否还响响,如果没有响,为面板按键受潮问题','',1),
(3090,7,'吊扇三线接法','测量阻值居中的那根黑线接220V一端,\r\n另一根非黄线再接220V另一端','',1),
(3093,9,'加油无力','查看汽车是不是外置汽油滤清器,\r\n内置的不需要更换,因为内置的在油箱里面,而且很大\r\n一般去大弄加油站8万公里左右换一次外置汽油滤清器\r\n小加油站6万公里左右就要换\r\n','',1),
(3097,9,'涡轮增压发动机注意事项','1.至少半合成机油以上\r\n2.涡轮不需要清理,清理不当反而容易损坏\r\n3.涡轮工作时温度800度到1000度的高温.好的机油可以更好的降温','',1),
(3321,11,'电子热水器不通电检修步骤','拆下漏电保护器单独测电压是否正常\r\n正常再测量一下发热管是否有几十欧阻值\r\n36欧 50欧 86欧 测对外金属外壳是否有短路或漏电现像\r\n如果正常，直接更换电脑板，看看显示板要不要换，一般都一起换','',1),
(3792,7,'遥控风扇按开机键转一下就停,按住不放也不转 ','更换5.6v1w稳压二极管         ','',1),
(3840,1,'间歇2秒循环报警','放锅上去间歇2秒左右报警，\r\n检查检锅电路，大电阻是否断开或者阻值变大\r\n功率管周边的大电阻焊下测一下阻值是否正常一般不超过1M阻值为正常','',1),
(3841,1,'不通电,保险丝没有烧','更换 IC 然后听一下IC旁边变压器是否有嘶嘶声，如有，焊下220v4.7uf测量阻值，电容阻值正常，直接更换变压器','',1),
(5313,11,'燃气热水器有打电火声,没着火','有电火声说明其它都正常就是煤气通道不通或未开,\r\n先更换电池,不行再更换煤气电磁阀','',1),
(6428,12,'手机屏开机一闪亮一下就熄灭 ','升压电感或升压电容问题\r\n手机升压电路  \r\n由 升压电感 IC 整流二极管 滤波电容组成','',1),
(6448,11,'燃气热水器不打火','手动短接看是否打火，如果打火更换水压膜片\r\n否则拔开插口用镙丝刀直接短接，\r\n如果打火更换水动开头\r\n否则更换点火器，如果更换点火器还是不打火\r\n测电池电压正常，那应该是电池盒里生锈了，更换电池盒','',1),
(6452,5,'查看系统是否是已久激活','运行 cmd\r\nslmgr.vbs -xpr','',1),
(6454,13,'https://github.com/','https://github.com/','',1),
(6456,13,'B站','https://www.bilibili.com/','',1),
(6458,13,'单机游戏网','https://www.3dmgame.com/','',1),
(6459,13,'有道翻译','https://fanyi.youdao.com/','',1),
(6460,13,'西西软件','https://www.cr173.com/','',1),
(6461,13,'php官网','https://www.php.net/','',1),
(6462,13,'风行影视','http://www.fun.tv/','',1),
(6463,13,'河池同城游','http://www.tcy365.com/hc/','',1),
(6464,13,'单片机arduino官网','https://www.arduino.cn/','',1),
(6465,13,'https://cn.vuejs.org/','https://cn.vuejs.org/','',1),
(6466,13,'改图宝','https://www.gaitubao.com/','',1),
(6468,13,'爱纯净系统','http://www.aichunjing.com/','',1),
(6470,5,'GHOST还原恢复系统失败','cmd cd 到GHOST程序目录下\r\n执行命令 Ghost64.exe -ntexact\r\n//必须是GHOST 12版本以上\r\n如果使用的PE系统中没有这个版本可以电脑手动下载后放到U盘里\r\n使用时cmd cd到存放位置 \r\n版本12.0.0.8006 使用正常(备份恢复时都是使用这个版本)','',1),
(6477,8,'屏幕出现规则横线纹','断开一边屏线,一边就能显示正常\r\n更换逻辑板\r\n','',1),
(6802,13,'树莓派系统官网','https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit','',1),
(6804,4,'微波炉电脑板故障','按键与显示都正常就是不加热\r\n如果已经确定是电脑板问题,试一下更换电脑板上面的部份三极管,一般能解决问题','',1),
(6806,12,'更换充电尾插','拆开手机壳\r\n扭开螺丝\r\n取出充电小板\r\n固定小板\r\n热风枪吹\r\n吸锡带清理底坐\r\n酒精清洗底座\r\n放入锡膏\r\n装入新的插口\r\n热风枪吹\r\n如果有引脚粘连 用电烙铁吸锡带吸一下就行','',1),
(6809,2,'按键显示都正常就是不加热','开启后，听一下没有吸合的声音\r\n测量电压是否有12v\r\n如果没有12v 断开70L05输入脚后，电压12v左右正常\r\n说明CPU 或者 连接CPU 供电另一路分支出现问题\r\n直接断开压力开关传感器，开机看看是否报错E4\r\n如果没有报错测量连接CPU引脚到传感器是否正常连接\r\n如果正常 CPU坏了\r\n\r\n如果报错E4了 检查cpu供电引脚电源另一分支线路\r\n','',1),
(6812,11,'电热水器显示按键正常但不加热','拆开\r\n断开加热管连线，测量其电阻值\r\n100欧以内正常, 阻值越小其功率瓦数越大\r\n\r\n把继电器连接的加热管断开，通电测量继电器在开机加热状态下有没有220V电压(一般没有电压)\r\n直接更换继电器再测量，\r\n如果还是没有电压更换电源板','',1),
(6813,5,'电脑开不了机，或者更换主板点不亮','首先检查重启开关是否沾连，如果沾连直接导通，也会使主板点不亮','',1),
(6814,14,'小孩咳嗽 雾化+抗生素','小孩咳嗽 雾化+抗生素','',1),
(6815,14,'预防肺炎 ','1.喂完奶粉千万记得要让宝宝坐着喂，喂完十分钟后再让宝宝自由活动，不然吐奶就会呛到，引起肺炎\r\n2.正常情况下，新生儿的呼吸频率可达40-45次/分，1个月至一岁，宝宝呼吸频率30-40次/分，一岁至3岁，呼吸频率为25-30次/分，4-7岁，呼吸频率为20-25次/分，八岁以上，呼吸频率接近成人，18-20次/分。年龄越小，呼吸频率相对较快，小儿以腹式呼吸为主，成人以胸式呼吸为主\r\n3.发烧达到39度就要服用退烧药，千万记得这时要吃消炎药，消炎药是杀死细菌的卫兵，退烧药只能让你不能再烧下去不然烧坏了，消炎药最少吃三天，最多8天 \r\n4.头孢克肟和头孢哌酮舒巴坦钠的区别\r\n都是第三代头孢，区别在前者是口服，后者是输液\r\n5.小孩子呛到了记得及时拍背','',1),
(6816,14,'感冒感染区分','感冒分为病毒和细菌感染\r\n流青鼻涕为病毒感染 使用 利韦巴林\r\n流浓鼻涕为细菌感染 使用 头孢或阿莫西林，阿奇霉素\r\n','',1),
(6817,14,'胃不舒服 ','反酸 打咳 一般是幽门螺旋杆菌感染\r\n一般使用三联药物治疗  \r\n奥美拉挫 阿莫西林 克拉霉素\r\n坚持吃 最多能吃8天\r\n\r\n最好的方法是食疗 每天早晚各一大碗豆浆,最好不放糖,7天就好了','',1),
(6820,14,'儿童一般3岁以后不容易得肺炎','儿童3岁以后免疫功能逐渐增强,6岁时免疫功能基本与成人相似','',1),
(6821,14,'肺炎判断','1 呼吸频率判断 不同年龄频率不同,超过5次就有感染风险\r\n2 肚皮呼吸,有感染风险\r\n3.发烧,有感染风险','',1),
(6825,3,'美的波轮洗衣机F8故障代码','检测水位开关导管，水位开关，还有接口是否漏气','',1),
(6826,14,'拉肚子 用药方法 ','18岁以下使用蒙脱石散\r\n18岁以上可以使用诺氟沙星\r\n ','',1),
(6828,1,'一通电在没有任务按键操作下 报警 ','先更换4.7UF/400V电解电容\r\n一般都是大件问题或大件虚焊或者感温器问题，\r\n一个感温器在线圈盘中心，还有一个在场效应管附近','',1),
(6843,10,'豆腐圆','馅 配方 \r\n豆腐圆 每斤肉放1.33两糯米饭，1斤肉放0.02斤盐，葱花每斤肉放一两，每斤肉放0.012味精,柠檬叶看情况份量不定\r\n煎豆腐圆使用的豆油 \r\n为节约成本,用食用豆油3.5元/斤混合专用煎油 比例1比1','',1),
(7160,1,'控制面板按键无反应','测量5伏电压正常。\r\n更换按键开关。故障依旧。\r\n更换贴片芯片。故障依旧。\r\n更换瓷片电容101\r\n故障排除。','',1),
(7165,3,'波轮洗衣机一直进水不转','更换水位传感器\r\n更新时必须注意以下几点\r\n1.必须在排完水后更换\r\n2.更换时最好拿铜丝绑紧接口处让其密封好\r\n3.通水\r\n4.调水位开关上面那个镙帽可以调节水位对应相对电子档位，向外转是调低水位','',1),
(7166,13,'在线视频转换','https://convertio.co/zh/','',1),
(7167,3,'滚筒洗衣机运行10多分钟就停','滚筒洗衣机排水采用抽水方式\r\n如果不排水也会有这种现象\r\n测量220v两脚电阻正常180欧左右\r\n无穷大或过小就更换','',1),
(7497,9,'4冲程割草机 难启动或启动一下就停','更换 化油器','',1),
(7498,6,'饮水机不制冷','拆下制冷片测量电阻 例如tec1-2706 正向向电阻正常为 0欧和45欧左右，如果阻值差别很大更换，更换后还是一样，更换主板','',1),
(7504,13,'国家中小学智慧教育网','https://basic.smartedu.cn/','',1),
(7838,6,'冰箱封口焊接步骤注意事项','必须在断电停止运行的状态下进行封口焊接，因为运行的时候管道内是负压很危险的\r\n用封口钳压两道，在压第三道的时候，封口钳要一直留在那里等风封口焊接完再拿下来\r\n用割管器把封口钳前面20mm左右割开\r\n封口稍微往上抬，做好周围部件的防热，就可以用氧焊口','',1),
(7839,3,'甩干内桶呼呼响，内桶撞到内壁','更换4个平衡杆','',1),
(7840,13,'火狐浏览器视频缓存','浏览器上输入 about:cache\r\n\r\nC:\\Users\\Administrator\\AppData\\Local\\Mozilla\\Firefox\\Profiles\\6m23yd8k.default-release-1\\cache2 ','',1),
(7864,13,'http://www.huayunengxiang.com/','http://www.huayunengxiang.com/','',1),
(7872,13,'https://www.ktkkt2.com/','https://www.ktkkt2.com/','',1),
(7874,1,'电磁炉面板无显示5V供电不正常未烧保险','更换电源IC\r\n更换电源小变压器','',1),
(7896,13,'springboot框架在线生成','https://start.spring.io/','',1),
(7901,12,'360通话录音','手机识别码 0bda0bi0\r\n激活码212  有规律  b代表2 隔一个算一个。a代表1','',1),
(7905,3,'滚筒洗衣机通电就报警','看看显示面板 门锁有没有关闭\r\n门锁关闭了 更换 水位传感器 ','',1),
(7906,13,'另一个微信号','\r\n密码 qq@277791907','',1),
(7915,13,'在线图片转文字','http://imagetotxt.com/','',1),
(7918,13,'www.41114.tv','www.41114.tv','',1),
(7922,13,'arm64 mysql5.7','https://blog.csdn.net/qq_40875195/article/details/129215341','',1),
(7924,13,'https://hanime1.me/watch?v=37590','https://hanime1.me/watch?v=37590','',1),
(7925,13,'https://xanimu.com/','https://xanimu.com/','',1),
(7929,3,'波轮洗衣机桶不转,点击有交流声','用交流电流表测量是否有交替的交流电,\r\n有交替的交流电流,测量一下电容,\r\n电容容量没问题,把电容装回去,测量电机连接电容的两根线是否有电容容量,如果没有,查一下线路是否被老鼠咬\r\n如果两根线有电容容量,拆下电机接电容单独测试看看扭力够不够','',1),
(7933,9,'电动车电瓶保养','使用工具\r\n1.浓缩修复液  2 一字小螺丝刀 3 注射针管\r\n一 浓缩液用量 每个电瓶安数 / 2 \r\n比如12A的   12/2=6毫升  如果一个是电瓶有6个格，每个格要加6毫升,加完502胶水粘好盖子\r\n二 静放4小时,然后充电2小时,把点放完,然后一次性把点充满,再放电,做循环让修复液彻底循环\r\n','',1),
(7944,14,'过敏性咳嗽，咳嗽频率搞','富马酸酮替芬片','',1),
(7969,13,'redis window版下载地址','https://github.com/MicrosoftArchive/redis/releases','',1),
(7980,5,'电脑电源单独检测好坏','24口插脚凸面朝下,右下开始数第4根绿线短接随意黑线,\r\n电源风扇转动就是好的\r\n','',1),
(7982,5,'在不拆机状态下查看主板型号','Win+R 组合键\r\nmsinfo32 回车','',1),
(8013,14,'颈椎病会引起高血压','脖子僵硬,转头颈椎疼,是由于脖子后面左右两根神经不通,严重是会起床或躺下天旋地转血压升高\r\n注意事项\r\n冷天注意脖子保暖\r\n不要床上看手机,\r\n坐在电脑前30分钟,运动一下脖子,背部肌肉','',1),
(8014,5,'内存真假防伪方法','运行Thaiphoon.exe\r\n选择Read 下拉\r\nJEDEC DIMM Label 下面\r\n8GB 2Rx8 (2R开头为真) 1R是假内存-服务器拆机颗粒的','',1),
(8015,13,'香橙派3','http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-Zero-3.html','',1),
(8021,5,'电脑开手机模拟器就蓝屏,必须开启CPU虚拟化','进入BIOS 启用SVM Mode','',1),
(8022,4,'烧坏220V保险管','把连接电容的线全拔掉,分别测量电容两个脚对外壳电阻,都为无穷大,\r\n重点测量门开关和微波发射管,如果使用几天才烧220V保险管,为微波炉发射管问题,一般为门开关不良,更换就可以了','',1),
(8030,14,'小孩不吃肉,抵抗力低','小孩不吃肉,抵抗力低,必须吃肉','',1),
(8062,3,'洗衣机进水阀电阻值','4k左右','',1),
(8063,8,'图像抖动','图像抖动,时间越久越明显\r\n一般是屏幕问题,屏里面应该有短路\r\n处理方法\r\n逻辑板,两个排线,有一根需要技改来维修\r\n如果维修中灰屏了,就是两边都有问题,无法修复','',1),
(8064,1,'电磁炉E5','功率管感温二极管(正常60k左右,有时候也需要换),补焊检锅传感器','',1),
(8065,5,'电脑编程系统必备','QQ拼音输入法\r\nQQ五笔\r\ncpu 温度检测\r\ngolang\r\narduino\r\nffmpeg\r\n桌面CMD\r\nFlashFXP\r\n火狐浏览器\r\nEdge\r\nQQ\r\n微信电脑版\r\n央视影音\r\n迅雷\r\nQQ游戏\r\n\r\nphp\r\nsublime\r\n','',1),
(8066,13,'ipv6网址检测','https://v6t.ipip.net/','',1),
(8067,5,'电脑电源好坏','用外接卡测试，\r\n3.3v应该有3.38v-3.4v\r\n5v 应该有 5.12v\r\n12v 应该有 12.12v','',1),
(8068,5,'电脑不定时蓝屏或死机','查看CPU温度都是0度，一般为CPU问题','',1),
(8069,9,'汽车防鼠','1.空调进气口使用铸工胶+网购橱柜铝合金网格(量好尺寸)\r\n2.车尾轮胎后面 车内气压泄压孔(用于关门时车内气压泄压)，使用金属片量好尺寸剪好打孔+铸工胶封好\r\n3.发动机撒点风油清可以驱鼠防止老鼠咬线路\r\n4.车里不要使用吸引老鼠的香水','',1),
(8070,8,'液晶电视开机背光闪1秒就灭','使用灯条测试仪能点亮灯条，这个情况不一定是主板问题，测量一下主板灯条供电电压正常100v左右，只后慢慢降到40v左右，说明主板正常,灯条问题','',1),
(8071,4,'微波炉微波管好坏检测','电阻测量\r\n1.测量灯丝电阻：微波管有两个灯丝引脚，正常情况下，这两根引脚之间的电阻应该很小，一般在 1Ω 左右\r\n2.常情况下，这个电阻值应该为无穷大，因为灯丝与外壳之间是绝缘的。如果测得有一定的电阻值，说明微波管的绝缘性能下降，存在漏电现象，也是损坏的表现','',1),
(8072,3,'洗衣机排水正常两分钟后E4','短接门开关\r\n不行就更换水位传感器','',1),
(8073,4,'微波炉接磁控管的两根线阻值也是0欧左右','微波炉接磁控管的两根线阻值也是0欧左右','',1),
(8074,4,'微波炉电容有一边对外壳电阻230欧左右','微波炉电容有一边对外壳电阻230欧左右','',1),
(8075,4,'微波炉烧保险','检查电容容量和电容电地电阻看看是否短路\r\n电容有一边对外壳电阻230欧左右\r\n如果完好,更换门开关','',1),
(8076,7,'遥控电风扇开机不通电','测一个 稳压二级管5.1v,在线就可以测量','',1);

--
-- Table structure for table `WisdomTools`
--

CREATE TABLE `WisdomTools` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category` varchar(32) NOT NULL DEFAULT '',
  `userid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;

--
-- Dumping data for table `WisdomTools`
--

INSERT INTO `WisdomTools` VALUES
(1,'家电维修',1),
(3,'制冷维修',1),
(4,'汽车维修',1),
(5,'智能家居',1),
(6,'车上必备',1),
(7,'外出必备',1),
(8,'水果工具',1),
(29,'必学技能',1);

--
-- Table structure for table `WisdomToolsReply`
--

CREATE TABLE `WisdomToolsReply` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category` varchar(32) NOT NULL DEFAULT '',
  `name` varchar(32) NOT NULL DEFAULT '',
  `number` int(10) DEFAULT 0,
  `buy` float DEFAULT 0,
  `freight` float NOT NULL DEFAULT 0,
  `date` date NOT NULL,
  `userid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1043 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;

--
-- Dumping data for table `WisdomToolsReply`
--

INSERT INTO `WisdomToolsReply` VALUES
(1,'汽车维修','40件套(内六角十二梅花)',1,46,0,'2019-09-07',1),
(3,'家电维修','电烙铁芯内热式',1,10,1,'2019-09-07',1),
(961,'家电维修','英爵伦电吹风',1,27,0,'2023-08-16',1),
(5,'家电维修','936焊台烙铁芯',3,12,1,'2019-09-07',1),
(6,'家电维修','6寸老虎钳',1,7,1,'2019-09-07',1),
(7,'家电维修','八角锤2.2斤',1,13,1,'2019-09-07',1),
(780,'家电维修','3斤松香',1,24,0,'2020-10-18',1),
(9,'家电维修','烙铁头936电焊台',1,5.5,1,'2019-09-07',1),
(10,'家电维修','汉邦936恒温电烙铁',1,59,0,'2019-09-07',1),
(838,'家电维修','802电动镙丝刀批头 ',34,3,0.5,'2022-04-19',1),
(12,'汽车维修','8寸一字镙丝刀',1,8.5,1,'2019-09-07',1),
(13,'家电维修','8寸十字镙丝刀',1,8.5,1,'2019-09-07',1),
(874,'家电维修','17寸双层工具箱',1,15,0,'2022-08-18',1),
(839,'家电维修','936烙铁头5个一套',1,13.5,0.5,'2022-04-19',1),
(17,'家电维修','十字镙丝刀200m',1,3.8,1,'2019-09-07',1),
(18,'家电维修','9v电子称充电电源',1,10,0,'2019-09-07',1),
(19,'家电维修','107吸锡器',2,9.6,1,'2019-09-07',1),
(20,'家电维修','10寸活动板手',1,12.8,1,'2019-09-07',1),
(21,'家电维修','铁皮剪8寸',1,11.8,0,'2019-09-07',1),
(22,'家电维修','热熔胶枪',1,14,0,'2019-09-07',1),
(23,'家电维修','电热熔枪胶棒',10,0.8,1,'2019-09-07',1),
(960,'智能家居','康夫电吹风',1,68,0,'2023-08-16',1),
(810,'智能家居',' 手机遥控电动卷闸门 ',1,180,0,'2021-06-18',1),
(26,'家电维修','12v2000瓦逆变器',1,350,0,'2019-09-07',1),
(836,'家电维修','焊锡丝500克',1,39,0,'2022-03-23',1),
(28,'家电维修','936焊台烙铁头',2,6,1,'2019-09-07',1),
(29,'汽车维修','保险丝30A',3,0.5,0,'2019-09-07',1),
(30,'汽车维修','保险丝20A ',3,0.5,0,'2019-09-07',1),
(31,'汽车维修','保险丝15A',5,0.5,0,'2019-09-07',1),
(32,'汽车维修','72齿弯柄棘轮61件套',1,210,0,'2019-09-07',1),
(33,'汽车维修','12/24脉冲充电器',1,92,0,'2019-09-07',1),
(34,'汽车维修','千斤顶(气压)',1,50,0,'2019-09-07',1),
(35,'制冷维修','飞越真空泵',1,265,0,'2019-09-07',1),
(36,'制冷维修','封口钳',1,17,0,'2019-09-07',1),
(37,'制冷维修','弯管器6/8/10m',1,28,0,'2019-09-07',1),
(38,'制冷维修','扩管器割管刀',1,32,1,'2019-09-07',1),
(39,'制冷维修','雪种万能开瓶',2,9,1,'2019-09-07',1),
(40,'制冷维修','钳形电流表(交流)',1,27,1,'2019-09-07',1),
(42,'制冷维修','500克硼砂',2,8,0,'2019-09-07',1),
(44,'制冷维修','2升液化瓶减压阀',1,16,0,'2019-09-07',1),
(45,'制冷维修','小型割管器',2,12,0,'2019-09-07',1),
(46,'制冷维修','2.5Mpa压力表头',2,7,0,'2019-09-07',1),
(868,'制冷维修','R134A汽车空调高压接头',1,8,0,'2022-08-13',1),
(48,'汽车维修','12寸活动板手',1,15.3,0,'2019-09-07',1),
(49,'家电维修','6寸尖嘴钳',1,9,0,'2019-09-07',1),
(50,'家电维修','6寸细尖嘴钳',1,12,0,'2019-09-07',1),
(51,'家电维修','尖嘴镊子',2,5,1,'2019-09-07',1),
(52,'家电维修','卷尺',1,3,0,'2019-09-08',1),
(53,'家电维修','802电动镙比刀',1,120,0,'2019-09-08',1),
(54,'家电维修','3米人字梯',1,330,0,'2019-09-08',1),
(55,'家电维修','三路单独开关插座',1,30,0,'2019-09-08',1),
(58,'智能家居','手机遥控定时充电插座',1,20,0,'2019-09-08',1),
(61,'智能家居','wifi路由器',1,98,0,'2019-09-08',1),
(62,'智能家居','夜视摄像头',1,168,0,'2019-09-08',1),
(1026,'智能家居','5700+16g+512g+显示器',1,2000,0,'2025-02-22',1),
(64,'智能家居','空调',1,3200,0,'2019-09-08',1),
(65,'智能家居','冰箱',1,1680,0,'2019-09-08',1),
(977,'智能家居','滚筒洗衣机',1,1500,0,'2024-05-28',1),
(67,'智能家居','电脑桌',1,168,0,'2019-09-08',1),
(68,'智能家居','厨房液化燃气',1,200,0,'2019-09-08',1),
(69,'智能家居','电磁炉',2,200,0,'2019-09-08',1),
(970,'智能家居','浴霸',1,70,0,'2023-12-06',1),
(71,'智能家居','沐浴露',1,30,0,'2019-09-08',1),
(73,'智能家居','洗发水',1,30,0,'2019-09-08',1),
(74,'智能家居','洗衣粉',1,20,0,'2019-09-08',1),
(75,'智能家居','.剃须刀',1,20,0,'2019-09-08',1),
(76,'智能家居','飞科理发器',1,100,0,'2019-09-08',1),
(814,'车上必备','三头剃须刀 ',1,19,0,'2021-06-18',1),
(78,'车上必备','纯净水',1,2,0,'2019-09-08',1),
(789,'车上必备','灭火器',1,15,0.5,'2020-12-28',1),
(788,'车上必备','灭火器',1,15,0.5,'2020-12-28',1),
(81,'车上必备','雨伞',1,10,0,'2019-09-08',1),
(887,'车上必备','360行车记录仪',1,300,0.5,'2023-04-29',1),
(83,'车上必备','千斤顶',1,50,0,'2019-09-08',1),
(84,'车上必备','几个大号塑料袋',1,1,0,'2019-09-08',1),
(85,'车上必备','三角板',1,0,0,'2019-09-08',1),
(86,'车上必备','车贴黑膜',1,100,0,'2019-09-08',1),
(89,'智能家居','拖鞋',1,20,0,'2019-09-08',1),
(88,'家电维修','网线钳-测试仪',1,25,0,'2019-09-08',1),
(90,'外出必备','纸巾',1,2,0,'2019-09-08',1),
(91,'外出必备','镜子',1,10,0,'2019-09-08',1),
(92,'外出必备','理发器',1,100,0,'2019-09-08',1),
(93,'外出必备','剃须刀',1,20,0,'2019-09-08',1),
(937,'外出必备','手机',1,3000,0,'2023-05-19',1),
(95,'外出必备','驾驶证',1,0,0,'2019-09-08',1),
(96,'外出必备','手机充电器',1,0,0,'2019-09-08',1),
(97,'外出必备','沐浴露',1,30,0,'2019-09-08',1),
(98,'外出必备','两套换洗',1,0,0,'2019-09-08',1),
(99,'外出必备','拖鞋',1,20,0,'2019-09-08',1),
(100,'汽车维修','拾取器(买工具箱附送)',1,0,0,'2019-09-08',1),
(758,'家电维修','晶思达数字万用表',1,80,0,'2020-05-27',1),
(857,'家电维修','洗衣机捶打扳手',1,50,0,'2022-07-28',1),
(942,'家电维修','4-12mm九层含古钻头',1,14.3,0,'2023-05-26',1),
(808,'智能家居','电动牙刷 充电能用一年',1,40,0,'2021-06-18',1),
(1012,'家电维修','电动扳手(伯特里)全铝',1,91.1,0,'2024-10-17',1),
(109,'水果工具','糖度仪0~32%',1,105,0,'2019-09-09',1),
(867,'餐饮小吃','双层保温桶',1,168,0,'2022-08-12',1),
(964,'家电维修','波轮洗衣机拉钩一对',1,4,0,'2023-08-22',1),
(116,'水果工具','打药管收纳轮(80)',2,110,0,'2019-09-09',1),
(114,'水果工具','打药喷杆',2,20,0,'2019-09-09',1),
(936,'遥控工具车','24VDC继电器6脚 C型',8,3,0,'2023-05-19',1),
(732,'水果工具','1寸18米水带',5,33,0,'2019-10-05',1),
(746,'餐饮小吃','测温仪-32到380度',1,38,0,'2019-11-23',1),
(743,'餐饮小吃','豆浆奶茶封口机',1,200,0,'2019-11-22',1),
(741,'餐饮小吃','不锈钢油炸盆60x40x15',1,78,0,'2019-11-21',1),
(742,'餐饮小吃','30L豆浆保温桶',1,105,0,'2019-11-22',1),
(739,'餐饮小吃','擀面杖直径3.2cm长度30cm',1,13.5,0,'2019-11-21',1),
(738,'餐饮小吃','擀面杖直径3.2cm长度30cm',1,13.5,0,'2019-11-21',1),
(737,'餐饮小吃','不锈钢油炸盆60x40x15',1,78,0,'2019-11-21',1),
(735,'车上必备','灭火器',1,70,0,'2019-11-19',1),
(736,'水果工具','汽油抽水泵',1,180,0,'2019-11-19',1),
(733,'汽车维修','黑旋封586汽车耐油温密封胶',1,10,0,'2019-10-18',1),
(730,'汽车维修','气门拆装油封钳',1,18,0,'2019-09-30',1),
(727,'汽车维修','气门拆装油封钳',1,18,0,'2019-09-30',1),
(728,'汽车维修','棕刚玉150*25*32(粒度80)',1,16,0,'2019-09-30',1),
(729,'汽车维修','棕刚玉150*25*32(粒度80)',1,16,0,'2019-09-30',1),
(724,'汽车维修','机油壳扳手',1,15,0,'2019-09-29',1),
(723,'汽车维修','机油壳扳手',1,15,0,'2019-09-29',1),
(722,'汽车维修','塞尺',1,6,0,'2019-09-28',1),
(721,'汽车维修','气门工具',1,43,0,'2019-09-28',1),
(720,'汽车维修','塞尺',1,6,0,'2019-09-27',1),
(719,'汽车维修','气门工具',1,43,0,'2019-09-27',1),
(717,'汽车维修','3吨卧式千斤顶(汽修专用)',1,334,0,'2019-09-12',1),
(716,'汽车维修','3吨卧式千斤顶(汽修专用)',1,334,0,'2019-09-12',1),
(714,'水果工具','30升酒壶(装柴油)',1,32,0,'2019-09-09',1),
(713,'水果工具','水箱2000斤',1,330,0,'2019-09-09',1),
(840,'水果工具','PVC软管1寸牛筋50米',2,169,0,'2022-04-28',1),
(711,'水果工具','50米抽刚电缆',1,45,0,'2019-09-09',1),
(710,'水果工具','至尊电子秤计价30kg',1,88,0,'2019-09-09',1),
(709,'水果工具','抽水管50米',1,120,0,'2019-09-09',1),
(708,'水果工具','风冷柴油机',1,800,0,'2019-09-09',1),
(707,'水果工具','打药管收纳轮(80)',2,110,0,'2019-09-09',1),
(706,'水果工具','打药喷杆',2,20,0,'2019-09-09',1),
(705,'水果工具','45cm大果剪',1,35,0,'2019-09-09',1),
(704,'水果工具','糖度仪0~32%',1,105,0,'2019-09-09',1),
(703,'水果工具','60v抽水泵300W',1,130,0,'2019-09-09',1),
(702,'水果工具','4冲程割草机',1,420,0,'2019-09-09',1),
(701,'水果工具','水箱540斤',1,150,0,'2019-09-09',1),
(700,'水果工具',' 水箱660斤',1,176,0,'2019-09-09',1),
(699,'水果工具','220v抽水机370w',1,188,0,'2019-09-09',1),
(698,'水果工具','200米打药管(65)',1,260,0,'2019-09-09',1),
(696,'外出必备','拖鞋',1,20,0,'2019-09-08',1),
(697,'水果工具','打药泵',1,400,0,'2019-09-09',1),
(695,'外出必备','两套换洗',1,0,0,'2019-09-08',1),
(694,'外出必备','沐浴露',1,30,0,'2019-09-08',1),
(693,'外出必备','手机充电器',1,0,0,'2019-09-08',1),
(692,'外出必备','驾驶证',1,0,0,'2019-09-08',1),
(691,'外出必备','手机',1,1500,0,'2019-09-08',1),
(690,'外出必备','剃须刀',1,20,0,'2019-09-08',1),
(689,'外出必备','理发器',1,100,0,'2019-09-08',1),
(688,'外出必备','镜子',1,10,0,'2019-09-08',1),
(687,'外出必备','纸巾',1,2,0,'2019-09-08',1),
(686,'车上必备','车贴黑膜',1,100,0,'2019-09-08',1),
(685,'车上必备','三角板',1,0,0,'2019-09-08',1),
(684,'车上必备','几个大号塑料袋',1,1,0,'2019-09-08',1),
(683,'车上必备','千斤顶',1,50,0,'2019-09-08',1),
(682,'车上必备','行车记录仪',1,368,0,'2019-09-08',1),
(681,'车上必备','雨伞',1,10,0,'2019-09-08',1),
(680,'车上必备','大功率手机充电器',1,40,0,'2019-09-08',1),
(679,'车上必备','.安全套',1,30,0,'2019-09-08',1),
(678,'车上必备','纯净水',1,2,0,'2019-09-08',1),
(677,'车上必备','.剃须刀',1,20,0,'2019-09-08',1),
(676,'智能家居','拖鞋',1,20,0,'2019-09-08',1),
(675,'智能家居','飞科理发器',1,100,0,'2019-09-08',1),
(674,'智能家居','.剃须刀',1,20,0,'2019-09-08',1),
(673,'智能家居','洗衣粉',1,20,0,'2019-09-08',1),
(672,'智能家居','洗发水',1,30,0,'2019-09-08',1),
(671,'智能家居','沐浴露',1,30,0,'2019-09-08',1),
(670,'智能家居','48寸液晶电视机',1,4300,0,'2019-09-08',1),
(669,'智能家居','电磁炉',2,200,0,'2019-09-08',1),
(668,'智能家居','厨房液化燃气',1,200,0,'2019-09-08',1),
(667,'智能家居','电脑桌',1,168,0,'2019-09-08',1),
(666,'智能家居','滚筒洗衣机',1,3500,0,'2019-09-08',1),
(665,'智能家居','冰箱',1,1680,0,'2019-09-08',1),
(664,'智能家居','空调',1,3200,0,'2019-09-08',1),
(663,'智能家居','8升电压力锅',1,330,0,'2019-09-08',1),
(662,'智能家居','夜视摄像头',1,168,0,'2019-09-08',1),
(661,'智能家居','wifi路由器',1,98,0,'2019-09-08',1),
(660,'智能家居','电脑',1,1700,0,'2019-09-08',1),
(659,'智能家居','台式电脑下载共享备份机',1,400,0,'2019-09-08',1),
(658,'智能家居','手机遥控定时充电插座',1,20,0,'2019-09-08',1),
(657,'智能家居','手机遥控电动卷闸门',1,50,0,'2019-09-08',1),
(656,'汽车维修','拾取器(买工具箱附送)',1,0,0,'2019-09-08',1),
(655,'汽车维修','12寸活动板手',1,15.3,0,'2019-09-07',1),
(654,'汽车维修','千斤顶(气压)',1,50,0,'2019-09-07',1),
(653,'汽车维修','12/24脉冲充电器',1,92,0,'2019-09-07',1),
(652,'汽车维修','72齿弯柄棘轮61件套',1,210,0,'2019-09-07',1),
(651,'汽车维修','保险丝15A',5,0.5,0,'2019-09-07',1),
(650,'汽车维修','保险丝20A ',3,0.5,0,'2019-09-07',1),
(649,'汽车维修','保险丝30A',3,0.5,0,'2019-09-07',1),
(718,'汽车维修','40件铁盒套(内6角12梅花)',1,46,0,'2019-09-12',1),
(648,'汽车维修','8寸一字镙丝刀',1,8.5,1,'2019-09-07',1),
(646,'制冷维修','加长点火棒',2,5,0,'2019-09-07',1),
(645,'制冷维修','2.5Mpa压力表头',2,7,0,'2019-09-07',1),
(643,'制冷维修','2升液化瓶减压阀',1,16,0,'2019-09-07',1),
(644,'制冷维修','小型割管器',2,12,0,'2019-09-07',1),
(642,'制冷维修','发泡枪',1,10,0,'2019-09-07',1),
(641,'制冷维修','500克硼砂',2,8,0,'2019-09-07',1),
(640,'制冷维修','2升焊炬双用氧气瓶',1,225,0,'2019-09-07',1),
(639,'制冷维修','钳形电流表(交流)',1,27,1,'2019-09-07',1),
(638,'制冷维修','雪种万能开瓶',2,9,1,'2019-09-07',1),
(637,'制冷维修','扩管器割管刀',1,32,1,'2019-09-07',1),
(636,'制冷维修','弯管器6/8/10m',1,28,0,'2019-09-07',1),
(635,'制冷维修','封口钳',1,17,0,'2019-09-07',1),
(633,'家电维修','数字万用表',1,40,0,'2019-09-08',1),
(634,'制冷维修','飞越真空泵',1,265,0,'2019-09-07',1),
(632,'家电维修','网线钳-测试仪',1,25,0,'2019-09-08',1),
(631,'家电维修','工作台(自焊接DIY)',1,50,0,'2019-09-08',1),
(630,'家电维修','三路单独开关插座',1,30,0,'2019-09-08',1),
(629,'家电维修','3米人字梯',1,330,0,'2019-09-08',1),
(628,'家电维修','802电动镙比刀',1,120,0,'2019-09-08',1),
(627,'家电维修','卷尺',1,3,0,'2019-09-08',1),
(626,'家电维修','尖嘴镊子',2,5,1,'2019-09-07',1),
(625,'家电维修','6寸细尖嘴钳',1,12,0,'2019-09-07',1),
(624,'家电维修','6寸尖嘴钳',1,9,0,'2019-09-07',1),
(623,'家电维修','936焊台烙铁头',2,6,1,'2019-09-07',1),
(622,'家电维修','焊锡丝350克',1,25,1,'2019-09-07',1),
(621,'家电维修','12v2000瓦逆变器',1,350,0,'2019-09-07',1),
(620,'家电维修','康夫电吹风',1,68,0,'2019-09-07',1),
(619,'家电维修','电热熔枪胶棒',10,0.8,1,'2019-09-07',1),
(618,'家电维修','热熔胶枪',1,14,0,'2019-09-07',1),
(617,'家电维修','铁皮剪8寸',1,11.8,0,'2019-09-07',1),
(616,'家电维修','10寸活动板手',1,12.8,1,'2019-09-07',1),
(615,'家电维修','107吸锡器',2,9.6,1,'2019-09-07',1),
(614,'家电维修','9v电子称充电电源',1,10,0,'2019-09-07',1),
(613,'家电维修','十字镙丝刀200m',1,3.8,1,'2019-09-07',1),
(612,'家电维修','电子元件盒',24,1.9,1,'2019-09-07',1),
(611,'家电维修','电钻炭刷一对',1,1,1,'2019-09-07',1),
(610,'家电维修','220v电钻',1,89,0,'2019-09-07',1),
(609,'家电维修','8寸十字镙丝刀',1,8.5,1,'2019-09-07',1),
(608,'家电维修','802电动镙丝刀批头',26,3,1,'2019-09-07',1),
(607,'家电维修','汉邦936恒温电烙铁',1,59,0,'2019-09-07',1),
(605,'家电维修','松香',11,0.6,1,'2019-09-07',1),
(604,'家电维修','八角锤2.2斤',1,13,1,'2019-09-07',1),
(603,'家电维修','6寸老虎钳',1,7,1,'2019-09-07',1),
(602,'家电维修','936焊台烙铁芯',3,12,1,'2019-09-07',1),
(601,'家电维修','直柄麻花钻 3MM',7,0.5,1,'2019-09-07',1),
(600,'家电维修','电烙铁芯内热式',1,10,1,'2019-09-07',1),
(747,'制冷维修','双公透明加液管',1,3.5,0.5,'2019-12-19',1),
(748,'制冷维修','公英透明加液管',1,0.5,0.5,'2019-12-19',1),
(750,'制冷维修','双公透明加液管',1,3.5,0.5,'2019-12-19',1),
(751,'制冷维修','公英透明加液管',1,3.5,0.5,'2019-12-19',1),
(752,'制冷维修','自制空压机',1,150,0.5,'2019-12-21',1),
(753,'汽车维修','黑色防锈漆1L',1,32,0,'2020-01-04',1),
(980,'水果工具','48-72v电动打药机',1,458,0,'2024-06-02',1),
(755,'水果工具','139汽油机泵头',1,170,0,'2020-05-11',1),
(756,'水果工具','斯尔特割草机发动机',1,240,0,'2020-05-25',1),
(763,'家电维修','液晶屏 背光灯测试仪',1,55,0,'2020-06-07',1),
(766,'车上必备','30L汽油铁桶',1,55,0,'2020-06-16',1),
(767,'车上必备','30L汽油铁桶',1,55,0,'2020-06-16',1),
(768,'水果工具','6.8KW油锯',1,279,0,'2020-07-13',1),
(769,'水果工具','6.8KW油锯',1,279,0,'2020-07-13',1),
(770,'水果工具','大功率二冲程油锯',1,335,0,'2020-07-19',1),
(771,'水果工具','大功率二冲程油锯',1,335,0,'2020-07-19',1),
(773,'智能家居','卫星接收机(71台)',1,188,0,'2020-07-31',1),
(1001,'家电维修','水龙头断丝取出器',1,4,0,'2024-09-30',1),
(775,'智能家居','树莓派4b(4g内存)',1,430,0,'2020-09-23',1),
(776,'餐饮小吃','气温 湿度表',1,21,0,'2020-10-11',1),
(777,'餐饮小吃','气温 湿度表',1,21,0,'2020-10-11',1),
(781,'家电维修','3斤松香',1,24,0,'2020-10-18',1),
(779,'餐饮小吃','温度湿度表',1,21,0,'2020-10-15',1),
(782,'家电维修','20卷电工胶布',1,14,0,'2020-10-18',1),
(785,'智能家居','三星256G内存卡-树莓派',1,194,0,'2020-10-30',1),
(786,'车上必备','安全套 ',1,22,0.5,'2020-12-28',1),
(787,'车上必备','安全套 ',1,22,0.5,'2020-12-28',1),
(791,'车上必备','剃须刀',1,10,0.5,'2020-12-28',1),
(792,'车上必备','30A汽车保险丝',2,0.5,0.5,'2020-12-28',1),
(793,'车上必备','30A汽车保险丝',2,0.5,0.5,'2020-12-28',1),
(794,'车上必备','墨镜或眼镜',1,10,0.5,'2020-12-28',1),
(795,'车上必备','墨镜或眼镜',1,10,0.5,'2020-12-28',1),
(991,'智能家居','304不锈钢50*50米桶',1,90,0,'2024-08-14',1),
(797,'水果工具','电动剪刀40cm',1,410,0,'2021-02-23',1),
(799,'水果工具','电动剪刀30cm(两电)',1,310,0,'2021-03-04',1),
(801,'水果工具','4冲程割草机(用于抽水)',1,324,0,'2021-03-06',1),
(803,'家电维修','元件盒子17.3x9.8x2.2',30,2,0.5,'2021-04-18',1),
(804,'车上必备','洗车水管水枪',1,17,0,'2021-04-19',1),
(805,'车上必备','洗车水管水枪',1,17,0,'2021-04-19',1),
(807,'智能家居','7800+8+120g技术电脑',2,1200,0,'2021-05-21',1),
(809,'智能家居','电动牙刷 充电能用一年',1,40,0,'2021-06-18',1),
(811,'智能家居',' 手机遥控电动卷闸门 ',1,180,0,'2021-06-18',1),
(1007,'家电维修','电脑电源转接板',1,12,0,'2024-10-07',1),
(813,'智能家居','7800+8+240g技术电脑 ',1,1400,0,'2021-06-18',1),
(815,'车上必备','三头剃须刀 ',1,19,0,'2021-06-18',1),
(816,'车上必备','汽车座椅套',1,209,0,'2021-06-18',1),
(817,'车上必备','汽车座椅套',1,209,0,'2021-06-18',1),
(818,'家电维修','外热笔式电烙铁',1,20,0,'2021-08-10',1),
(1042,'智能家居','米缸防潮垫50x50x3cm',1,9,0,'2025-09-20',1),
(820,'车上必备','鼻毛剪刀',1,3,0,'2021-08-12',1),
(821,'车上必备','鼻毛剪刀',1,3,0,'2021-08-12',1),
(822,'车上必备','指甲剪',1,2,0,'2021-08-12',1),
(823,'车上必备','指甲剪',1,2,0,'2021-08-12',1),
(825,'车上必备','行车记录仪',1,120,0,'2021-08-12',1),
(827,'家电维修','元件盒子17.3x9.8x2.2',1,32,0.5,'2021-10-11',1),
(829,'家电维修','元件盒子17.3x9.8x2.2',32,2,0.5,'2021-10-11',1),
(833,'家电维修','姚工热风枪850无数显',1,143,0.5,'2022-02-24',1),
(834,'家电维修','热风枪焬膏(安立信)30g',1,13.8,2,'2022-03-11',1),
(875,'家电维修','液晶电视维修吸盘',1,33,0,'2022-08-22',1),
(842,'家电维修','鹿仙子维修卡具',1,15,2,'2022-04-29',1),
(859,'家电维修','12号订书(摇头)',1,12,0.5,'2022-07-30',1),
(846,'智能家居','19寸液晶电脑显示器',1,200,0.5,'2022-05-05',1),
(1027,'智能家居','8750+8g+240g技术电脑',1,350,0,'2025-02-22',1),
(847,'智能家居','19寸液晶电脑显示器2',1,200,0.5,'2022-05-05',1),
(1032,'智能家居','24寸液晶电脑显示器（收购）',1,100,0,'2025-02-24',1),
(854,'家电维修','过塑机 齐心F131B',1,68,2,'2022-05-10',1),
(1028,'智能家居','7800+8g+240g技术电脑',1,330,0,'2025-02-22',1),
(856,'家电维修','卷尺3m',1,3,0,'2022-07-14',1),
(858,'制冷维修','R134A汽车空调低压接头',1,8,2,'2022-07-29',1),
(863,'家电维修','20寸工具箱',1,16,0,'2022-08-08',1),
(864,'家电维修','8寸一字螺丝刀',1,3,1,'2022-08-12',1),
(865,'家电维修','8寸十字螺丝刀',1,3,1,'2022-08-12',1),
(866,'家电维修','6寸薄爪拉马',1,42,0,'2022-08-12',1),
(870,'制冷维修','R410接头高',1,13,0,'2022-08-13',1),
(871,'制冷维修','R410接头低',1,13,0,'2022-08-13',1),
(872,'制冷维修','R22接头低',1,14,0,'2022-08-13',1),
(873,'制冷维修','R22接头高',1,14,0,'2022-08-13',1),
(876,'家电维修','液晶屏维修支架6个',1,37,0,'2022-09-09',1),
(877,'智能家居','消毒碗柜',1,207,0,'2022-09-24',1),
(878,'家电维修','A4切纸机',1,31,1,'2022-11-06',1),
(882,'智能家居','1.6米直径旋转圆桌',1,310,0,'2023-02-01',1),
(953,'智能家居','1.6米餐桌12个凳子',1,152,0,'2023-06-19',1),
(1010,'智能家居','300斤电子秤',2,130,0,'2024-10-13',1),
(886,'智能家居','搬运车60x40cm',1,65.5,0.5,'2023-03-01',1),
(919,'遥控工具车','禧玛诺18齿内变速齿轮',2,10,0,'2023-05-12',1),
(1023,'家电维修','铆钉枪',1,10,0,'2025-02-08',1),
(890,'遥控工具车','36V350W短轴带脚带齿轮',2,120,10,'2023-05-05',1),
(891,'遥控工具车','36VDC继电器6脚 C型',4,3.6,0,'2023-05-05',1),
(892,'遥控工具车','前轴28cm带隔套',2,9.5,0,'2023-05-05',1),
(915,'遥控工具车','沙滩车法兰',2,17,0,'2023-05-12',1),
(894,'遥控工具车','进口6202轴承',10,1,0,'2023-05-05',1),
(944,'遥控工具车','5-6-7-8寸重型万向轮底座',4,5.5,0,'2023-05-30',1),
(897,'遥控工具车','265*185*80mm单片机盒子',1,14,0,'2023-05-05',1),
(898,'遥控工具车','螺丝套8x40mm',20,0.7,0,'2023-05-05',1),
(899,'遥控工具车','中号焊接定位器',2,8,0,'2023-05-05',1),
(1024,'智能家居','鸡鸭拔毛器',1,39,0,'2025-02-10',1),
(901,'遥控工具车','万向轮',2,13,0,'2023-05-05',1),
(902,'遥控工具车','esp32底座',1,9,0,'2023-05-05',1),
(904,'遥控工具车','13X6.5-6轮胎带轮毂',2,75,0,'2023-05-05',1),
(905,'遥控工具车','两个电机底座（帮打孔）',2,13,0,'2023-05-05',1),
(967,'智能家居','360P1WIFI路由器',1,19,0,'2023-09-18',1),
(917,'遥控工具车','36v800W有刷控制器',1,41,6,'2023-05-12',1),
(911,'遥控工具车','油漆',1,20,0,'2023-05-12',1),
(912,'遥控工具车',' 焊条焊料',1,30,0,'2023-05-12',1),
(913,'遥控工具车','PCB板腐浊料',1,5,0,'2023-05-12',1),
(914,'遥控工具车','5-38v可调降压模块',1,2.5,1,'2023-05-12',1),
(918,'遥控工具车','PCB板钻头',1,2.5,0,'2023-05-12',1),
(921,'遥控工具车','6002轴承',4,1.82,0,'2023-05-13',1),
(927,'遥控工具车','30*56*3mm铁片',6,1,0,'2023-05-14',1),
(923,'遥控工具车','2芯纯铜2.5*1000mm',1,29,0,'2023-05-13',1),
(924,'遥控工具车','大型船型开关',1,4,0,'2023-05-14',1),
(930,'遥控工具车','36v12a充电器',1,18,0,'2023-05-18',1),
(926,'遥控工具车','20A紫铜卡扣10个',1,5,0,'2023-05-14',1),
(929,'遥控工具车','嘉立创打样5片PCB',1,54,0,'2023-05-18',1),
(943,'遥控工具车','34*60*3mm圆形铁片10个',1,6,0,'2023-05-30',1),
(932,'遥控工具车','法兰改装转动管',2,42,0,'2023-05-18',1),
(933,'遥控工具车','柳螺母头+10个M5',1,10,0,'2023-05-19',1),
(934,'遥控工具车','拿快递交通费',1,100,0,'2023-05-19',1),
(941,'遥控工具车','请帮电焊50',1,50,0,'2023-05-21',1),
(1011,'智能家居','诗贝康雾化机',1,68,0,'2024-10-13',1),
(947,'遥控工具车','30cm直径26mm+双9齿轮轴',1,28,0,'2023-05-30',1),
(992,'智能家居','18.3cm不锈钢水勺',1,7.6,0,'2024-08-25',1),
(952,'遥控工具车','8路模块配8键遥控器433',1,33,0,'2023-06-14',1),
(951,'遥控工具车','U型卡扣M20',1,6,1,'2023-06-12',1),
(968,'家电维修','电子元件15格盒子',40,2,0,'2023-11-27',1),
(1019,'家电维修','上门维修电动车',1,700,0,'2024-10-26',1),
(959,'制冷维修','空调加氟安全带',1,35,0,'2023-08-08',1),
(962,'家电维修','鹿仙子出锡辅助器',1,30,0,'2023-08-16',1),
(963,'车上必备','手机导航支架',1,3,0,'2023-08-20',1),
(965,'家电维修','晨洲岛12s语音数字万用表',1,44.1,0,'2023-08-24',1),
(966,'家电维修','金属锡线架',1,5,0,'2023-09-07',1),
(969,'智能家居','鑫悦电猫',1,58,0,'2023-12-02',1),
(1025,'智能家居','电动车定时充电器',1,14,0,'2025-02-13',1),
(982,'家电维修','21v电动螺丝刀电池',1,37,0,'2024-07-13',1),
(989,'智能家居','316不锈钢筷子',10,2.5,0,'2024-08-09',1),
(988,'家电维修','90cm磁铁条E36寸',1,14.25,0,'2024-07-31',1),
(993,'水果工具','40个吊针输液管',1,40,0,'2024-08-25',1),
(994,'水果工具','40个输液塑料瓶',1,22,0,'2024-08-25',1),
(995,'家电维修','U型端子紫铜管压线钳',1,31,0,'2024-08-27',1),
(996,'智能家居','代步电动车',1,700,0,'2024-09-01',1),
(1004,'智能家居','树莓派4b(2g内存+tf256g)',1,512,0,'2024-10-06',1),
(999,'智能家居','电动车雨棚',1,30,0,'2024-09-16',1),
(1002,'智能家居','一次性杯子取杯器(60个)',1,6,0,'2024-10-05',1),
(1003,'家电维修','监控警示牌',1,4.2,0,'2024-10-05',1),
(1009,'家电维修','轴承拉玛',1,14,0,'2024-10-11',1),
(1013,'家电维修','电动扳手转电钻螺丝刀',1,7.89,0,'2024-10-17',1),
(1014,'家电维修','万能取螺丝器',1,8,0,'2024-10-21',1),
(1015,'家电维修','电动扳手转角磨机转接头',1,3.8,0,'2024-10-22',1),
(1016,'家电维修','电动扳手20节电池',1,42,0,'2024-10-23',1),
(1017,'家电维修','绿林强磁防滑4件套螺丝头',1,5.6,0,'2024-10-24',1),
(1018,'家电维修','货架1.5x0.4x1.6',2,115,0,'2024-10-26',1),
(1021,'智能家居','弩式弹弓(带十字瞄准镜)',1,87,0,'2024-11-09',1),
(1031,'智能家居','爱普生L3256 打印复印扫描',1,779,0,'2025-02-24',1),
(1033,'家电维修','皮筋绑筋工具',1,7.3,0,'2025-02-24',1),
(1036,'智能家居','6L不锈钢内胆',2,49,0,'2025-04-26',1),
(1035,'智能家居','48v800瓦正弦波逆变器',1,155,0,'2025-04-26',1),
(1037,'必学技能','STA32全案例开发实战书',1,15,0,'2025-05-22',1),
(1038,'必学技能','golang',1,100,0,'2025-05-22',1),
(1039,'必学技能','arduino',1,100,0,'2025-05-22',1),
(1040,'必学技能','开车',1,5000,0,'2025-05-22',1),
(1041,'智能家居','康佳真空封口机',1,70,0,'2025-05-30',1);


