Эх сурвалжийг харах

根据最新要求重新开发Dati部分。
修改/删除部分不合理代码。

Jees 2 жил өмнө
parent
commit
f2546ca438

+ 2 - 0
.gitignore

@@ -5,3 +5,5 @@
 /static/
 /checkIn/templates backup.7z
 /venv/
+*.log
+

+ 28 - 257
.idea/workspace.xml

@@ -13,272 +13,30 @@
     <select />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="5d56ca4e-fa09-4724-964f-713958f1a350" name="Default" comment="签到系统增加多选功能。去掉一些明显的bug。&#10;志愿者报名系统,增加导出当月服务功能。">
-      <change afterPath="$PROJECT_DIR$/MP_verify_nWvJfsXLyqPEqBTg.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/admin.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/apps.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/functions.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/migrations/0001_initial.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/migrations/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/models.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/settings.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/tests.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/urls.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/views.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/backend/wechat.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/checkIn/migrations/0007_auto_20210527_1615.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/checkIn/migrations/0008_item_timestamp.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/checkIn/setting.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/checkIn/static/media/qrcode/c_ID_7.png" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/checkIn/templates backup.7z" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/index_pjh.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/checkIn/urls.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/dati/static/dati2/dati2_bg.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/dati/static/dati2/dati2_bg2.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/dati/static/dati2/dati2_btn.png" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/dati/static/dati2/dati2_main.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/dati/static/dati2/dati2_main2.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/index_pjh.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/schedule_tasks/count_credit.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/schedule_tasks/next_day_reminder.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/service.log" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi-2020.12.5.dist-info/INSTALLER" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi-2020.12.5.dist-info/LICENSE" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi-2020.12.5.dist-info/METADATA" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi-2020.12.5.dist-info/RECORD" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi-2020.12.5.dist-info/WHEEL" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi-2020.12.5.dist-info/top_level.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi/__main__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi/cacert.pem" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/certifi/core.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet-4.0.0.dist-info/INSTALLER" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet-4.0.0.dist-info/LICENSE" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet-4.0.0.dist-info/METADATA" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet-4.0.0.dist-info/RECORD" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet-4.0.0.dist-info/WHEEL" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet-4.0.0.dist-info/entry_points.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet-4.0.0.dist-info/top_level.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/big5freq.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/big5prober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/chardistribution.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/charsetgroupprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/charsetprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/cli/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/cli/chardetect.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/codingstatemachine.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/compat.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/cp949prober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/enums.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/escprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/escsm.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/eucjpprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/euckrfreq.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/euckrprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/euctwfreq.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/euctwprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/gb2312freq.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/gb2312prober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/hebrewprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/jisfreq.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/jpcntx.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/langbulgarianmodel.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/langgreekmodel.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/langhebrewmodel.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/langhungarianmodel.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/langrussianmodel.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/langthaimodel.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/langturkishmodel.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/latin1prober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/mbcharsetprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/mbcsgroupprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/mbcssm.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/metadata/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/metadata/languages.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/sbcharsetprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/sbcsgroupprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/sjisprober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/universaldetector.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/utf8prober.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/chardet/version.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna-2.10.dist-info/INSTALLER" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna-2.10.dist-info/LICENSE.rst" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna-2.10.dist-info/METADATA" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna-2.10.dist-info/RECORD" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna-2.10.dist-info/WHEEL" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna-2.10.dist-info/top_level.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/codec.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/compat.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/core.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/idnadata.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/intranges.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/package_data.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/idna/uts46data.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests-2.25.1.dist-info/INSTALLER" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests-2.25.1.dist-info/LICENSE" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests-2.25.1.dist-info/METADATA" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests-2.25.1.dist-info/RECORD" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests-2.25.1.dist-info/REQUESTED" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests-2.25.1.dist-info/WHEEL" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests-2.25.1.dist-info/top_level.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/__version__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/_internal_utils.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/adapters.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/api.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/auth.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/certs.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/compat.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/cookies.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/exceptions.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/help.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/hooks.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/models.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/packages.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/sessions.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/status_codes.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/structures.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/requests/utils.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/DESCRIPTION.rst" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/INSTALLER" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/LICENSE.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/METADATA" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/RECORD" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/WHEEL" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/metadata.json" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3-1.26.4.dist-info/top_level.txt" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/_collections.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/_version.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/connection.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/connectionpool.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/_appengine_environ.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/_securetransport/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/_securetransport/bindings.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/_securetransport/low_level.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/appengine.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/ntlmpool.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/pyopenssl.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/securetransport.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/contrib/socks.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/exceptions.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/fields.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/filepost.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/packages/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/packages/backports/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/packages/backports/makefile.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/packages/six.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/packages/ssl_match_hostname/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/poolmanager.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/request.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/response.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/__init__.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/connection.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/proxy.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/queue.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/request.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/response.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/retry.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/ssl_.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/ssltransport.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/timeout.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/url.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Lib/site-packages/urllib3/util/wait.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/venv/Scripts/chardetect.exe" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0004_servicetimeslot_booked_count.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0005_servicebooking_register_time.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0006_auto_20210330_1704.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0007_auto_20210330_1842.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0008_auto_20210330_1934.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0009_auto_20210330_1936.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0010_auto_20210403_1913.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0011_bonusrecord_register_time.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0012_auto_20210527_1702.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/migrations/0013_auto_20210530_1456.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/setting.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/media/-6899712029966619670_.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/media/7061105663688948058.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/media/7797926292689988560.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/volunteer_arrangement/202105/home_top.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/volunteer_arrangement/202105/home_top_cr.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/volunteer_arrangement/202105/home_top_cr_2.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/volunteer_arrangement/202105/login.jpg" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/static/volunteer_arrangement/202105/login.png" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/task_views.py" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin/adjust_credit.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_create_service.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_future_timeslots.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/bonus/admin_list.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/bonus/create.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/choicePage.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/volunteer_bonus_list.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/volunteer_bonus_my_enrollment.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/volunteer_home.html" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/volunteer_update_info.html" afterDir="false" />
+    <list default="true" id="5d56ca4e-fa09-4724-964f-713958f1a350" name="Default" comment="签到系统增加多选功能。去掉一些明显的bug。&#10;志愿者报名系统,增加导出当月服务功能。&#10;修改问卷扫码人数超过上限Bug&#10;添加身份证在网页端验证功能">
+      <change afterPath="$PROJECT_DIR$/MP_verify_FGlGjjfKq4iz5EZc.txt" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/dati/migrations/0008_auto_20230506_1222.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/dati/raw_data.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/dati/templates/dati/result.html" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.vscode/settings.json" beforeDir="false" afterPath="$PROJECT_DIR$/.vscode/settings.json" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/APP_data/db.sqlite3" beforeDir="false" afterPath="$PROJECT_DIR$/APP_data/db.sqlite3" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/Niko/settings.py" beforeDir="false" afterPath="$PROJECT_DIR$/Niko/settings.py" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/Niko/urls.py" beforeDir="false" afterPath="$PROJECT_DIR$/Niko/urls.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/AJAX.py" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/AjaxViews.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/checkIn_media/qrcode/c_ID_1.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/checkIn_media/qrcode/c_ID_2.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/checkIn_media/qrcode/c_ID_3.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/checkIn_media/qrcode/c_ID_4.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/checkIn_media/qrcode/c_ID_5.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/checkIn_media/qrcode/c_ID_6.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/forms.py" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/forms.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/functions.py" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/functions.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/models.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/static/JS/newItems.js" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/static/JS/newItems.js" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/static/qrcode/c_ID_1.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/static/qrcode/c_ID_2.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/static/qrcode/c_ID_3.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/static/qrcode/c_ID_6.png" beforeDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/bottom.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/bottom.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/checkInDetail.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/checkInDetail.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/checkInStatus.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/checkInStatus.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/index.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/backend/views.py" beforeDir="false" afterPath="$PROJECT_DIR$/backend/views.py" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/itemUpdate.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/itemUpdate.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/layout.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/layout.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/login.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/login.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/main.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/main.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/newCheckIn.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/newCheckIn.html" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/newItems.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/newItems.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/print.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/print.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/public.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/public.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/updateInfo.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/updateInfo.html" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/user/checkIn.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/user/checkIn.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/user/error.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/user/error.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/templates/checkIn/user/success.html" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/templates/checkIn/user/success.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/userViews.py" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/userViews.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/checkIn/views.py" beforeDir="false" afterPath="$PROJECT_DIR$/checkIn/views.py" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/dati/data.py" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/dati/forms.py" beforeDir="false" afterPath="$PROJECT_DIR$/dati/forms.py" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/dati/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/dati/models.py" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/dati/templates/dati/bottom.html" beforeDir="false" afterPath="$PROJECT_DIR$/dati/templates/dati/bottom.html" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/dati/templates/dati/dati.html" beforeDir="false" afterPath="$PROJECT_DIR$/dati/templates/dati/dati.html" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/dati/templates/dati/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/dati/templates/dati/index.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/dati/templates/dati/layout.html" beforeDir="false" afterPath="$PROJECT_DIR$/dati/templates/dati/layout.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/dati/templates/dati/layout1.html" beforeDir="false" afterPath="$PROJECT_DIR$/dati/templates/dati/layout1.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/dati/templates/dati/ranking.html" beforeDir="false" afterPath="$PROJECT_DIR$/dati/templates/dati/ranking.html" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/dati/views.py" beforeDir="false" afterPath="$PROJECT_DIR$/dati/views.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/data.py" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/data.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/functions.py" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/functions.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/models.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_delete_service.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_delete_service.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_home.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_home.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_pending_list.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/admin_pending_list.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/booking_service.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/booking_service.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/bottom.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/bottom.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/index.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/layout.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/layout.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/my_service.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/my_service.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/volunteer_reg.html" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/templates/volunteer_arrangement/volunteer_reg.html" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/urls.py" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/urls.py" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/volunteer_arrangement/views.py" beforeDir="false" afterPath="$PROJECT_DIR$/volunteer_arrangement/views.py" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -288,8 +46,8 @@
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
       <list>
