diff --git a/.gitignore b/.gitignore
index 3530448..a89ad7f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,7 @@
$*
~$*
.$*
-*.db
\ No newline at end of file
+*.db
+venv/
+__pycache__/
+.vscode/
\ No newline at end of file
diff --git a/DBBigWorkDesign.drawio b/DBBigWorkDesign.drawio
index 0048032..da146df 100644
--- a/DBBigWorkDesign.drawio
+++ b/DBBigWorkDesign.drawio
@@ -1 +1 @@
-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
\ No newline at end of file
+7V1Zd6M2FP41ekwOCMTyiLfpkmnTpudk0jfZYJsZDC4midNfX0kWZlMwk7IoE87JSdCV2HQXffp0RYA23R0/xXi//Ry5XgCg4h6BNgMQmjYkv6ng5SQwdHQSbGLfPYnUTHDn/+txocKlj77rHQoNkygKEn9fFK6iMPRWSUGG4zh6LjZbR0Hxrnu88SqCuxUOqtJ73022XKoadlbxk+dvtvzWFjRPFTucNuZvcthiN3rOibQ50KZxFCWno91x6gW079J+OZ23eKX2/GCxFyZNTrjRv/19/1f8x83+/ndzZv35eX/165Wq84dLXtI39lzSAbwYxck22kQhDuaZdBJHj6Hr0csqpJS1uYmiPRGqRPjVS5IXrk38mEREtE12Aa/1jn7yJXf8QC91jXhpduRXZoWXtBAm8cuXfCF3Fi1mp7FSet46CpMF3vkBFdzhGB8wed/PURiRP3dT8us3L3Z5Q/7EpFe0SbV/eZcfosd45dV1KrdTHG+8pKYddw3a4bkbcO198qKdR16ENIi9ACf+U9EiMTfszbldpntywNX/PaZwuu4TDh75ncDcBM4cOCo9sBVgGWCOgK0C26pYTdEmnrd+4t3tMeumZxIYivp/s07WfhBMoyCK2U01F3mWS+WHJI6+ebkaCy41w6jT4pMXJ96xtt95LdS5B6chjBefs3hgcdE2FwnSs1pXlGa8P5/N3PSh4KXS+Cxs6LPWUD4b33yN4S8zhKPblbk8zO4XBryqt4QwCltVfabuh1yNJKo/ENUlDh3xszdnsoVP+5RdvHvzUE2p7EOFo4FIZiCqXAaiyW8g6kcyD7kwIaxgwltyKyMgrzBZxgW7Mf55pDMZ1q9XB9axDmmg6vsj67m0nhxt2F+KKXXgWGBuAMsCE1MAN19HmWp/KHO99ozVSoQyXdNeKrWG0RxlIlhEmXoVZapQADOtrmCmVZ0PcM27/pNQ9QIl8zMOexwKT1ni1bcN0+rV6tSv1Gj80E98HAgvOaMGiHdU1+HysGc1SlV0ui958dOtO3sckRnrYLJgZkwkKnAWF56GiFmPptKSzecs2sWHbXGOdSha/2GL97S4O24oG3Ptrt1rFyf4Loli7+cZaYEDfxOSFoG35j2x8sPNDSvNNCLZR36YMFtCE/JDunaqAEQeZEpLJH7ny2qxlpZIi0Jtrkzr1dK11EJrVkKzNqeI2LPWQuc1Vpa3XLfjvIZZdF5Vaei9nU0SU/7swnTeADYCRDHUVGe0tmx9pAOSYlgtdiQfKfO9zkWppa1It3pEPqHd6a9w4PCKne+6bG4qiuNFyNH+hLC5bjX4puk/bEGzQshm94zY4IfF9GpTIk81pEJtapXKu4XX7QE3BOwJmMzZQGcDx/jYwE1XivFBEwSIfpEbGkn9Dkj9plM4TZcrGAjmcHprocCi8NbS2cEcTJwxFBShwtChQDeHDAXKtZkHD0ptLBjCp7WmPo3k8mmt6tNaaz5NRnULWA47mAJHSSXM3Scz+kMggKMzv/+AXm4aRS8/MzeDefnZ4McBv8Xg0Bj9t77mw04l0xr8kmvAiZnsyrdUkCMQ9TKBWMoH+b725OD0BJlZnl/lf4xHypCWKvX6VB+WKtfqQjptlo5ihk0o5uo0uEfSeaSYPxrFXKYhdWtoilkbY3kHsdxsGsvlykSqn2e2zUpLnYTWMSnd2EA0uQZ7szpnhdewRVLamdHEVHJgQbYe+5GZKEM6UlqVNZ9Aawj2SuY1gr0R7HWXT6DIBvZgfaLgO6CYTAk5plSF7y1tFKJe4V4LaaPdMYwdJ44KLESsErm4nfS5S/lHNhnLUDqasrQjmwxqJj0gA5xTDTKD7Ctar9fwFYxmLA3U0b4iXbBa2OvGIqgLdCZK9phMqdooFFrQhMeyzsacsTK3rgnGb0Og2jaSxsSqFVCtwgTsUbWXvLa0+qcaqArNlF7dtjqzFrntmOp5UbeaVorI2sBuq9fjrF4p1vrsjRzLBgs02xmGSYS67aaoWy4KLX3uEVO9npuBShlYgm00/W7WhgKdnTVENEei9BicG6m2FJwNQdpNr8FZE8BlKRhNvRGjWUndHBnNkdHsjNFExmXv7Xn5Gknqvui7FyQWbM528mOFSiYzOp6MTvWDO5Vpl2iG4Z3qVYha4BksOt44kxQAzUa4czFgQrMZku1uLipCsiM72MI2ESRQbVdIVrh2UP2cV3+rOQ1phcJqTmecQrdrOTqfMLw33kEXrQtUgroULEM/X4SzLMlYBl007DbZx8MmgRPGFREkZMExWleUbTfgHew+B+KU4ioNxOXpAPFLDViMGLQMyhCOqq3gZ9mW6VDVAaXPsinx/RLmVKPG+2MGy7Kpfe5x3H0lY0I03+113EXVjbiMy18AB/HB1YHjKNtAtVoD1fYbigfdOf+D7qlFqGkkhnJFYgFXPEbiC6C430gsSnCqfp1kjMSXI7Fs66xIsHNk5JTfolq9xFsM/i072O+2wTcmNPWTz9Qa91ibHn45j3ywz1eJH2dIblqyXcWyWMhg7HTtcxc3lhY+h5TtESVjhXVapFLpKFFNRKFVZPTQmcShXzl6HdX9cLtGS8ND411nbWwarTU16XI0jEY5GmczQ8CeU+J9TLEas0E6ywYpL0r1+Q3qWighnfeajbxXZ2lUUzqzIF1LV1JGn/rgPiXaotezT4l4jnGzz1sorPJmn+4W/0gx+z+Pp0/pZf8sU5v/Bw==7Vtdr9ogGP41XG5p6Yf0sq11u9hZspll29VCLEe71OIQj7pfP6DUWlvP3JIjrcfEKLxAP3ie94MXBE683L1jeLV4oCnJAbTSHXDGAELP9cW3FOxLget6pWDOsrQU2bVgmv0mWmhp6SZLybrRkVOa82zVFM5oUZAZb8gwY3Tb7PZI8+ZdV3hOWoLpDOdt6dcs5Qsttf2gbnhPsvlC3xrBUdmwxFVn/SbrBU7p9kjkJMCJGaW8LC13Mcnl3FXzUo6bnGk9PBgjBb9oAKOfmJcneBxh/sOP2ObX4xtbw7Pm++qNSSomQFcLWoifiNFNkRJ5HUvUKOMLOqcFzj9QuhJCWwh/Es73Gj684VSIFnyZ61ayy/g3Ofytp2vfj1rGO31lVdlXlYKz/dEgWf1+3FYPU7Vq3CMt+AQvs1wKppjhNRYv+EALKn6msfj6SFiqO+ontl1RX3PMeCg5U7+5kk2yPNcXL2dLTtFZFLRoTTdsRp6bes1mzOaEP9MPHrgidIzQJREvK8YxkmOePTWfA2u2zw/9akKIgubEv/CjvO4Tzjf6TiAZgcAFkQcSD4RjEFggEdUAhL5sChMQ2qqPBZCSRA6IIlWIQDBp0a3Jre0i42S6wmrmtsKiNHn039jq1yCMk93zyLVnWg9wK0XWlsyu6tsju1DJFkcmwbVeCpzRXXkNKS+8UHkdo8qL7vzoOT9ck/yA54x7iEDiA4RANFKSQFnwQBakTfdlB2nlPRAIB9C2QoO16dAybtPhX2bz6graUM9aWweuoM6FCjoyasCdARjw180P3yg/3Ds/es4P+4wDuhJBvDtBek4QzyQ/nI4I0JMxHvJkvIccFQq2VvWDjfcc6yTeQ+14D1013AvuCmpIQd0LFRQZXaJZd370nB+BUX7Yd370nB+2ZZIgboeH90EQAzRWrj5Ujl04fOHhVUofTUDYXnYOxsN7qGce3usAoCvJ1osQK80YmfGMFkIgFEBO2Euk2Ry/DYrbAQp6KVDgdddF9pHRrE3o68yM+xeaTWh039PvXBjJ7U6kjCTs08LohbT2dLFkXGtHnaa03FZOUIWFC6JJ5dRsEE50n8hVEuHv2kmzQcN0wKAvMKFO3QkEBMnhqED8+cv4tmDw+gZD0B35CR0YKRgEHr4qIKkVshCD0KokkdSoaCw/NwWT3zejVh10O7FqYSxjxNKqRZayYbEET6KSgKC97Bs2Kn7fUOk++NRG5aYDgL6hAodwWvE2sx1lOH5J3G70yBMcwpG4184Qs4eeYKdlPzmlmoggNQCRXeXI2ifpBpMRgycZMdd0Rgx27Tq2I1Mk124SE7UhGbQ3ygbtW+GJb/WM+9auTPFI5oJRGd9EKvdx4xEPvBoqolr/90O1Hf2Bxkn+AA==7V1bc5s4FP41eswOiJt4BMdpu9N0O8102j7tUJvaNLblwaRJ9tevhIVtJNkmjoOE0UsCMsag7ztHOhcdAWcwf3qXJ8vpLR6nMwCt8RNwrgGEQQjJX9rwvG7wXW/dMMmz8brJ3jbcZf+lrNFirQ/ZOF3VLiwwnhXZst44wotFOipqbUme48f6Zb/wrP6ry2SSCg13o2Qmtn7LxsWUtdp+uP3gfZpNpuynEQzWH8yT6mL2JqtpMsaPO03OEDiDHONifTR/GqQz2ndVv6y/d7Pn082D5emiaPKFm8BPrp8/P67+Wdy+X/49+v3t/uqKvcWqeK5eOB2T92enC7wg/+IcPyzGKb2NRc5wXkzxBC+S2UeMl6TRJo2/06J4ZuglDwUmTdNiPmOfpk9Z8X3n+Ae91V8eO7t+YncuT56rk0WRP3/fPdn5Fj3dfq08q773Cy+Km2SezWjDXZInq4S84C1eYPLvbkD+fErzMbuQPbHtkvNVkeRFRCmzffOy7SabzTY/NeauIC07n/8ihwM8w/n2AhEmhtwKP+Sj9AA2Fd2TfJIWB65jAkWB2/kBRoJ3KZ6npH/IBXk6S4rsT53YCZOPyea6LYXIAWPRCxjF7vsnmT2wXwLDAERDENn0ILQA8gXSEdlY0sN8iuc/H1Z19oyT1XTDvsdpVqSrZVL23CNROaRtmeYZefg0397h87bpdEa8BM0/aV6kTwf7n30KEVMIz9z541a/VE3THc3iWm+EmAjHW+qArdz/2PnkmA7Yiv2PmtRrqANOF3jYUOAdrQQemSFE2yGkKaNsrRgFmwwhQw+ENghF9r1k5DgZ6TOMA7av2TjgSLrdA9FN2duk/0m320JvVyM3uT+ZkqevGLnZHc4ycp8DnqAOj+OK8PhtwmMHCsdpq6GirY/Tts6K9nSt6jXVqr5eatUyBOoYgUK9CCSqf0MgvQmE9CKQY0zNbhEIQr0I5BkCdYxArl4EMpPorhFIr0m0A1sl0MW7u96eQI4y59b7f1efn8Yfv44mVy7+8nM0vX+83yjEtjSQGcAa00eOl17edvbYnG80dEGEwNAHCIFYHOK64hJ1Lc1corYrdPdC6F3yckVd+CQ+/GSWTRbkdER6p/Rt0l7JRsksYh/Ms/GY3nENyl0dlLo6UAmR08BrDSUQwTeDSJQI0U3RK4igdhD5EqXV38jCJpJQ4WOpjiygBoPKh+v+IOTyKRrKEQqbDPs0JEpEqU9AcaK0iamqAqryl9WACgGCNHy9DmLHfVJ1SLMgKhQndCUsIYgjClQYgNgtEfOoIJGDCIKwxxKlHjHZ5MEHsVOqPo9OIdCAthDoIq88GIDwpj+I8TKmXAcGHQgTbpyqF+xhhWzScNRD5uuVQRy062I1/Hk1f/RykQUqo8wmxnMSg/TKUwha9tGfxCDDnx3+6BVlDlSmKZzCn4sNEjZnkF6pdkG7eQomzHwGBkFVDJLGLTuRLt5bBskh0yvVBcqczh4IYxAPwdAFcQgice1gV2LNPh+FUR1rdto1W4zK349E05XXUK9JQ/XcnKsUxVvHKBIX/Ou59voMEu5B3ST8tGySVZHj+5RLVrjg/AW/QRZQq/kLzmkpJn3DzdMOty4YUb1wBDp+N0dUt+VQ1hkYdKHpuo0ZVI3emjDIkee+1Y2oq/Lomk7QhggQtYlEB6Ke07QcF6QTMR2lrpyDCL9gHAnr44gryb5qdd7mdsEy64cWQE21gDJn3MHnPqYFApodFsflZ0NquHVOC5xLCfi6KQGn3VJ555gKXOpksqkSOP9kkn31M87IQ2+56nFcdTgSrl+JfWvLQ/FGHOkd/kbrVxZuVBJ68z6vWFzUBYOpNsxdqguyUmPHiz+ePfItp2ZQOUEYNT3eat/D8ROoKV+Gp4yZTVdNGl7WeKlXTmH13LUJ2FGbqyuxLN7T7ar2dFf5xjpPlux+CCxsKrB6ed58dZ63hgrf8KfOH71SOKvn5hb6HDGvu6LwA18zhe+J4+tc6F0TIvN43KDiEJknpgyYkLTEG8VZ+I7q0KYnqjeDm0RPWrrhJhZZNnpSghtXfNm1HcW4ydYNeyAKQOj0cN2938DgbHXNqSeri8Tb930qYcEj5ElmGu0itCcEVgoOXYJPJuei1+By8UG64SMvMVI3mHolQUgzHRe0G4E00Zn9zqmmTpFAL6dI9dzH0xCiAS0uRAZOWrBmv1rWNg3hTFkISLeChL5oP3y4iz/1RyvzyWG2aq3syy0DFJQVhQK64gKhUqRcKmW9AYo3vW1PNVAyE4FXfn2a4HickQ1VT0F9uYnAi1J/Sz3xaxbVy5TMaPDLgp5BVTxN3KHtYvEJOKPbDhXjI8lpaM1kaGgw9CJlMWiasojYDF0Tg0GyVa8xOTVnkF7FuJC6lNKTEvf6zh5lhZSkWZ9tJ93/FZgNn15AITlmevm8Anlx8yMOrq4kAoW61TiofsyslT9sKfC2t+rEhGoDBpNQchA3xO8MoBw3mUu/vx4S23I0c2oh+bbqtGy5V6aQDKnnsUcAcal0MFAN0J4tAWoThD75hW2L3wOgRRmSL/6CQu8bN8RbWwFSJJisaFzH5dBjixtQEdVLDuKIyvo+AdcryH0GAee32XMle3y8ldEghcfs6qyJeDeuVKpsdaf0cdr1Uhsv0RkIpJefse1ayYZAryaQsjCH9HHEILfWUY5LnZ42Zo+yMKvcvml3ubyxb15NIL2GL9iF/UYuLdHjVfxRt6v8ocfmnch+mcbl0hUgcXcr/cMGCzlaNXdtMUZmYi2SjS35xfIST/FbxVrkuIkxMhPblLiX+MW7TnuLdw/O9kyMrO7uq5YetphFfNCWq+GDQOwB5JZ7/UYgtL5++dgfiBwuSOa1uKfvQX8NH8W8BmEZxaTbZTt9CpLxkwr1CMmXt0QuXVlNYxwWQD1SctDSDR9ZIXhEY1DRdXlQFinoDT7CykpbNT7tuvBODELBCzOiD+YQHs9WZhdqYkV3YbeQi6taeNC9ctyPpxeDoDxZjIwQISqnWTfUKbNvkLi4RAXIWSptbgIgx0dMJjeeG4n5YnO4SSzMVj0Akq1MjefmOG5tlsuTryUxGxJoMqJW5f+7FtmQ7N3IfH+xT1eo04P9qX8XZ3bZDUbUVs0u6c5I/a0gYFt8xVLVfgvpzgk+LXtJ6/ZVJRb7AxAvQJLc2TPhQ05zjIudz96R7pne4nFKr/gf7Vxtj6M2EP41/pgqGAzmIyTZVn27Siu1dx+54Ca0BG8JuST99bWNCeFlN5w2x3i3SKssDJjAzDwz48dDkL3Ynb7Po6ftLzxmKcLz+ITsJcLY87H4lIJzKXAdUgo2eRKXIqsWPCb/Mi2ca+khidm+cWLBeVokT03hmmcZWxcNWZTn/Ng87U+eNr/1KdqwjuBxHaVd6R9JXGy11HL9+sAPLNls9VdT7JUHdlF1sn6S/TaK+fFKZK+Qvcg5L8qt3WnBUqm7Si/luIdnjl5uLGdZMWRAfPzH//GnX7ezD2eKg9/X0eLDfmZp8+yLc/XELBYK0LsZz8S/MOeHLGbyOnOxx/Niyzc8i9KfOX8SQksI/2JFcdbmiw4FF6JtsUv1UXZKio9y+HdE7326OrI86SurnXO1kxX5+WqQ3P10fawepvaqceUDyad4VlFatOeHfM1e0o52uCjfsOKF8+yLOQUMGN8xcT9iXM7SqEi+NO8j0g65uZxX20xsaLN9jQnL636J0oP+pijeJdks5Zsk61i3acrjNinY41OktHAUAG6aTV+Z5QU7vazM7sPrAdjV7q/xb1VwONZoolq0vcKRM/9W6nInj39eO3igx1ugLo87Ln/Ys9wQj3fnhnm8f0Ml/x/vtgd6twMaz+cde00B6qtNSCBNaD+Tkrfi+uDxqZ2R8Rw4PmEyOfyNWDTA4TGG9Hin4/Fo5SLfReEcrQgKQxQGaOUh30EBlYcoRaHXtXuaiokdGwcHrTx9cXowHEyV6a2APgQHoMmb0FFtaF1ZsLbnLRs2LFgb1BwbEg/Shq412fAONvRBcdifjx5QQNCKokBsYMPykY0Ny0dujw6JVFQgcrqPfB8FjuE6dBxotqlHH1MsabJIQ+gm0OkcnmbkdzEiaEawx83q79WIzwXgkbixLrOimF8jiJU28QtOrFh9VZAnJ+OiEJJV0AoFlqqLiJqniwy+lELIDO61qyBwJdKOEqM4nn3m/G9wjyMtKs92gZVlO1OQvZUAh6wng66uEXuqWe9gRAKaKcm4SHy3RgRl1cm4jPC7NSLo7LG6zTYXNUf+QpVjjuKiXFmL0R6Dj1h8udQwCsrGUz1xay42ZOZNIQFQXbhFJAqn91eKUQwUo+ig0EeBqyBhyZkIJBLalTU4EjDujSL0QQYSqbtAsbFURhHJxhKpQb+7sl5jxRpFkRY1bIqCx2Vk31pIGdpu4IJGlP52g9tgcFPxTOHnXGxt5JY8h67kqoVsUlgh39NLHHKjGg4NofaiBjiE7KlR4SXtDKVSbdgetS6VKjmtWc72B4ESaGqrXYrCO/24nR1vzemHtgXYoK0dlXdMRnydEUFX8pxpUngPIzqg/KQzdg3hvVMrghYRzthJ8b1aETQr2t11YlUKxqyIktS4UhC8qcv2Ovrq64wzitBqNycQ6LfS3Gmp+GaFNYSHAV0qrm6zgQTh9w+yjUQucigMdJGgz1HNJ9SS7big2KCmYWMiWG4WrkOwAVsb9S17CL+ncsFDbixUulBvSVFPLwAGPb0XY3ZfuaYhYWLrX3KxofUlMBL6+hBLJCgGPlzKP7OQQB3TkGAu/3hPj37tREgP/Y0n4qtra7Yy/KUari5RIkiPalnqchuvQMCwGYNRCPCxYQgg/X0EQom0Ki3DUClxqUpLR712DNtRQ9s94dDLGAT3x+Kl6kYSqpwjSgxXog3dE076EhqRi89ybuOhwNP99CYrEZpFIX0xsfM2Ya1Wo7TpOKbhum8m7iOK1Uzck5+hZbgSwXHt9gVHIvtKQvtq7kYlwP2yic1TNax6qYYqt/WpbCSRGnf6f/PiNvcxNsHaDg3gv1jldnsT3kSzW5tIcsEduofZPxQFz/RL8KGqNSUnh8GV155xfUPlid36dzfLGr/+8VJ79R8=
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..94680c5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+```shell
+cd src
+python -m venv venv
+pip install flask
+flask --app main run
+```
\ No newline at end of file
diff --git a/src/__init__.py b/src/__init__.py
new file mode 100644
index 0000000..6e69bf3
--- /dev/null
+++ b/src/__init__.py
@@ -0,0 +1,29 @@
+import os
+
+from flask import Flask
+
+
+def create_app(test_config=None):
+ # create and configure the app
+ app = Flask(__name__, instance_relative_config=True)
+ app.config.from_mapping(
+ SECRET_KEY='dev',
+ DATABASE=os.path.join(app.instance_path, 'dbproj.db'),
+ )
+
+ if test_config is None:
+ app.config.from_pyfile('config.py', silent=True)
+ else:
+ app.config.from_mapping(test_config)
+
+ try:
+ os.makedirs(app.instance_path)
+ except OSError:
+ pass
+
+ @app.route('/hello')
+ def hello():
+ return 'Hello, World!'
+ from . import db
+ db.init_app(app)
+ return app
\ No newline at end of file
diff --git a/src/db.py b/src/db.py
new file mode 100644
index 0000000..684e41e
--- /dev/null
+++ b/src/db.py
@@ -0,0 +1,35 @@
+import sqlite3
+import click
+from flask import current_app, g
+
+def get_db():
+ if 'db' not in g:
+ g.db = sqlite3.connect(
+ current_app.config['DATABASE'],
+ detect_types=sqlite3.PARSE_DECLTYPES
+ )
+ g.db.row_factory = sqlite3.Row
+
+ return g.db
+
+
+def close_db(e=None):
+ db = g.pop('db', None)
+
+ if db is not None:
+ db.close()
+
+@click.command('init-db')
+def init_db():
+ db = get_db()
+ click.echo("Initializing database schema...")
+ with current_app.open_resource('sql/db_create_sqlite.sql') as f:
+ db.executescript(f.read().decode('utf8'))
+ click.echo("Initializing database triggers...")
+ with current_app.open_resource('sql/trigger_sqlite.sql') as f:
+ db.executescript(f.read().decode('utf8'))
+ click.echo("Initialized database.")
+
+def init_app(app):
+ app.teardown_appcontext(close_db)
+ app.cli.add_command(init_db)
\ No newline at end of file
diff --git a/src/sql/db_create.sql b/src/sql/db_create.sql
new file mode 100644
index 0000000..9cac25c
--- /dev/null
+++ b/src/sql/db_create.sql
@@ -0,0 +1,111 @@
+drop database if exists bigwork;
+create database bigwork;
+
+create table `admin`
+(
+ passwd varchar(100) NOT NULL
+);
+
+insert into `admin` (`passwd`) values('');
+
+create table user
+(
+user_id int PRIMARY KEY AUTO_INCREMENT,
+user_name varchar(100) NOT NULL,
+user_mail varchar(100) NOT NULL,
+user_passwd varchar(100) NOT NULL,
+user_limit int NOT NULL,
+user_regtime datetime NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table book
+(
+book_id int PRIMARY KEY AUTO_INCREMENT,
+book_name varchar(100) NOT NULL,
+book_isbn varchar(100) DEFAULT NULL,
+book_publisher varchar(100) DEFAULT NULL,
+book_pubdate datetime DEFAULT NULL,
+book_lang varchar(100) DEFAULT NULL,
+user_id int NOT NULL,
+CONSTRAINT `fk_book_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table document
+(
+doc_id int PRIMARY KEY AUTO_INCREMENT,
+doc_name varchar(100) NOT NULL,
+doc_url varchar(100) NOT NULL,
+doc_size int NOT NULL,
+doc_date datetime NOT NULL,
+doc_type varchar(100) NOT NULL,
+book_id int NOT NULL,
+user_id int NOT NULL,
+CONSTRAINT `fk_document_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`),
+CONSTRAINT `fk_document_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`),
+INDEX (doc_name(10)),
+INDEX (doc_date)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table note
+(
+note_id int PRIMARY KEY AUTO_INCREMENT,
+note_name varchar(100) NOT NULL,
+note_date datetime NOT NULL,
+note_content mediumtext NOT NULL DEFAULT '',
+book_id int NOT NULL,
+user_id int NOT NULL,
+CONSTRAINT `fk_note_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`),
+CONSTRAINT `fk_note_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`),
+INDEX (note_name(10))
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table record
+(
+record_time timestamp PRIMARY KEY,
+record_type varchar(10) NOT NULL,
+doc_URL varchar(100) NOT NULL,
+user_id int NOT NULL,
+INDEX (record_type)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table typetable
+(
+type_id int PRIMARY KEY AUTO_INCREMENT,
+type_name varchar(20) NOT NULL,
+UNIQUE (type_name)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table author
+(
+author_id int PRIMARY KEY AUTO_INCREMENT,
+author_name varchar(50) NOT NULL,
+INDEX (author_name(10))
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table book_author
+(
+author_id int NOT NULL,
+book_id int NOT NULL,
+PRIMARY KEY (`author_id`, `book_id`),
+CONSTRAINT `fk_ba_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`),
+CONSTRAINT `fk_ba_author_id` FOREIGN KEY (`author_id`) REFERENCES author(`author_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table book_type
+(
+type_id int NOT NULL,
+book_id int NOT NULL,
+PRIMARY KEY (`type_id`, `book_id`),
+CONSTRAINT `fk_bt_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`),
+CONSTRAINT `fk_bt_type_id` FOREIGN KEY (`type_id`) REFERENCES typetable(`type_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+create table user_stat
+(
+user_id int PRIMARY KEY,
+user_usedspace int NOT NULL DEFAULT 0,
+user_bookcount int NOT NULL DEFAULT 0,
+user_doccount int NOT NULL DEFAULT 0,
+user_typecount int NOT NULL DEFAULT 0,
+CONSTRAINT `fk_user_stat_user` FOREIGN KEY REFERENCES user(`user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
diff --git a/src/sql/db_create_sqlite.sql b/src/sql/db_create_sqlite.sql
new file mode 100644
index 0000000..1b4973c
--- /dev/null
+++ b/src/sql/db_create_sqlite.sql
@@ -0,0 +1,154 @@
+drop table if exists `admin`;
+drop table if exists user;
+drop table if exists book;
+drop table if exists document;
+drop table if exists note;
+drop table if exists record;
+drop table if exists typetable;
+drop table if exists author;
+drop table if exists book_author;
+drop table if exists book_type;
+drop table if exists user_stat;
+create table `admin`
+(
+ passwd varchar(100) NOT NULL
+);
+-- insert into `admin` (`passwd`) values('');
+-- sqlite default no foreign key
+PRAGMA FOREIGN_KEYS=ON;
+
+-- user
+drop table if exists user;
+create table user
+(
+user_id INTEGER PRIMARY KEY AUTOINCREMENT,
+user_name varchar(100) NOT NULL UNIQUE,
+user_mail varchar(100) NOT NULL UNIQUE,
+user_passwd varchar(100) NOT NULL,
+user_limit int NOT NULL,
+user_regtime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+-- insert into user (`user_name`, `user_mail`, `user_passwd`, `user_limit`) values ('catfood', 'a@a.com', 'lil0', 100);
+
+-- book
+drop table if exists book;
+create table book
+(
+book_id INTEGER PRIMARY KEY AUTOINCREMENT,
+book_name varchar(100) NOT NULL,
+book_isbn varchar(100) DEFAULT NULL,
+book_publisher varchar(100) DEFAULT NULL,
+book_pubdate datetime DEFAULT NULL,
+book_lang varchar(100) DEFAULT NULL,
+user_id int NOT NULL,
+CONSTRAINT `fk_book_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`) ON DELETE RESTRICT
+);
+
+-- insert into book (`book_name`, `book_isbn`, `book_publisher`, `book_pubdate`, `book_lang`, `user_id`) values ('mom pig', 'emm', NULL, NULL, 'CN', 1);
+
+-- document
+drop table if exists document;
+create table document
+(
+doc_id INTEGER PRIMARY KEY AUTOINCREMENT,
+doc_name varchar(100) NOT NULL,
+doc_url varchar(100) NOT NULL,
+doc_size int NOT NULL,
+doc_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+doc_type varchar(100) NOT NULL,
+book_id int NOT NULL,
+user_id int NOT NULL,
+CONSTRAINT `fk_document_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`) ON DELETE RESTRICT,
+CONSTRAINT `fk_document_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`) ON DELETE RESTRICT
+);
+create index `idx_doc_name` on document(doc_name);
+
+-- insert into document (`doc_name`,`doc_url`,`doc_size`,`doc_type`,`book_id`,`user_id`) values ("a.pdf", 'c:/shit/a.pdf', 10, 'pdf', 1, 1);
+
+-- note
+drop table if exists note;
+create table note
+(
+note_id INTEGER PRIMARY KEY AUTOINCREMENT,
+note_name varchar(100) NOT NULL,
+note_date datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+note_content text NOT NULL DEFAULT '',
+book_id int NOT NULL,
+user_id int NOT NULL,
+CONSTRAINT `fk_note_user_id` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`) ON DELETE RESTRICT,
+CONSTRAINT `fk_note_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`) ON DELETE RESTRICT
+);
+create index `idx_note_name` on note(note_name);
+
+-- insert into note (`note_name`, `note_content`,`book_id`,`user_id`) values ('long ago', 'well, nothing', 1, 1);
+
+-- record
+drop table if exists record;
+create table record
+(
+record_time timestamp PRIMARY KEY DEFAULT CURRENT_TIMESTAMP,
+record_type varchar(10) NOT NULL,
+doc_URL varchar(100) NOT NULL,
+user_id int NOT NULL
+);
+
+-- insert into record (`record_type`,`doc_URL`,`user_id`)
+ -- values ('write', 'c:\a.pdf', 1);
+
+-- typetable
+drop table if exists typetable;
+create table typetable
+(
+type_id INTEGER PRIMARY KEY AUTOINCREMENT,
+type_name varchar(20) NOT NULL UNIQUE
+);
+-- insert into typetable (`type_name`) values ('sjot');
+
+-- author
+drop table if exists author;
+create table author
+(
+author_id INTEGER PRIMARY KEY AUTOINCREMENT,
+author_name varchar(50) NOT NULL
+);
+create index `idx_author_name` on author(author_name);
+-- insert into author (`author_name`) values ('alabama.shit');
+
+-- book_author
+drop table if exists book_author;
+create table book_author
+(
+author_id int NOT NULL,
+book_id int NOT NULL,
+PRIMARY KEY (`author_id`, `book_id`),
+CONSTRAINT `fk_ba_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`) ON DELETE RESTRICT,
+CONSTRAINT `fk_ba_author_id` FOREIGN KEY (`author_id`) REFERENCES author(`author_id`) ON DELETE RESTRICT
+);
+-- insert into book_author values (1,1);
+
+-- book_type
+drop table if exists book_type;
+create table book_type
+(
+type_id int NOT NULL,
+book_id int NOT NULL,
+PRIMARY KEY (`type_id`, `book_id`),
+CONSTRAINT `fk_bt_book_id` FOREIGN KEY (`book_id`) REFERENCES book(`book_id`) ON DELETE RESTRICT,
+CONSTRAINT `fk_bt_type_id` FOREIGN KEY (`type_id`) REFERENCES typetable(`type_id`) ON DELETE RESTRICT
+);
+-- insert into book_type values (1,1);
+
+-- user_stat
+drop table if exists user_stat;
+create table user_stat
+(
+user_id int PRIMARY KEY,
+user_limit int NOT NULL,
+user_usedspace int NOT NULL DEFAULT 0,
+user_bookcount int NOT NULL DEFAULT 0,
+user_doccount int NOT NULL DEFAULT 0,
+user_notecount int NOT NULL DEFAULT 0,
+CONSTRAINT `fk_user_stat_user` FOREIGN KEY (`user_id`) REFERENCES user(`user_id`) ON DELETE RESTRICT,
+CONSTRAINT `ck_usedspace` CHECK (user_usedspace <= user_limit)
+);
+-- insert into user_stat values (1,1,1,1,1,1);
\ No newline at end of file
diff --git a/src/sql/trigger.sql b/src/sql/trigger.sql
new file mode 100644
index 0000000..27f832a
--- /dev/null
+++ b/src/sql/trigger.sql
@@ -0,0 +1,55 @@
+drop trigger if exists `trig_update_stat_book_ins`;
+DELIMITER ##
+create trigger `trig_update_stat_book_ins`
+ after insert on book
+ for each row begin
+ update user_stat set user_bookcount=user_bookcount+1 where user_stat.user_id=NEW.user_id;
+end ##
+DELIMITER ;
+
+drop trigger if exists `trig_update_stat_book_del`;
+DELIMITER ##
+create trigger `trig_update_stat_book_del`
+ after delete on book
+ for each row begin
+ update user_stat set user_bookcount=user_bookcount-1 where user_stat.user_id=OLD.user_id;
+end ##
+DELIMITER ;
+
+drop trigger if exists `trig_update_stat_doc_ins`;
+DELIMITER ##
+create trigger `trig_update_stat_doc_ins`
+ after insert on document
+ for each row begin
+ update user_stat set user_doccount=user_doccount+1 where user_stat.user_id=NEW.user_id;
+ update user_stat set user_usedspace=user_usedspace+NEW.doc_size where user_stat.user_id=NEW.user_id;
+end ##
+DELIMITER ;
+
+drop trigger if exists `trig_update_stat_doc_del`;
+DELIMITER ##
+create trigger `trig_update_stat_doc_del`
+ after delete on document
+ for each row begin
+ update user_stat set user_doccount=user_doccount-1 where user_stat.user_id=OLD.user_id;
+ update user_stat set user_usedspace=user_usedspace-OLD.doc_size where user_stat.user_id=OLD.user_id;
+end ##
+DELIMITER ;
+
+drop trigger if exists `trig_update_stat_type_ins`;
+DELIMITER ##
+create trigger `trig_update_stat_type_ins`
+ after insert on typetable
+ for each row begin
+ update user_stat set user_typecount=user_typecount+1 where user_stat.user_id=NEW.user_id;
+end ##
+DELIMITER ;
+
+drop trigger if exists `trig_update_stat_type_del`;
+DELIMITER ##
+create trigger `trig_update_stat_type_del`
+ after delete on typetable
+ for each row begin
+ update user_stat set user_typecount=user_typecount-1 where user_stat.user_id=OLD.user_id;
+end ##
+DELIMITER ;
\ No newline at end of file
diff --git a/src/sql/trigger_sqlite.sql b/src/sql/trigger_sqlite.sql
new file mode 100644
index 0000000..70e1ecc
--- /dev/null
+++ b/src/sql/trigger_sqlite.sql
@@ -0,0 +1,62 @@
+drop trigger if exists `trig_create_user_stat`;
+create trigger `trig_create_user_stat`
+ after insert on user
+ for each row begin
+ insert into user_stat (`user_id`, `user_limit`) values(NEW.user_id, NEW.user_limit);
+end;
+
+drop trigger if exists `trig_delete_user_stat`;
+create trigger `trig_delete_user_stat`
+ after delete on user
+ for each row begin
+ delete from user_stat where user_id=OLD.user_id;
+end;
+
+drop trigger if exists `trig_update_stat_book_ins`;
+create trigger `trig_update_stat_book_ins`
+ after insert on book
+ for each row begin
+ update user_stat set user_bookcount=user_bookcount+1 where user_stat.user_id=NEW.user_id;
+end;
+
+
+drop trigger if exists `trig_update_stat_book_del`;
+create trigger `trig_update_stat_book_del`
+ after delete on book
+ for each row begin
+ update user_stat set user_bookcount=user_bookcount-1 where user_stat.user_id=OLD.user_id;
+end;
+
+
+drop trigger if exists `trig_update_stat_doc_ins`;
+create trigger `trig_update_stat_doc_ins`
+ after insert on document
+ for each row begin
+ update user_stat set user_doccount=user_doccount+1 where user_stat.user_id=NEW.user_id;
+ update user_stat set user_usedspace=user_usedspace+NEW.doc_size where user_stat.user_id=NEW.user_id;
+end;
+
+
+drop trigger if exists `trig_update_stat_doc_del`;
+create trigger `trig_update_stat_doc_del`
+ after delete on document
+ for each row begin
+ update user_stat set user_doccount=user_doccount-1 where user_stat.user_id=OLD.user_id;
+ update user_stat set user_usedspace=user_usedspace-OLD.doc_size where user_stat.user_id=OLD.user_id;
+end;
+
+
+drop trigger if exists `trig_update_stat_note_ins`;
+create trigger `trig_update_stat_note_ins`
+ after insert on note
+ for each row begin
+ update user_stat set user_notecount=user_notecount+1 where user_stat.user_id=NEW.user_id;
+end;
+
+
+drop trigger if exists `trig_update_stat_note_del`;
+create trigger `trig_update_stat_note_del`
+ after delete on note
+ for each row begin
+ update user_stat set user_notecount=user_notecount-1 where user_stat.user_id=OLD.user_id;
+end;
diff --git a/src/templates/index.html b/src/templates/index.html
new file mode 100644
index 0000000..b39e329
--- /dev/null
+++ b/src/templates/index.html
@@ -0,0 +1,15 @@
+
+
+
+ DBProject
+
+
+
+简单的电子书归档系统
+
+
+
\ No newline at end of file
diff --git a/src/test/test_sqlite.py b/test/test_sqlite.py
similarity index 100%
rename from src/test/test_sqlite.py
rename to test/test_sqlite.py