首页 > 其他分享 >网站建设之用户管理

网站建设之用户管理

时间:2023-04-01 10:35:43浏览次数:40  
标签:username return 网站 request 用户 建设 user login password

写在前面

  • 接了个搭建网站的活,是个长期工程,后续会慢慢更新
  • 在chatgpt的帮助下,用一天时间完成了用户管理功能

功能

  • 用户管理CRUD
  • 基于用户角色的权限划分
  • 未登录拦截、会话保持
  • 用户信息加密保存

技术栈

  • django负责后端处理和转发页面
  • bootstrap美化界面

效果展示

  • 登录界面
  • 用户管理界面(只有root用户能进入)

核心代码

用户管理app

  • views.py
import hashlib

from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_exempt

from manage import models
from .forms import SelectAdminForm


def user_list(request):
    user_set = models.User.objects.all()
    return render(request, 'user_list.html', {"user_set": user_set})


@csrf_exempt
def user_add(request):
    if request.method == 'GET':
        select_form = SelectAdminForm()
        return render(request, 'user_add.html', {'select_form': select_form})
    username = request.POST.get("username")
    password = request.POST.get("password")
    is_admin = request.POST.get("is_admin")
    models.User.objects.create(username=username, password=password, is_admin=is_admin)
    return redirect('../')


@csrf_exempt
def user_edit(request):
    user_id = request.GET.get('user_id')
    row_object = models.User.objects.filter(id=user_id).first()
    select_form = SelectAdminForm()
    if request.method == 'GET':
        return render(request, 'user_edit.html', {"form": row_object, "select_form": select_form})
    username = request.POST.get("username")
    password = request.POST.get("password")
    is_admin = request.POST.get("is_admin")
    models.User.objects.filter(id=user_id).update(username=username, password=password, is_admin=is_admin)
    return redirect('../')


def user_delete(request):
    user_id = request.GET.get('user_id')
    models.User.objects.filter(id=user_id).delete()
    return redirect('../')
  • models.py
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=100)
    ADMIN_VALUE = (('是', '是'), ('否', '否'))
    is_admin = models.CharField(max_length=10, choices=ADMIN_VALUE)

    def __str__(self):
        return self.username

    def is_valid(self):
        if len(self.password) > 1:
            return True