-        <option value="HTML File" />
         <option value="Python Script" />
+        <option value="HTML File" />
       </list>
     </option>
   </component>
@@ -450,7 +208,14 @@
       <option name="project" value="LOCAL" />
       <updated>1615436590277</updated>
     </task>
-    <option name="localTasksCounter" value="2" />
+    <task id="LOCAL-00002" summary="签到系统增加多选功能。去掉一些明显的bug。&#10;志愿者报名系统,增加导出当月服务功能。&#10;修改问卷扫码人数超过上限Bug&#10;添加身份证在网页端验证功能">
+      <created>1644844082971</created>
+      <option name="number" value="00002" />
+      <option name="presentableId" value="LOCAL-00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1644844082971</updated>
+    </task>
+    <option name="localTasksCounter" value="3" />
     <servers />
   </component>
   <component name="Vcs.Log.Tabs.Properties">
@@ -467,7 +232,8 @@
   <component name="VcsManagerConfiguration">
     <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
     <MESSAGE value="签到系统增加多选功能。去掉一些明显的bug。&#10;志愿者报名系统,增加导出当月服务功能。" />
-    <option name="LAST_COMMIT_MESSAGE" value="签到系统增加多选功能。去掉一些明显的bug。&#10;志愿者报名系统,增加导出当月服务功能。" />
+    <MESSAGE value="签到系统增加多选功能。去掉一些明显的bug。&#10;志愿者报名系统,增加导出当月服务功能。&#10;修改问卷扫码人数超过上限Bug&#10;添加身份证在网页端验证功能" />
+    <option name="LAST_COMMIT_MESSAGE" value="签到系统增加多选功能。去掉一些明显的bug。&#10;志愿者报名系统,增加导出当月服务功能。&#10;修改问卷扫码人数超过上限Bug&#10;添加身份证在网页端验证功能" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
@@ -482,6 +248,11 @@
           <line>33</line>
           <option name="timeStamp" value="55" />
         </line-breakpoint>
+        <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
+          <url>file://$PROJECT_DIR$/dati/views.py</url>
+          <line>133</line>
+          <option name="timeStamp" value="56" />
+        </line-breakpoint>
       </breakpoints>
       <default-breakpoints>
         <breakpoint type="python-exception">

+ 5 - 1
.vscode/settings.json

@@ -6,5 +6,9 @@
         ".direnv",
         ".venv"
     ],
-    "git.ignoreLimitWarning": true
+    "git.ignoreLimitWarning": true,
+    "[python]": {
+        "editor.defaultFormatter": "ms-python.autopep8"
+    },
+    "python.formatting.provider": "none"
 }

BIN
APP_data/db.sqlite3


+ 1 - 0
MP_verify_FGlGjjfKq4iz5EZc.txt

@@ -0,0 +1 @@
+FGlGjjfKq4iz5EZc

+ 3 - 2
Niko/urls.py

@@ -7,7 +7,7 @@ from django.conf.urls import include, url
 # from django.urls import path
 from django.contrib import admin
 from checkIn.views import index_pjh
-from backend.views import wechat_authorize_domain
+from backend.views import wechat_authorize_domain,wechat_authorize_domain_2
 from django.views.generic.base import RedirectView
 
 # from checkIn import views, AJAX, userViews, staticViews, addonViews
