重生之我要做商城 - 萌音商城V1.0上線

萌音系列的第N+1個項目來了呢。這其實又是一個鴿了好幾年的項目了,這回總算能把坑填上了。 先上項目地址: https://MoeKoe.cn 我為什麼一直在做項目? 這個問題就很有意思了,為什麼一直在做各種項目,而且還是不掙錢的東西。接觸過我之前一些項目的小夥伴都知道我開發什麼項目都是本著自己用的原則在創作的,當然這次也不例外。一直我就想在某個平台賣賣我那些留著沒用,丟了捨不得的小玩意,同時分享好玩有趣的產品給大家(未來可能還有我自己的IP產品)。「想把最美好的事和物分享給最美好的你」就算,本著「別人有我也要有」的原則,我也得有。 如果說我只是想賣點小玩意,我為何不直接上淘寶、閒魚這樣的平台呢?退一萬步講,就算不上這些平台,我也可以自己搭建一個現成的商城系統啊,現在市面上成熟好用的系統一抓一大把喔,為何還要自己開發呢? 一句話,因為我喜歡,這是我的愛好,我喜歡創造,喜歡做點有意思的東西和事。我想成為一個厲害而又有趣的人,而不是一個只會活著的普通人,我想認識更多有趣的靈魂。厲害對於我的定義並不是說他技術有多厲害、賺錢有多厲害,而是一個人面對挫折和困苦的時候,依然能笑著面對,依然能保持樂觀、不忘初心,這樣的人,我願稱他為厲害的人。 明明是一個發布新項目的文章,又給我寫成大白話部落格了,哈哈哈。 項目介紹 最近在搞什麼?在搞粉嫩粉嫩的東西,一個二次元少女萌系風格的魔法少女商城。 歡迎來到魔法少女的奇幻世界,開啟探索二次元無限可能的冒險之旅!這是專為二次元愛好者量身打造的線上商城。在這裡,你能找到最閃耀的魔法道具、最萌系的變身服飾,還有豐富多樣的二次元周邊商品。無論你鍾情於可愛的萌物,還是酷炫的收藏品,這裡都能滿足你對二次元的所有熱愛與期待! 點開網址你會發現一個讓你眼前一亮(粉)的感覺,沒錯,這就是我想要的風格,粉嫩粉嫩的,少女心爆棚,卡哇伊的感覺,這樣才能突出我的個性。 技術棧 Vue.js3 Vite Pinia Axios Node.js Express Mysql Nginx 前後端分離 MySQL執行緒池 Vue.js全家桶真是太棒了,省去自己寫原生的煩惱,目前國際化插件(i18n)這個版本還沒有上,由於市面上的UI庫並不直接符合我對這個項目的定位和我的個性,所以並沒有使用現成的界面庫,全靠自己手撸。 介紹: 支援虛擬幣USDT(只需填寫錢包地址,自動監控到帳,無須外置程式,監控系統有新訂單自動啟動,30分鐘無新訂單自動休眠,減少資源消耗) 支援支付寶當面付支付,即時到帳,自動回調 支援使用者註冊、登入、登出、修改密碼、修改頭像、商品評論 支援商品管理、商品分類管理 支援訂單管理、訂單支付、訂單發貨、物流查詢 支援商品訂單數據分析 全站響應式佈局 前後端分離 MySQL執行緒池 系統的基本資訊設定 第一個版本就只增加了基礎和必要的功能,新功能在設計的時候就已經考慮到了,資料庫和程式碼都做了預留(所以當你看到某一個按鈕點擊了沒有反應的時候不要緊張,因為它後面根本就沒有程式碼),會在未來的版本中進行添加。目前商城售賣的是一種實物發貨的形式,未來會加上虛擬商品的售賣,基本就是把萌音發卡的功能都直接給合併進來了。 我對這個項目的命名是mall,而不是shop,所以之後它有機會變成一個商場,而不只是一個商店。 未來: 多商戶模式。直接使用者申請入駐商城成為商家,借助萌音商城進行售賣自己的產品 商品多產品分類。產品更多的規格分類 更多的支付方式。因為目前作者沒有其他的支付權限,僅對接了兩個 支援虛擬商品。算是把發卡的功能給集成進來了 商品海報宣傳圖生成 郵件系統。可有可無的通知功能而已 右下角的多功能選單。下方的笑臉小人,會成為一個智能導航系統 增加商品介面數據顯示。數據一目了然 多語言支援(i18n)。跟隨國際化潮流,走向世界 簡訊系統。跟郵件系統一模一樣 Redis快取。本來是準備在這個版本加上去的,不過數據的控制也還好 暗黑模式。也是跟隨潮流 如何獲取原始碼? 贊助阿珏醬 233RMB+ 即可獲取原始碼。 曾經贊助過阿珏醬的小夥伴(如果之前贊助的總金額不足233需要進行補差價的形式,如果超過了233則只需再贊助1元重新簽訂契約即可直接獲得) 點擊這裡某社群官方交流群去贊助阿珏醬。因為放不了個人QQ連結,所以我放了群連結,加群@群主即可。 為什麼不設商業版? 為什麼不設商業版,而是贊助版,這有什麼區別呢?商業版,那就需要一個授權系統,同時可能還不一定提供原始碼,可能還需要提供技術支援,並且需要更多完善的功能。商業版的錢是給項目本身的,和作者是一種利益關係,一種商業合同的模式,作者需要對其(人)負責。(我特別不喜歡這種感覺,這可能就是我掙不到錢的原因吧) 而贊助版,贊助的是作者本人,是一種個人意願,一種朋友與朋友之間約定的一種契約模式,作者只對項目本身負責。 當然你可能會覺得我在玩文字遊戲,鑽文字的空子。所以嘛,這完全就是贊助行為了。雖然這次的贊助門檻有那麼點商業的氣息,那是因為我和我老婆們要恰飯的嘛 提示 贊助版提供Vue前端原始碼+編譯後的靜態檔案+Node.js後端源檔案。 所有贊助版獲得的都是源檔案,不存在加密或混淆的情況,還請不要洩露,同時也是保障自己的權益。 修改原始碼需要一定基礎程式設計知識,如果不會,請勿修改。 提供一次寶塔面板的部署服務。 網站的介面效果更傾向少女萌系風格,可能並不適用大眾向的產品,還請注意。 因為程式碼具有可複製性,契約一經簽訂,不可撤銷,還請諒解。 這次還是跟以往一樣採用了贊助版的模式獲取原始碼,為什麼這次又開放了原始碼的獲取呢?多少是受之前萌音社群的影響吧,萌音社群是我花了兩個月多精心寫出來的,同時沒有接受贊助獲得原始碼這個方式,純屬自己營運,那些要贊助的都被我勸退了,雖然最後還是收到了一筆贊助。最後呢,感覺對不起萌音社群,被自己給砸手裡了,沒讓更多人知道它的存在。那為什麼不直接開源呢?那樣我反而覺得更對不起這個項目,會讓人覺得這是一個觸手可得的東西,反而不再珍視它。雖然沒有直接開源,但我會把項目相關的架構和設計思路和部分程式碼發出來,給大家參考,並不影響大家學習。 ...

