python设计网站

news/2024/5/20 23:01:14/文章来源:https://blog.csdn.net/weixin_33866037/article/details/93539721

系统概要说明

现在,随着物联网以及网络技术的飞速发展,互联网已经成为了人们发布与获取信息的重要途径之一,所以通过老师要求,我们设计了一个普通的公司管理信息系统网站。这网站的具有的功能有注册,登录,注销,发布,列表展示,详情页,评论(列表显示),个人中心,搜索,条件组合搜索,文章分类,显示,点赞,收藏,修改密码,上传头像,我的发布(点赞),高级搜索等一系列功能。

 

一.网站结构设计

 

二.模块详细设计

2.1基本功能

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}首页</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="{{ url_for('static',filename='js/switch.js') }}"></script>
<link rel="stylesheet"  type="text/css" href="{{ url_for('static',filename='css/base.css') }}">

{% block head %}{% endblock %}
</head>
<body id="myBody" style="background-image:url(/static/img/2345_image_file_copy_4.jpg)">
<nav class="navbar">
<img src="{{ url_for('static',filename='img/1.jpg') }}" alt="" width="50px">
<a href="{{ url_for('index') }}">首页</a>
<a href="{{ url_for('questions') }}">提问</a>
<form action="{{ url_for('search')}}" method="get" class="navbar-form navbar-right">
<input name="q" type="text" name="title" required lay-verify="required" placeholder="请输入搜索内容" autocomplete="off"
class="layui-input">
<button class="seek" style="padding-left: 10px;" type="submit">搜索</button>
</form>
{% if username %}
<a href="{{ url_for('usercenter',user_id=user.id,tag=1) }}">{{user.username }}</a>
{#    <a href="#">{{ username }}</a>#}
<a href="{{ url_for('logout') }}">注销</a>
{% else %}
<a class="login" href="{{ url_for('login') }}">登录</a>
<a class="enroll" href="{{ url_for('enroll') }}">注册</a>
{% endif %}
<img id="myOnOff" οnclick="mySwitch()" src="http://www.runoob.com/images/pic_bulbon.gif" width="25px">
</nav>




{% block main %}
<div>
<ul>
{% for foo in fenlei %}
<li><a href="{{url_for('index',bd= foo.id)}}">{{foo.name}}</a></li>
{% endfor %}
</ul>
</div>
<ul class="list-group">
{% for foo in questions %}
<li class="list-group-item"
style="padding-left: 0px; padding-right: 10px; box-shadow: rgba(0, 0, 0, 0.498039) 0px 0px 0px 0px; width: 600px;margin: auto">
<span class="glyphicon glyphicon-leaf" aria-hidden="true"></span>
<a href="{{ url_for('detail',questions_id=foo.id) }}">{{ foo.title }}</a>{#链接到相关详情页#}
<span class="badge" >{{ foo.create_time }}</span>
<p style="margin: 20px">{{ foo.detail }}</p>
<span class="glyphicon glyphicon-user" aria-hidden="true"></span>
<a href="{{ url_for('usercenter',user_id=foo.author_id,tag=1) }}">{{ foo.author.username }}评论:({{ foo.comments|length }})</a><br>
</li>
{% endfor %}
</ul>
{% endblock %}

</body>

<footer>
<div class="footer_box">
版权@LHH
</div>
</footer>
</html>
首页基本页面显示功能,其中包含提问,搜索,注销,登录,注册等显示

 

2.2问答详情功能

   {% extends'base.html' %}

{% block title %}问答详情{% endblock %}
{% block head %}
<link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/detail.css') }}">
{% endblock %}

{% block main %}
<div class="page-header">
<h3 align="center">题目:{{ questions.title }}<br>
<small>作者:{{ questions.author.username }} <span class="badge">发布时间:{{ questions.create_time }}</span>
</small>
</h3>
</div>
<p class="lead" align="center">详情:{{ questions.detail }}</p><br>

<form action="{{ url_for('dianzan') }}"method="post" >

<input type="hidden" name="questions_id" value="{{questions.id }}">
<input type="hidden" name="user_id" value="{{ userid }}">
{% if dzyes %}
<span>点赞数:{{ questions.dianzan|length }}</span>
{% else %}
<button type="submit">点赞</button>
{% endif %}
</form>
<form action="{{ url_for('collection') }}" method="post">
<input type="hidden" name="questions_id" value="{{ questions.id }}">
<input type="hidden" name="user_id" value="{{ userid }}">
{% if collection %}
<span>已收藏</span>
{% else %}
<button type="submit">收藏</button>
{% endif %}
</form>

{#发布评论#}
<form action="{{ url_for('comments') }}" method="post" style="margin: 20px">
<div class="form-group" align="center">
<textarea name="new_comment" class="form-control" rows="3" id="new-comment"
placeholder="请写下你的评论" style="width:600px; margin: auto"></textarea>
<input type="hidden" name="questions_id" value="{{ questions.id }}">
<button type="submit" class="btn btn-default">发送</button>
</div>

</form>


{# 评论列表#}
<h4 align="center">评论({{ questions.comments|length }})</h4>
<ul class="list-group" style="margin: 10px">
{% for foo in  questions.comments %}
<li class="list-group-item" style="width: 600px ;margin: auto">
<span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>
<a href="{{ url_for('usercenter',user_id=foo.author.id,tag=1) }}">{{ foo.author.username }}</a>
<span class="badge">{{ foo.create_time }}</span>
<p>{{ foo.detail }}</p>
</li>
{% endfor %}
</ul>
{% endblock %}

问答详情功能里面包含点赞功能,收藏,评论功能。

2.3注册功能

{% extends'base.html' %}
{% block title %}注册{% endblock %}
{% block head %}
    <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/enroll.css') }}">
    <script src="{{ url_for('static',filename='js/enroll.js') }}"></script>
{% endblock %}


{% block main %}
<div class="box">
    <h2>注册</h2>
    <form action="{{ url_for('enroll') }}" method="post">
    <div class="input_box">
        username:<input  id="zname" type="text"placeholder="设置您的用户名" name="username"><br>
        <!--yourname:<input  id="znickname" type="text"placeholder="设置您的昵称" name="nickname">-->
   
</div>
    <div class="input_box">
        password:<input  id="zpass1" type="password"placeholder="设置您的密码" name="password"><br>
    <!--</div>-->
    <!--<div class="input-box">-->
       
twowrite:<input id="zpass2" type="password" placeholder="重新输入一样的密码">
    </div>
        <div class="input_box">
        <a href="{{ url_for('login') }}" style="margin: 10px">已有账号,登录</a>
    </div>

    <div id="error_box"><br></div>
    <div class="input_box">
        <button class="button" οnclick="fnEnroll()">立即注册</button>
    </div>
    </form>
</div>
{% endblock %}

 

2.4登录功能

{% extends'base.html' %}
{% block title %}登录{% endblock %}
{% block head %}
    <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/login.css') }}">
    <script src="{{ url_for('static',filename='/js/login.js')}}"></script>
{% endblock %}

{% block main %}

<div class="box">
    <h2>登录</h2>
    <form action="{{ url_for('login') }}" method="post">
    <div class="input_box">
        username:<input id="uname" type="text"placeholder="请输入用户名" name="username">
    </div>
    <div class="input_box">
        yourname<input id="unickname" type="text"placeholder="请输入昵称" name="nickname">
    </div>
    <div class="input_box">
        password:<input  id="upass" type="password"placeholder="请输入密码" name="password">
    </div>

    <div class="input_box">
        <a href="{{ url_for('enroll') }}">没有账号?立即注册</a>
    </div>

    <div id="error_box"><br></div>
    <div class="input_box">
        <button class="button"  οnclick="fnLogin()">登录</button>
    </div>
    </form>
</div>
{% endblock %}

2.5 发布问答功能

{% extends'base.html' %}
{% block title %}发布问答{% endblock %}
{% block head %}
    <link rel="stylesheet" href="{{ url_for('static',filename='css/questions.css') }}" type="text/css">
{% endblock %}

{% block main %}
    <div class="box">
        <h2>发布问答</h2>
        <form action="{{ url_for('questions') }}" method="post">
            <div class="input-box">
                <lable for="title">标题</lable>
                <textarea class="form-control" id="title" rows="1" cols="50" name="title"></textarea>
            </div>
            <div class="input-box">
                <select name="fenlei_id" id="">
                    {% for foo in fenlei %}
                    <option value="{{foo.id}}">{{foo.name}}</option>
                     {% endfor %}
                </select>
            </div>
            <div class="input-box">
                <lable for="detail">详情</lable>
                <textarea class="form-control" id="detail" rows="5" cols="50" name="detail"></textarea>
            </div>
            <input type="checkbox">记住我<br>
            <div class="input-box">
                <button class="button">发布问答</button>
            </div>

        </form>
    </div>

{% endblock %}

2.6修改密码功能

{% extends'base.html' %}
{% block title %}修改密码{% endblock %}
{% block head %}
    <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/login.css') }}">
    <script src="{{ url_for('static',filename='/js/login.js')}}"></script>
{% endblock %}

{% block main %}

<div class="box">
    <h2>修改密码</h2>
    <form action="{{ url_for('updata_password',user_id=user.id) }}" method="post">
    <div class="input_box">
        oldpwd:<input id="uname" type="text"placeholder="请输入原密码" name="oldpwd">
    </div>
    <div class="input_box">
        newpwd:<input id="unickname" type="text"placeholder="请输入新密码" name="newpwd">
    </div>
    <div class="input_box">
        newpwd1:<input  id="upass" type="password"placeholder="请确认密码" name="newpwd1">
    </div>

    <!--<div class="input_box">-->
        <!--<a href="{{ url_for('enroll') }}">
没有账号?立即注册</a>-->
    <!--</div>-->

   
<div id="error_box"><br></div>
    <div class="input_box">
        <button class="button" type="submit"  οnclick="fnLogin()">登录</button>
    </div>
    </form>
</div>
{% endblock %}

 

2.7个人中心功能

{% extends "base.html" %}
{% block title %}个人中心{% endblock %}
{% block head %}
    <style>
        .nav nav-tabs li{
            list-style: none;
            float: left;
            margin: 25px;
        }

    </style>
{% endblock %}

{% block main %}
    <h3><span class="glyphicon glyphicon-user" aria-hidden="true"></span>{{ user.username }}</h3>
    <ul class="nav nav-tabs">
    <li role="presentation"><a href="{{ url_for('usercenter',user_id=user.id,tag=1) }}">全部问答</a></li>
    <li role="presentation"><a href="{{ url_for('usercenter',user_id=user.id,tag=2) }}">全部评论</a></li>
    <li role="presentation"><a href="{{ url_for('usercenter',user_id=user.id,tag=3) }}">个人信息</a></li>
    </ul>

    {% block user %}{% endblock %}

{% endblock %}

2.8评论功能

{% extends 'user.html' %}


{% block user %}
    <div class="page-header">
    <h3><span class="glyphicon glyphicon-user" aria-hidden="true"></span>{{ username }}<br>
        <small>全部评论<span class="badge"></span></small>
    </h3>
    <ul class="list-group">
        {% for foo in comments %}
        <li class="list-group-item">
            <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>
            <a href="{{ url_for('usercenter',user_id=foo.author_id ,tag=2)}}">{{ foo.author.username }}</a>
            <span class="badge">{{ foo.create_time }}</span>
            <p>{{ foo.detail }}</p>

        </li>
        {% endfor %}
    </ul>
</div>
{% endblock %}

 

2.9个人信息功能

{% extends 'user.html' %}

{% block user %}
    <div class="page-header">
    <h3><span class="glyphicon glyphicon-user" aria-hidden="true"></span>{{ username }}<br>
        <small>个人信息<span class="badge"></span></small>
    </h3>
    <ul class="list-group">
        <li class="list-group-item">
            {% if user.img %}
                <img src="/static/{{ user.img }}" alt="" width="150px" height="200px">
            {% else %}
                 无上传图片
            {% endif %}
            <form action="{{ url_for('img',user_id=user.id )}}" method="post" enctype="multipart/form-data">
            <input type="file" required name="img">
        <button type="submit">上传</button>
                </form>
        </li>
        <li class="list-group-item">用户:{{ user.username }}</li>
        <li class="list-group-item">编号:{{ user.id }}</li>
        <li class="list-group-item">昵称:{{ nickname }}</li>
        <li class="list-group-item">评论次数:{{ comments|length }}</li>
        <li class="list-group-item">问答次数:{{ questions|length }}</li>
        <li class="list-group-item"><a href="{{ url_for('updata_password',user_id=user.id) }}">修改密码</a></li>
    </ul>
</div>
{% endblock %}

 

 

 

三.数据库设计

3.1注册

function fnEnroll() {
            var oZname=document.getElementById("zname");
            var oZpass1=document.getElementById("zpass1");
            var oZpass2=document.getElementById("zpass2");
            var oError=document.getElementById("error_box");
            var isError=true;

            oError.innerHTML="<br>"

           
if ((oZname.value.length < 6) || (oZname.value.length > 12)) {
                oError.innerHTML = "用户名要6-12位";
                isError=false;
                return isError;
            }else if ((oZname.value.charCodeAt(0)>=48)&&(oZname.value.charCodeAt(0)<=57)){
                oError.innerHTML="首字母必须是字母";
                isError=false;
                return isError;
            }else for(var i=0;i<oZname.value.length;i++){
                if ((oZname.value.charCodeAt(i)<48)||(oZname.value.charCodeAt(i)>57)&&(oZname.value.charCodeAt(i)<97) ||(oZname.value.charCodeAt(i)>122)){
                    oError.innerHTML="用户名只能是字母和数字";
                    isNotError=false;
                    return isError;
                }
            }
            if ((oZpass1.value.length < 6) || (oZpass1.value.length > 12)) {
                oError.innerHTML = "密码要6-12位";
                isError=false;
                return isError;

            }else if (oZpass1.value!= oZpass2.value) {
                oError.innerHTML = "两次密码不一致";
                isError=false;
                return isError;
            }
            return isError;
    window.alert("注册成功!")
        }

 

 

3.2登录

   

function fnLogin() {
            var oUname=document.getElementById("uname");
            var oUpass=document.getElementById("upass");
            var oError=document.getElementById("error_box");
            var isError=true;
            oError.innerHTML="<br>"

            
//uname
           
if ((oUname.value.length < 6) || (oUname.value.length > 20)) {
                oError.innerHTML = "用户名要6-20位";
                isError=false;
                return isError;
            }else if ((oUname.value.charCodeAt(0)>=48)&&(oUname.value.charCodeAt(0)<=57)){
                oError.innerHTML="首字母必须是字母";
                isError=false;
                return isError;
            }else {
                for(var i=0;i<oUname.value.length;i++){
                    if ((oUname.value.charCodeAt(i)<48)||(oUname.value.charCodeAt(i)>57)&&(oUname.value.charCodeAt(i)<97) ||(oUname.value.charCodeAt(i)>122)){
                        oError.innerHTML="用户名只能是字母和数字";
                        isNotError=false;
                        return isError;
                    }
                }
            }
            //upass
           
if ((oUpass.value.length < 6 )|| (oUpass.value.length > 20)) {
                oError.innerHTML = "密码要6-20位";
                isError=false;
                return isError;
            }
            return isError;
    window.alert("登录成功!")
        }

 

 

 

 

 

3.3其他

function mySwitch() {
    var oBody = document.getElementById("myBody");
    var oOnOff = document.getElementById("myOnOff");
    if (oOnOff.src.match("bulbon")) {
        oOnOff.src = "http://www.runoob.com/images/pic_bulboff.gif";
        oBody.style.background = "black";
        oBody.style.color = "white";
    } else {
        oOnOff.src = "http://www.runoob.com/images/pic_bulbon.gif";
        oBody.style.background = "white";
        oBody.style.color = "black";

    }
}

 

 

 

四.系统实现的关键算法和数据结构

关键算法是if根据前端传到的数据在后台进行比对,再根据传输的code的值进行判断,再根据js文件的判断,在页面上展示出不同的效果。

其中其code值是如何传输的?这就需要调用其中resful文件中,不同类的定义了。

 

import os
DEBUG=True
SECRET_KEY=os.urandom(24)



SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@127.0.0.1:3306/mytest1?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False

 

 

from flask import Flask, render_template, request, redirect, url_for, session,g
from flask_sqlalchemy import SQLAlchemy
import config,os
from functools import wraps
from datetime import datetime
from sqlalchemy import or_,and_

from werkzeug.security import generate_password_hash,check_password_hash


app=Flask(__name__)
app.config.from_object(config)
db=SQLAlchemy(app)

# 创建用户模型
class User(db.Model):
    __tablename__ = 'user'
   
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(20),nullable=False)
    _password = db.Column(db.String(200),nullable=False)#内部使用
   
img= db.Column(db.String(200))
    nickname=db.Column(db.String(50))

    @property
    def password(self): # 外部使用
       
return self._password

    @password.setter
    def password(self,row_password):
        self._password = generate_password_hash(row_password)

    def check_password(self,row_password):
        result = check_password_hash(self._password,row_password)
        return result

#创建发布问答模型
class Question(db.Model):
    __tablename__ ='questions'
   
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title=db.Column(db.String(100),nullable=False)
    detail=db.Column(db.Text,nullable=False)
    create_time=db.Column(db.DateTime,default=datetime.now)
    fenlei_id = db.Column(db.Integer,db.ForeignKey('fenlei.id'))
    author_id=db.Column(db.Integer,db.ForeignKey('user.id'))#外键约束,数据类型db.Integer第二个参数指定外键是user表的id
   
author=db.relationship('User',backref=db.backref('questions'))
    fenlei=db.relationship('Fenlei',backref=db.backref('questions'))
# 创建评论模型
class Comment(db.Model):
    __tablename__ = 'comments'
   
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    questions_id = db.Column(db.Integer, db.ForeignKey('questions.id'))
    create_time=db.Column(db.DateTime, default=datetime.now)
    detail=db.Column(db.Text,nullable=False)
    questions=db.relationship('Question',backref=db.backref('comments',order_by=create_time.desc))
    author=db.relationship('User',backref=db.backref('comments'))

class Fenlei(db.Model):
    __tablename__='fenlei'
   
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100))

class Dianzan(db.Model):
    __tablename__ = 'dianzan'
   
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 外键约束,数据类型db.Integer第二个参数指定外键是user表的id
   
questions_id = db.Column(db.Integer, db.ForeignKey('questions.id'))
    user = db.relationship('User', backref=db.backref('dianzan'))
    question = db.relationship('Question', backref=db.backref('dianzan'))

class Collection(db.Model):
    __tablename__ = 'collection'
   
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 外键约束,数据类型db.Integer第二个参数指定外键是user表的id
   
questions_id = db.Column(db.Integer, db.ForeignKey('questions.id'))
    create_time = db.Column(db.DateTime, default=datetime.now)
    user = db.relationship('User', backref=db.backref('collection'))
    question = db.relationship('Question', backref=db.backref('collection'))

db.create_all()

@app.route('/')
def index():
    fenleiid= request.args.get('bd',type=int,default=None)
    if fenleiid:
        questions = Question.query.filter_by(fenlei_id=fenleiid)
    else:
        questions= Question.query.order_by('-create_time').all()
    context={
        "questions":questions,
        "fenlei":Fenlei.query.all()
    }
    return render_template('base.html',**context)

#登录
@app.route('/login/',methods={'GET','POST'})
def login():
    if request.method=='GET':
        return render_template('login.html')
    else:
        username = request.form.get('username'# 获取form中的数据
       
password = request.form.get('password')
        nickname = request.form.get('nickname')
        user = User.query.filter(User.username == username).first()
        # id = User.query.filter(User.id == id).first()
       
if user:
            if user.check_password(password):
                session['user'] = username
                session['id'] = user.id
                session.permanent=True
                return
redirect(url_for('index'))  # 返回到首页
           
else:
                return u'password error'
       
else:
            return u'error username or password' #输出错误

#修改密码
@app.route('/updata_password/<user_id>',methods={'GET','POST'})
def updata_password(user_id):
    if request.method=='GET':
        return render_template('updata_password.html')
    else:
        oldpwd = request.form.get('oldpwd')
        newpwd = request.form.get('newpwd')
        newpwd1= request.form.get('newpwd1')
        user= User.query.filter(User.id==user_id).first()
        if user.check_password(oldpwd):
            if newpwd !=newpwd1:
                return '密码输入不一致'
           
else:
                user.password=newpwd
                db.session.commit()
                return render_template('login.html')
        else:
            return '原密码错误'





#注册
@app.route('/enroll/',methods={'GET','POST'})
def enroll():
    if request.method=='GET':
        return render_template('enroll.html')
    else:
        username=request.form.get('username')# 获取form中的数据
       
password=request.form.get('password')
        nickname=request.form.get('nickname')
        user = User.query.filter(User.username == username).first()
        if user:
            return u'username existed'
       
else:
            user = User(username=username, password=password, nickname=nickname)
            db.session.add(user)#数据库操作
           
db.session.commit()
            return redirect(url_for('login'))# 重定向到登录页

#注销
@app.route('/logout/')
def logout():
    session.clear()
    return redirect(url_for('index'))# 清除所有数据返回到首页


# 上下文处理器
@app.context_processor
def mycontext():
    usern=session.get('user')
    userid = session.get('userid')
    # id=session.get('id')
   
if usern:
        user = User.query.filter(User.username==usern).first()

        return {'username':usern,'user':user,
                  'userid':user.id
                }
    else:
        return {}

# 发布前登录:装饰器
def loginFirst(func):# 参数是函数
   
@wraps(func)
    def wrapper(*args, ** kwargs):# 定义个函数将其返回
       
if session.get('user'):
            return func(*args, ** kwargs)
        else:
            return redirect(url_for('login'))
    return wrapper# 返回一个函数

#提问
@app.route('/questions/',methods=['GET','POST'])
@loginFirst
def questions():
    if request.method == 'GET':
        fenlei = Fenlei.query.all()
        return render_template('questions.html',fenlei=fenlei)
    else:
        title = request.form.get('title'# 获取form中的数据
       
detail = request.form.get('detail')
        fenlei_id = request.form.get('fenlei_id')
        author_id = User.query.filter(User.username == session.get('user')).first().id
        questions = Question(title=title, detail=detail, author_id=author_id ,fenlei_id=fenlei_id)
        db.session.add(questions)  # 保存到数据库
       
db.session.commit()  # 提交
       
return redirect(url_for('index'))  # 跳转

# 详情页
@app.route('/detail/<questions_id>', methods=['GET', 'POST'])
def detail(questions_id):
    questions = Question.query.filter(Question.id == questions_id).first()
    # user_id = request.form.get('user_id')
   
dzyes = Dianzan.query.filter(  # dzyes用在用户详情页判断是否已点赞的按钮
        
and_(
            Dianzan.user_id ==session.get('id'),Dianzan.questions_id == questions.id
        )
    ).first()
    collection = Collection.query.filter(
        and_(
            Collection.user_id ==session.get('id'), Collection.questions_id == questions.id
        )
    ).first()
    return render_template('detail.html', questions=questions,dzyes=dzyes,collection=collection)


#评论页
@app.route('/comments/',methods=['POST'])
@loginFirst
def comments():
    comment=request.form.get('new_comment')
    questions_id =request.form.get('questions_id')
    author_id = User.query.filter(User.username == session.get('user')).first().id
    comments = Comment(detail=comment, author_id=author_id, questions_id=questions_id)
    db.session.add(comments)  # 保存到数据库
   
db.session.commit()  # 提交
   
return redirect(url_for('detail',questions_id=questions_id))


#用户中心页
@app.route('/usercenter/<user_id>/<tag>')
@loginFirst
def usercenter(user_id,tag):
    user=User.query.filter(User.id==user_id).first()
    context={
        'user':user,
        # 'username':user.username,
       
'questions':user.questions,
        'comments':user.comments
    }
    if tag=='1':
        return render_template('usercenter1.html',**context)
    elif tag=='2':
        return render_template('usercenter2.html',**context)
    else:
        return render_template('usercenter3.html',**context)
    # return render_template('usercenter.html',**context)

@app.route('/search/')
def search():
    qu = request.args.get('q')
    ques = Question.query.filter(
        or_(
        Question.title.contains(qu),
        Question.detail.contains(qu)
        )
    )
    return render_template('base.html',questions=ques)

#点赞功能
@app.route('/dianzan/',methods=['GET','POST'])
@loginFirst
def dianzan():
    user_id=request.form.get('user_id')
    questions_id=request.form.get('questions_id')
    dianzan=Dianzan(user_id=user_id,questions_id=questions_id)
    db.session.add(dianzan)
    db.session.commit()
    return redirect(url_for('detail',questions_id=questions_id))
#收藏功能
@app.route('/collection/',methods=['GET','POST'])
@loginFirst
def collection():
    user_id=request.form.get('user_id')
    questions_id=request.form.get('questions_id')
    collection=Collection(user_id=user_id,questions_id=questions_id)
    db.session.add(collection)
    db.session.commit()
    return redirect(url_for('detail',questions_id=questions_id))

@app.route('/img/<user_id>',methods=['GET','POST'])
@loginFirst
def img(user_id):
     user = User.query.filter(User.id == user_id).first()
     f = request.files['img']
     basepath = os.path.dirname(__file__)  # 当前文件所在路径
    
upload_path = os.path.join(basepath, 'static/img', f.filename)  # 注意:没有的文件夹一定要先创建,不然会提示没有该路径
    
f.save(upload_path)
     user.img = 'img/' + f.filename
     db.session.commit()
     return redirect(url_for('usercenter',tag=3,user_id=user.id))

if __name__ == '__main__':
    app.run(debug=True)

 

 

 

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

在此次系统中我们放弃了上下文处理器的选择,而重新选择了一种新的函数方法,g函数,g函数是指每次用户登录都会记录和调用其本用户的的数据内容,不需要在后台重新定义一个视图函数在继承在页面中,减少了代码的冗余。提高了数值传递效率。非常的好用,前后台都可以进行使用,只需在hooks文件中添加

 

五.成品展示

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/lianghaohui123/p/9188653.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_770493.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html背景图片加载慢,javascript – 如何加快我网站的背景图片加载速度?

我正在努力提高website的性能.在Chrome DevTools中,我看到bg2.jpg的请求在开始下载时被延迟了.我认为这种情况正在发生,因为我使用JavaScript生成URL并将其设置为CSS中的背景图像,Chrome浏览器正在优先处理包含此代码的脚本标记.let bgImgName "bg" Math.floor(Mat…

《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

此篇已收录至《大型网站技术架构》读书笔记系列目录贴&#xff0c;点击访问该目录可获取更多内容。 一、网站性能测试 &#xff08;1&#xff09;性能测试指标&#xff1a;①响应时间&#xff1b;②并发数&#xff1b;③吞吐量&#xff1b;④性能计数器&#xff1b; &#xff0…

ssh框架点击按钮就404_深挖网站404页面问题

404页面&#xff0c;指显示网站错误链接的页面&#xff0c;可能是访问的页面不存在&#xff0c;也可能是页面已经删除了。出现404异常状态&#xff0c;用户体验可能不佳&#xff0c;但可喜的是404页面能缓解用户的焦虑和挫败感。网站改版成为满足业务需要和提升用户体验的必经之…

transwarp site_SEO重拎SITE命令:看收录,判降权…还能发现网站结构疏漏

给部门编辑们提供SEO文章发布指南时&#xff0c;发现大伙对于SITE命令尚缺乏了解和应用。回到我自己入门SEO的那个时间点 &#xff0c;是先从掌握几个SEO命令开始的&#xff0c;其中最为实用的就是SITE命令&#xff0c;因为它可以查看网站的收录量。除此之外&#xff0c;SITE命…

大型网站技术架构(四)网站的高性能架构

2019独角兽企业重金招聘Python工程师标准>>> 网站性能是客观的指标&#xff0c;可以具体体现到响应时间、吞吐量、并发数、性能计数器等技术指标。 1、性能测试指标 1.1 响应时间 指应用执行一个操作需要的时间&#xff0c;指从发出请求到最后收到响应数据所需要的时…

如何把其他网站的搜索页挂到自己的网站上_Google网站排名多久能到首页?

每一个企业都希望自己的外贸网站排名可以在短时间内排上Google首页&#xff0c;那Google网站排名多久能到首页呢&#xff1f;一尘SEO可以告诉大家的是&#xff0c;Google排名需要一定的时间和周期去判定&#xff0c;SEO是一个持续积累的过程&#xff0c;并不像SEM一样立竿见影。…

电商网站模板_上海电商网站建设设计方案是什么?具体建设流程分享

网站建设是很多人都会选择的&#xff0c;网站是很多人的一个营销和推广选择&#xff0c;必定如今互联网是非常发达的&#xff0c;在网站建设过程中也存在很多问题&#xff0c;一般在网站建设时需要将这些问题逐一解决&#xff0c;以保证自己建站更为满意&#xff0c;那么上海电…

网站可行性报告范文_合肥可以做可行性研究报告范文

合肥可以做可行性研究报告范文yllc合肥可以做可行性研究报告范文紧密纺纤维项目合作计划书年产真空拔罐器2000万套项目合作计划书年产1000吨胶剂生产线建设项目可行性报告年产2万吨混凝土减水剂深加工项目项目策划书年产500套全网制基站信息采集查询系统技术改造项目项目申请报…

用go重写php网站,php如何使用自动加载(重写url形成单一入口)-Go语言中文社区

事情是这样的&#xff0c;昨天我面了个试&#xff0c;发现自己对自动加载了解的很片面&#xff0c;于是我就去看自动加载的机制&#xff0c;而网上的例子讲的都是方法含义&#xff0c;于是我自己写了个简单的例子。什么是自动加载了&#xff1f;在php5之前是没有自动加载的&…

网络不稳定是什么原因_关键词排名波动原因,如何解决网站排名不稳定!

理论上讲&#xff0c;关键词的排名决定了网站的流量&#xff0c;定期审查关键词的排名是每个SEO人员的工作&#xff0c;在以往的工作我们可能会遇到这样一种情况&#xff1a;关键词排名频繁波动&#xff0c;很不稳定。 它往往搞的SEOer一头雾水&#xff0c;明明没有过度优化&am…

少儿编程的关联网站

​少儿编程教育的目的是学习某编程语言&#xff0c;掌握多少编程知识和技能&#xff0c;而是通过编程的学习提升数字素养&#xff0c;培养信息意识&#xff0c;形成学科融合的能力。格物斯坦认为&#xff1a;编程化计算思维的建立&#xff0c;为解决实际问题提供更富有逻辑化的…

学习人工智能网站

​在谈论人工智能教育之前&#xff0c;让我们简单地理解两个概念&#xff0c;一个是大数据&#xff0c;另一个是人工智能。对大数据概念的简单理解是数据价值的过程。格物斯坦表示&#xff1a;目前大数据正在从概念向行业转变。目前&#xff0c;大数据行业已初步形成了基于数据…

url获取网站信息不包含网页源文件内的标签_企业掌握这四点优化方法,轻松获取免费流量...

对于企业来说&#xff0c;在互联网中获取流量时&#xff0c;需要进行非常精细的测算&#xff0c;其中转化率则是计算的重点。企业对引流的渴求度高&#xff0c;在平台虽有公共流量&#xff0c;但是转化率低。想额外达到获客的成果又需要支付相应的费用&#xff0c;这就造成“流…

maya刷权重时有个叉_如何快速提升网站权重?7年SEO从业经验给你谈快速上权重方法...

今天在SEO圈子里面看到很多SEO新手入坑玩家&#xff0c;在群里交流网站权重上升太慢做几个月都没有一点权重和流量。那么今天王听风老师来给大家说一下网站权重快速提升的方法。网站权重我总结的几个经验&#xff1a;一&#xff0c;发文章做词库发文章必须带词库关键词&#xf…

seo自动发外链_seo如何做外链(做seo外链建设有哪些原则)

人人做seo都需要发外链&#xff0c;同样的工作最终的结果却是千差万别&#xff0c;有些人发的外链让网站优化的结果更好&#xff0c;有些人发外链带给网站的优化结果是无效甚至于是反作用的。我们seo如何做外链呢&#xff1f;做外链建设有哪些原则&#xff1f;一、发布一些高质…

python搭建网盘网站_搭建nextcloud私有云存储网盘

简介&#xff1a;搭建个人云存储一般会想到ownCloud&#xff0c;堪称是自建云存储服务的经典。而Nextcloud是ownCloud原开发团队打造的号称是“下一代”存储.真正试用过后就由衷地赞同这个Nextcloud&#xff1a;它是个人云存储服务的绝佳选择。一开始以为Nextcloud只是一个网盘…

一个同时在线人数为500人的电商网站,TOMCAT设置并发数以及mysql数据库连接数

请问各位一下&#xff0c;如果现在有一个每天同时在线人数为500人的电商网站&#xff0c;使用阿里云服务器的配置如图 &#xff0c;用的是strutshibernatespring开发&#xff0c;使用tomcat&#xff0c;如果该网站上线了&#xff0c;那我该如何设置tomcat的连接数&#xff0c;…

承受每天百万级访问量的网站需要多少台服务器?

说一下我的网站吧&#xff0c;是一个漫画网站&#xff0c;全站动态伪静态&#xff0c;目前建站一年&#xff0c;是一个漫画为主的网站。 帖服务器配置截图 以及高峰期的CPU内存占用情况 因为是漫画网站全是图片&#xff0c;所以配了2个8T SAS硬盘做rid&#xff0c;保持服务器稳…

Nginx--大型网站高并发处理

文章目录 **Nginx**-->**大型网站高并发处理** 一&#xff0c;产生背景 二&#xff0c;负载均衡&#xff08;Load Balance&#xff09; 2.1 高并发 2.2 负载均衡 2.3 tomcat并发图 三&#xff0c;Nginx简介 3.1 什么是 Nginx? 3.2 哪些地方使用了Nginx&#xff1f; 四&…

我记录网站综合系统 -- 技术原理解析[7:CSS类]

CSS是前台工程师的必修课&#xff0c;一般我们使用CSS只是统一写在.css里面。不过&#xff0c;wojilu提供了一些操作CSS的类&#xff0c;你可以将CSS当作一个个类来操作。 源代码位置&#xff1a;\wojilu\Web\UI 我们可以将一个CSS看作一个字典 Dictionary<String, Dictiona…