diff --git a/.env.example b/.env.example deleted file mode 100644 index a437a5b..0000000 --- a/.env.example +++ /dev/null @@ -1,29 +0,0 @@ -# Django -SECRET_KEY=your-secret-key-here -DEBUG=True -DJANGO_SETTINGS_MODULE=config.settings.development -ALLOWED_HOSTS=localhost,127.0.0.1 - -# Database -DB_NAME=fonrey -DB_USER=fonrey -DB_PASSWORD=fonrey -DB_HOST=db -DB_PORT=5432 - -# Redis -REDIS_URL=redis://redis:6379/0 -CELERY_BROKER_URL=redis://redis:6379/1 - -# Cloudflare R2 -R2_ENDPOINT_URL=https://.r2.cloudflarestorage.com -R2_ACCESS_KEY_ID= -R2_SECRET_ACCESS_KEY= -R2_BUCKET_NAME=media -R2_CUSTOM_DOMAIN= - -# Sentry(production 填写) -SENTRY_DSN= - -# PII 加密密钥(AES-256,生产环境必须替换) -PHONE_ENCRYPTION_KEY= diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 7a78dad..0000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.env -*.pyc -__pycache__/ -.DS_Store -node_modules/ -static/css/output.css -media/ -dist/ diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index c5e27a5..0000000 --- a/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -RUN apt-get update && apt-get install -y libpq-dev gcc && rm -rf /var/lib/apt/lists/* -COPY requirements/base.txt requirements/base.txt -RUN pip install --no-cache-dir -r requirements/base.txt -COPY . . -EXPOSE 8000 -CMD ["uvicorn", "config.asgi:application", "--host", "0.0.0.0", "--port", "8000"] diff --git a/Makefile b/Makefile deleted file mode 100644 index d948e82..0000000 --- a/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -.PHONY: dev migrate shell createsuperuser test lint - -dev: - docker compose up - -migrate: - docker compose exec web python manage.py migrate_schemas --shared - docker compose exec web python manage.py migrate_schemas - -shell: - docker compose exec web python manage.py shell_plus - -test: - docker compose exec web pytest apps/ -v - -lint: - ruff check . && black --check . - -tailwind-build: - npm run build - -createsuperuser: - docker compose exec web python manage.py create_tenant_superuser diff --git a/apps/__init__.py b/apps/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/__init__.py b/apps/account/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/admin.py b/apps/account/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/account/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/account/apps.py b/apps/account/apps.py deleted file mode 100644 index d198496..0000000 --- a/apps/account/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class AccountConfig(AppConfig): - name = "apps.account" - verbose_name = "登录认证" diff --git a/apps/account/models/.gitkeep b/apps/account/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/models/__init__.py b/apps/account/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/services/.gitkeep b/apps/account/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/services/__init__.py b/apps/account/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/tasks.py b/apps/account/tasks.py deleted file mode 100644 index cc9b107..0000000 --- a/apps/account/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "account task placeholder" diff --git a/apps/account/tests/.gitkeep b/apps/account/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/tests/__init__.py b/apps/account/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/account/urls.py b/apps/account/urls.py deleted file mode 100644 index 3428704..0000000 --- a/apps/account/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "account" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/account/views.py b/apps/account/views.py deleted file mode 100644 index b0896ee..0000000 --- a/apps/account/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("account app placeholder") diff --git a/apps/client/__init__.py b/apps/client/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/client/admin.py b/apps/client/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/client/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/client/apps.py b/apps/client/apps.py deleted file mode 100644 index b63df23..0000000 --- a/apps/client/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class ClientConfig(AppConfig): - name = "apps.client" - verbose_name = "客源管理" diff --git a/apps/client/models/.gitkeep b/apps/client/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/client/models/__init__.py b/apps/client/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/client/services/.gitkeep b/apps/client/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/client/services/__init__.py b/apps/client/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/client/tasks.py b/apps/client/tasks.py deleted file mode 100644 index c211dc7..0000000 --- a/apps/client/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "client task placeholder" diff --git a/apps/client/tests/.gitkeep b/apps/client/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/client/tests/__init__.py b/apps/client/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/client/urls.py b/apps/client/urls.py deleted file mode 100644 index bb45b80..0000000 --- a/apps/client/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "client" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/client/views.py b/apps/client/views.py deleted file mode 100644 index 5e0bca4..0000000 --- a/apps/client/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("client app placeholder") diff --git a/apps/complex/__init__.py b/apps/complex/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/complex/admin.py b/apps/complex/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/complex/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/complex/apps.py b/apps/complex/apps.py deleted file mode 100644 index c012532..0000000 --- a/apps/complex/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class ComplexConfig(AppConfig): - name = "apps.complex" - verbose_name = "楼盘管理" diff --git a/apps/complex/models/.gitkeep b/apps/complex/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/complex/models/__init__.py b/apps/complex/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/complex/services/.gitkeep b/apps/complex/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/complex/services/__init__.py b/apps/complex/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/complex/tasks.py b/apps/complex/tasks.py deleted file mode 100644 index 5236757..0000000 --- a/apps/complex/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "complex task placeholder" diff --git a/apps/complex/tests/.gitkeep b/apps/complex/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/complex/tests/__init__.py b/apps/complex/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/complex/urls.py b/apps/complex/urls.py deleted file mode 100644 index c932e88..0000000 --- a/apps/complex/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "complex" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/complex/views.py b/apps/complex/views.py deleted file mode 100644 index 26809a6..0000000 --- a/apps/complex/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("complex app placeholder") diff --git a/apps/org/__init__.py b/apps/org/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/org/admin.py b/apps/org/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/org/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/org/apps.py b/apps/org/apps.py deleted file mode 100644 index 76a6fce..0000000 --- a/apps/org/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class OrgConfig(AppConfig): - name = "apps.org" - verbose_name = "组织人事" diff --git a/apps/org/models/.gitkeep b/apps/org/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/org/models/__init__.py b/apps/org/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/org/services/.gitkeep b/apps/org/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/org/services/__init__.py b/apps/org/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/org/tasks.py b/apps/org/tasks.py deleted file mode 100644 index 7e29b91..0000000 --- a/apps/org/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "org task placeholder" diff --git a/apps/org/tests/.gitkeep b/apps/org/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/org/tests/__init__.py b/apps/org/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/org/urls.py b/apps/org/urls.py deleted file mode 100644 index 388f639..0000000 --- a/apps/org/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "org" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/org/views.py b/apps/org/views.py deleted file mode 100644 index ba1f257..0000000 --- a/apps/org/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("org app placeholder") diff --git a/apps/permission/__init__.py b/apps/permission/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/permission/admin.py b/apps/permission/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/permission/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/permission/apps.py b/apps/permission/apps.py deleted file mode 100644 index 0d27980..0000000 --- a/apps/permission/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class PermissionConfig(AppConfig): - name = "apps.permission" - verbose_name = "权限管理" diff --git a/apps/permission/models/.gitkeep b/apps/permission/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/permission/models/__init__.py b/apps/permission/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/permission/services/.gitkeep b/apps/permission/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/permission/services/__init__.py b/apps/permission/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/permission/tasks.py b/apps/permission/tasks.py deleted file mode 100644 index 0a23640..0000000 --- a/apps/permission/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "permission task placeholder" diff --git a/apps/permission/tests/.gitkeep b/apps/permission/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/permission/tests/__init__.py b/apps/permission/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/permission/urls.py b/apps/permission/urls.py deleted file mode 100644 index cc08ddb..0000000 --- a/apps/permission/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "permission" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/permission/views.py b/apps/permission/views.py deleted file mode 100644 index 625df14..0000000 --- a/apps/permission/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("permission app placeholder") diff --git a/apps/property/__init__.py b/apps/property/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/property/admin.py b/apps/property/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/property/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/property/apps.py b/apps/property/apps.py deleted file mode 100644 index c2e5539..0000000 --- a/apps/property/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class PropertyConfig(AppConfig): - name = "apps.property" - verbose_name = "房源核心" diff --git a/apps/property/models/.gitkeep b/apps/property/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/property/models/__init__.py b/apps/property/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/property/services/.gitkeep b/apps/property/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/property/services/__init__.py b/apps/property/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/property/tasks.py b/apps/property/tasks.py deleted file mode 100644 index f297bad..0000000 --- a/apps/property/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "property task placeholder" diff --git a/apps/property/tests/.gitkeep b/apps/property/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/property/tests/__init__.py b/apps/property/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/property/urls.py b/apps/property/urls.py deleted file mode 100644 index 63f9162..0000000 --- a/apps/property/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "property" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/property/views.py b/apps/property/views.py deleted file mode 100644 index ca9efba..0000000 --- a/apps/property/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("property app placeholder") diff --git a/apps/region/__init__.py b/apps/region/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/region/admin.py b/apps/region/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/region/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/region/apps.py b/apps/region/apps.py deleted file mode 100644 index 6e69d6a..0000000 --- a/apps/region/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class RegionConfig(AppConfig): - name = "apps.region" - verbose_name = "区域管理" diff --git a/apps/region/models/.gitkeep b/apps/region/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/region/models/__init__.py b/apps/region/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/region/services/.gitkeep b/apps/region/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/region/services/__init__.py b/apps/region/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/region/tasks.py b/apps/region/tasks.py deleted file mode 100644 index 5c89472..0000000 --- a/apps/region/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "region task placeholder" diff --git a/apps/region/tests/.gitkeep b/apps/region/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/region/tests/__init__.py b/apps/region/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/region/urls.py b/apps/region/urls.py deleted file mode 100644 index 7179d93..0000000 --- a/apps/region/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "region" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/region/views.py b/apps/region/views.py deleted file mode 100644 index c768af5..0000000 --- a/apps/region/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("region app placeholder") diff --git a/apps/release/__init__.py b/apps/release/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/release/admin.py b/apps/release/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/release/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/release/apps.py b/apps/release/apps.py deleted file mode 100644 index e3e2297..0000000 --- a/apps/release/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class ReleaseConfig(AppConfig): - name = "apps.release" - verbose_name = "客户端发布管理" diff --git a/apps/release/models/.gitkeep b/apps/release/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/release/models/__init__.py b/apps/release/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/release/services/.gitkeep b/apps/release/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/release/services/__init__.py b/apps/release/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/release/tasks.py b/apps/release/tasks.py deleted file mode 100644 index f08a889..0000000 --- a/apps/release/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "release task placeholder" diff --git a/apps/release/tests/.gitkeep b/apps/release/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/release/tests/__init__.py b/apps/release/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/release/urls.py b/apps/release/urls.py deleted file mode 100644 index 6e9bb9b..0000000 --- a/apps/release/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "release" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/release/views.py b/apps/release/views.py deleted file mode 100644 index dddb5a8..0000000 --- a/apps/release/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("release app placeholder") diff --git a/apps/setting/__init__.py b/apps/setting/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/setting/admin.py b/apps/setting/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/setting/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/setting/apps.py b/apps/setting/apps.py deleted file mode 100644 index fba93c1..0000000 --- a/apps/setting/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class SettingConfig(AppConfig): - name = "apps.setting" - verbose_name = "系统设置" diff --git a/apps/setting/models/.gitkeep b/apps/setting/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/setting/models/__init__.py b/apps/setting/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/setting/services/.gitkeep b/apps/setting/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/setting/services/__init__.py b/apps/setting/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/setting/tasks.py b/apps/setting/tasks.py deleted file mode 100644 index e6b29a0..0000000 --- a/apps/setting/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "setting task placeholder" diff --git a/apps/setting/tests/.gitkeep b/apps/setting/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/setting/tests/__init__.py b/apps/setting/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/setting/urls.py b/apps/setting/urls.py deleted file mode 100644 index 1a8d1d8..0000000 --- a/apps/setting/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "setting" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/setting/views.py b/apps/setting/views.py deleted file mode 100644 index d3e7593..0000000 --- a/apps/setting/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("setting app placeholder") diff --git a/apps/tenant/__init__.py b/apps/tenant/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/tenant/admin.py b/apps/tenant/admin.py deleted file mode 100644 index 694323f..0000000 --- a/apps/tenant/admin.py +++ /dev/null @@ -1 +0,0 @@ -from django.contrib import admin diff --git a/apps/tenant/apps.py b/apps/tenant/apps.py deleted file mode 100644 index f077b66..0000000 --- a/apps/tenant/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class TenantConfig(AppConfig): - name = "apps.tenant" - verbose_name = "租户管理" diff --git a/apps/tenant/models.py b/apps/tenant/models.py deleted file mode 100644 index 2e15f01..0000000 --- a/apps/tenant/models.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.db import models -from django_tenants.models import DomainMixin, TenantMixin - - -class Tenant(TenantMixin): - name = models.CharField(max_length=100) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - - auto_create_schema = True - - class Meta: - verbose_name = "租户" - verbose_name_plural = "租户" - - def __str__(self) -> str: - return self.name - - -class Domain(DomainMixin): - class Meta: - verbose_name = "租户域名" - verbose_name_plural = "租户域名" diff --git a/apps/tenant/services/.gitkeep b/apps/tenant/services/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/tenant/services/__init__.py b/apps/tenant/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/tenant/tasks.py b/apps/tenant/tasks.py deleted file mode 100644 index 2df7365..0000000 --- a/apps/tenant/tasks.py +++ /dev/null @@ -1,6 +0,0 @@ -from celery import shared_task - - -@shared_task -def sample_task() -> str: - return "tenant task placeholder" diff --git a/apps/tenant/tests/.gitkeep b/apps/tenant/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/tenant/tests/__init__.py b/apps/tenant/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/apps/tenant/urls.py b/apps/tenant/urls.py deleted file mode 100644 index 1e052bb..0000000 --- a/apps/tenant/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "tenant" - -urlpatterns = [ - path("", views.index, name="index"), -] diff --git a/apps/tenant/views.py b/apps/tenant/views.py deleted file mode 100644 index f5a58f2..0000000 --- a/apps/tenant/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.http import HttpRequest, HttpResponse - - -def index(request: HttpRequest) -> HttpResponse: - return HttpResponse("tenant app placeholder") diff --git a/config/__init__.py b/config/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/config/asgi.py b/config/asgi.py deleted file mode 100644 index bc33ab2..0000000 --- a/config/asgi.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -from django.core.asgi import get_asgi_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.development") - -application = get_asgi_application() diff --git a/config/settings/__init__.py b/config/settings/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/config/settings/base.py b/config/settings/base.py deleted file mode 100644 index 358deed..0000000 --- a/config/settings/base.py +++ /dev/null @@ -1,144 +0,0 @@ -from pathlib import Path - -from decouple import Csv, config as env - -BASE_DIR = Path(__file__).resolve().parent.parent.parent - -SECRET_KEY = env("SECRET_KEY", default="django-insecure-change-me") -DEBUG = env("DEBUG", default=False, cast=bool) -ALLOWED_HOSTS = env("ALLOWED_HOSTS", default="localhost,127.0.0.1", cast=Csv()) - -SHARED_APPS = [ - "django_tenants", - "apps.tenant", - "apps.release", - "shared", - "django.contrib.contenttypes", - "django.contrib.auth", - "django.contrib.sessions", - "django.contrib.messages", - "django.contrib.staticfiles", - "django_celery_beat", - "django_celery_results", -] - -TENANT_APPS = [ - "apps.account", - "apps.permission", - "apps.org", - "apps.region", - "apps.complex", - "apps.property", - "apps.client", - "apps.setting", - "core", -] - -INSTALLED_APPS = list(SHARED_APPS) + list(TENANT_APPS) - -TENANT_MODEL = "tenant.Tenant" -TENANT_DOMAIN_MODEL = "tenant.Domain" -DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" - -DATABASES = { - "default": { - "ENGINE": "django_tenants.postgresql_backend", - "NAME": env("DB_NAME"), - "USER": env("DB_USER"), - "PASSWORD": env("DB_PASSWORD"), - "HOST": env("DB_HOST", default="localhost"), - "PORT": env("DB_PORT", default="5432"), - "CONN_MAX_AGE": 60, - "OPTIONS": {"pool_size": 10}, - } -} - -DATABASE_ROUTERS = ["django_tenants.routers.TenantSyncRouter"] - -CACHES = { - "default": { - "BACKEND": "django_redis.cache.RedisCache", - "LOCATION": env("REDIS_URL", default="redis://127.0.0.1:6379/0"), - "OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient"}, - "KEY_PREFIX": "fonrey", - } -} - -SESSION_ENGINE = "django.contrib.sessions.backends.cache" -SESSION_CACHE_ALIAS = "default" - -CELERY_BROKER_URL = env("CELERY_BROKER_URL", default="redis://127.0.0.1:6379/1") -CELERY_RESULT_BACKEND = "django-db" -CELERY_TASK_ALWAYS_EAGER = False -CELERY_TASK_TIME_LIMIT = 300 -CELERY_TASK_SOFT_TIME_LIMIT = 270 - -DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" -AWS_S3_ENDPOINT_URL = env("R2_ENDPOINT_URL", default="") -AWS_ACCESS_KEY_ID = env("R2_ACCESS_KEY_ID", default="") -AWS_SECRET_ACCESS_KEY = env("R2_SECRET_ACCESS_KEY", default="") -AWS_STORAGE_BUCKET_NAME = env("R2_BUCKET_NAME", default="media") -AWS_S3_CUSTOM_DOMAIN = env("R2_CUSTOM_DOMAIN", default=None) -AWS_DEFAULT_ACL = "private" - -ASGI_APPLICATION = "config.asgi.application" -WSGI_APPLICATION = "config.wsgi.application" -ROOT_URLCONF = "config.urls" - -MIDDLEWARE = [ - "django_tenants.middleware.main.TenantMainMiddleware", - "django.middleware.security.SecurityMiddleware", - "whitenoise.middleware.WhiteNoiseMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", - "django.middleware.csrf.CsrfViewMiddleware", - "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.middleware.clickjacking.XFrameOptionsMiddleware", - "core.middleware.audit.AuditMiddleware", -] - -SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") -SESSION_COOKIE_HTTPONLY = True -SESSION_COOKIE_SAMESITE = "Lax" -CSRF_COOKIE_HTTPONLY = False -X_FRAME_OPTIONS = "DENY" - -LANGUAGE_CODE = "zh-hans" -TIME_ZONE = "Asia/Shanghai" -USE_I18N = True -USE_TZ = True - -TEMPLATES = [ - { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [BASE_DIR / "templates"], - "APP_DIRS": True, - "OPTIONS": { - "context_processors": [ - "django.template.context_processors.debug", - "django.template.context_processors.request", - "django.contrib.auth.context_processors.auth", - "django.contrib.messages.context_processors.messages", - ] - }, - } -] - -HTMX_GLOBAL_CSRF = True - -STATIC_URL = "/static/" -STATIC_ROOT = BASE_DIR / "staticfiles" -STATICFILES_DIRS = [BASE_DIR / "static"] - -MEDIA_URL = "/media/" -MEDIA_ROOT = BASE_DIR / "media" - -PUBLIC_SCHEMA_URLCONF = "config.urls" - -LOGGING = { - "version": 1, - "disable_existing_loggers": False, - "handlers": {"console": {"class": "logging.StreamHandler"}}, - "root": {"handlers": ["console"], "level": "INFO"}, -} diff --git a/config/settings/development.py b/config/settings/development.py deleted file mode 100644 index 3ac92de..0000000 --- a/config/settings/development.py +++ /dev/null @@ -1,3 +0,0 @@ -from .base import * - -DEBUG = True diff --git a/config/settings/production.py b/config/settings/production.py deleted file mode 100644 index b7b2a17..0000000 --- a/config/settings/production.py +++ /dev/null @@ -1,22 +0,0 @@ -from decouple import config as env - -from .base import * - -DEBUG = False -ALLOWED_HOSTS = env("ALLOWED_HOSTS", default="localhost,127.0.0.1").split(",") - -SECURE_SSL_REDIRECT = True -SESSION_COOKIE_SECURE = True -CSRF_COOKIE_SECURE = True - -SENTRY_DSN = env("SENTRY_DSN", default="") -if SENTRY_DSN: - import sentry_sdk - from sentry_sdk.integrations.django import DjangoIntegration - - sentry_sdk.init( - dsn=SENTRY_DSN, - integrations=[DjangoIntegration()], - traces_sample_rate=0.1, - send_default_pii=False, - ) diff --git a/config/urls.py b/config/urls.py deleted file mode 100644 index 223094a..0000000 --- a/config/urls.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.conf import settings -from django.conf.urls.static import static -from django.db import connection -from django.http import HttpResponse -from django.urls import include, path -from django_tenants.utils import get_public_schema_name - - -def healthz(_request): - return HttpResponse("ok") - - -public_urlpatterns = [ - path("healthz/", healthz, name="healthz"), - path("tenant/", include("apps.tenant.urls")), - path("release/", include("apps.release.urls")), -] - -tenant_urlpatterns = [ - path("", include("apps.account.urls")), - path("permission/", include("apps.permission.urls")), - path("org/", include("apps.org.urls")), - path("region/", include("apps.region.urls")), - path("complex/", include("apps.complex.urls")), - path("property/", include("apps.property.urls")), - path("client/", include("apps.client.urls")), - path("setting/", include("apps.setting.urls")), -] - -if connection.schema_name == get_public_schema_name(): - urlpatterns = public_urlpatterns -else: - urlpatterns = tenant_urlpatterns - -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/config/wsgi.py b/config/wsgi.py deleted file mode 100644 index 3eb3a0c..0000000 --- a/config/wsgi.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.development") - -application = get_wsgi_application() diff --git a/core/__init__.py b/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/core/cache.py b/core/cache.py deleted file mode 100644 index cab3721..0000000 --- a/core/cache.py +++ /dev/null @@ -1,13 +0,0 @@ -from decouple import config as env - - -class RedisCache: - """Redis 工具骨架。""" - - @staticmethod - def get_client_url() -> str: - return env("REDIS_URL", default="redis://127.0.0.1:6379/0") - - @staticmethod - def make_key(*parts: str) -> str: - return ":".join(["fonrey", *parts]) diff --git a/core/encryption.py b/core/encryption.py deleted file mode 100644 index fd99f9f..0000000 --- a/core/encryption.py +++ /dev/null @@ -1,35 +0,0 @@ -import base64 -import hashlib - -from cryptography.fernet import Fernet -from django.conf import settings - - -class PhoneEncryption: - """ - 手机号 AES-256-GCM 加密存储 + SHA-256 哈希索引 - 存储字段:phone_encrypted(加密密文)+ phone_hash(哈希,用于精确查询) - 显示:脱敏格式 138****1234 - """ - - @staticmethod - def encrypt(phone: str) -> str: - """加密手机号,返回 base64 密文""" - ... - - @staticmethod - def decrypt(ciphertext: str) -> str: - """解密返回明文""" - ... - - @staticmethod - def hash(phone: str) -> str: - """返回 SHA-256 哈希(用于 DB 索引查询)""" - ... - - @staticmethod - def mask(phone: str) -> str: - """返回脱敏格式:138****1234""" - if not phone or len(phone) < 7: - return "***" - return phone[:3] + "****" + phone[-4:] diff --git a/core/htmx.py b/core/htmx.py deleted file mode 100644 index 6f9a7e1..0000000 --- a/core/htmx.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.http import HttpResponse - - -def htmx_response(content="", status=200, toast=None, redirect=None): - """ - toast: {"type": "success|error|warning|info", "message": "..."} - """ - response = HttpResponse(content, status=status) - if toast: - import json - - response["HX-Trigger"] = json.dumps({"fonrey:toast": toast}) - if redirect: - response["HX-Redirect"] = redirect - return response diff --git a/core/middleware/__init__.py b/core/middleware/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/core/middleware/audit.py b/core/middleware/audit.py deleted file mode 100644 index 5d7fb6c..0000000 --- a/core/middleware/audit.py +++ /dev/null @@ -1,9 +0,0 @@ -class AuditMiddleware: - """审计日志中间件骨架。""" - - def __init__(self, get_response): - self.get_response = get_response - - def __call__(self, request): - response = self.get_response(request) - return response diff --git a/core/models/__init__.py b/core/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/core/models/base.py b/core/models/base.py deleted file mode 100644 index cc83d94..0000000 --- a/core/models/base.py +++ /dev/null @@ -1,80 +0,0 @@ -import uuid - -from django.db import models -from django.utils import timezone - - -class UUIDPrimaryKeyModel(models.Model): - """所有业务模型的根基类:UUID v4 主键""" - - id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) - - class Meta: - abstract = True - - -class TimeStampedModel(UUIDPrimaryKeyModel): - """追加创建/更新时间(TIMESTAMPTZ)""" - - created_at = models.DateTimeField(auto_now_add=True, db_index=True) - updated_at = models.DateTimeField(auto_now=True) - - class Meta: - abstract = True - ordering = ["-created_at"] - - -class ActiveManager(models.Manager): - """默认只返回未软删除的记录""" - - def get_queryset(self): - return super().get_queryset().filter(deleted_at__isnull=True) - - -class SoftDeleteModel(TimeStampedModel): - """软删除:deleted_at=NULL 表示未删除""" - - deleted_at = models.DateTimeField(null=True, blank=True, db_index=True) - objects = ActiveManager() - all_objects = models.Manager() - - def delete(self, using=None, keep_parents=False): - self.deleted_at = timezone.now() - self.save(update_fields=["deleted_at"]) - - def hard_delete(self): - super().delete() - - def restore(self): - self.deleted_at = None - self.save(update_fields=["deleted_at"]) - - @property - def is_deleted(self): - return self.deleted_at is not None - - class Meta: - abstract = True - - -class AuditedModel(SoftDeleteModel): - """审计字段:操作人(FK to Staff,允许 NULL 表示系统操作)""" - - created_by = models.ForeignKey( - "org.Staff", - null=True, - blank=True, - on_delete=models.SET_NULL, - related_name="%(app_label)s_%(class)s_created", - db_index=True, - ) - updated_by = models.ForeignKey( - "org.Staff", - null=True, - blank=True, - on_delete=models.SET_NULL, - related_name="%(app_label)s_%(class)s_updated", - ) - - class Meta: - abstract = True diff --git a/core/templatetags/__init__.py b/core/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/core/templatetags/heroicons.py b/core/templatetags/heroicons.py deleted file mode 100644 index 5065a71..0000000 --- a/core/templatetags/heroicons.py +++ /dev/null @@ -1,21 +0,0 @@ -import os - -from django import template -from django.utils.safestring import mark_safe - -register = template.Library() -ICONS_PATH = os.path.join(os.path.dirname(__file__), "..", "static", "icons") - - -@register.simple_tag -def heroicon(name: str, size: str = "24", style: str = "outline", css_class: str = "") -> str: - """ - 用法: {% heroicon 'plus' %} - {% heroicon 'trash' size='20' style='solid' css_class='text-danger-600' %} - """ - css = ( - f'class="w-{size//4 if isinstance(size, int) else size} ' - f'h-{size//4 if isinstance(size, int) else size} {css_class}"' - ) - _ = css - return mark_safe(f"") diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml deleted file mode 100644 index caf38b0..0000000 --- a/docker-compose.prod.yml +++ /dev/null @@ -1,55 +0,0 @@ -services: - web: - build: . - env_file: .env - command: gunicorn config.asgi:application -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 - ports: - - "8001:8000" - depends_on: - - db - - redis - networks: - - fonrey_net - - db: - image: postgres:16-alpine - env_file: .env - volumes: - - postgres_data:/var/lib/postgresql/data - networks: - - fonrey_net - - redis: - image: redis:7-alpine - env_file: .env - volumes: - - redis_data:/data - networks: - - fonrey_net - - celery: - build: . - env_file: .env - command: celery -A config worker -l info - depends_on: - - redis - - db - networks: - - fonrey_net - - celery-beat: - build: . - env_file: .env - command: celery -A config beat -l info - depends_on: - - redis - - db - networks: - - fonrey_net - -networks: - fonrey_net: - -volumes: - postgres_data: - redis_data: diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 6af734f..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,79 +0,0 @@ -services: - web: - build: . - env_file: .env - command: uvicorn config.asgi:application --host 0.0.0.0 --port 8000 - volumes: - - .:/app - ports: - - "8001:8000" - depends_on: - - db - - redis - networks: - - fonrey_net - - db: - image: postgres:16-alpine - env_file: .env - environment: - POSTGRES_DB: ${DB_NAME} - POSTGRES_USER: ${DB_USER} - POSTGRES_PASSWORD: ${DB_PASSWORD} - ports: - - "5432:5432" - volumes: - - postgres_data:/var/lib/postgresql/data - networks: - - fonrey_net - - redis: - image: redis:7-alpine - env_file: .env - ports: - - "6379:6379" - volumes: - - redis_data:/data - networks: - - fonrey_net - - celery: - build: . - env_file: .env - command: celery -A config worker -l info - volumes: - - .:/app - depends_on: - - redis - - db - networks: - - fonrey_net - - celery-beat: - build: . - env_file: .env - command: celery -A config beat -l info - volumes: - - .:/app - depends_on: - - redis - - db - networks: - - fonrey_net - - tailwind: - image: node:20-alpine - working_dir: /app - env_file: .env - command: sh -c "npm install && npm run watch" - volumes: - - .:/app - networks: - - fonrey_net - -networks: - fonrey_net: - -volumes: - postgres_data: - redis_data: diff --git a/manage.py b/manage.py deleted file mode 100644 index b4b9546..0000000 --- a/manage.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -import os -import sys - - -def main(): - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.development") - try: - from django.core.management import execute_from_command_line - except ImportError as exc: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and available on your " - "PYTHONPATH environment variable? Did you forget to activate a virtual " - "environment?" - ) from exc - execute_from_command_line(sys.argv) - - -if __name__ == "__main__": - main() diff --git a/package.json b/package.json deleted file mode 100644 index a7acc51..0000000 --- a/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "fonrey-frontend", - "version": "1.0.0", - "private": true, - "scripts": { - "build": "tailwindcss -i ./static/css/main.css -o ./static/css/output.css --minify", - "watch": "tailwindcss -i ./static/css/main.css -o ./static/css/output.css --watch" - }, - "devDependencies": { - "tailwindcss": "^3.4.0" - } -} diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 527e869..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,18 +0,0 @@ -[tool.ruff] -line-length = 100 -select = ["E", "F", "I", "N", "W", "UP"] -ignore = ["E501"] -target-version = "py312" - -[tool.black] -line-length = 100 -target-version = ["py312"] - -[tool.isort] -profile = "black" -line_length = 100 - -[tool.pytest.ini_options] -DJANGO_SETTINGS_MODULE = "config.settings.development" -python_files = ["test_*.py", "*_test.py"] -addopts = "--reuse-db" diff --git a/requirements/base.txt b/requirements/base.txt deleted file mode 100644 index 55f2825..0000000 --- a/requirements/base.txt +++ /dev/null @@ -1,16 +0,0 @@ -Django==4.2.16 -django-tenants==3.7.0 -psycopg2-binary==2.9.9 -django-redis==5.4.0 -celery==5.4.0 -django-celery-beat==2.7.0 -django-celery-results==2.5.1 -django-storages[s3]==1.14.4 -boto3==1.35.0 -cryptography==43.0.0 -whitenoise==6.8.2 -gunicorn==23.0.0 -uvicorn[standard]==0.32.0 -sentry-sdk[django]==2.18.0 -python-decouple==3.8 -Pillow==11.0.0 diff --git a/requirements/development.txt b/requirements/development.txt deleted file mode 100644 index 27f1645..0000000 --- a/requirements/development.txt +++ /dev/null @@ -1,6 +0,0 @@ --r base.txt -ruff==0.7.0 -black==24.10.0 -pytest-django==4.9.0 -factory-boy==3.3.1 -django-debug-toolbar==4.4.6 diff --git a/requirements/production.txt b/requirements/production.txt deleted file mode 100644 index a3e81b8..0000000 --- a/requirements/production.txt +++ /dev/null @@ -1 +0,0 @@ --r base.txt diff --git a/shared/__init__.py b/shared/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shared/apps.py b/shared/apps.py deleted file mode 100644 index 76ed86a..0000000 --- a/shared/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.apps import AppConfig - - -class SharedConfig(AppConfig): - default_auto_field = "django.db.models.UUIDField" - name = "shared" - verbose_name = "公共 Schema" diff --git a/static/css/main.css b/static/css/main.css deleted file mode 100644 index b5c61c9..0000000 --- a/static/css/main.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/static/js/main.js b/static/js/main.js deleted file mode 100644 index 3b7ea4f..0000000 --- a/static/js/main.js +++ /dev/null @@ -1,49 +0,0 @@ -(function () { - if (window.Alpine && window.Alpine.plugin && window.Alpine.$persist) { - window.Alpine.plugin(window.Alpine.$persist); - } - - function createToast(payload) { - var container = document.getElementById("toast-container"); - if (!container || !payload || !payload.message) { - return; - } - - var type = payload.type || "info"; - var color = { - success: "border-success-600", - error: "border-danger-600", - warning: "border-warning-600", - info: "border-info-600", - }[type] || "border-info-600"; - - var item = document.createElement("div"); - item.className = "bg-white border-l-4 " + color + " shadow-xs rounded px-4 py-3 text-sm min-w-[240px]"; - item.textContent = payload.message; - container.appendChild(item); - - window.setTimeout(function () { - item.remove(); - }, 4000); - } - - document.addEventListener("DOMContentLoaded", function () { - document.body.addEventListener("htmx:afterRequest", function (event) { - var xhr = event.detail && event.detail.xhr; - if (!xhr) { - return; - } - var trigger = xhr.getResponseHeader("HX-Trigger"); - if (!trigger) { - return; - } - try { - var parsed = JSON.parse(trigger); - if (parsed["fonrey:toast"]) { - createToast(parsed["fonrey:toast"]); - } - } catch (_err) { - } - }); - }); -})(); diff --git a/static/vendor/alpine.min.js b/static/vendor/alpine.min.js deleted file mode 100644 index e69de29..0000000 diff --git a/static/vendor/flatpickr.min.css b/static/vendor/flatpickr.min.css deleted file mode 100644 index e69de29..0000000 diff --git a/static/vendor/htmx.min.js b/static/vendor/htmx.min.js deleted file mode 100644 index e69de29..0000000 diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 2b245c3..0000000 --- a/tailwind.config.js +++ /dev/null @@ -1,61 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - "./templates/**/*.html", - "./apps/**/templates/**/*.html", - "./static/js/**/*.js", - ], - theme: { - extend: { - colors: { - primary: { - 50: "#F0FDFA", - 100: "#CCFBF1", - 200: "#99F6E4", - 300: "#5EEAD4", - 400: "#2DD4BF", - 500: "#14B8A6", - 600: "#0F766E", - 700: "#0F766E", - 800: "#134E4A", - }, - neutral: { - 50: "#F8FAFC", - 100: "#F1F5F9", - 200: "#E2E8F0", - 300: "#CBD5E1", - 400: "#94A3B8", - 500: "#64748B", - 600: "#475569", - 700: "#334155", - 800: "#1E293B", - 900: "#0F172A", - }, - success: { 600: "#16A34A" }, - warning: { 600: "#D97706" }, - danger: { 600: "#DC2626" }, - info: { 600: "#2563EB" }, - }, - fontFamily: { - sans: ["Inter", "PingFang SC", "Microsoft YaHei", "sans-serif"], - }, - zIndex: { - 60: "60", - 70: "70", - }, - boxShadow: { - xs: "0 1px 2px 0 rgb(15 23 42 / 0.06)", - }, - keyframes: { - "slide-in-right": { - "0%": { transform: "translateX(100%)", opacity: "0" }, - "100%": { transform: "translateX(0)", opacity: "1" }, - }, - }, - animation: { - "slide-in-right": "slide-in-right 0.25s ease-out", - }, - }, - }, - plugins: [], -}; diff --git a/templates/base.html b/templates/base.html deleted file mode 100644 index 747ec15..0000000 --- a/templates/base.html +++ /dev/null @@ -1,21 +0,0 @@ -{% load static %} - - - - - - {% block title %}Fonrey{% endblock %} - - {% if use_flatpickr %} - - {% endif %} - {% block extra_head %}{% endblock %} - - - {% block content %}{% endblock %} - - - - {% block extra_js %}{% endblock %} - - diff --git a/templates/components/empty-state.html b/templates/components/empty-state.html deleted file mode 100644 index 692f29d..0000000 --- a/templates/components/empty-state.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