2024年10月2日 · 1 min · MoeJue

什麼是Web3.0,與區塊鏈又有什麼關係?

又是一個莫名其妙的詞語的新起-。- 我大致歸納為以下幾個點 什麼是web3.0 Web 3.0(Web3)是下一代網際網路的發展方向,旨在創建一個更加去中心化、用戶控制和數據保護的網路環境。與之前的Web 1.0(靜態網頁)和Web 2.0(動態、互動式網頁和社交媒體)不同,Web 3.0的核心理念和技術包括以下幾個方面: 去中心化: 區塊鏈技術:Web 3.0的核心是區塊鏈技術,它提供了一個去中心化的帳本,記錄所有的交易和數據變化。這意味著數據不再由單一的中央伺服器控制,而是分佈在多個節點上。 分佈式應用(DApps):這些應用程式運行在區塊鏈網路上,沒有中心化的控制者。DApps的用戶可以直接進行交易和互動,而無需通過中介機構。 用戶控制和數據保護: 用戶主權身份:在Web 3.0中,用戶可以完全控制自己的數位身份和數據。通過加密技術,用戶可以決定誰可以訪問他們的数据以及如何使用這些數據。 數據所有權:用戶的數據儲存在去中心化的網路上,用戶擁有數據的所有權,而不是由大公司集中管理和控制。 智能合約: 自動執行協議:智能合約是在區塊鏈上運行的自動化協議,當滿足特定條件時自動執行。這種技術可以用於各種場景,如金融交易、供應鏈管理和法律合約。 互操作性: 跨平台和跨鏈技術:Web 3.0致力於實現不同區塊鏈和分佈式網路之間的互操作性,使得數據和資產可以在不同平台之間無縫轉移。 去信任化和透明度: 無信任機制:Web 3.0通過區塊鏈技術實現了無信任機制,即參與者無需互相信任或依賴第三方中介,就能進行安全的交易和互動。 透明性:所有交易和數據變更記錄在區塊鏈上,公開透明且不可篡改,提高了信任度和安全性。 Web 3.0的應用場景 去中心化金融(DeFi):通過智能合約和區塊鏈技術,提供無需中介的金融服務,如借貸、交易和投資。 數位身份:用戶可以創建和管理自己的數位身份,控制個人數據的訪問和使用。 供應鏈管理:通過區塊鏈技術,實現供應鏈的透明和可追溯性,防止偽造和欺詐。 內容創作和分發:藝術家、音樂家和作家可以直接與觀眾互動和交易,獲得更公平的收益分配。 那什麼又是區塊鏈呢? 區塊鏈技術是一種分佈式帳本技術(Distributed Ledger Technology, DLT),用於記錄交易和資訊的不可篡改、去中心化的資料庫。區塊鏈技術的核心思想是通過去中心化的方式實現數據的安全、透明和可信。 區塊鏈的基本原理 區塊(Block): 區塊是包含交易記錄的數據包。每個區塊包含多個交易和一個哈希值(用於唯一標識該區塊)。 區塊還包含上一個區塊的哈希值,從而將所有區塊連接成鏈,形成區塊鏈。 鏈(Chain): 區塊通過哈希值相互連接,形成一個鏈式結構。每個區塊包含前一個區塊的哈希值,這使得區塊鏈中的數據難以篡改。 如果試圖更改一個區塊中的數據,將導致該區塊及其後續所有區塊的哈希值發生變化,需要重新計算所有這些區塊的哈希值,這幾乎是不可能的。 去中心化(Decentralization): 區塊鏈網路中的所有節點(電腦)都保存一個完整的區塊鏈副本,這些副本通過共識機制保持一致。 沒有中央機構控制或管理區塊鏈,數據由所有節點共同維護。 共識機制(Consensus Mechanism): 區塊鏈網路使用共識機制來確保所有節點對區塊鏈的狀態達成一致。常見的共識機制包括工作量證明(Proof of Work, PoW)和權益證明(Proof of Stake, PoS)。 工作量證明(PoW):礦工通過解決複雜的數學問題來驗證交易,並將其添加到區塊鏈中。解決問題需要大量計算能力,確保了區塊鏈的安全性。 權益證明(PoS):驗證者根據其持有的加密貨幣數量和其他因素來驗證交易,並獲得相應的獎勵。 加密技術(Cryptography): -區塊鏈使用加密技術確保數據的安全性和隱私性。每個交易都使用公鑰和私鑰進行簽名和驗證,確保只有合法的所有者才能發起交易。 區塊鏈的優點 安全性: 數據分佈在多個節點上,沒有單點故障,攻擊者難以篡改數據。 每個區塊包含上一個區塊的哈希值,篡改一個區塊需要更改整個鏈條,成本極高。 2.透明性: 區塊鏈上的所有交易記錄都是公開可見的,任何人都可以查閱。 交易記錄不可篡改,提高了系統的透明度和信任度。 3.去中心化: 沒有中央控制機構,所有節點平等參與網路的維護和管理,防止了單點控制和權力集中。 4.不可篡改性: 一旦數據被寫入區塊鏈,就很難被篡改,確保了數據的完整性和真實性。 區塊鏈的應用場景 加密貨幣: ...