@@ -35,7 +35,8 @@ urlpatterns = [
     url(r'^cq/library/', include('library.urls')),
     url(r'^cq/volunteer/', include('volunteer_arrangement.urls')),
     url(r'^backend/', include('backend.urls')),
-    url('MP_verify_nWvJfsXLyqPEqBTg.txt', wechat_authorize_domain),
+    url('MP_verify_FGlGjjfKq4iz5EZc.txt', wechat_authorize_domain),
+    url('MP_verify_nWvJfsXLyqPEqBTg.txt', wechat_authorize_domain_2),
     url(r'^favicon.ico$', RedirectView.as_view(url='http://www.pujianghui.work:81/favicon.ico'))
 ]
 

+ 3 - 0
backend/views.py

@@ -61,4 +61,7 @@ def wechat_openid(request):
 
 # 微信验证返回信息
 def wechat_authorize_domain(request):
+    return HttpResponse('FGlGjjfKq4iz5EZc')
+def wechat_authorize_domain_2(request):
     return HttpResponse('nWvJfsXLyqPEqBTg')
+

+ 4 - 4
checkIn/templates/checkIn/itemUpdate.html

@@ -32,14 +32,14 @@
         </div>
         <div id="onlyDIV" class="form-group">
             <label>是否要求唯一?</label>
