Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
SWAG 주 의회 공식 입법·제안·기타 안건 검토 및 투표 시스템
Официальная система рассмотрения законопроектов, инициатив и иных вопросов, вынесенных на голосование членов Генеральной Ассамблеи и Конгресса штата SWAG.
비즈니스JavaScript · CSSGitHub @Fegke12온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Электронное голосование для Генеральной Ассамблеи RP-штата SWAG: приглашения, тайный режим, авто-итог и PDF-протокол. Cloudflare Workers + D1
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
🗳 Генеральная Ассамблея штата SWAG — электронная система голосования Голосование по законопроектам, поправкам, кадровым вопросам и инициативам для Генеральной Ассамблеи и Конгресса RP-штата SWAG — с приглашениями, тайным режимом, автоматическим итогом и официальным протоколом в PDF.README 전문 보기 ↗
Голосование по законопроектам, поправкам, кадровым вопросам и инициативам для Генеральной Ассамблеи и Конгресса RP-штата SWAG — с приглашениями, тайным режимом, автоматическим итогом и официальным протоколом в PDF.
Участник получает от Спикера Конгресса ссылку‑приглашение → проходит идентификацию → изучает законопроект → выбирает «ЗА / ПРОТИВ / ВОЗДЕРЖАЛСЯ» → подтверждает → получает номер регистрации голоса. После завершения система сама подводит итог по заданному правилу, формирует постановление и официальный протокол (PDF).
Система работает на Cloudflare Workers (сервер) + D1 (база данных, SQLite) + Cron Triggers (автозавершение голосований). На бесплатном тарифе Cloudflare этого хватает с большим запасом, сервер не «засыпает».
Нужен Node.js 20+.
npm install
npm run dev # http://localhost:8787 — с демо-данными
npm test # 34 сквозные проверки на локальном движке Cloudflare
Локальные настройки — в файле .dev.vars (не попадает в git):
SPEAKER_PASSWORD=любой_пароль
SPEAKER_NAME=Имя Фамилия
SEED_DEMO=1
/ — главная, /speaker — панель Спикера (логин speaker), /vote/8FJ2-KD91-XP72 — демо-приглашение.swag-vote. Её Database ID вписать в wrangler.toml (database_id).npx wrangler deploy (по умолчанию).SPEAKER_PASSWORD — пароль Спикера.wrangler.toml. Каждый push в main деплоится сам.Или из терминала: npx wrangler login, npx wrangler d1 create swag-vote (ID → wrangler.toml), npx wrangler secret put SPEAKER_PASSWORD, npm run deploy.
[vars] в wrangler.toml)| Переменная | По умолчанию | Назначение |
|---|---|---|
SPEAKER_PASSWORD | — (секрет) | Пароль Спикера. Смена секрета = смена пароля |
SPEAKER_LOGIN | speaker | Логин Спикера |
SPEAKER_NAME | Спикер Конгресса | Имя в протоколах и на страницах голосования |
PUBLIC_URL | адрес запроса | Базовый адрес ссылок-приглашений (если свой домен) |
DISPLAY_TZ | Europe/Moscow | Часовой пояс в скачиваемых документах |
SEED_DEMO | 0 | 1 — загрузить демо-голосования в пустую базу |
wrangler.toml конфигурация Worker: D1, статика, cron, переменные
src/
worker.js маршруты API (Hono), выдача страниц, обработчик cron
lib/schema.js схема БД + триггеры целостности (применяется автоматически)
lib/db.js обёртка D1, счётчики, распознавание ошибок базы
lib/util.js ошибки, валидация, Web Crypto
services/ бизнес-логика — все проверки здесь, на сервере
votes.js голосования, статусы, подсчёт, итог, завершение
participation.js приглашение → идентификация → регистрация голоса
invites.js приглашения: коды, срок, лимит, отзыв, продление
rules.js правила принятия (не зашиты в код — задаются Спикером)
protocols.js снимок итогов для протокола (с контрольной суммой)
events.js журнал действий и уведомления
scheduler.js начало, «осталось 30 минут», автозавершение, протоколы
auth.js вход Спикера (секрет + серверные сессии)
markdown.js, documents.js текст законопроекта и его скачиваемая версия
seed.js демо-данные
public/ фронтенд без сборки; PDF протокола собирается в браузере (pdfmake)
test/e2e.js сквозные тесты
Frontend — только интерфейс. Backend (Worker) — все решения: авторизация приглашений, регистрация голосов, проверка повторного голосования, подсчёт, итог, протоколы. Database (D1) — пользователи, сессии, голосования, редакции, приложения, приглашения, участники, бюллетени, протоколы, журнал, уведомления, комментарии, ограничения частоты запросов.
Код работает с базой через src/lib/db.js и обычный SQL — при необходимости переносится на PostgreSQL (например, через Hyperdrive) заменой этого модуля.
httpOnly‑cookie с токеном; в БД хранится только его SHA‑256.UNIQUE(vote_id, name_key)), атомарная отметка has_voted, уникальный бюллетень на участника.max_uses) проверяется в базе; опция «одно устройство — один участник».participant_id и без времени, со случайным id и номером — сопоставить участника и выбор невозможно ни по ссылке, ни по порядку записей. Выбор не попадает в журнал и уведомления; промежуточный подсчёт скрыт от Спикера до завершения.SameSite=Strict, лимит попыток входа (хранится в D1). Защита Cloudflare от DDoS — автоматически.Участник: вход по ссылке/коду/QR или по именной ссылке · идентификация (Лидер / Заместитель / вручную + департамент и подразделение) · таймер · полный текст с оглавлением (статьи, пункты, подпункты, таблицы, важные положения) · скачивание документа · приложения · обсуждение · выбор → подтверждение → модальное окно → номер голоса · понятные экраны ошибок · уведомления · итоги с диаграммой, постановлением и протоколом PDF.
Спикер: дашборд · реестр голосований (статусы, поиск, тип, даты — архив законопроектов) · создание (8 типов, редактор с предпросмотром, сроки, правило, кворум, тайное/открытое, настройки публикации, приглашение) · приглашения (копировать, QR SVG/PNG, отозвать, продлить, новые ссылки, именные ссылки списком) · участники (✓ / ◷, заявки: допустить / отклонить, удаление) · редакции текста с историей · прикрепление документов · модерация обсуждения · перенос, продление, досрочное завершение, отмена · фиксация решения при ручном правиле · повторное голосование · вынесение поправки отдельным голосованием · экспорт CSV/JSON · протокол HTML (печать) и PDF · журнал событий · статистика активности членов Ассамблеи · уведомления.
Правила принятия: простое большинство · квалифицированное (любая доля) · единогласно · необходимое число голосов «ЗА» · порог в % · решение Спикера по итогам. База: от проголосовавших / от «ЗА»+«ПРОТИВ» / от приглашённых. Кворум: число или процент.
Схема и сервисы рассчитаны на расширение. Следующий логичный шаг — несколько вопросов в одном голосовании: таблица vote_questions, у бюллетеня появляется question_id, подсчёт и протокол группируются по вопросам. Загрузка файлов (сейчас приложения — ссылки) — добавить хранилище (S3/диск) и таблицу files.