2024年6月17日 · 1 min · MoeJue

基於Web3.0的區塊鏈圖片上傳

在開始之前,我們先簡單了解一下基本的概念,我大致歸納為以下幾個點 什麼是Web3.0,和區塊鏈又有什麼關係?(上回的文章不就派上用場了) 需求:開發一個基於Python的Web 3.0圖片上傳系統。這個系統將允許用戶上傳圖片,並將圖片儲存在去中心化的網路上,同時記錄交易資訊在區塊鏈上。 本來只是寫著玩的,想過要寫成用戶認證、檔案操作集成全套管理的,讓他「終將成為圖片上傳服務的最終解決方案」。實際下來卻發現不是很實際,就作罷了,奈何我一直以來對圖片這麼執著。 步驟概述 環境設定:使用Python開發,安裝必要的Python函式庫。 IPFS整合:將圖片上傳到IPFS,取得圖片的CID(內容識別碼)。 區塊鏈整合:將IPFS CID記錄在區塊鏈上。 Web介面:使用Flask建立一個Web介面,允許用戶上傳圖片。 詳細步驟 1. 環境設定 安裝所需的Python函式庫: pip install flask web3 ipfshttpclient 2. IPFS整合 IPFS(星際檔案系統)是一種點對點的檔案儲存協定。我們可以使用ipfshttpclient函式庫來與IPFS網路互動。 首先,請確保你已經安裝並運行了IPFS節點。如果還沒有安裝IPFS,可以在IPFS官網找到安裝指南。 以下是上傳圖片到IPFS的程式碼範例: import ipfshttpclient def upload_to_ipfs(file_path): client = ipfshttpclient.connect('/ip4/127.0.0.1/tcp/5001') res = client.add(file_path) return res['Hash'] 3. 區塊鏈整合 使用web3.py函式庫將IPFS CID記錄到區塊鏈上。我們將以太坊(Ethereum)作為範例區塊鏈。 以下是一個簡單的智能合約範例,用於儲存IPFS CID: pragma solidity ^0.8.0; contract IPFSStorage { mapping(address => string[]) public userCIDs; function storeCID(string memory cid) public { userCIDs[msg.sender].push(cid); } function getCIDs() public view returns (string[] memory) { return userCIDs[msg.sender]; } } 編譯並部署該合約後,使用以下Python程式碼與智能合約互動: ...

2024年6月17日 · 2 min · MoeJue

使用ESP8266-NodeMCU開發板顯示一下我的QQ頭像