class Administrator(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)

    def __str__(self):
        return self.username
  • user_list.html
{% extends 'base.html' %}
{% block title %}
    用户管理
{% endblock %}
{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px" class="clearfix">
            <a class="btn btn-success" href="/manage/add">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                新建用户
            </a>

            <div style="float: right;width: 300px">
                <form method="get">
                    <div class="input-group">

                        <input type="text" name="q" class="form-control" placeholder="请输入查找用户名称"
                               value="{{ search_data }}">
                        <span class="input-group-btn">
                            <button class="btn btn-default" type="submit">
                                <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                            </button>
                        </span>

                    </div>
                </form>
            </div>

        </div>

        <div class="bs-example" data-example-id="panel-without-body-with-table">
            <div class="panel panel-default">
                <!-- Default panel contents -->
                <div class="panel-heading">
                    <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
                    用户列表
                </div>

                <!-- Table -->
                <table class="table table-bordered">
                    <thead>
                    <tr>
                        <th>序号</th>
                        <th>用户名</th>
                        <th>密码</th>
                        <th>是否管理员</th>
                        <th>操作</th>

                    </tr>
                    </thead>
                    <tbody>
                    {% for obj in user_set %}
                        <tr>
                            <th scope="row">{{ obj.id }}</th>
                            <td>{{ obj.username }}</td>
                            <td>{{ obj.password }}</td>
                            <td>{{ obj.is_admin }}</td>
                            <td>
                                <a class="btn btn-primary btn-xs" href="/manage/edit/?user_id={{ obj.id }}">编辑</a>
                                <a class="btn btn-danger btn-xs" href="/manage/delete/?user_id={{ obj.id }}">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>


        <ul class="pagination">
            {{ page_string }}
        </ul>


    </div>

{% endblock %}

登录app

  • views.py
from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_exempt

from manage import models
from .forms import LoginForm
import hashlib


@csrf_exempt
def user_login(request):
    if request.session.get('is_login', None):
        return redirect('../manage')
    if request.method == 'GET':
        login_form = LoginForm()
        return render(request, 'user_login.html', locals())
    else:
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data["username"]
            password = login_form.cleaned_data["password"]
            try:
                user = models.User.objects.get(username=username)
                if user.password == password:
                    request.session['is_login'] = True
                    request.session['user_id'] = user.id
                    request.session['user_name'] = user.username
                    if user.username == "root":
                        return redirect('../manage')
                    return redirect('../manage')
                else:
                    message = "密码不正确!"
            except:
                message = "用户不存在"
        return render(request, 'user_login.html', locals())


@csrf_exempt
def user_logout(request):
    if request.session.get('is_login', None):
        request.session.flush()
    return redirect("../../login")


@csrf_exempt
def user_register(request):
    login_form = LoginForm()
    message = "请联系管理员进行用户注册!"
    return render(request, 'user_login.html', locals())
  • user_login.html,不知道为啥同一个项目下的不同app只能使用同一个base.html,django貌似只会扫描第一个app目录下的templates下的base.html
{% extends 'base.html' %}

{% block title %}登录{% endblock %}

{% block content %}
    <div class="container">
        <div class="col-md-4 col-md-offset-4">
          <form class='form-login' action="/login/" method="post">

              {% if message %}
                  <div class="alert alert-warning">{{ message }}</div>
              {% endif %}
              {% csrf_token %}
              <h2 class="text-center">欢迎登录</h2>
              <div class="form-group">
                  {{ login_form.username}}
              </div>
              <div class="form-group">
                  {{ login_form.password }}
              </div>

              <button type="reset" class="btn btn-default pull-left">重置</button>
              <button type="submit" class="btn btn-primary pull-right">登录</button>

          </form>
        </div>
    </div> <!-- /container -->
{% endblock %}

middleware app

  • LoginMiddleWare.py,用来做未登录拦截
from django.shortcuts import HttpResponseRedirect
from django.contrib import messages
from django.shortcuts import render, redirect
from login.forms import LoginForm

try:
    from django.utils.deprecation import MiddlewareMixin  # Django 1.10.x
except ImportError:
    MiddlewareMixin = object  # Django 1.4.x - Django 1.9.x
# 不需要登录用户就能能访问的地址列表
login_list = ['/login/', '/login/register/']

#只有root用户才能访问的地址列表
#manage_list = ['/manage/', '/manage/add/', '/manage/edit', '/manage/delete']
manage_list = []

class SimpleMiddleware(MiddlewareMixin):

    def process_request(self, request):
        if request.path not in login_list:
            print (request.path)
            username = request.session.get('user_name', None)
            if username is not None:
                if username!="root" and request.path in manage_list:
                    login_form = LoginForm()
                    message = "请用超级管理员账号登录后台!"
                    return render(request, 'user_login.html', locals())
                pass
            else:
                login_form = LoginForm()
                message = "请先登录用户!"
                return render(request, 'user_login.html', locals())

写在后面

  • 这种纯CRUD的活,完全可以模式化,未来肯定会被机器取代
  • 就我目前使用chatgpt的体验而言,它更多是帮我写一个模板,很多细节方面的实现还需要我自己去调整,而且它甚至会给我一些有错误的代码,卡了我挺长时间...
  • 它确实很强了,比我自己去必应找代码更方面更快捷,免去一些无关的信息筛选,提高了我不少效率,但目前感觉它还无法完全替代必应,毕竟互联网上有海量的技术博客、经验分享,就比如安装django有很多踩坑,必应的话会有很多前人的坑点总结,chatgpt的优势是提供优质经过筛选的信息,而不是信息的规模量

标签:username,return,网站,request,用户,建设,user,login,password
From: https://www.cnblogs.com/z5onk0/p/17278160.html

相关文章

  • 如何将Windows操作系统用户名的中文名称修改为英文名称【亲测有效】
    前言最近电脑重新安装nmap,但是图形化界面无法运行,如图所示:是因为用户名称中存在中文字符。接下来就亲自实操一下如何将Windows操作系统用户名的中文名称修改为英文名称。一、控制面板修改电脑名(1):桌面左下角搜索框搜索控制面板(2):打开控制面板,点击用户帐户下的更改账户类型(3......
  • 2023年国内免费使用的chatgpt镜像网站
       小程序于2023.03.28停服整改,预计4.5日前恢复使用,期间可以使用网页版本代替https://service-ht6dwx8s-1256721724.gz.apigw.tencentcs.com/release/#/chat/永久性免费chatgpt网页版时间:2023.03.29起投入使用 ......
  • Redhat/CentOS Linux 系统进入单用户模式
    Redhat/CentOSLinux系统进入单用户模式以CentOS7.9和Redhat8.2为例进行操作,因为CentOS是Redhat的发行版,所以同版本号界面和操作是一样的。CentOS7.9 开机在grub引导界面时,按下e键进入编辑模式: 找到linux16这一行,在行末添加rd.break(注意这里是一整行),使用Ct......
  • 项目一众筹网06_02给用户分配角色、执行用户角色的分配、提交的 只是我们选中的解决、
    项目一众筹网06_02项目一众筹网06_02文章目录项目一众筹网06_0209-Admin分配Role-执行分配-handler方法(执行角色分配的后端代码开始)隐藏域的东西,不用传,点击submit(提交)的时候就会传过去,如下图允许参数是空值10-Admin分配Role-执行分配-Service方法==重复问题==11-Admin分配Role-执行......
  • 项目一众筹网05_03_树的节点的增删改查、radio、代码里面实现模拟用户点击重置、每次
    系列文章目录文章目录系列文章目录18-添加子节点-目标和思路19-添加子节点-前端:打开模态框20-添加子节点-前端:发送Ajax请求==代码里面实现模拟用户点击重置==21-添加子节点-后端==bug发现异步的问题:每次加载数据的时候都要考虑一下异步的问题==22-更新节点-目标和思路23-更新节点......
  • 靠近用户侧和数据,算网融合实现极致协同
    游弋自如的生产力,在边缘。:::hljs-rightIMMENSE、36氪|作者::: 1846年1月,纽约。 一行长短不一的电码顺着通讯线路飞往130公里开外的费城,这是华尔街的巨头们首次使用电报传输讯息,更具有金钱意味的是,电力通讯的成功,彰显着电力从那一刻起开始成为新的生产力,无数新经济的可......
  • 面向chatgpt运维:根据自定义的日志统计访问用户数
    Craftedby[Genie](https://marketplace.visualstudio.com/items?itemName=genieai.chatgpt-vscode)You如何使用awk统计访问用户数,我的日志格式如下:{"level":"info","ts":"2023/03/3108:58:03","msg":"/api/v1/goods/project&quo......
  • Flask框架 之Flask-login用户登录
    文档:https://flask-login.readthedocs.io/en/latest/安装:pipinstallflask-login一、效果图  二、示例代码fromflaskimportFlask,render_template,url_for,redirect,flashfromflask_loginimportLoginManager,login_required,UserMixin,login_user,lo......
  • 高端品牌网站建设需要涉及哪些特点?这些特点独一无二
     如今的企业为了更好地在市场上占据一席之地,都会选择找一个靠谱的开发商帮助自己进行高端品牌网站建设。那么高端品牌网站建设需要涉及哪些特点?今天名锐讯动为大家讲述这些特点独一无二。 1.详细地规划。既然是高端品牌网站建设,那么就少不了对建站的规划。如果没有事先规划,那......
  • 直播网站源码,Android中点击图片放大的简单方法
    直播网站源码,Android中点击图片放大的简单方法简单的思路就是把要放大的图片显示在一个对话框中显示出来 Java代码: publicvoidonThumbnailClick(Viewv){//finalAlertDialogdialog=newAlertDialog.Builder(this).create();//ImageViewimgView=getView();//di......