docs(readme): redesenha o README com hero em SVG [skip ci]
This commit is contained in:
1 parent
41e82db2f6
commit
b95911f5a6
2 files changed
+142
-43
No files matched your search
@@ -1,58 +1,105 @@
|
||||
# Tibia Trade - Marketplace Seguro para Itens de Tibia
|
||||
<div align="center">
|
||||
|
||||
Marketplace multi-servidor seguro e confiável para compra, venda e negociação de itens de Tibia. Sistema de escrow protege 100% das transações.
|
||||
<img src="assets/readme/hero.svg" width="100%" alt="Tibia Trade: marketplace de itens de Tibia por servidor, com um anúncio em leilão, meios de pagamento aceitos e os botões Dar Lance e Intenção de compra">
|
||||
|
||||
## 🎯 Características
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
- **Marketplace Multi-Servidor**: Funciona com qualquer servidor de Tibia
|
||||
- **Sistema Escrow Seguro**: Protege 100% das transações contra scam
|
||||
- **Múltiplos Idiomas**: Português e Inglês
|
||||
- **Interface Moderna**: Design responsivo e acessível
|
||||
- **Core Web Vitals Otimizados**: Performance máxima para SEO
|
||||
[Plano de melhorias](docs/PLANO_MELHORIAS_MARKETPLACE.md) · [Configurar o AbacatePay](ABACATEPAY_SETUP.md) · [Issues](https://git.evandro.dev.br/evandro/pagodera/issues)
|
||||
|
||||
## 🚀 Como Iniciar
|
||||
</div>
|
||||
|
||||
```bash
|
||||
# Instalar dependências
|
||||
pnpm install
|
||||
O catálogo de itens vem no repositório (`data/tibiawiki.db`, SQLite com dados do TibiaWiki BR). Lido com o SQLite embutido do Node 22.13+, sem instalar nada:
|
||||
|
||||
# Desenvolvimento
|
||||
pnpm dev
|
||||
|
||||
# Build para produção
|
||||
pnpm build
|
||||
|
||||
# Iniciar servidor de produção
|
||||
pnpm start
|
||||
```console
|
||||
$ node --no-warnings -e "const db = new (require('node:sqlite').DatabaseSync)('data/tibiawiki.db', { readOnly: true }); const t = db.prepare(\"select name from sqlite_master where type = 'table' and name not like 'sqlite_%'\").all(); const n = t.reduce((s, { name }) => s + db.prepare('select count(*) as c from ' + name).get().c, 0); console.log(t.length + ' categorias, ' + n + ' itens'); console.table(db.prepare('select nome, lvl, voc, peso from espadas order by lvl desc limit 3').all())"
|
||||
28 categorias, 2575 itens
|
||||
┌─────────┬────────────────────────┬─────┬───────────┬──────┐
|
||||
│ (index) │ nome │ lvl │ voc │ peso │
|
||||
├─────────┼────────────────────────┼─────┼───────────┼──────┤
|
||||
│ 0 │ 'Grand Sanguine Blade' │ 600 │ 'Knights' │ 6000 │
|
||||
│ 1 │ 'Grand Sanguine Razor' │ 600 │ 'Knights' │ 7900 │
|
||||
│ 2 │ 'Sanguine Blade' │ 600 │ 'Knights' │ 6100 │
|
||||
└─────────┴────────────────────────┴─────┴───────────┴──────┘
|
||||
```
|
||||
|
||||
## 🛠️ Tecnologias
|
||||
## O que é
|
||||
|
||||
- **Framework**: Next.js 15 (App Router)
|
||||
- **Styling**: Tailwind CSS 4
|
||||
- **UI Components**: Radix UI
|
||||
- **Animações**: Motion (Framer Motion)
|
||||
- **Internacionalização**: next-intl
|
||||
- **Validação**: Zod
|
||||
- **Typescript**: TypeScript 5
|
||||
Tibia Trade (repositório `pagodera`) é um marketplace web para comprar, vender e leiloar itens de Tibia, separado por servidor. A interface tem português e inglês (`next-intl`, `messages/pt.json` e `messages/en.json`).
|
||||
|
||||
## 📦 Palavras-chave SEO
|
||||
| Página | O que faz |
|
||||
|---|---|
|
||||
| `/market` | Anúncios de venda por servidor, leilões com lances, intenções de compra ("Minhas intenções") e chat com o vendedor |
|
||||
| `/market/analytics` | Impressões e cliques dos seus anúncios |
|
||||
| `/library` | Catálogo de itens por categoria |
|
||||
| `/apoiar` | Doação por PIX (QR code gerado pelo AbacatePay) |
|
||||
| `/admin` | Cadastro de itens e categorias e gestão de planos de assinatura |
|
||||
| `/precos`, `/sobre` | Ainda mostram "em construção" |
|
||||
|
||||
- tibia marketplace
|
||||
- tibia trade
|
||||
- comprar itens tibia
|
||||
- vender itens tibia
|
||||
- tibia escrow
|
||||
- tibia gold
|
||||
- tibia coins
|
||||
- tc tibia
|
||||
- marketplace tibia seguro
|
||||
## Por que usar
|
||||
|
||||
## 🌐 Domínios
|
||||
- **Preço no meio que o jogador usa**: cada anúncio aceita PIX, Tibia Coins, gold coins ou troca.
|
||||
- **Leilão de verdade**: anúncios podem ter prazo (`auction_ends_at`) e incremento mínimo de lance; cada lance gera notificação.
|
||||
- **Negociação registrada**: o comprador abre uma intenção de compra, que vira um chat em tempo real com o vendedor (Socket.IO no servidor customizado `server.ts`, mensagens no MongoDB); o vendedor marca o anúncio como vendido.
|
||||
|
||||
- Desenvolvimento: https://tibiatrade.evandro.dev.br
|
||||
- Produção: https://tibiatrading.com (futuro)
|
||||
Quando não usar: se você precisa de pagamento garantido entre comprador e vendedor. O escrow existe só no modelo de dados (status `in_escrow`, tabela `Transaction`, taxa de 2%); nenhuma rota movimenta dinheiro, e o AbacatePay só é usado para doações. Também não serve para quem quer subir algo leve: o app precisa de PostgreSQL, Redis e MongoDB.
|
||||
|
||||
## 📄 Licença
|
||||
## Como funciona
|
||||
|
||||
Privado - Uso interno
|
||||
1. `server.ts` sobe o Next.js 15 (App Router) e o Socket.IO no mesmo servidor HTTP.
|
||||
2. As rotas em `app/api/` cuidam de autenticação (JWT com refresh, senhas com bcrypt), anúncios, lances, intenções de compra, chats, notificações, servidores, assinaturas e doações.
|
||||
3. PostgreSQL guarda usuários, anúncios, lances e intenções (Prisma em `prisma/schema.prisma` e SQL puro em `lib/db/migrations/`); Redis atende autenticação, Socket.IO e controle de uso da IA; MongoDB guarda chats e mensagens.
|
||||
4. O catálogo de itens sai de `data/tibiawiki.db` (com imagens em `data/images/`) e é importado por `lib/items/import-from-sqlite.ts`.
|
||||
5. No admin, a análise de um item novo pode usar o Gemini (`GEMINI_API_KEY`); sem a chave, o app usa um fallback estático.
|
||||
|
||||
## Início rápido
|
||||
|
||||
Requisitos: Node.js 18+ (o deploy em `nixpacks.toml` usa `nodejs_18`), pnpm, e instâncias de PostgreSQL, Redis e MongoDB. Não existe `.env.example`: crie o `.env` com as variáveis abaixo.
|
||||
|
||||
```bash
|
||||
git clone https://git.evandro.dev.br/evandro/pagodera.git
|
||||
cd pagodera
|
||||
pnpm install # o postinstall roda `prisma generate`
|
||||
pnpm db:migrate # aplica as migrações SQL no PostgreSQL (PG_DB)
|
||||
pnpm db:seed # cadastra os servidores de Tibia
|
||||
pnpm dev # tsx server.ts → http://localhost:3000
|
||||
```
|
||||
|
||||
Outros scripts: `pnpm build` (`next build --turbopack`), `pnpm start` (`NODE_ENV=production tsx server.ts`, sintaxe de shell POSIX), `pnpm lint` (Biome), `pnpm test` (`tests/run-tests.ts`), `pnpm db:test` (testa a conexão).
|
||||
|
||||
## Configuração
|
||||
|
||||
| Variável | Uso |
|
||||
|---|---|
|
||||
| `PG_DB` | Connection string do PostgreSQL para o pool `pg` e as migrações (obrigatória) |
|
||||
| `DATABASE_URL_APP` | Connection string do PostgreSQL para o Prisma |
|
||||
| `REDIS_DB` | Connection string do Redis (obrigatória) |
|
||||
| `MONGO_URL` | Connection string do MongoDB, para chats (obrigatória) |
|
||||
| `JWT_SECRET`, `JWT_REFRESH_SECRET` | Assinatura dos tokens de acesso e de refresh (obrigatórias) |
|
||||
| `NEXT_PUBLIC_BASE_URL` | Origem aceita pelo Socket.IO (padrão `http://localhost:3000`) |
|
||||
| `GEMINI_API_KEY` | Análise de itens no admin (opcional) |
|
||||
| `ABACATE_APIKEY`, `ABACATE_TEST_APIKEY`, `ABACATEPAY_WEBHOOK_SECRET`, `ABACATEPAY_WHITELIST_IPS` | Doações por PIX e o webhook do AbacatePay (veja [`ABACATEPAY_SETUP.md`](ABACATEPAY_SETUP.md)) |
|
||||
| `HOSTNAME`, `PORT` | Endereço do servidor (padrão `localhost:3000`) |
|
||||
|
||||
## Estado do projeto
|
||||
|
||||
Em desenvolvimento (`package.json` na versão `0.1.0`). O último commit no branch padrão (`develop`) é de 2025-11-22; o branch `wip/2026-10-20` guarda um snapshot de alterações ainda não finalizadas. O ambiente de desenvolvimento `tibiatrade.evandro.dev.br` não respondia com o app em 2026-10-24.
|
||||
|
||||
O que falta:
|
||||
|
||||
- Escrow e pagamento entre usuários (veja "Quando não usar").
|
||||
- O webhook de doações ainda não persiste a doação nem envia e-mail (pendências marcadas em `app/api/webhooks/abacatepay/route.ts`).
|
||||
- `/precos` e `/sobre` estão em construção.
|
||||
- `pnpm test` cobre só a validação dos metadados de itens (3 testes); não há CI.
|
||||
|
||||
## Licença
|
||||
|
||||
Sem licença publicada: todos os direitos reservados.
|
||||
|
||||
<div align="center">
|
||||
|
||||
<sub>Feito por <a href="https://evandro.dev.br">Evandro Fonseca Junior</a> · <a href="https://git.evandro.dev.br/evandro">git.evandro.dev.br</a></sub>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,52 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="420" viewBox="0 0 1200 420" role="img" aria-labelledby="title desc">
|
||||
<title id="title">Tibia Trade</title>
|
||||
<desc id="desc">Tibia Trade é um marketplace de itens de Tibia separado por servidor. À direita, um anúncio em leilão do item Grand Sanguine Blade no servidor Antica, com os meios de pagamento aceitos (PIX, Tibia Coins, gold coins e troca) e os botões Dar Lance e Intenção de compra.</desc>
|
||||
|
||||
<rect width="1200" height="420" rx="24" fill="#0a0a0a"/>
|
||||
|
||||
<g id="title-block" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif">
|
||||
<text x="64" y="104" font-family="ui-monospace, 'SF Mono', Consolas, monospace" font-size="20" fill="#a1a1a1">pagodera · marketplace</text>
|
||||
<text x="64" y="186" font-size="72" font-weight="700" fill="#fafafa">Tibia Trade</text>
|
||||
<text x="64" y="246" font-size="28" fill="#fafafa">Compre, venda e leiloe itens de Tibia</text>
|
||||
<text x="64" y="282" font-size="28" fill="#fafafa">por servidor, com chat em tempo real.</text>
|
||||
<text x="64" y="344" font-family="ui-monospace, 'SF Mono', Consolas, monospace" font-size="20" fill="#ffd700">Next.js 15.5 · PostgreSQL · Socket.IO</text>
|
||||
</g>
|
||||
|
||||
<g id="project-proof" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif">
|
||||
<rect x="632" y="40" width="504" height="340" rx="16" fill="#171717" stroke="#2e2e2e" stroke-width="2"/>
|
||||
|
||||
<rect x="664" y="68" width="96" height="36" rx="18" fill="#262626"/>
|
||||
<text x="712" y="92" font-size="18" fill="#fafafa" text-anchor="middle">Antica</text>
|
||||
<rect x="1000" y="68" width="104" height="36" rx="18" fill="#ffd700"/>
|
||||
<text x="1052" y="92" font-size="18" font-weight="700" fill="#0a0a0a" text-anchor="middle">LEILÃO</text>
|
||||
|
||||
<g id="item">
|
||||
<rect x="664" y="124" width="84" height="84" rx="12" fill="#262626"/>
|
||||
<line x1="696" y1="176" x2="734" y2="138" stroke="#e5e5e5" stroke-width="8" stroke-linecap="round"/>
|
||||
<line x1="684" y1="170" x2="702" y2="188" stroke="#ffd700" stroke-width="6" stroke-linecap="round"/>
|
||||
<line x1="690" y1="182" x2="680" y2="192" stroke="#a16207" stroke-width="6" stroke-linecap="round"/>
|
||||
<circle cx="677" cy="195" r="5" fill="#ffd700"/>
|
||||
<text x="768" y="160" font-size="26" font-weight="700" fill="#fafafa">Grand Sanguine Blade</text>
|
||||
<text x="768" y="192" font-size="20" fill="#a1a1a1">Espadas · nível 600 · Knights</text>
|
||||
</g>
|
||||
|
||||
<g id="currencies" font-size="18" fill="#fafafa">
|
||||
<text x="664" y="246" font-family="ui-monospace, 'SF Mono', Consolas, monospace" fill="#a1a1a1">aceita</text>
|
||||
<rect x="664" y="258" width="64" height="36" rx="8" fill="#262626"/>
|
||||
<text x="696" y="282" text-anchor="middle">PIX</text>
|
||||
<rect x="736" y="258" width="128" height="36" rx="8" fill="#262626"/>
|
||||
<text x="800" y="282" text-anchor="middle">Tibia Coins</text>
|
||||
<rect x="872" y="258" width="120" height="36" rx="8" fill="#262626"/>
|
||||
<text x="932" y="282" text-anchor="middle">gold coins</text>
|
||||
<rect x="1000" y="258" width="76" height="36" rx="8" fill="#262626"/>
|
||||
<text x="1038" y="282" text-anchor="middle">troca</text>
|
||||
</g>
|
||||
|
||||
<g id="actions" font-size="20" font-weight="700" text-anchor="middle">
|
||||
<rect x="664" y="316" width="200" height="44" rx="10" fill="#ffd700"/>
|
||||
<text x="764" y="345" fill="#0a0a0a">Dar Lance</text>
|
||||
<rect x="880" y="316" width="224" height="44" rx="10" fill="none" stroke="#ffd700" stroke-width="2"/>
|
||||
<text x="992" y="345" fill="#ffd700">Intenção de compra</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
Reference in new issue
Block a user