诶,說好的自己寫esp8266的開發板韌體的我回來了。 20年說好的,今天回來還願了 ESP8266串口WiFi模塊 - WiFi殺手 今天我們把OLED顯示屏也接上,我此次買的是4腳的OLED(128*64),不支持彩色顯示的。 NodeMCU開發板 NodeMCU是一個開源的IoT物聯網硬體開發板,由於它支持WIFI功能且使用方法十分類似Arduino開發板,所以近些年獲得了越來越多來自全世界的創客朋友們的青睞。NodeMCU尺寸與Arduino Nano類似。它並不是Arduino團隊開發的,但是我們也可以使用Arduino IDE 對它進行開發。 作為萬物互聯的IoT基礎,首先物聯網控制板的成本不能過高。高昂的物聯網控制元件不利於項目成本控制也不利於廣大創客愛好者學習和使用它。在這一點上,NodeMCU比樹莓派以及Arduino家族的IoT平台等更具優勢。 細心的朋友可能已經發現了,這會我開發板叫做ESP8266-NodeMCU。然而在其它的網站或資料中,有時是用ESP8266有時是用NodeMCU。那麼ESP8266和NodeMCU之間是什麼關係呢? ESP8266是一塊晶片(被鐵殼子包住的方形的東西),而NodeMCU則是以ESP8266晶片為核心的開發板,如下圖所示。 要想對ESP8266晶片來進行實驗操作是很困難的,因為我們很難將小小一枚晶片上的引腳與我們的電腦連接起來然後再進行上傳程式等操作。於是便誕生了圍繞ESP8266晶片的各種開發板。NodeMCU就是這些開發板中的一員。 NodeMCU開發板上的兩排插針與ESP8266晶片的引腳相連。有了開發板上的兩排插針,我們就可以很輕鬆的使用杜邦線將晶片的引腳接到實驗電路中。NodeMCU開發板上還配有USB接口以及電壓轉換電路。這些為我們提供了很大的便利。我們只要用一根USB數據線就可以輕鬆的實現為ESP8266供電以及上傳程式的操作。當然,NodeMCU開發板上的電路功能還不止這些,我就不再繼續延伸下去了 驅動的安裝 雖然之前已經講過開發板的驅動安裝了,但是不夠詳細。 目前市面上的ESP8266驅動有多種,即使是同一塊NodeMcu的開發板驅動也可能是不一樣的。目前主流的是CH340和CP210X的驅動 驅動的下載請直接去晶片的製造商的官網下載即可 CP210X:https://cn.silabs.com/developers/usb-to-uart-bridge-vcp-drivers CH340C:https://www.wch.cn/downloads/CH341SER_EXE.html 下載適合自己平台的驅動安裝程式 需要看清楚自己的串口晶片型號是否在驅動程式的支持範圍內 如何查看自己的開發板需要什麼驅動 直接看,下圖中豎著的長方形黑條,那個就是USB轉串口晶片。上面會寫明晶片的型號名稱 問你買的商家 顯示屏的焊接 不要焊接錯了,不然會燒壞晶片的 OLED接線: GND - GND VCC - VCC SCL - GPIO5(D1) SDA - GPIO4(D2) 烙鐵加熱中 下面就是焊接好的,注意接線,不一定是按我這個順序的,要看名稱 Arduino IDE的安裝 下載arduino IDE https://www.arduino.cc/en/software 安裝 安裝還要我教? 配置 點擊工具-開發板-開發板管理器,在設置中寫上開發板地址:http://arduino.esp8266.com/stable/package_esp8266com_index.json 之後就會自動下載相應的支援庫文件了,期間需要保證網絡的科學性 選擇開發板 NodeMCU1.0(ESP-12EModule) 選擇端口 在電腦的設備管理器中找到你的開發板的COM口 Arduino代碼 有時候我覺得我逼逼叨叨說一大堆還不如直接上代碼來的直接,我覺得你肯定也是想直接看代碼的而不是聽我說一堆廢話 我也盡可能在代碼中註釋了(編寫arduino代碼請遵循C/C++語言規範) 下列的例子中,連接WiFi使用的是庫,首次連接需要使用手機連接ESP8266發送出來的WiFi先進行配網操作。寫出屏幕使用的是庫,支持中文直接寫出 這是一個簡單的連接WiFi和屏幕顯示圖片的示例 #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <ESP8266WiFi.h> #include <NTPClient.h> #include <WiFiManager.h> #include <U8g2lib.h> #define SDA 4 // SDA引脚,默认gpio4(D2) #define SCL 5 // SCL引脚,默认gpio5(D1) Adafruit_SSD1306 oled(128, 64, &Wire,-1); //OLED 屏幕实例化 WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP,"pool.ntp.org", 8*3600, 60000); U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE); // 选择显示屏幕 // 只执行一次 void setup() { u8g2.begin(); // 初始化 u8g2.enableUTF8Print(); // UTF8允许 u8g2.setFont(u8g2_font_wqy12_t_gb2312b); //字体大小 u8g2_font_wqy15_t_gb2312b // 初始化屏幕 OLED_Init(); OLED_Showchin(1,13,"正在连接WiFi....",0); WiFiManager wifiManager; wifiManager.autoConnect("ESP8266"); OLED_Showchin(1,27,"WiFi连接成功!",0); OLED_Showchin(1,41,"名称: " + WiFi.SSID(),0); OLED_Showchin(1,55,"IP: " + WiFi.localIP().toString(),1); // 获取时间 timeClient.begin(); u8g2.setFont(u8g2_font_wqy15_t_gb2312b); //字体大小 u8g2_font_wqy15_t_gb2312b OLED_Showchin(1,13,"宁小建",0); OLED_Showchin(1,27,"hhhhhhhhhhhh",0); OLED_Showchin(1,55,"大傻逼哈哈哈",1); timeClient.update(); OLED_Showchin(1,20,"当前北京时间: ",0); OLED_Showchin(1,41,timeClient.getFormattedTime(),1); delay(1000); OLED_img(); } // 重复执行程序 void loop() { // 更新时间 // timeClient.update(); // OLED_Showchin(1,27,"当前北京时间: ",0); // OLED_Showchin(1,41,timeClient.getFormattedTime(),0); } // 打印输出到屏幕(支持中文) void OLED_Showchin(uint8_t x, uint8_t y, String string, uint8_t boot) { u8g2.setCursor(x, y); //设置显示坐标 u8g2.print(string); // 指定缓存区需要打印的字符串 u8g2.sendBuffer(); // 将定位信息发送到缓冲区 if(boot == 1){ delay(1000); u8g2.clearBuffer(); // 清除缓存,其实初始化里有清除,循环时一定要加上 } } // 屏幕初始化 void OLED_Init() { oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); //"SSD1306_SWITCHCAPVCC"表示显示器为OLED ,"0x3C"为OLED屏幕默认通信地址 oled.setTextColor(WHITE);//开像素点发光 oled.clearDisplay();//清屏 } // 输出屏幕 void OLED_ShowString(uint8_t x, uint8_t y, uint8_t font_size, String string) { oled.setTextSize(font_size); //设置字体尺寸 (>=1) oled.setCursor(x, y); //设置显示坐标 oled.println(string); //显示内容 oled.display(); //开启显示 } // 绘画 void OLED_img() { // 图片数据 const unsigned char gImage_1[518] = { 0X00,0X01,0X40,0X00,0X40,0X00, 0X00,0X40,0X00,0X00,0X00,0X3E,0XF0,0X00,0X00,0X80,0X00,0X00,0X00,0X1F,0XE0,0X00, 0X00,0X00,0X00,0X00,0X00,0X06,0XB0,0X00,0X01,0X00,0X00,0X00,0X00,0X03,0XF8,0X00, 0X00,0X00,0X00,0X00,0X00,0X03,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XDC,0X00, 0X04,0X00,0X00,0X00,0X00,0X01,0XC0,0X00,0X0E,0X00,0X00,0X00,0X00,0X00,0X80,0X00, 0X06,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X00,0X00,0X00,0X10,0X00,0X00,0X00, 0X08,0X00,0X00,0X00,0X0E,0X00,0X00,0X00,0X08,0X00,0X00,0X00,0X8F,0X00,0X00,0X00, 0X00,0X00,0X02,0X02,0X47,0X00,0X00,0X00,0X00,0X00,0X01,0X10,0X63,0X80,0X00,0X00, 0X00,0X00,0X01,0XC9,0X73,0XC0,0X00,0X00,0X00,0X00,0X00,0XE4,0X79,0XE0,0X00,0X00, 0X00,0X02,0X00,0XFA,0XF9,0XE0,0X00,0X00,0X10,0X02,0X00,0X7D,0X8C,0XF0,0X00,0X00, 0X10,0X03,0X01,0X7E,0X90,0XF1,0X80,0X00,0X10,0X01,0X20,0XFD,0X1C,0X7B,0XE0,0X00, 0X00,0X01,0XA0,0X7D,0X03,0X7B,0X20,0X00,0X10,0X01,0XD8,0XFF,0X8B,0X7E,0X30,0X00, 0X00,0X01,0XFC,0X7F,0X83,0XB6,0X10,0X00,0X00,0X00,0XF7,0XFF,0XC7,0XBE,0X10,0X00, 0X00,0X01,0X8F,0XFF,0XE3,0XF6,0X10,0X00,0X01,0X01,0X4F,0XFF,0XFF,0XFF,0X10,0X00, 0X00,0X01,0XCF,0XFF,0XFF,0XDF,0X10,0X00,0X00,0X01,0XC3,0XFF,0XFF,0XDF,0X70,0X00, 0X01,0X03,0XE3,0XFF,0XFF,0XDF,0XE0,0X00,0X04,0X01,0XE7,0XFF,0XFF,0XDF,0XE4,0X00, 0X07,0X00,0XFB,0XFF,0XFF,0XDF,0XC0,0X00,0X07,0X00,0XFB,0XFF,0XFF,0XFE,0X00,0X00, 0X13,0X00,0X7F,0XFF,0XFF,0XFC,0X00,0X00,0X01,0X20,0X3F,0XFF,0XFF,0XFC,0X00,0X00, 0X00,0X00,0X3F,0XFF,0XFF,0XF8,0X00,0X0B,0X00,0X00,0X1F,0XFE,0X0F,0XF8,0X00,0X1F, 0X00,0X00,0X1F,0XF8,0X6F,0XF0,0X00,0XFF,0X00,0X00,0X1F,0XE1,0XFF,0XF0,0X05,0XFF, 0X00,0X00,0X0F,0XF3,0XFF,0XE0,0X03,0XFF,0X00,0X40,0X0F,0XF7,0XFF,0XC0,0X07,0XFF, 0X00,0X00,0X07,0XFF,0XFF,0X80,0X07,0XFF,0X08,0X00,0X07,0XFF,0XFF,0X00,0X0F,0XFF, 0X00,0X00,0X23,0XFF,0XFE,0X00,0X0F,0XFF,0X00,0X08,0X60,0XFF,0XFE,0X00,0X0F,0XFF, 0X00,0X40,0X20,0X3F,0XFE,0X00,0X1F,0XFF,0X00,0X00,0X10,0X0B,0XFF,0X80,0X1F,0XFF, 0X00,0X00,0X40,0X00,0X3F,0X00,0X1F,0XFF,0X00,0X00,0X10,0X00,0X3F,0X00,0X1F,0XFF, 0X20,0X00,0X02,0X00,0X3F,0X00,0X3F,0XFF,0X00,0X00,0X00,0X00,0X7F,0X80,0X3F,0XFF, 0X00,0X00,0X00,0X10,0X7F,0X80,0X7F,0XFF,0X00,0X00,0X00,0X80,0X7F,0X80,0X7F,0XFF, 0X10,0X00,0X00,0X00,0X7F,0X80,0XFF,0XFF,0X30,0X00,0X00,0X00,0X7F,0X80,0XFF,0XFF, 0X10,0X10,0X00,0X00,0X7F,0XC1,0XFF,0XFF,0X00,0X00,0X00,0X00,0X7F,0XF3,0XFF,0XFF, 0X00,0X00,0X01,0X00,0X3F,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X04,0X3F,0XFF,0XFF,0XFF, 0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0X00,0X00,0X10,0X80,0X1F,0XFF,0XFF,0XFF, 0X01,0X00,0X00,0X05,0X1F,0XFF,0XFF,0XFB,0X00,0X00,0X00,0X00,0X1F,0XF7,0XFF,0XFC, 0X00,0X00,0X00,0X00,0X1F,0XFB,0XFF,0XFF,0X00,0X00,0X40,0X00,0X19,0XFF,0XFF,0XFF, }; oled.clearDisplay(); oled.drawBitmap(3, 1, gImage_1, 64, 64, WHITE); oled.display(); } ...

