- ウェブサイト: https://soji.dev
- Twitter: @sofpyon
学園祭運営支援ウェブシステム。
[DEPRECATED] inaka-portal は PortalDots に改称し、リポジトリも移転します。移行先➡️
Home Page: https://github.com/portal-dots/PortalDots
License: MIT License
学園祭運営支援ウェブシステム。
現状、フォーム一覧ページ・詳細画面から申請フォームエディターへアクセスする手段が無いので、アクセスできるようにしたいです
現状、申請やユーザーは削除できないようになっているが、削除できるようにする。
現状、一般ユーザーが自身のユーザー情報を変更する方法がない。
@hosakou
実装内容については対面で打ち合わせます!
現状、DB 上には最新の申請内容しか保存されないが、申請の変更履歴を閲覧できるようにしたい。
第2世代 理大祭ウェブポータル と同じように、場所にはタグを付けられるようにする。
S : スタッフユーザー
A : 回答者(一般ユーザー)
回答更新時、 form_answer_details
に対し update
を実行するように設計されているため。
新しく追加された設問については form_answer_details
にレコードがないため、設問 d に対して update
しても何も起こらない。
update
を delete
+ insert
に置き換える
form_answer_details
には適切なインデックスが設定されていないため、 ON DUPLICATE KEY UPDATE
文は利用できないid
が増え続けてしまう(全ての DB テーブルに対し適切なインデックスを設定した上で)
updateOrInsert
を利用する
団体新規作成画面において、メール認証が完了していないユーザーも団体責任者・学園祭係になれてしまう。
メール認証が完了していない状態(=本人確認ができていない状態)では、そのユーザーは団体責任者・学園祭係になれないようにしたい。
現状、HTTPリクエストは1件ずつ実行するようにしている。
しかし、例えば設問作成ボタンを複数回クリックした場合、1件ずつサーバーに新規設問作成のリクエストを送信するので、非常に遅い。
妙に ci_sessions テーブルだけ SELECT が遅いなあと思っていたら、ci_sessions には INDEX がなかった!
スタッフモードの「配布資料管理」にアクセスすると、500エラーが表示されてしまう。
配布資料を保存するフォルダのアクセス権の問題?
docker-compose.yml
において、 depends_on
による起動順序指定を行なっていないため?ドキュメントを執筆している際、説明がわかりにくくなるようであれば、 inaka-portal 自体のコードを変更することも検討する。
現在、申請フォームページの URL は以下のような形式になっている。
URL の途中に団体IDが挟まっているため、例えば「パンフ申請のURLはこれです!ここからアクセスしてね!」という誘導ができない。
そこで、申請フォームページの URL は以下のような形式にしたい。
具体的な実装内容として、
現状、以下 2 つの ESLint ルールについては、 error ではなく warning になるようにしている。
ずっと warning に設定して誤魔化し続けるわけにはいかないので、対処する。
import/no-cycle
に関する行を消す「理大祭ウェブポータ(2nd gen.)」では、ログイン画面にお知らせを表示していたが、inaka-portal(第1世代に相当)でも同様の機能を実装したい
ESLint を導入したが、CSS 部分はまだだった。Stylelint を導入して、Vue ファイルや既存の CSS ファイルにチェックを入れたい。
現状、DB の Form テーブルには、1団体が回答できる最大数を指定できる max_answers
というカラムがあるが、このカラムの情報は使われていない。
max_answers
を元に、複数の回答を作成できるようにしたい。
環境構築方法について
inaka-portal 初回起動時、WordPress みたいにインストーラーが起動するようにしたい。
とか
#39 が終わったら着手する。
現状、申請ページは CodeIgniter で作成されているが、それを Laravel + Vue にする。
「ログイン状態を維持する」機能は Laravel が標準で持っている機能である。
remember_web_なんちゃら
という Cookie をセットすることによって、ログイン状態を維持している
…はずが、この Cookie がどうやら機能していない?
ログイン状態は session_id
という Cookie が管理している。この Cookie が存在しない場合、 Laravel は remember_web_なんちゃら
という Cookie が存在しているか確認し、存在する場合、この Cookie で自動ログインしてくれるものと僕は認識している。
しかし session_id
を消すと、自動ログインせず、普通にログイン画面が表示されてしまう。
この原因の調査をお願いしたいです!
現在の inaka-portal の Laravel は 5.8 だが、最新のバージョンは 6.x。
6.0 は LTS(長期サポート)版なので、inaka-portal も Laravel 6.x にアップグレードしたい。
現状、申請フォーム上でアップロードした画像の「削除」をクリックしても、データベース上からファイルパスが消えるだけで、ファイルシステムにはファイルが残ってしまう。
Google Analytics のタグを除去する
独自にメール一斉送信機能を実装するよりも、 SendGrid のようなサービスを使った方が良い気もする
ポータルに登録しているユーザー全員にメールを送信する機能が欲しい
昔適当に書いてた、メールを一斉送信できそうなコード。ちゃんと動くかどうかは知らん
<?php
class EmailService
{
const NUMBERS_PER_EXECUTE = 100; // 1回の処理で取得するメールレコード数
const SEND_INTERVAL_SEC = 1; // メール送信間隔(秒)
const SEC_PER_JOB = 60; // プログラム強制終了まで
const NUM_RETRY_PER_EMAIL_ADDRESS = 3; // 送信失敗した場合,リトライする回数
const NUM_RETRY_PER_JOB = 10; // 1回のジョブで繰り返す回数
function enqueue()
{
for ($i = 0; $i < 10; ++$i) {
$email = new App\Email();
$email->subject = "件名";
// ...
$email->save();
}
}
function runJob()
{
const START_TIME = now(); // 開始時刻(UNIXエポック) (秒)
// 今期失敗回数
// (この関数が呼び出されて以降失敗した回数)
$count_failed_now = 0;
$emails = App\Email::orderBy('id', 'ASC')
->where('is_locked', false) // 排他ロックされていない
->where('is_sent', false) // かつ,未送信
->where('count_failed', '<', NUM_RETRY_PER_EMAIL_ADDRESS) // かつ,リトライ上限に達していないレコード
->take(NUMBERS_PER_EXECUTE)
->get(); // 最新 NUMBERS_PER_EXECUTE 件を取得
foreach ($emails as $email) {
// ロック処理
$email->is_locked = true;
$email->save();
try {
// ...何らかの送信処理...
// 送信済みフラグセット
$email->is_sent = true;
$email->save();
} catch (Exception $e) {
// 送信失敗したので失敗カウントを1つ追加
++$email->count_failed;
++$count_failed_now;
// TODO: エラーの内容をログに残せたら良さそう
// ロック解除
$email->is_locked = false;
$email->save();
// ...今度CRONが起動したらやり直す
}
// 現在実行中の runJob で、失敗回数が NUM_RETRY_PER_JOB 回を超えたら
// サーバー側の設定ミスなどが考えられるので、処理を中止する
if ($count_failed_now > NUM_RETRY_PER_JOB) {
// ...管理者にメールするなりログに書き込むなりする...
// とりあえず強制終了
break;
}
// 強制終了するか否か
if (now() - START_TIME > SEC_PER_JOB) break;
// スリープ
sleep(SEND_INTERVAL_SEC);
}
}
}
一度 2 段階認証が成功すると $_SESSION['staff_authorized']
が true にセットされるが、ログアウト時、このセッションはリセットされない。
そのため、ログアウトしてから再度スタッフユーザーとしてログインし、スタッフモードにアクセスすると 2 段階認証はスキップされ、スタッフモードにアクセスできてしまう。
学籍番号
+ @
+ 大学発行メールアドレスのドメイン
学籍番号
入力欄は表示され、 大学発行メールアドレス
入力欄は表示されない学籍番号
入力欄とは別に 大学発行メールアドレス
の入力欄を表示する
RP_UNIVEMAIL_DOMAIN
が、 大学発行メールアドレス
の 末尾 に含まれるかどうかを検証するRP_UNIVEMAIL_DOMAIN
に先頭のアットマークは含めない
DOMAIN
なのにアットマークを含めての指定が必要なのは不自然。アットマークを含めるにしても RP_UNIVEMAIL_SUFFIX
あたりが適切なのでは?グループウェアでは「ワークフロー機能」と呼ばれていたりするような機能。
提出された申請に対し、
のステータスを設定できるようにする。
承認・要再提出の場合、共にコメントをフォーム上に表示し、また、承認・要再提出にされたことを申請者にメールで送信する。
また、承認理由・要再提出理由をフォームやメールで表示する。
承認された場合、申請者は申請を変更できないようにする。
(承認後、スタッフなら編集可能にしたい)
modified_at
カラムを updated_at
カラムに変更するなど、Laravel 標準の規約に揃えるlaravel new
コマンドを実行して生成されたファイルを配置
public
ディレクトリには Laravel の public/index.php
を public/index_laravel.php
にリネームしたものを配置するpublic/index.php
では、URL によって CodeIgniter にルーティングするか Laravel にルーティングするかを分ける処理を入れる現状、申請フォームエディター画面上から送信される HTTP リクエストはバリデーションされていない。
Laravel の FormRequest クラスを作成し、全てのリクエストは FormRequest のバリデーションを経由するようにする。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.