ArrowTower æ¯äžäžªåºäº Polkadot çæçå°çäœçœ®æå¡å¹³å°ïŒæ¯æäžé®åŒå¹³å°éšçœ²,å€åºæ¯éçšïŒéè¿é¶ Gas 莹å端代éžé ææ¯ïŒè®©çšæ·æ éšæ§äœéª Web3ãéŠæèçŠç®å¡æä¹¡ææ
æžžåºæ¯ïŒæžžå®¢å®æç¹è²è·¯çº¿æå¡åäºåšä»»å¡åïŒç³»ç»èªåšåæŸç¬ç¹ NFT æ°å纪念åïŒæ éçšæ·äºè§£GasèŽ¹ææ¯ä»è޹çšïŒåŠä¹ é±å
䜿çšäžçŸåã

å¹³å°å¯å¿«éæå±è³ Web3 äŒå±æŽ»åšãååžææ æ¢çŽ¢ãæè²ç åŠãåäžè¥éãå ¬çæŽ»åš çå€äžªåäžåºæ¯ãéè¿éŸäžèº«ä»œéªè¯åå¯éªè¯æ°ååè¯ïŒäžºææ ãäŒå±ãæè²ãè¥éçè¡äžæäŸåæ°ççšæ·äºåšåæ°åèµäº§è§£å³æ¹æ¡ã
- ð æŒç€ºçœç«ïŒhttps://arrowtower.netlify.app/
- ð¬ æŒç€ºè§é¢ïŒArrowTower_DEMO
- ð åäžå¯è¡åææ¥å: Business_Feasibility_Study(Entertainment Edition)
- ð é¶ Gas 莹äœéªïŒåºäº PolkaVM å端代éžé ææ¯ïŒçšæ·æ éæ¯ä» Gasã
- ð å³å»çæïŒFork æå é项ç®åïŒæèµ· Docker éåå³å¯è¿å ¥ç³»ç»ïŒçæ£åå°åŒç®±å³çšã
- ð§ å€éšçœ²åœ¢åŒïŒæ¯æ Docker éšçœ²ãKubernetes éšçœ²ãGitHub Actions äžé® CI/CD äžçº¿ã
- ð éåéžé æºå¶ïŒæ¯æäºå¡éåãæ¹é NFT éžé (queue-minting)ïŒå¯åºå¯¹é«å¹¶ååºæ¯ã
- ð¥ïž å端å¯éšçœ²å纊ïŒå端管ççé¢çŽæ¥æ¯æéšçœ²ãé 眮å纊å°åïŒæ éå端æ¹é å³å¯åæ¢äžå NFT å纊ã
- ð å°çäœçœ®ïŒäºç»Žç æ ¡éªæå¡ïŒæ¯æ GPS å®äœæ ¡éª + äºç»Žç æ«æïŒå€ééªè¯ä¿éæå¡æææ§ã
- ðš äºåšä»»å¡ç³»ç»ïŒæç §äžäŒ ãç¥è¯é®çã任塿å¡ãæå°±è§£éçïŒæåçšæ·åäžæã
- ð æ°æ®ç»è®¡çæ¿ïŒå®æ¶ç»è®¡çšæ·è¡äžºãä»»å¡è¿åºŠãéžé éãæå¡äººæ°çéŸäž + çº¿äžæ°æ®ã
- ð§© æš¡ååå¯å€çšïŒä»»å¡ç³»ç»ãæå¡ç³»ç»ãNFT æš¡åãæ°æ®ç»è®¡æš¡åå坿åå€çšã
- â¡ PolkaVM 驱åšïŒåºäº PolkaVM åš Polkadot çæçæµè¯çœè¿è¡ïŒäº«å髿§èœ ïŒ äœææ¬äŒå¿ã
- çšæ·è®€è¯æš¡å
- é±å è¿æ¥
- çŸåè®€è¯ + äŒè¯ç®¡çïŒNextAuthïŒ
- å°çäœçœ®æå¡æš¡å
- GPS å®äœæ ¡éª
- äºç»Žç QR æ«ææ ¡éª
- æå¡è®°åœåæ¥è³éŸäž
- ä»»å¡ç³»ç»æš¡å
- å建ïŒçŒèŸä»»å¡è·¯çº¿çïŒåŠæç §äžäŒ ãé®çãæå¡ïŒ
- å¥å±è§ŠååšïŒå®æä»»å¡èªåšè§Šå NFT éžé ïŒ
- NFT éžé æš¡å
- å端代éžé ïŒçšæ·æ é GasïŒïŒå¯æ¹ééåéžé ïŒQueue MintingïŒ
- å端é 眮å纊å°å/ABIïŒæ¯ææ¿æ¢ NFT å纊éšçœ²åºæ¯
- éžé ç»æè®°åœéŸäžïŒçšæ·é±å èªå𿥿¶ NFT
- æ°æ®ç»è®¡æš¡å
- 宿¶ç»è®¡çšæ·æå¡ãä»»å¡å®æãéžé éãæŽ»è·åºŠãåäžççææ
- éŸäžæ°æ® + æ¬å°æ°æ®åºæ°æ®èåå±ç€º
- åŸè¡šçæ¿ïŒäŸ¿äºè¿è¥äººååææŽ»åšææ
- éšçœ²è¿ç»Žæš¡å
- æäŸ Dockerfile ïŒ docker-compose é 眮ïŒäžé®å¯åšæå¡
- æ¯æ GitHub ActionsïŒGitLab CI äžé®æå»º & éšçœ²æµçš
- æ¯æåæ¢ çœç»ïŒæ¬å°ãæµè¯çœãäž»çœïŒäž DB é 眮ïŒPostgreSQL/SQLiteïŒ
枞客éè¿ dApp æµè§ç®å¡æç¹è²æ 枞路线ïŒå°èŸŸæå®å°ç¹åéè¿å°çäœçœ®æ ¡éªææ«æäºç»Žç 宿æå¡ïŒå®æäºåšä»»å¡ïŒæç §äžäŒ ãç¥è¯é®çãæåäœéªïŒç§¯çޝæå°±ã宿宿Žè·¯çº¿åç³»ç»èªåšéžé å¹¶åéç¬ç¹çç®å¡æ NFT æ°å纪念åå°çšæ·é±å ïŒæ éçšæ·æäœïŒã
ä»·åŒïŒæå枞客枞è§è¶£å³æ§ååäžåºŠïŒäžºç®å¡æå»ºç«æ°ååæ æžžåçïŒéè¿ NFT å®ç°é¿æçšæ·è¿æ¥åäºæ¬¡äŒ æã
ðª Web3 äŒå±æŽ»åš
- äŒè®®çŸå°æå¡ãå±äœäºåšãæŒè®²å æå¡ã瀟亀çœç»æå¡
- æ ¹æ®æå¡å®æåºŠèªåšåæŸäžåç级çåäŒè¯æ NFT
- éŸäžèº«ä»œéªè¯ç¡®ä¿åäŒè 身仜ç宿§ïŒé²æ¢ä»£çŸå°
- 宿¶æ°æ®ç»è®¡ïŒäžºäž»åæ¹åå±åæäŸå¯éåçæææ°æ®
- éçšäºåºåéŸå³°äŒãWeb3 é»å®¢æŸãè¡äžå±è§äŒãåŒåè 倧äŒç
ðïž ååžææ æ¢çŽ¢
- å岿å线路ãçŸé£æ¢åºè·¯çº¿ãèºæ¯æå路线ãååžææèµ
- ä¿è¿ææ æ¶è޹åååžåçäŒ æïŒå»ºç«ååžæ°åæåèµäº§
ð æè²äžç åŠ
- æ ¡åå®åè¶éãç åŠæ è¡è®°åœãå®è·µè¯Ÿçšæå¡ãæ¯äžçºªå¿µå
- å¢åŒºåŠä¹ è¶£å³æ§ïŒå»ºç«éŸäžæè²æ¡£æ¡ïŒæäŸå¯éªè¯çè¯Ÿå€æŽ»åšè¯æ
ðïž åäžè¥é掻åš
- åçèåšæå¡ãæ°åååžäŒãäŒåäœç³»å级ã线äžå¿«éªæŽ»åš
- æåçšæ·å°åºçåäºåšçïŒæé åçæ°åèµäº§å Web3 瀟åºåºç¡
ð€ 瀟åºäžå ¬ç掻åš
- å¿æ¿æå¡è®°åœãç¯ä¿è¡åšæå¡ãç€ŸåºæŽ»åšåäžãæ åæèµ è®°åœ
- 建ç«å¯ä¿¡çå ¬çè®°åœäœç³»ïŒæåå ¬çæŽ»åšéæåºŠåå ¬ä¿¡å
å端
- æ¡æ¶ïŒNext.js 15+ (App Router)
- æ ·åŒïŒTailwind CSS + shadcn/ui
- åºåéŸäº€äºïŒwagmi + viem
- 讀è¯ç³»ç»ïŒNextAuth.js
- ç¶æç®¡çïŒReact Hooks
å端
- API å±ïŒNext.js API Routes
- æ°æ®åº ORMïŒPrisma
- NFT éžé ïŒå端代éžé ïŒZero Gas FeeïŒ
åºåéŸ
- èææºïŒPolkaVM
- æµè¯çœç»ïŒPolkadot Hub Testnet
- æºèœå纊ïŒ
- Minter å纊ïŒ
0x079098fb8e901DE45AB510fA669bdE793DfEBD50(View on blockchain explorer: Blockscout) - NFT å纊ïŒ
0x9373197B94f4633FBc121532F3cF3948FD4a5a15(View on blockchain explorer: Blockscout)
- Minter å纊ïŒ
âââââââââââââââââââââââââââââââââââââââââââ
â çšæ·çé¢å± (Next.js) â
â React + Tailwind CSS + shadcn/ui â
ââââââââââââââââââââ¬âââââââââââââââââââââââ
â
ââââââââââââââââââââŒâââââââââââââââââââââââ
â åºåéŸäº€äºå± (wagmi + viem) â
â çšæ·é±å
è¿æ¥äžäº€æçŸå â
ââââââââââââââââââââ¬âââââââââââââââââââââââ
â
ââââââââââââââââââââŒâââââââââââââââââââââââ
â äžå¡é»èŸå± (API Routes + NextAuth) â
â å°çäœçœ®éªè¯ | ä»»å¡ç®¡ç | æ°æ®ç»è®¡ â
ââââââââââââââââââââ¬âââââââââââââââââââââââ
â
ââââââââââââââââââââŒâââââââââââââââââââââââ
â æ°æ®æä¹
å± (Prisma + Database) â
â çšæ·æ°æ® | æå¡è®°åœ | ä»»å¡è¿åºŠ â
ââââââââââââââââââââ¬âââââââââââââââââââââââ
â
ââââââââââââââââââââŒâââââââââââââââââââââââ
â åºåéŸå± (PolkaVM + Testnet) â
â Polkadot Hub Testnet | Smart Contracts â
âââââââââââââââââââââââââââââââââââââââââââ
- Node.js 20.x ææŽé«çæ¬
- æ°æ®åºïŒPostgreSQL / MySQL / SQLiteïŒ
git clone https://github.com/easyshellworld/arrowtower-dapp.git
cd arrowtower-dapp2.1 è¿å ¥å纊ç®åœå¹¶å®è£ äŸèµ
cd contracts/hardhat-arrowtower
npm install2.2 é 眮å纊ç¯å¢åé
å建 .env æä»¶å¹¶é
眮以äžå
容ïŒ
# æ¬å°çœç»ç§é¥ç€ºäŸ
PRIVATE_KEY_LOCAL="0x...."
# passethub (æµè¯çœ) ç§é¥
PRIVATE_KEY_PA="0x...."2.3 éšçœ²äžæµè¯å纊
# æ¬å°çœç»éšçœ²äžæµè¯
npx hardhat run scripts/deploy.ts --network localNode
npx hardhat run scripts/deployandtest.ts --network localNode
# äœ¿çš passet-hub æµè¯çœéšçœ²äžæµè¯
npx hardhat run scripts/deploy.ts --network passethub
npx hardhat run scripts/deployandtest.ts --network passethub2.5 éšçœ²äžæµè¯å纊åéŠ
2.5 è¿åé¡¹ç®æ ¹ç®åœ
cd ../..3.1 å®è£ äŸèµ
npm install3.2 é 眮åºçšç¯å¢åé
å建 .env æä»¶å¹¶é
眮以äžå
容ïŒ
# æ°æ®åºé
眮
DATABASE_URL="your_database_url"
# NextAuth é
眮
NEXTAUTH_SECRET="your_nextauth_secret"
NEXTAUTH_URL="http://localhost:3000"
# é
眮çœç«åºæ¬éŸæ¥
NEXT_PUBLIC_ARROW_TOWER_BASE_URL="https://arrowtower.netlify.app/"
# æºèœå纊å°å
NEXT_PUBLIC_MINTER_CONTRACT="0x079098fb8e901DE45AB510fA669bdE793DfEBD50"
NEXT_PUBLIC_NFT_CONTRACT="0x9373197B94f4633FBc121532F3cF3948FD4a5a15"
# å端éžé ç§é¥ïŒä»
æå¡ç«¯ïŒ
PRIVATE_KEY="your_private_key"
# åå§å䜿çš
ADMIN_ADDRESS="admin wallet addresss"3.3 åå§åæ°æ®åº
npx prisma generate
npx prisma db push
npm run init:db3.4 å¯åšåŒåæå¡åš
npm run dev3.5 访é®åºçš
æåŒæµè§åšè®¿é® http://localhost:3000
äœ¿çš Docker Compose å¯ä»¥å¿«éå¯åšå®æŽçç产级 ArrowTower åºçšæ ïŒå æ¬ PostgreSQL æ°æ®åºå Next.js åºçšã
git clone https://github.com/easyshellworld/arrowtower-dapp.git
cd arrowtower-dappå建 .env æä»¶ïŒé
眮以äžå
³é®åæ°ïŒ
# æ°æ®åºé
眮
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=arrowtower
DATABASE_URL="postgresql://postgres:your_secure_password@postgres:5432/arrowtower?schema=public"
# NextAuth é
眮
NEXTAUTH_SECRET="your_nextauth_secret_here"
NEXTAUTH_URL="http://localhost:30000"
# çœç«åºç¡é
眮
NEXT_PUBLIC_ARROW_TOWER_BASE_URL="http://localhost:30000"
# æºèœå纊å°å
NEXT_PUBLIC_MINTER_CONTRACT="0x079098fb8e901DE45AB510fA669bdE793DfEBD50"
NEXT_PUBLIC_NFT_ADDRESS="0x9373197B94f4633FBc121532F3cF3948FD4a5a15"
# åºåéŸé
眮
PRIVATE_KEY="your_private_key_for_backend_minting"
CHAIN_ID="420420421"
RPC_URL="https://rpc.polkadot-hub-paseo-testnet.polkadot.io"
NETWORK="polkadot-hub-paseo-testnet"
# åå§å䜿çš
ADMIN_ADDRESS="admin wallet addresss"äœ¿çš Docker Compose äžé®å¯åšæææå¡ïŒ
docker-compose up -dè¿å°èªåšïŒ
- æåå¹¶å¯åš PostgreSQL 16 æ°æ®åº
- æå»ºå¹¶å¯åš Next.js åºçš
- é 眮çœç»åæ°æ®å·
- æ§è¡å¥åº·æ£æ¥
æ£æ¥æå¡ç¶æïŒ
docker-compose psæ¥çåºçšæ¥å¿ïŒ
docker-compose logs -f app访é®åºçšïŒæåŒæµè§åšè®¿é® http://localhost:30000
arrowtower-dapp/
âââ contracts/ # æºèœå纊 (Hardhat 项ç®)
â âââ hardhat-arrowtower/
â âââ contracts/ # Solidity æºç ïŒarrow_tower_minter.sol, arrow_tower_nft.sol, ...ïŒ
â âââ scripts/ # éšçœ² / æµè¯èæ¬
â âââ test/ # æºèœå纊æµè¯
â âââ artifacts-pvm/ # çŒè¯äº§ç©
â âââ typechain-types/ # TypeChain ç±»å
âââ prisma/ # Prisma ORMïŒschema / migrations / clientïŒ
â âââ (schema.prisma / migrations / client)
âââ src/ # åºçšæºç ïŒå·²ä» log äžè¯å«ïŒ
â âââ app/ # Next.js App Router æºç ïŒé¡µé¢äž API è·¯ç±ïŒ
â â âââ admin/ # 管çåå°é¡µé¢
â â âââ api/ # API è·¯ç±ïŒserver-onlyïŒ
â â â âââ admin/
â â â â ââcheckins/ # 管ççžå
³æ¥å£
â â â âââ auth/
â â â â ââsignin/
â â â â ââ[...nextauth]/
â â â âââ checkins/
â â â âââ checkmint/
â â â âââ health/
â â â âââ metadata/
â â â â ââ[id]/
â â â âââ pois/
â â â âââ route_list/
â â â âââ upload/
â â â ââphoto/
â â âââ maps/ # å°åŸçžå
³é¡µé¢
â â âââ routes/ # åšæè·¯ç±é¡µé¢
â â â ââ[id]/
â â âââ testcheckin/
â â âââ user/
â â ââcheckmint/
â â ââ[poi]/
â âââ components/ # å¯å€çšç»ä»¶
â â ââmaps/ # å°åŸç»ä»¶
â â ââui/
â âââ jobs/ # æ¹å€ç / åå°ä»»å¡ïŒcron / jobsïŒ
â âââ lib/ # 项ç®å
éšå·¥å
ጼ
â ââchains/ # éŸé
眮
â ââdb/ # æ°æ®åºå°è£
ïŒPrisma clientïŒ
âââ public/ # éæèµæºïŒweb å¯çŽåïŒ
â âââ pic/
â âââ svg_small/ # å°å°ºå¯ž svg èµæº
âââ pic/ # 讟计/瀺äŸåŸïŒlog äžåºç°çåç¬ç®åœïŒ
â ââsvg/
â ââsvg_small/
âââ scripts/ # 项ç®èæ¬ïŒéšçœ²ãå·¥å
·èæ¬ïŒ
âââ data/ # ç€ºäŸæ°æ® / ç§åæ°æ® / 富åº
âââ doc/ # é¡¹ç®ææ¡£ïŒrelease notes / design docïŒ
âââ tests/ # 端å°ç«¯æéææµè¯ç®åœ
âââ .env.example # ç¯å¢åé瀺äŸïŒè¯·ç¡®ä¿ææä¿¡æ¯äžåš repoïŒ
âââ README.md # 项ç®è¯Žæ
âââ (é
眮æä»¶)
ââtsconfig.json
âânext.config.js / next.config.ts
ââtailwind.config.js
ââpostcss.config.js
ââcomponents.json # shadcn/ui é
眮
- Fork æ¬é¡¹ç®å°äœ ç GitHub 莊æ·
- åš Netlify äžå¯Œå ¥é¡¹ç®
- é 眮ç¯å¢åé
- ç¹å»éšçœ²
项ç®å·²éšçœ²æŒç€ºïŒhttps://arrowtower.netlify.app/
æä»¬æ¬¢è¿ææåœ¢åŒç莡ç®ïŒå æ¬äœäžéäºïŒ
- ð æäº€ Bug æ¥å
- ð¡ æåºæ°åèœå»ºè®®
- ð æ¹è¿ææ¡£
- ð§ æäº€ä»£ç ä¿®å€
- ð ç¿»è¯ææ¡£
æ¬é¡¹ç®éçš MIT åè®®åŒæºã
- 项ç®äž»é¡µïŒhttps://github.com/easyshellworld/arrowtower-dapp
- æŒç€ºçœç«ïŒhttps://arrowtower.netlify.app/
- é®é¢åéŠïŒhttps://github.com/easyshellworld/arrowtower-dapp/issues
- ææ¡£äžå¿ïŒ
æè°¢ææäžºæ¬é¡¹ç®ååºèŽ¡ç®çåŒåè åç€ŸåºæåïŒ
ç¹å«æè°¢ Polkadot çæå¯¹ Web3 åºç¡è®Ÿæœçæ¯æã
ArrowTower - 让æ¯äžæ¬¡æ¢çŽ¢éœæäžºæ°žæçæ°åè®°å¿ ðŒâš