2024年6月16日 · 4 min · MoeJue

很抱歉,我回來了!

那是一個月黑風高、風雨交加、伸手不見五指的黑夜,冥冥之中好似要發生點什麼 因為出了個「意外」再加上疫情原因,我一度變成了「植物人」,差點去了二次元,好在「搶救」回來了。這幾年找我的消息我也收不到了,感謝那些還在和關心我的人,謝謝。 錯的並不是我,而是這個冥冥之中註定的世界 這些年找我的人和事,我也全部不知道,QQ、微信一些消息太久也都收不到了 看到我多年未亮起的頭像重新亮了起來,不少朋友都來問我怎麼回事。 很感謝那些素未謀面的網友,或許叫朋友更親切些,你們還一直惦記著我,讓我很是感動。 一找就是找了我三年 滿世界的找我 感動的不要不要的 下面才是正文 關於部落格 部落格首次建成時間是2016-06-09,如今已經成立了快8年之久了,在各種災難中也頑強地生存了下來 期間也認識了好多好多的小夥伴,一起討論,一起進步,一起成長。所以我並不想讓部落格就此消失 部落格數據原本有自動備份到七牛雲的,但直到現在才知道,備份不知道什麼原因,19年10月份左右就停掉了 都說網際網路是有記憶的,本著「頭可斷血可流,數據不能丟」的精神,我在茫茫網路中尋找數日,終究還是讓我找到了部落格的網站存檔。 可以點擊這裡去看我的部落格歷史版本archive (國外著名的網站檔案館項目) 於是就寫了個Python腳本把文章和評論數據給爬下來了。 爬完後我發現有人已經給我備份了(我部落格之前是別人贊助的三年) 部落格搬遷 部落格搬遷到部落格園,其實也是不得已而為之 部落格的原域名(52ecy.cn,moeins.cn,moeins.com)在到期後被人搶註,溝通無果後,一時半會是拿不回來的了 迫於無奈吧,只能暫且先將部落格搬遷到部落格園來(之後是否再自建的話再做打算吧)。另一方面也可能是現在沒有太多閒時間來折騰自己的系統,放在部落格園反倒是更加省心省力。但是評論就沒那麼方便了,需要登入才可以發表評論,當然有啥問題也可以直接在群裡@我 其實早在18年底的時候,我就已經有想換主題的想法了->這下真鴿了 (我可真能拖,太佩服我自己了) 無奈之前的emlog系統沒有合適現成的,自己又懶得移植,便一直一拖再拖。 原來那個主題我一直就想換掉了,因為不太好看,沒有個性,就是規規矩矩的,並不符合我的個性和風格 但是呢,我審美雖然特別棒,但你要讓我自己寫一套符合我審美的主題出來那就是有點困難了 後來突然看到部落格園用戶不忘編碼的部落格,心想部落格園還支持這樣自己美化。 一句「我又不想他部落格從此也失聯,無法訪問打開」 後便決定暫時先搬遷到部落格園再說吧。 一直就想換這種二次元風格的主題了 目前此部落格美化風格樣式基於櫻花莊的白貓的WordPress主題Sakura,不忘編碼移植,但BUG和細節問題較多,我又花了兩天優化了一下,但也好多頁面沒優化,之後再慢慢來吧 (能明天再做的事為什麼不留給明天的我去做呢) 由於之前的emlog部落格使用的是HTML的TinyMCE編輯器,而且還是很老的版本,所以生成的文章的HTML程式碼也是相當的混亂,所以搬遷至部落格園的markdown格式的時候出現了很多的樣式不相容問題,我也已經盡可能地修復了一些,但也沒法保證所有文章都能正常地顯示,看到的話再慢慢修吧 部落格園不支持自建部落格系統的一鍵搬遷功能,所以文章的發布時間和評論的資訊就不能一同搬遷了,但我又想保留原汁原味,所以我就一併寫到文章當中了,私密評論也還是隱藏了。 (自建部落格系統的問題也和部落格園團隊溝通了,說後期開發會加上,也不為難他們了,他們也入不敷出了,文章的發布使用了Cnblog的VScode插件) 友情連結我也單獨搞了一個頁面給搬遷過去了,但也很多友鏈的網站也已經無法訪問了,有的也已經下掉友鏈了。 現在的我也不是獨立域名了,都不好意思再去申請友鏈了….. 之前部落格的所有圖片都是存在新浪的,一直擔心哪天又給丟了,所以平常都是一份七牛雲,一份新浪,現在也全部給搬遷到部落格園來了 我為什麼要寫部落格? 有人會覺得這些有這麼重要嗎? 有時候我也是想說點什麼,想寫點什麼,但又沒人說,沒地方寫,就是需要那麼一個地方 我做部落格也不是為了什麼流量啊,賺錢之類的,就想搞一片自己的小天地,在自己的小圈子裡瞎混噠 也許也正因這一份熱愛,所以我才能慢慢堅持下來,奈何事與願違,出了一點意外 以前好多部落格圈的朋友都要麼不見了,要麼都不更新了,真的好可惜啊,我都還沒來得及認識他們 (尤其是月宅那貨) @寒穹 那貨還說我:「阿珏,那麼久了怎麼還那麼二次元」。 我想這麼多年來,一直沒變的就是我了吧。 很高興,也很感謝還有那麼多人記得我,對我那麼好。 好像不該發這麼多圖片的 紀念逝去的部落格,永遠活在我的127裡 Python程式碼 搬遷的Python的程式碼,雖然沒啥用,但算是記錄一下,供有需要的人學習學習 點擊查看程式碼 import os import re import time import requests from bs4 import BeautifulSoup from urllib.parse import urlparse, parse_qs # 指定文件路径 file_path = "C:\\Users\\Administrator\\Desktop\\blog\\content.txt" save_folder = "C:\\Users\\Administrator\\Desktop\\blog\\content\\" def save_to_file(data, file_name): try: file_path = os.path.join(save_folder, file_name + ".txt") with open(file_path, 'a', encoding='utf-8') as file: file.write(data) print("数据已成功保存到文件:", file_path) except Exception as e: print("保存文件时出错:", e) def remove_html_tags(text): soup = BeautifulSoup(text, 'html.parser') return soup.get_text() def comment(html_content): comment_matches = re.findall(r'<div class="comment (.*?)" id="comment-\d+">[\s\S]*?<img .*?inal=".*?202.*?/([^"]+)"/>[\s\S]*?<div ' + 'class="comment-content">(.*?)</div>[\s\S]*?itle=".*?">(.*?)</span>[\s\S]*?<span class="comment-time">(.*?)</span>', html_content, re.DOTALL) article_comments = '' if comment_matches: i = 0 for comment_match in comment_matches: if 'comment-children' in comment_match[0]: i += 1 is_reply_comment = '>' * i else: is_reply_comment = '>' i = 1 #头像 大小控制在40 # 兼容gravatar头像 https://secure.gravatar.com/avatar/ if 'gravatar.com' in comment_match[1]: avatar_url = '![](' + str(re.sub(r'(\?|&)s=\d+', '\\1s=40', str(comment_match[1]))) + ') ' else: parsed_url = urlparse(comment_match[1]) query_params = parse_qs(parsed_url.query) dst_uin = query_params.get('dst_uin', ['1638211921']) avatar_url = '![]('+'https://q1.qlogo.cn/g?b=qq&nk='+str(dst_uin[0])+'&s=40'+') ' comment_content = comment_match[2].strip() nickname = comment_match[3].strip() comment_time = comment_match[4].strip() link_url = re.search(r'030.*?/(.*?)" .*? rel', nickname) # 构造评论的markdown格式 comment_content = is_reply_comment + comment_content.replace('\n', '>') comment_content = comment_content.replace('##这篇评论是私密评论##', '[#这篇评论是私密评论#]') # 替换表情图片 soup = BeautifulSoup(comment_content, 'html.parser') for img in soup.find_all('img'): title_text = img.get('title', '') img.replace_with('[#'+title_text+']') comment_content = soup.get_text() # 保存评论用户的URL地址 if link_url: nickname = '['+remove_html_tags(nickname)+']' link_url = '(' + link_url[1] + ') ' else: link_url = '' nickname = remove_html_tags(nickname) + ' ' if i == 1: article_comments += '\n' article_comments += is_reply_comment + avatar_url + nickname + link_url + comment_time + '\n' + comment_content + '\n' return article_comments else: return '' def process_article(url): print("当前执行===="+url) response = requests.get(url) if response.status_code == 200: html_content = response.text soup = BeautifulSoup(html_content, 'html.parser') article_title = soup.find('h1', class_='article-title') article_mate = soup.find('div', class_='article-meta') article_article = soup.find('article', class_='article-content') soup_content = BeautifulSoup(article_article.prettify(), 'html.parser') img_tags = soup_content.find_all('img') pattern = r"https://web.*?_/" for img_tag in img_tags: if 'data-original' in img_tag.attrs: original_url = img_tag['data-original'] else: original_url = img_tag['src'] cleaned_url = re.sub(pattern, '', original_url) new_url = 'https://image.baidu.com/search/down?url=' + cleaned_url img_tag['src'] = new_url del img_tag['data-original'] article_comment = soup.find('div', class_='article_comment_list') data = "###### `当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`\n\n" + '###' + article_title.text.strip()+'\n\n'+article_mate.text.strip().replace('\n', '').replace('\r', '').replace('\t', '')+'\n' + soup_content.prettify().replace('<article class="article-content">', '').replace('</article>', '') save_to_file(data + '\n网友评论:\n\n', article_title.text.strip()) data = comment(html_content) if not data: return save_to_file(data, article_title.text.strip()) if article_comment: comment_links = re.findall(r'<a\s+href="(.*?)nts"', str(article_comment)) if comment_links: print('有分页评论数据') for link in comment_links: url = link +"nts" print(url) response = requests.get(url) if response.status_code == 200: html_content = response.text data = comment(html_content) if not data: return save_to_file(data, article_title.text.strip()) print("写分页评论数据中") else: print("Failed to retrieve the webpage.") def main(): with open(file_path, 'r', encoding='utf-8') as file: for line in file: segments = line.strip().split("----") if len(segments) > 0: url = segments[0] process_article(url) else: print("No URL found in the line.") print('开启下一篇文章') time.sleep(4) if __name__ == "__main__": main()

