20260123最后备份

This commit is contained in:
2026-01-23 16:19:08 +08:00
parent 7d76e9a7e9
commit ba4e4024ed
2 changed files with 130 additions and 13 deletions

View File

@@ -92,17 +92,15 @@ def load_config():
NEED_AUDIT = settings.need_audit NEED_AUDIT = settings.need_audit
except Exception as e: except Exception as e:
print(f"Warning: Failed to load settings: {e}") print(f"Warning: Failed to load settings: {e}")
global DENY_WORDS_CACHE
def load_deny_words(): with app.app_context():
global DENY_WORDS_CACHE try:
with app.app_context(): words = db.session.query(DenyWord.word).all()
try: # words 是 list of tuples [('word1',), ('word2',)]
words = db.session.query(DenyWord.word).all() DENY_WORDS_CACHE = [w[0] for w in words]
# words 是 list of tuples [('word1',), ('word2',)] print(f"Loaded {len(DENY_WORDS_CACHE)} deny words.")
DENY_WORDS_CACHE = [w[0] for w in words] except Exception as e:
print(f"Loaded {len(DENY_WORDS_CACHE)} deny words.") print(f"Warning: Failed to load deny words: {e}")
except Exception as e:
print(f"Warning: Failed to load deny words: {e}")
# --- 用户普通api端点 --- # --- 用户普通api端点 ---
@app.route('/api/settings', methods=['GET']) @app.route('/api/settings', methods=['GET'])
@@ -367,6 +365,45 @@ def get_statics():
except Exception as e: except Exception as e:
return jsonify({"code": 2003, "data": str(e)}) return jsonify({"code": 2003, "data": str(e)})
@app.route('/api/10_info', methods=['GET'])
def get_10_info():
try:
page = request.args.get("page", 1, type=int)
if page < 1:
page = 1
per_page = 10
# 相比v1的优化使用数据库层面的过滤和分页避免一次性加载所有数据
pagination = Submission.query.filter_by(status='Pass')\
.order_by(Submission.id.desc())\
.paginate(page=page, per_page=per_page, error_out=False)
page_posts = pagination.items
data = []
for s in page_posts:
data.append({
"id": s.id,
"content": s.content,
"upvotes": s.upvotes,
"downvotes": s.downvotes,
"created_at": s.created_at.isoformat() if s.created_at else None,
"comment_count": len(s.comments),
"total_pages": pagination.total,
})
return jsonify({
"code": 1000,
"data": data
})
except Exception as e:
return jsonify({"code": 2003, "data": str(e)})
# --- 菜单 ---
@app.route('/get/teapot', methods=['GET'])
def return_418():
abort(418)
# --- 用户的管理api端点 --- # --- 用户的管理api端点 ---
# TODO: 用户管理端点 # TODO: 用户管理端点
@@ -377,5 +414,4 @@ def get_statics():
if __name__ == '__main__': if __name__ == '__main__':
init_db() init_db()
load_config() load_config()
load_deny_words()
app.run(debug=True, port=5000) app.run(debug=True, port=5000)

View File

@@ -0,0 +1,81 @@
// 复用 v1 的 NotFound 组件
import React from 'react';
import { useNavigate } from 'react-router-dom';
import { makeStyles, tokens, Card, CardHeader, CardPreview, Text, Button, Title1, Subtitle1 } from '@fluentui/react-components';
import { ArrowLeft24Regular, Home24Regular } from '@fluentui/react-icons';
const useStyles = makeStyles({
page: {
minHeight: '100vh',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
backgroundColor: tokens.colorNeutralBackground3,
padding: tokens.spacingHorizontalXL,
},
card: {
width: 'min(720px, 92vw)',
borderRadius: tokens.borderRadiusLarge,
overflow: 'hidden',
boxShadow: tokens.shadow8,
},
header: {
paddingLeft: tokens.spacingHorizontalXL,
paddingRight: tokens.spacingHorizontalXL,
paddingTop: tokens.spacingVerticalM,
paddingBottom: tokens.spacingVerticalM,
},
preview: {
height: '140px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
background: `linear-gradient(135deg, ${tokens.colorBrandBackground} 0%, ${tokens.colorBrandBackground2} 50%, ${tokens.colorPaletteBlueBackground2} 100%)`,
color: tokens.colorNeutralForegroundOnBrand,
},
content: {
paddingLeft: tokens.spacingHorizontalXL,
paddingRight: tokens.spacingHorizontalXL,
paddingTop: tokens.spacingVerticalL,
paddingBottom: tokens.spacingVerticalL,
display: 'flex',
flexDirection: 'column',
gap: tokens.spacingVerticalM,
},
actions: {
display: 'flex',
gap: tokens.spacingHorizontalM,
marginTop: tokens.spacingVerticalL,
},
});
const NotFound: React.FC = () => {
const styles = useStyles();
const navigate = useNavigate();
return (
<div className={styles.page}>
<Card className={styles.card}>
<CardHeader className={styles.header} header={<Title1 style={{ margin: 0 }}>😕 404 Not Found</Title1>} />
<CardPreview>
<div className={styles.preview} />
</CardPreview>
<div className={styles.content}>
<Subtitle1>Oh no, 😭</Subtitle1>
<Text></Text>
<div className={styles.actions}>
<Button appearance="primary" icon={<ArrowLeft24Regular />} onClick={() => navigate(-1)}>
</Button>
<Button appearance="secondary" icon={<Home24Regular />} onClick={() => navigate('/') }>
</Button>
</div>
</div>
</Card>
</div>
);
};
export default NotFound;