-            <input id="onlyCheck" type="checkbox" name="uniqueItem" {% if item.unique %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将拒绝同样的签到内容二次签到。" />
+            <input id="onlyCheck" type="checkbox" name="uniqueItem" {% if item.unique %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将拒绝同样的内容。" />
         </div>
         <div id="reservedDIV" class="form-group">
-            <label>是否预设签到内容?</label>
-            <input type="checkbox" id="reservedCheck" name="reservedFlag" onchange="reservedChange()" {% if item.reservedContent %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将只会接受签到者输入的信息在预制信息之内。"/>
+            <label>是否预设内容?</label>
+            <input type="checkbox" id="reservedCheck" name="reservedFlag" onchange="reservedChange()" {% if item.reservedContent %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将只会接受用户输入的信息在预设信息之内。"/>
         </div>
         <div id="reservedArea" hidden="hidden" class="form-group">
-            <label>如果需要设定预设内容,请输入所有选项,用分号(;)分割,或者每个选项一行。并且勾选是否预设签到内容。<br /></label>
+            <label>如果需要设定预设内容,请输入所有选项,用分号(;)分割,或者每个选项一行。并且勾选是否预设内容。<br /></label>
             <textarea name="reservedContent" rows="10" cols="50" class="form-control"> {{item.reservedContent }}</textarea>
         </div>
         <input type="submit" value="修改" class="btn btn-default"/>

+ 2 - 2
checkIn/templates/checkIn/newItems.html

@@ -40,11 +40,11 @@
         </div>
         <div id="onlyDIV" class="form-group">
             <label>是否要求唯一?</label>
-            <input id="onlyCheck" type="checkbox" name="uniqueItem" {% if item.unique %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将拒绝同样的签到内容二次签到。" />
+            <input id="onlyCheck" type="checkbox" name="uniqueItem" {% if item.unique %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将拒绝同样的内容二次签到。" />
         </div>
         <div id="reservedDIV" class="form-group">
             <label>是否预设签到内容?</label>
-            <input type="checkbox" id="reservedCheck" name="reservedFlag" onchange="reservedChange()" {% if item.reservedContent %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将只会接受签到者输入的信息在预制信息之内。"/>
+            <input type="checkbox" id="reservedCheck" name="reservedFlag" onchange="reservedChange()" {% if item.reservedContent %} checked="checked" {% endif %} data-toggle="tooltip" title="系统将只会接受输入的信息在预设信息之内。"/>
         </div>
         <div id="reservedArea" hidden="hidden" class="form-group">
             <label>如果需要设定预设内容,请输入所有选项,用分号(;)分割,或者每个选项一行。并且勾选是否预设签到内容。<br /></label>

+ 1 - 1
checkIn/templates/checkIn/user/checkIn.html

@@ -22,7 +22,7 @@
                 <table class="table">
                     {% for item in items %}
                     <tr>
-                        <th>{{item.description}}:</th>
+                        <th>{{item.description}}{% if item.unique %}(这个内容不能和别人重复){% endif %}:</th>
 
                         <td>
                             {% if item.type == 0 %}<input type="text" required="required" name="{{item.description}}"

+ 0 - 13
dati/data.py

@@ -1,13 +0,0 @@
-form_department_choice = [('露香居民区党总支', '露香居民区党总支'), ('党建服务中心党总支', '党建服务中心党总支'), ('肇方居民区党总支', '肇方居民区党总支'),
-                          ('会稽居民区党总支', '会稽居民区党总支'), ('方西居民区党总支', '方西居民区党总支'), ('同庆居民区党总支', '同庆居民区党总支'),
-                          ('广福居民区党总支', '广福居民区党总支'), ('四新居民区党总支', '四新居民区党总支'), ('太都居民区党总支', '太都居民区党总支'),
-                          ('泰瑞居民区党总支', '泰瑞居民区党总支'), ('侯家居民区党总支', '侯家居民区党总支'), ('宝带居民区党总支', '宝带居民区党总支'),
-                          ('机关第一党支部', '机关第一党支部'), ('社区事务受理服务中心党支部', '社区事务受理服务中心党支部'), ('绿化和市容管理所党支部', '绿化和市容管理所党支部'),
-                          ('学院居民区党总支', '学院居民区党总支'), ('果育居民区党总支', '果育居民区党总支'), ('光启居民区党总支', '光启居民区党总支'),
-                          ('机关第二党支部', '机关第二党支部'), ('豫园街道城管中队党支部', '豫园街道城管中队党支部'), ('淮海居民区党总支', '淮海居民区党总支'),
-                          ('古城居民区党总支', '古城居民区党总支'), ('丹马居民区党总支', '丹马居民区党总支'),
-                          ('住房保障和房屋管理局豫园办事处党支部', '住房保障和房屋管理局豫园办事处党支部'), ('城市网格化综合管理中心党支部', '城市网格化综合管理中心党支部'),
-                          ('机关第三党支部', '机关第三党支部'), ('两新城隍庙片区', '两新城隍庙片区'), ('两新流动片区', '两新流动片区'),
-                          ('两新小商品市场片区', '两新小商品市场片区'), ('两新太都片区', '两新太都片区'), ('两新三牌楼片区', '两新三牌楼片区'),
-                          ('两新桃源片区', '两新桃源片区'), ('社会组织联合会党支部', '社会组织联合会党支部'),
-                          ]

+ 19 - 12
dati/forms.py

@@ -1,15 +1,22 @@
 from django import forms
-from dati.data import form_department_choice
+from dati.raw_data import form_department_choice_2, age_range, sex_list, district_choice
 
 
-class loginForm(forms.Form):
-     username = forms.CharField(max_length=14, min_length=1, required=True, label='姓名',
-                                error_messages={'required': '请输入你的姓名。'},
-                                widget=forms.TextInput(attrs={'style': 'width:100%'}))
-     mobile = forms.IntegerField(required=True, label='电话', max_value=19999999999, min_value=13000000000,
-                                 widget=forms.NumberInput(attrs={'style': 'width:100%'}))
-     department = forms.ChoiceField(choices=form_department_choice,label='党支部',
-                                    widget=forms.Select(attrs={'style': 'width:100%'}))
-     address = forms.CharField(max_length=255, min_length=1, required=True, label='地址',
-                                error_messages={'required': '请输入你的地址。'},
-                               widget=forms.TextInput(attrs={'style': 'width:100%'}))
+class LoginForm(forms.Form):
+    # mobile = forms.IntegerField(required=True, label='电话', max_value=19999999999, min_value=13000000000,
+    #                             widget=forms.NumberInput(attrs={'style': 'width:100%'}))
+    # district = forms.ChoiceField(choices=district_choice, label='所属区委',
+    #                              widget=forms.Select(attrs={'style': 'width:100%; color:black'}))
+    department = forms.ChoiceField(choices=form_department_choice_2, label='所属组织',
+                                   widget=forms.Select(attrs={'style': 'width:100%; color:black'}))
+    username = forms.CharField(max_length=14, min_length=1, label='姓名', required=False,
+                               # error_messages={'required': '请输入你的姓名。'},
+                               widget=forms.TextInput(
+                                   attrs={'style': 'width:100%; color:black', 'placeholder': '空白即为匿名'}))
+    sex = forms.ChoiceField(choices=sex_list, label='性别',
+                            widget=forms.Select(attrs={'style': 'width:100%; color:black'}))
+    age_range = forms.ChoiceField(choices=age_range, label='年龄区间',
+                                  widget=forms.Select(attrs={'style': 'width:100%; color:black'}))
+    # address = forms.CharField(max_length=255, min_length=1, required=True, label='地址',
+    #                           error_messages={'required': '请输入你的地址。'},
+    #                           widget=forms.TextInput(attrs={'style': 'width:100%'}))

+ 30 - 0
dati/migrations/0008_auto_20230506_1222.py

@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.5 on 2023-05-06 04:22
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dati', '0007_scores_address'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='question',
+            name='a5',
+            field=models.CharField(blank=True, max_length=128, null=True),
+        ),
+        migrations.AddField(
+            model_name='scores',
+            name='age_range',
+            field=models.CharField(blank=True, max_length=128, null=True),
+        ),
+        migrations.AddField(
+            model_name='scores',
+            name='sex',
+            field=models.CharField(blank=True, max_length=8, null=True),
+        ),
+    ]

+ 6 - 3
dati/models.py

@@ -9,6 +9,7 @@ class Question(models.Model):
     a2 = models.CharField(max_length=128)
     a3 = models.CharField(max_length=128)
     a4 = models.CharField(max_length=128)
+    a5 = models.CharField(max_length=128, blank=True, null=True)
     answer = models.IntegerField()
 
     @staticmethod
@@ -41,14 +42,16 @@ class Scores(models.Model):
     user = models.CharField(max_length=128)
     mobile = models.IntegerField()
     department = models.CharField(max_length=128)
+    sex = models.CharField(max_length=8, blank=True, null=True)
+    age_range = models.CharField(max_length=128, blank=True, null=True)
     score = models.FloatField()
     start_time = models.DateTimeField(auto_now=True)
     total_time = models.IntegerField()
     address = models.CharField(max_length=255)
 
-    def add_score(self):
-        Scores.objects.create(user=self.user, mobile=self.mobile, department=self.department, score=self.score,
-                              total_time=self.total_time, address=self.address)
+    # def add_score(self):
+    #     Scores.objects.create(user=self.user, mobile=self.mobile, department=self.department, score=self.score,
+    #                           total_time=self.total_time, address=self.address)
 
     @staticmethod
     def find_score(mobile_number):

+ 42 - 0
dati/raw_data.py

@@ -0,0 +1,42 @@
+form_department_choice = [('露香居民区党总支', '露香居民区党总支'), ('党建服务中心党总支', '党建服务中心党总支'), ('肇方居民区党总支', '肇方居民区党总支'),
+                          ('会稽居民区党总支', '会稽居民区党总支'), ('方西居民区党总支', '方西居民区党总支'), ('同庆居民区党总支', '同庆居民区党总支'),
+                          ('广福居民区党总支', '广福居民区党总支'), ('四新居民区党总支', '四新居民区党总支'), ('太都居民区党总支', '太都居民区党总支'),
+                          ('泰瑞居民区党总支', '泰瑞居民区党总支'), ('侯家居民区党总支', '侯家居民区党总支'), ('宝带居民区党总支', '宝带居民区党总支'),
+                          ('机关第一党支部', '机关第一党支部'), ('社区事务受理服务中心党支部', '社区事务受理服务中心党支部'), ('绿化和市容管理所党支部', '绿化和市容管理所党支部'),
+                          ('学院居民区党总支', '学院居民区党总支'), ('果育居民区党总支', '果育居民区党总支'), ('光启居民区党总支', '光启居民区党总支'),
+                          ('机关第二党支部', '机关第二党支部'), ('豫园街道城管中队党支部', '豫园街道城管中队党支部'), ('淮海居民区党总支', '淮海居民区党总支'),
+                          ('古城居民区党总支', '古城居民区党总支'), ('丹马居民区党总支', '丹马居民区党总支'),
+                          ('住房保障和房屋管理局豫园办事处党支部', '住房保障和房屋管理局豫园办事处党支部'), ('城市网格化综合管理中心党支部', '城市网格化综合管理中心党支部'),
+                          ('机关第三党支部', '机关第三党支部'), ('两新城隍庙片区', '两新城隍庙片区'), ('两新流动片区', '两新流动片区'),
+                          ('两新小商品市场片区', '两新小商品市场片区'), ('两新太都片区', '两新太都片区'), ('两新三牌楼片区', '两新三牌楼片区'),
+                          ('两新桃源片区', '两新桃源片区'), ('社会组织联合会党支部', '社会组织联合会党支部'),
+                          ]
+
+form_department_choice_2 = [('复旦大学委', '复旦大学委'), ('交通大学委', '交通大学委'), ('交大医学院委', '交大医学院委'), ('中医大委', '中医大委'),
+                            ('卫健委', '卫健委'), ('申康委', '申康委'), ('华东师范大学委', '华东师范大学委'), ('文广委', '文广委'), ('大剧院委', '大剧院委'),
+                            ('同济大学委', '同济大学委'), ('司法委', '司法委'), ('上海师范大学委', '上海师范大学委'), ('科技委', '科技委'),
+                            ('海事大学委', '海事大学委'), ('上海戏曲艺术中心委', '上海戏曲艺术中心委'), ('经信委', '经信委'), ('医药总支', '医药总支'),
+                            ('上海财经大学总支', '上海财经大学总支'), ('书画艺术委', '书画艺术委'), ('新闻总支', '新闻总支'), ('张江总支', '张江总支'),
+                            ('上海对外经贸大学支部', '上海对外经贸大学支部'), ('上海大学支部', '上海大学支部'), ('华东理工大学支部', '华东理工大学支部'),
+                            ('东华大学支部', '东华大学支部'), ('上海体育学院支部', '上海体育学院支部'), ('体育支部', '体育支部'), ('舞蹈学校支部', '舞蹈学校支部'),
+                            ('戏曲学校支部', '戏曲学校支部'), ('社科院支部', '社科院支部'), ('轻工支部', '轻工支部'), ('工业支部', '工业支部'),
+                            ('文旅局支部', '文旅局支部'), ('上海世纪出版集团支部', '上海世纪出版集团支部'), ('市政支部', '市政支部'), ('交通支部', '交通支部'),
+                            ('产业支部', '产业支部'), ('上海健康医学院支部', '上海健康医学院支部'), ('机关一支', '机关一支'), ('机关二支', '机关二支'),
+                            ('上海外国语大学支部', '上海外国语大学支部'), ('生态环境支部', '生态环境支部'), ('上海音乐学院支部', '上海音乐学院支部'),
+                            ('电影集团支部', '电影集团支部'), ('华东政法大学支部', '华东政法大学支部'), ('浦东新区区委', '浦东新区区委'), ('黄浦区委', '黄浦区委'),
+                            ('静安区委', '静安区委'), ('徐汇区委', '徐汇区委'), ('长宁区委', '长宁区委'),
+                            ('普陀区委', '普陀区委'), ('虹口区委', '虹口区委'), ('杨浦区委', '杨浦区委'), ('宝山区委', '宝山区委'),
+                            ('闵行区委', '闵行区委'), ('嘉定区委', '嘉定区委'), ('金山区委', '金山区委'), ('松江区委', '松江区委'), ('青浦区委', '青浦区委'),
+                            ('奉贤区委', '奉贤区委'), ('崇明区委', '崇明区委'),
+                            ]
+
+district_choice = [('浦东新区区委', '浦东新区区委'), ('黄浦区委', '黄浦区委'), ('静安区委', '静安区委'), ('徐汇区委', '徐汇区委'), ('长宁区委', '长宁区委'),
+                   ('普陀区委', '普陀区委'), ('虹口区委', '虹口区委'), ('杨浦区委', '杨浦区委'), ('宝山区委', '宝山区委'),
+                   ('闵行区委', '闵行区委'), ('嘉定区委', '嘉定区委'), ('金山区委', '金山区委'), ('松江区委', '松江区委'), ('青浦区委', '青浦区委'),
+                   ('奉贤区委', '奉贤区委'), ('崇明区委', '崇明区委'),
+                   ]
+
+age_range = [('20-', '20-'), ('21-30', '21-30'), ('31-40', '31-40'), ('41-50', '41-50'), ('51-60', '51-60'),
+             ('61-70', '61-70'), ('70+', '70+')]
+
+sex_list = [('男', '男'), ('女', '女')]

+ 2 - 4
dati/templates/dati/bottom.html

@@ -1,5 +1,3 @@
-{% load staticfiles %}
-<!-- <div id="bottom" class="container"style="text-align:center;margin-bottom: 1em;position:absolute; width:100%;color:white;">
+<div id="bottom" class="container" style="width: 100%; color: white; position:absolute; left: 0; bottom: 0;  text-align: center;">
     沪ICP备17040079号-3
-</div> -->
-<div id="bottom" class="container" style="width: 100%; color: white; margin-top: 0px; position:absolute; top: 100%; text-align: center;">沪ICP备17040079号-3</div></div>
+</div>

+ 95 - 66
dati/templates/dati/dati.html

@@ -4,11 +4,11 @@
 {% block script %}
 
 <script>
-    var timer = 60;
+    var timer = 120;
     function count_down() {
         setInterval(function () {
             timer--
-            console.log(timer)
+            // console.log(timer)
             if (timer == 0) {
                 alert('答题时间结束')
                 window.location.href = '/cq/dati/'
@@ -20,94 +20,123 @@
         height = $("#background").height();
         console.log(height);
         $("#content").height(height);
-    }
+    } 
 
     function check_answer() {
+        document.getElementById("submit").disabled = true
+        document.getElementById("a1").disabled = true
+        document.getElementById("a2").disabled = true
+        try { document.getElementById("a3").disabled = true } catch { }
+        try { document.getElementById("a4").disabled = true } catch { }
+        try { document.getElementById("a5").disabled = true } catch { }
+        document.getElementById("popup_form").hidden = false
         correct_answer = {{ question.answer }}
-        for (i = 0; i < dati.answer.length; i++) {
-            if (dati.answer[i].checked) {
-                your_answer = i + 1;
-            }
-        }
-        if (your_answer == correct_answer) {
-            alert("恭喜你答对了!");
+    for (i = 0; i < dati.answer.length; i++) {
+        if (dati.answer[i].checked) {
+            your_answer = i + 1;
+            document.getElementById("hidden_answer").setAttribute("value", your_answer);
         }
-        else {
-            switch (correct_answer) {
-                case 1:
-                    alert("很遗憾,你答错了!\n" + "正确答案是:" + "{{question.a1}}");
-                    break;
-                case 2:
-                    alert("很遗憾,你答错了!\n" + "正确答案是:" + "{{question.a2}}");
-                    break;
-                case 3:
-                    alert("很遗憾,你答错了!\n" + "正确答案是:" + "{{question.a3}}");
-                    break;
-                case 4:
-                    alert("很遗憾,你答错了!\n" + "正确答案是:" + "{{question.a4}}");
-                    break;
-            }
+    }
+    if (your_answer == correct_answer) {
+        set_feedback("你真棒!");
+    }
+    else {
+        switch (correct_answer) {
+            case 1:
+                set_feedback("继续加油!<br><br>" + "正确答案是:" + "{{question.a1}}");
+                break;
+            case 2:
+                set_feedback("继续加油!<br><br>" + "正确答案是:" + "{{question.a2}}");
+                break;
+            case 3:
+                set_feedback("继续加油!<br><br>" + "正确答案是:" + "{{question.a3}}");
+                break;
+            case 4:
+                set_feedback("继续加油!<br><br>" + "正确答案是:" + "{{question.a4}}");
+                break;
+            case 5:
+                set_feedback("继续加油!<br><br>" + "正确答案是:" + "{{question.a5}}");
+                break;
         }
+    }
             // submit.disabled="true";
             //window.location.reload();
     }
+
+    function set_feedback(feedback) {
+        document.getElementById("answer_feedback").innerHTML = feedback
+        // alert(feedback)
+    }
+
+    function check_answer_selected() {
+        if ($("#a1")[0].checked || $("#a2")[0].checked || $("#a3")[0].checked || $("#a4")[0].checked || $("#a5")[0].checked) {
+            $("#submit")[0].disabled = false;
+        } else {
+            $("#submit")[0].disabled = true;
+        }
+        console.log("used" + {{ question.answer }}* 3.14 + "seconds to click")
+    }
+</script>
+<script>
+    window.onload = function () {
+        setHeight();
+        count_down();
+    }
+    
 </script>
 
 {% endblock %}
 
 {%block body %}
 <div>
-    <img id="background" src="http://www.pujianghui.work:81/dati/dati2_main.jpg" width="100%" alt=""
-        style="position:absolute">
+    <img id="background" src="http://www.pujianghui.work:81/dati/NGD/dati_2.jpg" width="100%" alt="" style="position:absolute">
 </div>
 <div id="content" class="container" style="position: absolute; width: 100%; height: 1200px; padding:0px">
-    <div style="margin-left: 10%; margin-top: 20%; width: 80%;">
+    <div
+        style="margin-left: 5%; margin-top: 25%; width: 90%;border:2px solid red;border-radius:15px; background-color:rgba(255, 255, 255, 0.7); position: absolute">
+        <div
+            style="border:2px solid red;border-radius:15px; width: fit-content; margin-left: 40%; margin-right: 40%; margin-top: -3%; padding-right: 10px; padding-left: 10px;background-color:rgba(255, 255, 255, 1);">
+            <div>第{{ question_number }}题</div>
+        </div>
         <form id="dati" method="POST">
             {% csrf_token %}
             <h3>{{question.q}}</h3><br>
-            <div style="font-size: larger;"><input type="radio" name="answer" value=1 id="a1"
-                    onclick="check_answer_selected()"></input><label for="a1"
+            <div><input type="radio" name="answer" value=1 id="a1" onclick="check_answer_selected()" /><label for="a1"
                     onclick="check_answer_selected()">{{question.a1}}</label></div>
-            <div style="font-size: larger;"><input type="radio" name="answer" value=2 id="a2"
-                    onclick="check_answer_selected()"></input><label for="a2"
+            <div><input type="radio" name="answer" value=2 id="a2" onclick="check_answer_selected()" /><label for="a2"
                     onclick="check_answer_selected()">{{question.a2}}</label></div>
-            <div style="font-size: larger;"><input type="radio" name="answer" value=3 id="a3"
-                    onclick="check_answer_selected()"></input><label for="a3"
+            {% if question.a3|length > 0 %}
+            <div><input type="radio" name="answer" value=3 id="a3" onclick="check_answer_selected()" /><label for="a3"
                     onclick="check_answer_selected()">{{question.a3}}</label></div>
-            <div style="font-size: larger;"><input type="radio" name="answer" value=4 id="a4"
-                    onclick="check_answer_selected()"></input><label for="a4"
+            {% endif %}
+            {% if question.a4|length > 0 %}
+            <div><input type="radio" name="answer" value=4 id="a4" onclick="check_answer_selected()" /><label for="a4"
                     onclick="check_answer_selected()">{{question.a4}}</label></div>
-            <div style="margin-top:2em;text-align: center;"><input type="submit" disabled=true id="submit" value="提交"
-                    onclick="check_answer()" class="btn btn-danger btn-lg"></div>
+            {% endif %}
+            {% if question.a5|length > 0 %}
+            <div><input type="radio" name="answer" value=5 id="a5" onclick="check_answer_selected()" /><label for="a5"
+                    onclick="check_answer_selected()">{{question.a5}}</label></div>
+            {% endif %}
+            <div style="margin-top:2em;text-align: center;"><input type="button" disabled=true id="submit" value={% if question_number == 15 %}"提交"{% else %}"下一题"{% endif %} onclick="check_answer()" data-toggle="modal"
+                    data-target="#check_answer" class="btn btn-danger btn-lg" style="margin-bottom:10%"></div>
+        </form>
+    </div>
+    <!-- 手动弹窗 -->
+    <div class="container" id="popup_form" hidden=true
+        style="border:2px solid red;border-radius:15px; width: 80%; margin-left: 10%; margin-right: 10%; margin-top: 50%; ;background-color:rgba(255, 255, 255, 0.9); position: absolute;">
+        <form method="POST" style="margin-top:10%">
+            <!-- 隐藏submit form -->
+            {% csrf_token %}
+            <div id="answer_feedback">
+                在这里输入答案反馈
+            </div>
+            <input id="hidden_answer" name="answer" type="hidden" />
+            <div style="margin-top:2em;text-align: center;">
+                <input class="btn btn-info" type="submit" value="确认" style="margin-bottom:10%">
+            </div>
         </form>
     </div>
 
-    <!-- <div style="color: white; margin-top: -30px; position:relative; text-align: center;">沪ICP备17040079号-3</div> -->
-    <!-- <br><a href="/cq/dati/history">查询我的答题记录</a> -->
-
-    <script>
-        window.onload = function () {
-            setHeight();
-            count_down();
-        }
-    </script>
-    <script>
-        // function check_answer_selected() {
-        //     if (a1.checked || a2.checked || a3.checked || a4.checked) {
-        //         submit.disabled = false;
-        //     } else {
-        //         submit.disabled = true;
-        //     }
-        //     console.log("used" + {{ question.answer }}* 3.14 + "seconds to click")
-        // }
+{% endblock %}
 
-        function check_answer_selected() {
-            if ($("#a1")[0].checked || $("#a2")[0].checked || $("#a3")[0].checked || $("#a4")[0].checked) {
-                $("#submit")[0].disabled = false;
-            } else {
-                $("#submit")[0].disabled = true;
-            }
-            console.log("used" + {{ question.answer }}* 3.14 + "seconds to click")
-        }
-    </script>
-    {% endblock %}
+</div>

+ 15 - 7
dati/templates/dati/index.html

@@ -11,29 +11,36 @@
 </script>
 <style>
     #image {
-        width: 20%;
+        width: 50%;
         position: absolute;
         left: 50%;
         top: 50%;
         transform: translate(-50%, -50%);
+        margin-top:20%;
         /* 50%为自身尺寸的一半 */
     }
+    input{
+        border-radius:15px;
+    }
+    select{
+        border-radius:15px;
+    }
 </style>
 
 {% endblock %}
 
 {%block body %}
 <div>
-    <img id="background" src="http://www.pujianghui.work:81/dati/dati2_intro.jpg" width="100%" alt="" style="position:absolute">
+    <img id="background" src="http://www.pujianghui.work:81/dati/NGD/dati_1.jpg" width="100%" alt="" style="position:absolute">
 </div>
 <div id="content" class="container" style="position: absolute; width: 100%; height: 1200px; padding: 0px;">
-    <div style="margin-top: 20%; margin-left: 10%;">
+    <div style="margin-top: 120%">
         <form name="login" method="post" class="form-inline">
-            <!-- <table class="table table-hover"> -->
+             <table class="table table-hover" style="color: white">
             {% csrf_token %}
-            <!-- {{form}} -->
-            <!-- </table> -->
-            <input id="image" type="image" src="http://www.pujianghui.work:81/dati/dati2_btn.png" alt="">
+             {{form}}
+             </table>
+            <input id="image" type="image" src="http://www.pujianghui.work:81/dati/NGD/btn.png" alt="" style="position: relative">
             <!-- <input type="submit" value="参与答题" class="btn btn-danger btn-lg"/> -->
         </form>
         <!-- </div>
@@ -48,3 +55,4 @@
         }
     </script>    
     {% endblock %}
+</div>

+ 1 - 2
dati/templates/dati/layout.html

@@ -5,11 +5,10 @@
         <meta http-equiv="X-UA-Compatible" content="chrome=1" />
         <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width" />
         {% load staticfiles %}
-        <title>{% if title %} {{title}} {% else %} -在线测试- {% endif %}</title>
+        <title>{% if title %} {{title}} {% else %} 等侬来答 {% endif %}</title>
         <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
         <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
         <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
-        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
         {% block script %}{% endblock %}
     </head>
     {% load static %}

+ 6 - 4
dati/templates/dati/layout1.html

@@ -6,10 +6,12 @@
         <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width" />
         {% load staticfiles %}
         <title>{% if title %} {{title}} {% else %} -在线测试- {% endif %}</title>
-        <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
-        <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
-        <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
-        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
+        {% comment %} <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> {% endcomment %}
+        {% comment %} <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> {% endcomment %}
+        {% comment %} <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> {% endcomment %}
+        <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
+        <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
+        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
         {% block script %}{% endblock %}
     </head>
     {% load static %}

+ 3 - 3
dati/templates/dati/ranking.html

@@ -6,9 +6,9 @@
 {% endblock %}
 
 {%block body %}
-<div style="margin: 0%;">
-    <img src="https://echo3991-1251363834.cos.ap-shanghai.myqcloud.com/pujianghui/dati_a.jpg" style="width: 100%;">
-</div>
+<!--<div style="margin: 0%;">-->
+<!--    <img src="https://echo3991-1251363834.cos.ap-shanghai.myqcloud.com/pujianghui/dati_a.jpg" style="width: 100%;">-->
+<!--</div>-->
 <div class="container" style="margin-top: 0%; margin-bottom: 4em ;color: white;background-color: #A0060A">
     <table class="table">
 

+ 45 - 0
dati/templates/dati/result.html

@@ -0,0 +1,45 @@
+{% extends "dati/layout.html" %}
+{% load staticfiles %}
+
+{% block script %}
+<script>
+    function setHeight(){
+        height =  $("#background").height();
+        console.log(height);
+        $("#content").height(height);
+    }
+</script>
+<style>
+    #image {
+        width: 50%;
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        transform: translate(-50%, -50%);
+        margin-top:20%;
+        /* 50%为自身尺寸的一半 */
+    }
+    input{
+        border-radius:15px;
+    }
+    select{
+        border-radius:15px;
+    }
+</style>
+
+{% endblock %}
+
+{%block body %}
+<div>
+    <img id="background" src="http://www.pujianghui.work:81/dati/NGD/dati_2.jpg" width="100%" alt="" style="position:absolute">
+</div>
+<div style="margin-left: 5%; margin-top: 90%; width: 90%;border:2px solid red;border-radius:15px; background-color:rgba(255, 255, 255, 0.7); position: absolute;">
+    <div style="font-size:18px; margin-top:10%; margin-bottom:10%; padding:4%">
+        {% comment %} 谢谢参与。你已经完成答题。<br>
+        共答对{{ correct_qty }}道题。<br>
+        你可以关闭这个页面了。 {% endcomment %}
+        {{ feedback }}
+    </div>
+</div>   
+    {% endblock %}
+</div>

+ 79 - 49
dati/views.py

@@ -1,7 +1,7 @@
 from django.shortcuts import render
 from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
-from django.core import serializers
-from .forms import loginForm
+# from django.core import serializers
+from .forms import LoginForm
 from .models import Question, AnswerRecord, Scores
 from datetime import datetime, timedelta
 import json
@@ -13,16 +13,20 @@ import json
 def index(request):
     # homepage
     if request.method == 'POST':
-        # lForm = loginForm(request.POST)
-        # if lForm.is_valid():
-            # request.session['username'] = lForm.cleaned_data['username'].strip()
-            # request.session['mobile'] = lForm.cleaned_data['mobile']
-            # request.session['department'] = lForm.cleaned_data['department']
-            # request.session['address'] = lForm.cleaned_data['address']
-        request.session['username'] = 'dati2 fake username'
-        request.session['mobile'] = '13000001111'
-        request.session['department'] = 'dati2 fake department'
-        request.session['address'] = 'dati2 fake address'
+        login_form = LoginForm(request.POST)
+        if login_form.is_valid():
+            request.session['username'] = login_form.cleaned_data['username'].strip()
+            if request.session['username'] == "":
+                request.session['username'] = "匿名"
+            # request.session['mobile'] = login_form.cleaned_data['mobile']
+            # request.session['address'] = login_form.cleaned_data['district']
+            # request.session['address'] = login_form.cleaned_data['address']
+            request.session['address'] = 'NA'
+            request.session['department'] = login_form.cleaned_data['department']
+            request.session['age_range'] = login_form.cleaned_data['age_range']
+            request.session['sex'] = login_form.cleaned_data['sex']
+            request.session['mobile'] = '13000001111'
+
         # user_score = Scores()
         # if user_score.find_score(mobile_number=request.session['mobile']):
         #     return render(request, 'dati/directPage.html', {'alertMsg': '您已经答过题了。', 'dirLink': '/cq/dati'})
@@ -32,9 +36,10 @@ def index(request):
         request.session['used_question_list'] = question_list
         request.session['start_time'] = str(datetime.now())
         return HttpResponseRedirect('/cq/dati/dati')
-    else:
+
+    if request.method == 'GET':
         request.session.flush()
-        return render(request, 'dati/index.html', {'form': loginForm})
+        return render(request, 'dati/index.html', {'form': LoginForm})
 
 
 def dati(request):
@@ -58,40 +63,44 @@ def dati(request):
     #     del request.session['mobile']
     #     return render(request, 'dati/directPage.html', {'alertMsg': message, 'dirLink': '/cq/dati'})
     if request.method == 'POST':
-        request.session['time'] = request.session['time'] + 1
+        request.session['time'] = request.session['time'] + 1       # time表示答题次数
         quest.ID = request.session['question_id']
         quest = Question.search_id(quest)
         your_answer = request.POST['answer']
-        answerRecord = AnswerRecord
-        answerRecord.user = request.session['username']
-        answerRecord.mobile = request.session['mobile']
-        answerRecord.department = request.session['department']
-        answerRecord.question = quest[0].q
+        answer_record = AnswerRecord
+        answer_record.user = request.session['username']
+        answer_record.mobile = request.session['mobile']
+        answer_record.department = request.session['department']
+        answer_record.question = quest[0].q
         if int(your_answer) == quest[0].answer:
-            answerRecord.result = '正确'
+            answer_record.result = '正确'
             request.session['correct'] = request.session['correct'] + 1
         else:
-            answerRecord.result = '错误'
+            answer_record.result = '错误'
         # 用户的答案
         if your_answer == '1':
-            answerRecord.your_answer = quest[0].a1
+            answer_record.your_answer = quest[0].a1
         elif your_answer == '2':
-            answerRecord.your_answer = quest[0].a2
+            answer_record.your_answer = quest[0].a2
         elif your_answer == '3':
-            answerRecord.your_answer = quest[0].a3
+            answer_record.your_answer = quest[0].a3
         elif your_answer == '4':
-            answerRecord.your_answer = quest[0].a4
+            answer_record.your_answer = quest[0].a4
+        elif your_answer == '5':
+            answer_record.your_answer = quest[0].a5
         # 记录正确答案
         if quest[0].answer == 1:
-            answerRecord.correct_answer = quest[0].a1
+            answer_record.correct_answer = quest[0].a1
         elif quest[0].answer == 2:
-            answerRecord.correct_answer = quest[0].a2
+            answer_record.correct_answer = quest[0].a2
         elif quest[0].answer == 3:
-            answerRecord.correct_answer = quest[0].a3
+            answer_record.correct_answer = quest[0].a3
         elif quest[0].answer == 4:
-            answerRecord.correct_answer = quest[0].a4
-        AnswerRecord.add_record(answerRecord)
-        if request.session['time'] >= 10:
+            answer_record.correct_answer = quest[0].a4
+        elif quest[0].answer == 5:
+            answer_record.correct_answer = quest[0].a5
+        AnswerRecord.add_record(answer_record)
+        if request.session['time'] >= 15:       # 控制总答题数量,达到后结束答题
             user_score = Scores()
             user_score.user = request.session['username']
             user_score.mobile = request.session['mobile']
@@ -99,24 +108,44 @@ def dati(request):
             user_score.score = request.session['correct']
             user_score.address = request.session['address']
             user_score.total_time = time_delta_since_last
-            user_score.add_score()
+            user_score.sex = request.session['sex']
+            user_score.age_range = request.session['age_range']
+            # user_score.add_score()
+            user_score.save()
+            del request.session['mobile']
             # message = '答题结束本次答题,你答对了'+str(request.session['correct'])+'题。共用时'+str(round(user_score.total_time))+'秒。'
-            if request.session['correct'] == 10:
-                message = '您完成答题,您答对了10题。答题完成界面请拍照保留后,至前台领取活动宣传品一份。'
+            # if request.session['correct'] == 10:
+            #     message = '您完成答题,您答对了10题。答题完成界面请拍照保留后,至前台领取活动宣传品一份。'
+            # else:
+            #     message = '您完成答题,您答对了' + str(request.session['correct']) + '题。'
+            # message = '您完成答题,您答对了' + str(request.session['correct']) + '题。'
+            # return render(request, 'dati/directPage.html', {'alertMsg': message, 'dirLink': '/cq/dati'})
+            feedback = '好的成绩,全靠努力,继续加油,再次来战!'
+            correct_qty = request.session['correct']
+            if correct_qty == 15:
+                feedback = '满分答卷,您也可以选择再次挑战。'
+            elif correct_qty >= 12:
+                feedback = '学习到位,成绩优秀,您是否选择再次挑战?'
+            elif correct_qty >= 9:
+                feedback = '再接再厉,不懈努力,等您再次来答题!'
             else:
-                message = '您完成答题,您答对了' + str(request.session['correct']) + '题。'
-            del request.session['mobile']
-            return render(request, 'dati/directPage.html', {'alertMsg': message, 'dirLink': '/cq/dati'})
+                feedback = '好的成绩,全靠努力,继续加油,再次来战!'
+
+            return render(request, 'dati/result.html', {'correct_qty': correct_qty, 'feedback': feedback})
         else:
-            if request.session['correct'] == 50:
-                message = '再接再厉,奖品离你越来越近了哦!'
-                return render(request, 'dati/directPage.html', {'alertMsg': message, 'dirLink': '/cq/dati/dati'})
-            else:
-                return HttpResponseRedirect('/cq/dati/dati')
+            return HttpResponseRedirect('/cq/dati/dati')
+            # 答对一定数量后给的提示
+            # if request.session['correct'] == 500:
+            #     message = '再接再厉,奖品离你越来越近了哦!'
+            #     return render(request, 'dati/directPage.html', {'alertMsg': message, 'dirLink': '/cq/dati/dati'})
+            # else:
+            #     return HttpResponseRedirect('/cq/dati/dati')
+
     if request.method == 'GET':
         quest = Question.get_random_question()[0]
         request.session['question_id'] = quest.ID
         used_question_list = request.session['used_question_list']
+        question_number = request.session['time'] + 1
         while True:
             if quest.ID in used_question_list:
                 quest = Question.get_random_question()[0]
@@ -124,15 +153,16 @@ def dati(request):
             else:
                 used_question_list.append(quest.ID)
                 break
-        return render(request, 'dati/dati.html', {'question': quest, 'start_time': str(start_time)})
+        return render(request, 'dati/dati.html',
+                      {'question': quest, 'start_time': str(start_time), 'question_number': question_number})
 
 
 def history(request):
-    ansRecord = AnswerRecord
-    ansRecord.user = request.session['username']
-    ansRecord.mobile = request.session['mobile']
-    ansRecord = AnswerRecord.get_record(ansRecord)
-    return render(request, 'dati/history.html', {'history': ansRecord})
+    answer_record = AnswerRecord
+    answer_record.user = request.session['username']
+    answer_record.mobile = request.session['mobile']
+    answer_record = AnswerRecord.get_record(answer_record)
+    return render(request, 'dati/history.html', {'history': answer_record})
 
 
 def ranking(request):