2024年6月16日 · 3 min · MoeJue

2020年遲到的年終總結

我一直在想究竟要不要寫年終總結,又該寫點什麼好呢 糾結了一個多月,這件事一直放在心裡,直到前幾天和楊小姐傑打遊戲時,問我:「年終總結寫了嗎?」這才讓我決定一定要寫。 去年,2020年,因為疫情的原因,讓我感覺這一年過得非常快,什麼事情都還沒有開始做就結束了 這也使得我感覺沒啥好總結的,不知道從哪開始總結 這是18年的年終總結 –> 我以為我會暴富,但是我沒有。 今年就沒有往年那麼精彩的文案了。 在 文章歸檔 這裡還是可以很清楚地看到所有文章和發布的時間,2020年我變成了月更部落格,但每天還是會來看看這點不變。 部落格 感覺這一年部落格活生生地變成了開箱部落格,我變成了開箱UP主,但實際上開箱最早能追溯到2018年,那時就已經有了。意思就是我開了兩年箱子 雖然也寫過那麼幾篇其他類型的文章,但給我的感覺還是有點空虛,“new"了一年,還是沒能給自己"new"出一個對象 生活 因為疫情,工作擱置,又在家多待了幾個月,這也可能是我感覺空虛的原因之一吧。 下半年我又因拒絕無意義的加班,拍拍屁股離開了公司。 租了兩個月房,吃了兩個月外賣,學了兩個月車,駕照到手,離開了廣東。(這段話要帶著滄桑的語氣去讀) 2021 上幾個月去出入境大廳辦護照,又因為疫情的原因,沒能給我辦下來。 2021年希望疫情能有所緩解,這樣我就能趁機去辦個護照了。 我想就這一兩年出趟國 - -> 日本或者更多國家。有人問過我為什麼,我的回答是:「乘上與平常相反的電車,去看看那未曾見過的風景」 買個GoPro,記錄生活的點點滴滴,為旅行增添回放 2020年有點不太容易,有點空虛,沒有做太多事,但新的一年我還是會朝著自己的夢想前行,那些還沒開始做的事情,接下來的日子去一點一點地把它完成了吧。

