復盤:微信小程序+Spring Boot從0到1)
每年六月底的校園最熱鬧的地方除了食堂和操場還有每棟宿舍樓下的垃圾桶。畢業(yè)生們把教材、臺燈、電風扇、收納箱一瓶一瓶往外搬宿舍樓群里此起彼伏地發(fā)著“10塊錢帶走不還價”的消息。我在那個場景里站了很久忽然意識到一個很多人忽略的事實這些突如其來的“垃圾”其實是剛需——只不過它們出現(xiàn)在了錯誤的時間、錯誤的地點。它就是“squirrel松鼠”校園二手交易平臺的起點。我們從零開始做這個項目花了三個月完成小程序前后端開發(fā)并上線又花了兩個月冷啟動、迭代、和騙子斗智斗勇。作為一款典型的校園垂直交易產(chǎn)品它不見得有多高大上但完整走了一遍從需求調(diào)研到產(chǎn)品落地、從開發(fā)到運營的全過程。這篇文章想把這段經(jīng)歷掰開揉碎了講清楚為什么做、怎么設計、技術選型怎么定、風控怎么做、冷啟動怎么破以及哪些坑是值得每一個想做校園項目的人提前避開的。1. Squirrel的起點從一次宿舍樓下的“畢業(yè)甩賣”說起1.1 調(diào)研發(fā)現(xiàn)的真實校園二手交易鏈條當時我們團隊里三個人都在一個學生社區(qū)組織里接觸大量校內(nèi)信息后發(fā)現(xiàn)二手交易的需求被嚴重低估了。為了不做“拍腦袋產(chǎn)品”我們用一周時間做了三輪調(diào)研發(fā)了 200 份問卷、訪談了 32 個在校生、還混進了 7 個宿舍樓的二手交易群觀察真實交易行為。問卷結果里最有價值的不是“你是否愿意買二手”而是“你上次處理閑置的方式”。接近 60% 的人選擇“直接扔了或者送給室友”只有 11% 的人會專門掛到平臺上賣。這說明問題不在“不想賣”而在“賣東西的流程成本太高”——拍圖、編輯描述、定價、反復和買家聊天、約時間、防鴿子這一整套動作在閑魚上要做二十分鐘在宿舍樓下群聊里倒是快但信息瞬間就被刷沒了。線下的真實鏈條更原始畢業(yè)生先在樓棟群發(fā)照片約好時間放到一樓大廳買家自己來拿錢貨都在現(xiàn)場。這個流程效率極高但有幾個致命缺陷一是消息有效生命周期只有半小時錯過就沒了二是完全靠群聊能不能被看到跟緣分掛鉤三是沒有任何信息沉淀出了糾紛找人都找不到。我們意識到校園二手市場缺的不是交易而是一個“把群聊沉淀成結構化信息同時保留線下當面交易優(yōu)勢”的工具。1.2 為什么QQ群和閑魚都做不了校園生意調(diào)研完我們聊了很久結論是QQ群、微信群做不適合閑魚也不適合但原因完全不同。QQ群和微信群的本質是“時間線”它的排序邏輯是“最后發(fā)言靠前”。一件 10 塊錢的小風扇可能在發(fā)出消息后的 20 分鐘里被 30 條新消息淹沒。買家如果想找便宜教材只能一屏一屏往上翻翻到腰酸。更麻煩的是群里沒有結構化信息搜索基本等于沒有。賣家要重復回答“還在嗎”“幾成新”“能便宜嗎”效率無限趨近于零。閑魚的問題反而不在功能而在信任半徑。閑魚面向全網(wǎng)雖說有芝麻信用但校園場景里“本校學長學姐”這個身份本身就是最強信任背書。一個新生在閑魚買二手教材擔心的是遇到職業(yè)賣家在校園群里買哪怕對方是陌生人至少確認過“是本校的人”這種信任感是平臺用再復雜的信用體系也很難復刻的。所以我們的產(chǎn)品定義從一開始就很明確做“地點可信、身份真實、當面交易”的校園內(nèi)二手交易工具不做跨校、不做快遞、不做中間擔保。2. 產(chǎn)品定義到底做一個“交易平臺”還是一個“信息廣場”2.1 “松鼠”名字的由來和品牌隱喻名字是團隊里一個女生起的。她說松鼠的習性就是“把暫時用不到的東西囤起來等真正需要的時候再拿出來換”。這和二手交易的邏輯很像座位上的閑置不是廢品只是一個暫時沒找到主人的資源。品牌調(diào)性也因此確定下來不是冷冰冰的“校園閑置處理平臺”而是一個溫暖的“校內(nèi)好物漂流社區(qū)”。所以 UI 主色我們選了偏橙黃的松鼠毛色而不是常見的藍色綠色圖標是一只抱著松果的毛茸茸尾巴松果上寫了小小的“s”代表 goods 也代表 student。這些聽起來很虛但在冷啟動階段幫了大忙。掃樓時我們讓學生掃碼體驗小程序很多人就是因為“這形象挺可愛的”才愿意點進來。對于一個小團隊來說一個容易記憶、有情緒價值的品牌符號比砸錢買流量劃算得多。2.2 MVP功能清單砍掉支付保住發(fā)品和溝通很多學生團隊做這種事一上來就想做“學校版閑魚”在線支付、擔保交易、物流對接、自動評價全搬上去。我們沒這么做。MVP 階段只保留了四個核心能力發(fā)布閑置、瀏覽搜索、聯(lián)系微信、線下交易后互相評價??车粼诰€支付是當時最重要的決定。我們不是沒能力接微信支付而是深入思考后發(fā)現(xiàn)校園二手交易單均價格太低中位數(shù) 20 元用戶對“等平臺確認收貨”的耐心幾乎為零。線下一手交錢一手交貨既符合習慣又能幫我們省下平臺資金池的合規(guī)成本。事實證明這個決策是對的——上線后自然成交率遠高于預期幾乎沒有用戶問“為什么不能直接在小程序里付款”。評論系統(tǒng)我們也做了但做得很輕交易完成后一方發(fā)起評價另一方不回復也行只記錄“靠譜/有耐心/描述相符”幾個標簽不搞星級評分。原因很簡單校園場景里評價的目的不是“幫別人選品”而是“給未來可能的學弟學妹留一個參考”壓力太大會讓人連評價都不愿意寫。2.3 核心流程設計發(fā)品、瀏覽、詢價、線下交易最終的用戶路徑是這樣的用戶用微信授權登錄后先做學籍認證填學號拍學生證卡片認證通過后才能發(fā)品和留言。發(fā)品時需要選擇“商品分類”“幾成新”“期望價格”“原始價格”上傳最多九張圖片盡量讓操作在兩分鐘內(nèi)完成。買家搜索或刷信息流看到商品后可以點“聯(lián)系賣家”系統(tǒng)會生成一個臨時聊天頁面雙方確認后互相加微信約好在哪棟宿舍樓下見面。這里有個細節(jié)我們后來才發(fā)現(xiàn)特別關鍵所有商品默認展示“最近活躍時間”。團隊一開始不理解說這不是多余嗎運營一兩周后才發(fā)現(xiàn)校園二手物品時效性極強一個用戶看到喜歡的東西如果不敢確定賣家還在不在大概率就直接關掉了。有了“13分鐘前在線”這個字段咨詢率和成交率明顯上升。3. 技術選型與系統(tǒng)設計一個學生團隊三個月能做到什么程度3.1 技術棧選擇小程序的“夠用哲學”先說結論前端選了微信小程序原生開發(fā)后端選了 Spring Boot MyBatis-Plus MySQL Redis圖片存對象存儲OSS內(nèi)容安全用微信官方的內(nèi)容安全接口。選擇小程序而不是 App理由很樸素校園場景低頻但剛需學生不可能為了賣個二手專門裝一個 App小程序在微信里即用即走還能順著舍友群快速傳播。技術棧上我們沒有追新沒有上微服務、沒有用 K8s甚至沒有單獨做管理后臺管理頁面直接嵌在后端項目里用 Thymeleaf 模板渲染。為什么用 Spring Boot 而不用 Node.js純粹是因為團隊里兩個人最熟的是 Java。校園項目拼的不是架構超前而是“熟悉 快速 少踩坑”。如果你問我只用一個人的話就是“誰熟用誰”。3.2 數(shù)據(jù)庫設計一張商品表也能撐起MVP關于數(shù)據(jù)庫很多新手容易一上來就設計十幾張表結果前后端聯(lián)調(diào)時改得想哭。我們的原則是能晚做的表絕不在 MVP 做能用索引解決的絕不建表。核心商品表設計大概是這樣的CREATE TABLE product ( id bigint(20) NOT NULL AUTO_INCREMENT, seller_id bigint(20) NOT NULL COMMENT 賣家用戶ID, title varchar(60) NOT NULL COMMENT 標題, category int(11) NOT NULL COMMENT 分類1教材 2數(shù)碼 3生活 4運動 5其他, description varchar(1000) DEFAULT NULL COMMENT 描述, price decimal(10,2) NOT NULL COMMENT 期望價格, original_price decimal(10,2) DEFAULT NULL COMMENT 原始購買價格, condition_level tinyint(4) NOT NULL COMMENT 成色1幾乎全新 2輕微使用 3明顯使用 4功能正常成色較差, image_urls varchar(2000) DEFAULT NULL COMMENT 圖片URL逗號分隔最多9張, status tinyint(4) NOT NULL COMMENT 狀態(tài)1上架 2下架 3已交易 4刪除, active_at datetime DEFAULT NULL COMMENT 最近活躍時間, created_at datetime NOT NULL, updated_at datetime NOT NULL, PRIMARY KEY (id), KEY idx_seller_id (seller_id), KEY idx_category_status_active (category, status, active_at) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT閑置商品表;這里兩個小設計值得說一下。第一image_urls用逗號分隔字符串而不是再建一張圖片表違反了三大范式但在 MVP 階段完全可以接受理由是每件商品圖片數(shù)量上限不超過9張單表查詢不拆表能少兩次 join性能更好。第二聯(lián)合索引idx_category_status_active保證了信息流首頁按分類篩選并按活躍時間排序時可以走索引避免 filesort。用戶表、系統(tǒng)消息表、舉報表、評價表沒有太多值得講的但有一點必須提醒所有表都要帶上created_at和updated_at而且更新時一定要用update_time now()這樣的數(shù)據(jù)庫時間不要用應用服務器時間否則后面做統(tǒng)計報表日期對不上。3.3 登錄與鑒權微信生態(tài)里最容易被忽略的安全問題微信小程序登錄的標準流程是wx.login拿 code傳給后端換 openid。很多教學 demo 到這一步就結束了但校園平臺不能這么做因為 openid 只是唯一標識它不告訴你這個人是不是你的學校學生。我們在登錄之后加了一個強制“學籍認證”步驟用戶輸入學號和姓名后端調(diào)學校統(tǒng)一身份認證接口我們學校開放了 OAuth2 能力驗證真?zhèn)?。實名是驗證“這個微信對應的是哪個學生”而學籍驗證是確認“這個學生是我們學校的”兩部分缺一不可。這里有個安全細節(jié)給前端返回用戶信息時永遠不要返回 openid也不要返回數(shù)據(jù)庫主鍵 id要返回一個獨立的user_uid字符串。否則用戶抓到接口就能遍歷 id 看到別人的信息這就屬于很典型的越權漏洞。我們的辦法是每次登錄后生成一個隨機 UUID 作為對外用戶標識所有商品、評論、聊天都關聯(lián)這個user_uid數(shù)據(jù)庫主鍵只用于內(nèi)部 join。3.4 圖片與內(nèi)容安全如何用免費額度頂住前半年校園二手交易最頭疼的是圖片審核。MVP 上線前我們天真地以為二手商品圖不會有違規(guī)內(nèi)容結果上線第三天就有人在教材分類里上傳了違規(guī)小廣告圖片??咳斯徍瞬滑F(xiàn)實我們直接接入了微信官方的security.msgSecCheck和security.imgSecCheck接口。這兩個接口雖然不支持自定義關鍵詞庫但對于涉黃涉暴、違法內(nèi)容識別率還不錯關鍵是不用額外認證小程序后臺配置后即可調(diào)用。圖片安全的具體做法是用戶上傳圖片時前端先壓縮到最長邊 1200px 再傳給 OSSOSS 回調(diào)后端時觸發(fā)一次圖片檢測如果返回errCode非0立刻把圖片從 OSS 刪除并把商品狀態(tài)改為違規(guī)下架。文字描述則在發(fā)布接口里先調(diào)用內(nèi)容安全接口同時再跑一層自己的關鍵詞過濾比如補課類廣告、代寫論文雙保險。這套方案最省錢的點在于小程序本身有內(nèi)容安全接口免費額度夠一個校園平臺的初期用量。等到之后用戶量大了再升級云服務商的機器審核也不遲。4. 信用、風控與防騙二手交易平臺的生死線4.1 實名認證把“學長學姐”變成可追溯的ID任何交易平臺都逃不開一個詛咒越自由越容易被薅羊毛。校園二手平臺雖然天然有圍墻但墻內(nèi)也一樣有職業(yè)賣家、有詐騙、有掛羊頭賣狗肉。所以我們把學籍認證設置在“發(fā)布商品”和“聯(lián)系賣家”之前而不只是“瀏覽”之前。這個設計會犧牲一部分轉化率——大約有 18% 的訪客會因為“不想認證”而流失。但我們認為值得。原因很簡單一個用戶愿意用真實學號認證本身就說明他是個真實的在校學生這比任何信用分都更有約束力。我們把用戶分為 Lv0未認證和 Lv1已認證Lv1 用戶發(fā)布的商品才出現(xiàn)在默認信息流里Lv0 只能看和搜索但不能聯(lián)系。這么做以后商品的“可信底噪”一下子就高了很多。4.2 平臺不碰錢的交易保障方案前文提到我們砍了在線支付。隨之而來一個問題如果買家被賣家騙了平臺要不要賠我們的選擇是平臺不介入資金流但堅決介入“信息流”和“糾紛仲裁”。具體保障措施有三條第一商品詳情頁必須展示“交易規(guī)則”明確建議學生當面交易盡量選擇食堂、圖書館等人流密集區(qū)域避免在宿舍樓內(nèi)部交易。第二如果出現(xiàn)線下交易被騙的情況平臺依據(jù)聊天記錄和舉報信息把涉嫌欺詐的賬號做封禁處理并將封號結果在全校公示欄里其實就是運營群通報。第三我們和校保衛(wèi)處建立了聯(lián)系重大糾紛直接引導學生去保衛(wèi)處處理。這套方案雖然不完美但它把平臺責任控制在了信息中介的范圍內(nèi)規(guī)避了資金池和支付牌照合規(guī)風險。對校園團隊來說有時候少做比多做更安全。4.3 舉報與關鍵詞過濾跟代刷廣告斗智斗勇校園二手平臺一旦有了流量一定會混進各種奇怪的東西代刷網(wǎng)課、代寫論文、包過駕照、甚至還有傳銷拉人。我們建立了兩層過濾機制。第一層是發(fā)布時實時過濾前文提過第二層是用戶舉報后的人工復審。我們設計了一套輕量舉報后臺普通用戶看到可疑商品可以點“舉報”后臺按“分類-次數(shù)”統(tǒng)計。當同一個商品被舉報超過 3 次商品自動下架進入待審列表由一個管理員人工判斷而不是一刀切刪除避免誤傷正常交易。運營三個月真正需要人工處理的舉報一共 47 條其中 36 條確實違規(guī)9 條是用戶誤會2 條是惡意舉報。惡意舉報的用戶我們查出來后限制了 7 天發(fā)布權限規(guī)則放進了用戶協(xié)議里沒引發(fā)什么爭議。4.4 真的遇到糾紛怎么辦人工客服的原則即使做了這么多糾紛還是會來。典型的場景是賣方說買方拿了東西不給錢買方說東西是壞的賣家隱瞞瑕疵。我們沒有客服系統(tǒng)只有一個小程序意見反饋入口和一個對外郵箱。后來把個人微信做成了“客服號”但這帶來了嚴重的隱私問題——最后還是收斂回郵件表單??偨Y下來人工處理糾紛的時候要遵循三點原則一是先要求雙方各發(fā)一版聊天記錄截圖和實物照片避免只聽一面之詞二是判定標準看“有沒有隱瞞關鍵信息”比如商品描述里沒寫劃痕而買家收到有劃痕賣家需要承擔退部分款或接受退貨三是處理結果必須可追溯我們不刪帖不拉黑只在后臺記錄違規(guī)類型。這套原則雖然樸素但足以覆蓋 95% 的校園交易糾紛了。5. 冷啟動與運營從0到2000用戶的真實路徑5.1 掃樓、社團和輔導員線下信任的遷移很多產(chǎn)品冷啟動靠投放校園產(chǎn)品不一樣校園里最有效的傳播途徑是“線下信任”。第一周我們?nèi)齻€人分了 7 棟宿舍樓掃樓敲門之后第一句話不是“下載App”而是“同學你好我們在做一個校園二手平臺可以幫你把畢業(yè)季的書賣掉要不要掃個碼看看”。這比任何地推話術都好用因為“幫你賣東西”是即時價值。同時我們通過學院學生會聯(lián)系到了輔導員在年級通知群發(fā)了一條措辭正常的介紹。這條推送帶來了一波非常密集的注冊量很多學生是因為輔導員轉發(fā)了才覺得“這應該是靠譜的”。這里分享一個關鍵經(jīng)驗和官方合作一定要用“公益服務學生”的定位不要用“商業(yè)平臺推廣”的定位否則哪怕功能很實用也會被校方拒之門外。5.2 畢業(yè)季活動“宿舍斷舍離”如何引爆首月真正的爆發(fā)點是我們策劃的一場“宿舍斷舍離”活動。時間定在畢業(yè)前最后一個周日規(guī)則很簡單畢業(yè)生在松鼠平臺發(fā)布閑置時額外打上tag“畢業(yè)清倉”平臺會給每件商品免費配一個“推薦位”曝光并且在活動當天設置一個線下擺攤點畢業(yè)生可以把自己的閑置直接放到攤位我們派人看管來往學生現(xiàn)場掃碼看詳情、現(xiàn)場拿走。這場活動我們聯(lián)系了校學生會生活部借用了一塊宿舍區(qū)門口的場地準備了 100 張手寫標簽和兩塊展板。實際效果遠超預期活動當天新增注冊 600 人發(fā)布商品 310 件線下成交 180 件。很多人之前完全不知道這個項目在攤位逛了一圈之后當天晚上就發(fā)布了第一件閑置。這說明校園二手平臺的冷啟動關鍵不在于線上裂變而在于線下場景的“你看到別人在交易你才信這個平臺能用”。5.3 留存的秘密有人是來買東西有人是來看故事的運營兩周后我們發(fā)現(xiàn)一個有趣的現(xiàn)象很大一部分用戶只為“逛”并不買東西。于是我們上線了一個輕量“好物故事”模塊——賣家可以在發(fā)布商品時寫一小段“為什么賣它”比如“考研結束時太開心忘記還有一摞資料”“前男友送的鍵盤回不去了出了”。這看起來很不“二手交易”但它直接拉長了用戶平均使用時長。為什么要做這個因為我們發(fā)現(xiàn)二手商品的價值除了“便宜”之外還有“一段校園記憶”。如果你只把平臺當貨架用戶買完就走留存會很差。但當你把每件商品背后的故事展示出來用戶就會像刷小紅書一樣逛二手平臺甚至會主動收藏某些商品。這個模塊上線后次日留存率提高了 8 個百分點雖然不多但已經(jīng)證明它值得做。5.4 埋點數(shù)據(jù)教我們的事我們把小程序接入了一套簡易埋點不復雜就是發(fā)布、瀏覽詳情、聯(lián)系賣家、成功交易這四個關鍵事件。數(shù)據(jù)很快告訴我們一個之前沒想到的信息成交轉化率最高的商品分類是“教材”和“宿舍生活用品”而瀏覽熱度最高的是“數(shù)碼產(chǎn)品”。這個反差很符合校園二手平臺的邏輯學生逛的時候最想看的是好玩的數(shù)碼產(chǎn)品但真要花錢買的時候還是買剛需教材最果斷。于是我們調(diào)整了信息流排序策略默認頁加重了教材和日用品的展示權重數(shù)碼產(chǎn)品放到了“逛一逛”獨立入口。調(diào)整后整體成交率提升了 13%。這就是早期數(shù)據(jù)埋點的價值沒有它我們大概率還會繼續(xù)把數(shù)碼產(chǎn)品放首頁。6. 復盤那些做對了、做錯了和差點走不下去的事6.1 真實數(shù)據(jù)上線三個月的關鍵指標上線三個月松鼠平臺在一個規(guī)模約 3 萬人的高校里做到了 2800 個注冊用戶學籍認證完成率 72%發(fā)布商品累計 1600 件成功成交 980 單成交轉化率約 61%。日活峰值出現(xiàn)在畢業(yè)季最后一周達到 800 人閑時常日活在 100 人上下。這個數(shù)據(jù)放在閑魚面前不值一提但對一個校園垂直產(chǎn)品來說已經(jīng)算是跑通了“低頻剛需”的模型。查了后臺分類成交數(shù)據(jù)最出乎意料的是生活用品類比如插線板、臺燈、收納架這類商品單價低但成交頻率極高幾乎是教材之后第二個“現(xiàn)金?!狈诸?。后來我們復盤中意識到生活日用品是“看到就會順手買”的品類不用像教材那樣需要明確需求因此在運營上最好做的是“刺激逛”而不是“精準搜索”。6.2 最大的坑不是技術而是供需匹配失衡如果問我這個項目最大的坑是什么不是技術是“供需匹配失衡”。具體表現(xiàn)在平臺上“賣教材的很多、買教材的也不少但賣的是偏文科教材買的是工科專業(yè)書”標題和分類都對不上。我們曾試圖用推薦算法解決但后來發(fā)現(xiàn)問題的根源是“發(fā)品時沒有引導用戶填寫專業(yè)甚至課程代碼”。如果商品詳情里能選擇“所屬課程”買書的人搜索《高數(shù)》就能精準定位到對應的教材版本那轉化率一定更高。這其實是一個產(chǎn)品流程問題而不是算法問題。如果重新做一遍我會在發(fā)布教材時強制選擇學院和專業(yè)這比任何推薦系統(tǒng)都更有效。另外一個大坑是忽略了“真實需求的時間不均勻性”。開學季是買賣教材的黃金期畢業(yè)季是賣宿舍用品的高峰期這兩個高峰之間的平穩(wěn)期平臺幾乎完全靠“逛”維持活躍。想清楚這件事之后我們開始專門為“期初期末”策劃主題活動比如期末季“二手筆記互換”而不是等流量自然漲落。6.3 如果重新做一次我會砍掉什么、加什么如果讓我?guī)еF(xiàn)在的認知重新做一次“松鼠”第一件會砍掉的事情是“在線聊天”。我們的私信功能在技術實現(xiàn)上花了不少力氣但用戶最終幾乎全部流向微信。因為微信溝通成本為零而且可以語音通話能夠快速解決“你能不能送到樓下”這種問題。與其在平臺內(nèi)做半吊子聊天不如在“聯(lián)系賣家”按鈕上直接復制對方微信號把聊天成本壓到最低同時把精力省下來做更重要的“交易履約狀態(tài)管理”。第二件會加的功能是“多人拼單”。校園二手交易其實是強場景拼單的比如大三學生要把一整箱專業(yè)書清倉每本書單價很低但打包賣可以賣出一筆不錯的價格。我們后來發(fā)現(xiàn)“整套出”“組合出”的商品成交率遠高于單品說明用戶需要的不是單純貨架而是“一套東西一把清掉”的便利。如果繼續(xù)迭代我會增加“閑置包”概念允許一個賣家把多個商品打包成一個鏈接并在詳情頁標注“整套可小刀”。第三件會堅持到底的事情是“堅持真實學籍驗證”。雖然它篩掉了一部分用戶但它讓這個小平臺最終沒有變成騙子泛濫的信息垃圾場。作為一個校園項目最大的護城河不是技術不是資本而是“這個平臺上的確都是身邊人”。我在做這個項目的過程中最深的體感是校園二手交易平臺不是一個純技術項目而是一個“用技術重寫校園信任鏈條”的項目。代碼寫得好不好只決定上線穩(wěn)不穩(wěn)真正讓人愿意用下去的原因是每個學生進入平臺時第一眼看到的那個松鼠很像一個替自己保管閑置的老朋友。如果你也在校園里折騰類似的產(chǎn)品別急著堆功能先陪著你的用戶把“信任”這件事走通。