暂无数据

-
-
diff --git a/templates/components/modal.html b/templates/components/modal.html deleted file mode 100644 index bfaa253..0000000 --- a/templates/components/modal.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/templates/components/pagination.html b/templates/components/pagination.html deleted file mode 100644 index e8623b0..0000000 --- a/templates/components/pagination.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

第 1 页,共 1 页

- -
diff --git a/templates/components/sidebar.html b/templates/components/sidebar.html deleted file mode 100644 index c0fba38..0000000 --- a/templates/components/sidebar.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/templates/components/toast.html b/templates/components/toast.html deleted file mode 100644 index 2c91424..0000000 --- a/templates/components/toast.html +++ /dev/null @@ -1,3 +0,0 @@ -
-

{{ message|default:"操作完成" }}

-
diff --git a/templates/components/topbar.html b/templates/components/topbar.html deleted file mode 100644 index 1098fb5..0000000 --- a/templates/components/topbar.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

工作台

-
-
diff --git a/templates/errors/403.html b/templates/errors/403.html deleted file mode 100644 index d269718..0000000 --- a/templates/errors/403.html +++ /dev/null @@ -1,3 +0,0 @@ -{% extends "base.html" %} -{% block title %}403{% endblock %} -{% block content %}
403 Forbidden
{% endblock %} diff --git a/templates/errors/404.html b/templates/errors/404.html deleted file mode 100644 index dfbc7d0..0000000 --- a/templates/errors/404.html +++ /dev/null @@ -1,3 +0,0 @@ -{% extends "base.html" %} -{% block title %}404{% endblock %} -{% block content %}
404 Not Found
{% endblock %} diff --git a/templates/errors/500.html b/templates/errors/500.html deleted file mode 100644 index 0d7d02f..0000000 --- a/templates/errors/500.html +++ /dev/null @@ -1,3 +0,0 @@ -{% extends "base.html" %} -{% block title %}500{% endblock %} -{% block content %}
500 Server Error
{% endblock %} diff --git a/templates/layouts/app.html b/templates/layouts/app.html deleted file mode 100644 index 16f29ee..0000000 --- a/templates/layouts/app.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends "base.html" %} - -{% block body_class %}bg-neutral-50 text-neutral-900{% endblock %} - -{% block content %} -
-
-
Fonrey
- -
- - - -
-
- - - -
- {% include "components/topbar.html" %} -
-
- {% block app_content %}{% endblock %} -
-
-
- -
-
- - -{% endblock %} - -{% block extra_js %} - -{% endblock %} diff --git a/templates/layouts/auth.html b/templates/layouts/auth.html deleted file mode 100644 index bd073e2..0000000 --- a/templates/layouts/auth.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "base.html" %} - -{% block body_class %}min-h-screen bg-neutral-50{% endblock %} - -{% block content %} -
-
-
- {% block auth_content %}{% endblock %} -
-
-
-{% endblock %}