2021年1月26日 · 1 min · MoeJue

聖誕快樂 禮物

Merry Christmas 聖誕快樂!! 我的聖誕禮物,yes~ 眨眼間已經到了2020年底了,今年硬體廠商接連發力,前有英特爾打性價比戰爭發佈了加量不加價的英特爾十代桌面級處理器,後有英偉達RTX3070暴打自家上代消費級旗艦顯示卡,可謂是好不熱鬧,而要完美發揮這些效能硬體的潛力,一塊優秀的主機板自然也不可或缺華碩TUF GAMING電競特工主機板以紮實的用料,時尚的設計以及親民的價格廣受歡迎,而今年剛發佈的定位中端市場的重砲手系列,擁有更強悍供電配置、2.5G有線網卡、加強裝甲等從旗艦級產品下放的新特性,定價卻和其他中端產品無異,該系列自然也廣受DIY愛好者們的歡迎 貼紙…… 重砲手系列繼承了TUF GAMING系列原本的硬漢風格,依舊採用了黑綠色為主體,再點綴著黃顏色的LOGO,這是TUF GAMING特種部隊一貫的風格,辨識度很高。 主機板外觀透露著十足的電競氣息,大大的TUF GAMING的logo印在碩大的散熱裝甲上 使用了全新的LAG1200介面,不相容十代以前的處理器,不過好像是會支援後面11代的。 記憶體插槽方面,華碩TUF GAMING B460M-PRO重砲手主機板提供4根DDR4記憶體插槽,頻率可達2933MHz,並且搭載了華碩獨家OptiMem記憶體優化技術,可以顯著提升記憶體超頻空間和穩定性。最高支援128GB記憶體。華碩並對這款主機板1 3和2 4位置做了不同的顏色標註,提示使用者使用兩根記憶體時記憶體的插法 在MATX版型上,華碩 TUF GAMING B460M-PRO重砲手主機板對熱量發熱比較嚴重的供電、晶片組用了大量的磨砂表面處理的散熱裝甲。這樣的設計不僅僅能夠快速帶走主機板的熱量,也給主機板帶來非常強烈的精緻感和設計感。 顯示卡插槽方面,這款主機板提供了兩根PCIe長插槽。其中一根裝備了金屬保護裝甲,可以防止顯示卡插拔造成意外損壞, 並且這根插槽為X16模式,只會使用一個獨顯的使用者建議將顯示卡插在這根插槽上。 再來看看主機板的I/O介面,華碩 TUF GAMING B460M-PRO重砲手主機板的I/O擋板是集成在主機板上的,安裝時減少了背板的安裝步驟,同時主機板的一體性更強,一體I/O擋板的設計在以往的華碩高端主機板上才能見到,如今也是下放到了B460晶片組的主機板上,避免裝機時漏掉,還可以防塵防靜電。 這款主機板提供了兩個USB 2.0介面,4個USB 3.1Gen1介面,一個HDMI介面和一個DP介面,此外還有一個2.5Gb網路孔和5個常規的音訊介面 。 SATA介面準備了6個,三個一組,並且第二組插槽是橫向排的,這樣可以避免大顯示卡太長擋住介面 最後在音訊方面,這款主機板使用了Realtek S1200A高品質音訊晶片,具備108dB訊噪比輸出和 103dB 訊噪比,是目前頂級的音效卡晶片之一。 盒背面參數預覽 CPU簡單看一眼,因為沒啥太多可以說的,我放到了最後。i5-10600kf中國盒,全國聯保三年,由於帶了"K"後綴,從側邊也可以看出,這款CPU是不帶散熱器的,需要自己另外購買。

