commit 97a3b7b7bfae08bd2bc773d84bb3ebce74c0b7f1 Author: mxr612 Date: Tue Mar 4 19:29:43 2025 +0800 使用Flask和PyScript构建了一个简单的量表网站框架,实现了: 1. 纯json的量表编辑 2. 任意区间的Ratio填写 3. 可选的Reverse item 4. 可按照子量表计算结果 diff --git a/app.py b/app.py new file mode 100644 index 0000000..065f5fe --- /dev/null +++ b/app.py @@ -0,0 +1,60 @@ +import json +import os +from flask import Flask, render_template, request + +app = Flask(__name__) + +# 加载所有问卷数据 +def load_all_scales(): + scale_folder = 'scales' + scales = {} + for filename in os.listdir(scale_folder): + if filename.endswith('.json'): + with open(os.path.join(scale_folder, filename), 'r', encoding='utf-8') as f: + scale = json.load(f) + # 使用文件名作为问卷的唯一标识 + scale_id = os.path.splitext(filename)[0] + scales[scale_id] = scale + return scales + +@app.route('/') +def index(): + scales = load_all_scales() + return render_template('index.html', scales=scales) + +@app.route('/scales/') +def scale(scale_id): + scales = load_all_scales() + scale = scales.get(scale_id) + if scale: + return render_template('scale.html', scale_id=scale_id,scale=scale) + return "问卷未找到", 404 + +@app.route('/result/', methods=['POST']) +def result(scale_id): + # print(request.form) + scales = load_all_scales() + scale = scales.get(scale_id) + if scale: + responses = {} + ranges = {} + # print(scale['questions']) + for question in scale['questions']: + # print(question['subscale']) + if question['subscale'] not in responses: + responses[question['subscale']] = 0 + ranges[question['subscale']] = [0,0] + if 'reverse' in question and question['reverse']: + responses[question['subscale']] += question['range'][1] + question['range'][0] - int( request.form[question['id']]) + else: + responses[question['subscale']] += int( request.form[question['id']]) + ranges[question['subscale']][0] += question['range'][0] + ranges[question['subscale']][1] += question['range'][1] + # 这里可以添加保存数据到数据库等逻辑 + # print(ranges) + return render_template('result.html', responses=responses, ranges=ranges, scale_title=scale['title']) + return "问卷未找到", 404 + + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..19f4cff Binary files /dev/null and b/requirements.txt differ diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..b182f07 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,16 @@ + + + + + + 心尺 PsychoScales + + +

心尺 PsychoScales

+ + + \ No newline at end of file diff --git a/templates/result.html b/templates/result.html new file mode 100644 index 0000000..9b7160c --- /dev/null +++ b/templates/result.html @@ -0,0 +1,17 @@ + + + + + + Result + + +

{{ scale_title }}

+ +
    + {% for key, value in responses.items() %} +
  • {{ key }}: 在 {{ranges[key][0]}} 到 {{ranges[key][1]}} 的量表中得分 {{ value }}
  • + {% endfor %} +
+ + \ No newline at end of file diff --git a/templates/scale.html b/templates/scale.html new file mode 100644 index 0000000..32f13bc --- /dev/null +++ b/templates/scale.html @@ -0,0 +1,48 @@ + + + + + + {{ scale.title }} + + + +

{{ scale.title }}

+

{{ scale.instructions }}

+
+ {% for question in scale.questions %} + +
+ + {% for option in range(question.range[0], question.range[1]+1) %} + + + {% endfor %} +
+ {% endfor %} + +
+ + \ No newline at end of file