2020年12月25日 · 1 min · MoeJue

論網速快慢的區別

論網速快慢的區別 隨著網路的普及,使用者對響應速度快慢越來越重視了,網站越快,使用者的黏性和轉化率也會越高。 簡單來說,就是要提高速度!影響網站速度的因素有很多,比如…………………. 一本正經可不是我的風格,下面請看我的表演 想法起源: 一開始的想法是使用純CSS進行實現,把底圖base64編碼後直接放在background-image上,就可以達到背景圖片與網頁一同載入出來的效果 第一步: 首先將提前準備好的素材圖片進行處理,拔下泳衣和泳裙 第二步: 新建個HTML檔案 第三步: 完成。。 然後就發現個問題,由於我的底圖檔案大小達到了12兆,編碼後的字串過大,導致網頁載入又卡又慢,實在無使用者體驗 而且這種方式載入的底圖會突然的顯示出來,過於唐突,效果不好 後改用: CSS+JavaScript進行實現,由background-image直接載入背景圖片,能達到逐漸顯示的效果,待底圖載入完畢後再由JS動態插入配圖 window.onload = function(){ var img=new Image(); img.src=‘裸体.jpg’; if(img.width==0){ alert(‘圖片載入失敗’) }else{ document.getElementById(“泳衣”).style.backgroundImage=“url(泳衣.png)”; document.getElementById(“泳裙”).style.backgroundImage=“url(泳裙.png)”; } } 不禁感慨一句,什麼破網路,慢得連人物圖片的衣服都載入不出來

2020年11月7日 · 1 min · MoeJue

今天你過節了嗎?

一生二、二生四、程式碼生萬物……程式設計師們創造的世界,為人類提供了更多可能 又到了一年一度的1020程式設計師節,每年這個時候我不管多忙,都會準時地來寫一篇。 今年沒寫什麼開源專案,但也寫了不少程式碼,連起來可繞地球兩圈。 2020-1024=996?? 去年鬧得沸沸揚揚的996,這難道是冥冥之中註定的了 今年好像沒什麼好的文案跟大家分享。。 那就讓我們面向ACG程式設計吧~~! 讓我們看看往期的吧 2019年 1024程式設計師節,寫最棒的coding,做最靚的仔 2018年 1024程式設計師節快樂 2017年 1024程式設計師節快樂 2016年 程式設計師的節日1024!今天你過節了嗎~ 這也意味著,我的部落格已經陪我度過五年了,感謝這一路以來的你和我!

2020年10月24日 · 1 min · MoeJue

真 · 逃避現實

一直以來我都有一個想買VR設備的願望,今天終於圓了 在 @本群吉祥物 的推薦下,買了Oculus品牌的VR一體機 開卡省錢卡 -> 領優惠券 -> 儲值 -> 下單 -> 一氣呵成 (心在淌血) 由於Oculus品牌沒有進入中國市場等原因,所以我這也捆綁買了一個千兆的路由器 到貨就是兩個大箱子 一個是裝著VR本體的,商家額外贈送了一個USB充電電池,SMARTOOOLS西班牙品牌,貌似還行 另外一個箱子則是我的千兆路由器和好幾百一根的USB3.0 link線 長得跟個花生殼似的路由器 一堆看不懂的說明書,還是外置風扇(#哭笑)。由於這個路由器品牌也是國外的,三線插頭是歐洲標準,國內的三孔插座還得接個轉換器 外包裝 - 反面,下面放著一些熱門遊戲推薦 正面,簡約炫酷 包裝裡面的盒子,印著Oculus的logo 掀起蓋子,哇塞 Oculus Quest 六自由度VR,是目前市面上最強VR一體機 官方有附帶一對手柄電池,和設備基本操作說明書,和一本厚厚的詳細到看不懂的說明書 擺拍,主機+左右手柄 接下來就是開機上手,下載我心心念念已久的Beat Saber、VRChat……開啟我的逃避現實之旅…….. 後話: 一般開箱我都不做評測,因為專業的評測需要專業的學術知識去支撐,還需要會說那些厲害的術語。但是我不會,我也不想誤導看我文章的人,一本正經的胡說八道。我僅僅只是說我想說的話 讓我在VRChat裡等你們,之後有空的話我也會拍我遊玩的影片到小破站 如果有想進一步了解Oculus Quest的,我這邊推薦一個專業的評測影片。 Oculus Quest VR 讓我們離「刀劍神域」「頭號玩家」還有多遠? https://www.youtube.com/watch?v=2z-QyogFp9o (如果能打開的話)

2020年9月18日 · 1 min · MoeJue