轮播图添加删除

news2024/11/27 3:53:46

轮播图页面和对话框搭建

页面简单布局

<template>
  <div id="banner">
    <el-space direction="vertical" :size="20" style="width: 100%">
      <h1>轮播图管理</h1>
      <div style="text-align: right">
        <el-button type="primary" @click="onAddButtonClick">
          <el-icon><plus /></el-icon>
          添加轮播图
        </el-button>
      </div>
    </el-space>
    <el-dialog v-model="bannerDialogVisible" title="添加修改轮播图" width="30%">
      <el-form :model="form">
        <el-form-item label="名称" >
          <el-input v-model="form.name" autocomplete="off" />
        </el-form-item>
        <el-form-item label="图片" >
          <div style="display: flex">
            <el-input v-model="form.image_url" autocomplete="off" style="margin-right:10px"/>
            <!-- 上传的地址 -->
            <el-upload
              :show-file-list="false"
              :action="$http.server_host + '/cmsapi/banner/image/upload'"
              :headers="{'Authorization': 'Bearer '+$auth.token}"
              name="image"
              accept="image/jpeg, image/png"
              :on-success="onImageUploadSuccess"
              :on-error="onImageUploadError"
            >
              <el-button type="primary" size="small">上传图片</el-button>
            </el-upload>
          </div>
        </el-form-item>
        <el-form-item label="跳转" >
          <el-input v-model="form.link_url" autocomplete="off" />
        </el-form-item>
        <el-form-item label="优先级" >
          <el-input v-model="form.priority" autocomplete="off" type="number" />
        </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="bannerDialogVisible = false">取消</el-button>
          <el-button type="primary"> Confirm </el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>

<script>
import { Plus } from "@element-plus/icons-vue";
export default {
  name: "Banner",
  components: {
    Plus,
  },
  data() {
    return {
      bannerDialogVisible: false,
      form: {
        name: "",
        image_url: "",
        link_url: "",
        priority: "",
      },
    };
  },
  mounted() {},
  methods: {
    onAddButtonClick() {
      this.bannerDialogVisible = true;
    },
    onImageUploadSuccess(response){
      if(response['code'] == 200){
        var image_name = response['data']['image_url'];
        var image_url = "/media/banner/" + image_name
        this.form.image_url = image_url;
      }
    },
    onImageUploadError(err, file, fileList){
      console.log(err);
      console.log(file);
      console.log(fileList);
    },
  },
};
</script>

<style scoped>
.el-space {
  display: block;
}
</style>

在这里插入图片描述

上传轮播图

新建目录存储轮播图
在这里插入图片描述
配置路径
在这里插入图片描述
配置图片前缀
在这里插入图片描述

上传文件校验
在这里插入图片描述

from flask_wtf.file import FileAllowed, FileSize
from wtforms import FileField

from apps.front.forms import BaseForm


class UploadImageForm(BaseForm):
    image = FileField(validators=[FileAllowed(['jpg', 'jpeg', 'png'], message="图片格式不符合要求!"), FileSize(max_size=1024*1024*5, message="图片最大不能超过5M!")])

上传接口
在这里插入图片描述

'''
-*- coding: utf-8 -*-
@File  : views.py
@author: Lx
@Time  : 2023/07/17 15:08
'''
import time
from hashlib import md5

from flask import Blueprint, request, current_app, g

from apps.cmsapi.forms import UploadImageForm
from utils import restful
from flask_jwt_extended import jwt_required,get_jwt_identity
import os
bp = Blueprint("cmsapi", __name__, url_prefix="/cmsapi")

@bp.get('/')
@jwt_required()
def mytest():
    # 这个identity是通过create_access_token传入的identity 获取的是User.id
    identity = get_jwt_identity()
    return restful.ok(message="成功!")


@bp.post("/banner/image/upload")
def upload_banner_image():
    form = UploadImageForm(request.files)
    if form.validate():
        image = form.image.data
        # 不要使用用户上传上来的文件名,否则容易被黑客攻击
        filename = image.filename
        # xxx.png,xx.jpeg
        _, ext = os.path.splitext(filename)
        filename = md5((g.user.email + str(time.time())).encode("utf-8")).hexdigest() + ext
        image_path = os.path.join(current_app.config['BANNER_IMAGE_SAVE_PATH'], filename)
        image.save(image_path)
        return restful.ok(data={"image_url": filename})
    else:
        message = form.messages[0]
        return restful.params_error(message=message)

此时会报跨域错误
在这里插入图片描述

pip install flask-cors

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

此时上传文件会出现问题因为g.user 没有这个属性
在这里插入图片描述

# 调用cmsapi之前先获取jwt  通过之后绑定user属性
@bp.before_request
@jwt_required()
def cmsapi_before_request():
    if request.method == 'OPTIONS':
        return
    identity = get_jwt_identity()
    user = UserModel.query.filter_by(id=identity).first()
    if user:
        setattr(g, "user", user)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

	#做个判断
    if request.method == 'OPTIONS':
        return

在这里插入图片描述

onImageUploadSuccess(response){
      if(response['code'] == 200){
        var image_name = response['data']['image_url'];
        var image_url = "/media/banner/" + image_name
        this.form.image_url = image_url;
      }
    },
    onImageUploadError(err, file, fileList){
      console.log(err);
      console.log(file);
      console.log(fileList);
    },

添加轮播图
前端实现
在这里插入图片描述

轮播图添加
在这里插入图片描述

onDialogSubmitEvent(){
      this.$refs["dialogForm"].validate((valid) => {
        if(!valid){
          ElMessage.error("请确保数据输入正确!");
          return;
        }
          // 走添加操作
          this.$http.addBanner(this.form).then((result) => {
            let code = result['code'];
            if(code === 200){
              let banner = result['data'];
              // 返回的轮播图添加到数组中
              this.banners.push(banner);
              ElMessage.success("轮播图添加成功!");
              this.bannerDialogVisible = false;
            }
          }).catch(() => {
            ElMessage.error("服务器开小差了,请稍后再试!");
            this.bannerDialogVisible = false
          })
        
      })
    },

在这里插入图片描述

轮播图列表展示
后端

@bp.get("/banner/list")
def banner_list():
    banners = BannerModel.query.order_by(BannerModel.create_time.desc()).all()
    # BannerModel
    banner_dicts = [banner.to_dict() for banner in banners]
    return restful.ok(data=banner_dicts)

轮播图列表前端实现
前端
http.js

getBannerList(){
		const url = "/banner/list"
		return this.http.get(url);
	}

在这里插入图片描述

mounted() {
    this.$http.getBannerList().then(res => {
      if(res['code'] == 200){
        let banners = res['data'];
        this.banners = banners;
      }else{
        ElMessage.error(res['message']);
      }
    })
  },
<el-table :data="banners" style="width: 100%">
        <el-table-column prop="name" label="名称" width="250px" />
        <el-table-column label="图片">
          <template #default="scope">
            <img :src="formatImageUrl(scope.row.image_url)" style="width: 200px;height: 60px;" />
          </template>
        </el-table-column>
        <el-table-column label="跳转链接">
          <template #default="scope">
            <a :href="scope.row.link_url" target="_blank">{{scope.row.link_url}}</a>
          </template>
        </el-table-column>
        <el-table-column prop="priority" label="优先级" width="100px" />
        <el-table-column>
          <template #default="scope">
            <el-button type="primary" circle @click="onEditEvent(scope.$index)">
              <el-icon><edit /></el-icon>
            </el-button>
            <el-button type="danger" circle @click="onDeleteEvent(scope.$index)">
              <el-icon><delete /></el-icon>
            </el-button>
          </template>
        </el-table-column>
      </el-table>

在这里插入图片描述

添加轮播的时候上传本地需要拼接完整Url
如果是在输入框输入完整url则不需要拼接


<el-table-column label="图片">
          <template #default="scope">
            <img :src="formatImageUrl(scope.row.image_url)" style="width: 200px;height: 60px;" />
          </template>
        </el-table-column>


formatImageUrl(image_url){
      if(image_url.startsWith("http")){
        return image_url;
      }else{
        return this.$http.server_host + image_url;
      }
    },

在这里插入图片描述

删除轮播图前后端实现

deleteBanner(banner_id){
		const url = "/banner/delete"
		return this._post(url, {"id": banner_id})
	}
 onDeleteEvent(index){
      this.deleteingIndex = index;
      this.deleteDialogVisible = true;
    },
    onConfirmDeleteEvent(){
      let banner = this.banners[this.deleteingIndex];
      this.$http.deleteBanner(banner.id).then(res => {
        let result = res['data'];
        let code = result['code'];
        if(code === 200){
          this.deleteDialogVisible = false;
          this.banners.splice(this.deleteingIndex, 1);
          ElMessage.success("轮播图删除成功!");
        }
      })
    }
@bp.post("/banner/delete")
def delete_banner():
    banner_id = request.form.get("id")
    if not banner_id:
        return restful.params_error(message="没有传入id!")
    try:
        banner_model = BannerModel.query.get(banner_id)
    except Exception as e:
        return restful.params_error(message="此轮播图不存在!")
    db.session.delete(banner_model)
    db.session.commit()
    return restful.ok()

编辑轮播图

forms

class EditBannerForm(AddBannerForm):
    id = IntegerField(validators=[InputRequired(message="请输入轮播图的id!")])
@bp.post("/banner/edit")
def edit_banner():
    form = EditBannerForm(request.form)
    if form.validate():
        banner_id = form.id.data
        try:
            banner_model = BannerModel.query.get(banner_id)
        except Exception as e:
            return restful.params_error(message="轮播图不存在!")
        name = form.name.data
        image_url = form.image_url.data
        link_url = form.link_url.data
        priority = form.priority.data

        banner_model.name = name
        banner_model.image_url = image_url
        banner_model.link_url = link_url
        banner_model.priority = priority
        db.session.commit()
        return restful.ok(data=banner_model.to_dict())
    else:
        return restful.params_error(message=form.messages[0])

前端页面点击编辑按钮,数据回显
在这里插入图片描述

在这里插入图片描述

// 如果有值说明是编辑轮播图
    initForm(banner){
      if(banner){
        // 这里加轮播图id 验证是添加轮播图还是编辑
        this.form.id = banner.id;
        this.form.name = banner.name;
        this.form.image_url = banner.image_url;
        this.form.link_url = banner.link_url;
        this.form.priority = banner.priority;
      }else{
        // 如果没有则说明是添加轮播图,则把表单清空
        this.form = {
          name: "",
          image_url: "",
          link_url: "",
          priority: 0
        }
      }
    },
    onEditEvent(index){
      this.editingIndex = index;
      let banner = this.banners[index];
      this.initForm(banner);
      this.bannerDialogVisible = true;
    },

添加轮播图做修改

onDialogSubmitEvent(){
      this.$refs["dialogForm"].validate((valid) => {
        if(!valid){
          ElMessage.error("请确保数据输入正确!");
          return;
        }
        if(this.form.id){
          // 走编辑操作
          this.$http.editBanner(this.form).then((result) => {
            let code = result['code'];
            if(code === 200){
              let banner = result['data'];
              // this.banners.push(banner);
              // 需要使用splice才能完成替换操作,不能直接通过下标修改元素
              // 直接通过下标修改元素,页面上不会自动改变
              this.banners.splice(this.editingIndex, 1, banner);
              ElMessage.success("轮播图编辑成功!");
              this.bannerDialogVisible = false;
            }
          })
        }else{
          // 走添加操作
          this.$http.addBanner(this.form).then((result) => {
            let code = result['code'];
            if(code === 200){
              let banner = result['data'];
              this.banners.push(banner);
              ElMessage.success("轮播图添加成功!");
              this.bannerDialogVisible = false;
            }
          }).catch(() => {
            ElMessage.error("服务器开小差了,请稍后再试!");
            this.bannerDialogVisible = false
          })
        }
      })
    },

http.js

editBanner(data){
		const url = "/banner/edit"
		return this._post(url, data);
	}

前台加载真实轮播图数据

@bp.route('/')
def index():
    sort = request.args.get("st", type=int, default=1)
    board_id = request.args.get("bd", type=int, default=None)
    boards = BoardModel.query.order_by(BoardModel.priority.desc()).all()
    post_query = None
    if sort == 1:
        post_query = PostModel.query.order_by(PostModel.create_time.desc())
    else:
        # 根据评论数量进行排序
        post_query = db.session.query(PostModel).outerjoin(CommentModel).group_by(PostModel.id).order_by(func.count(CommentModel.id).desc(), PostModel.create_time.desc())

    page = request.args.get(get_page_parameter(), type=int, default=1)
    # 10-9
    # 210-19
    start = (page - 1) * current_app.config['PER_PAGE_COUNT']
    end = start + current_app.config['PER_PAGE_COUNT']

    if board_id:
        # "mapped class CommentModel->comment" has no property "board_id"
        # CommentModel中寻找board_id,然后进行过滤
        # post_query = post_query.filter_by(board_id=board_id)
        post_query = post_query.filter(PostModel.board_id==board_id)
    total = post_query.count()
    posts = post_query.slice(start, end)
    pagination = Pagination(bs_version=3, page=page, total=total, prev_label="上一页")

    banners = BannerModel.query.order_by(BannerModel.priority.desc()).all()
    context = {
        "boards": boards,
        "posts": posts,
        "pagination": pagination,
        "st": sort,
        "bd": board_id,
        "banners": banners
    }
    return render_template("front/index.html", **context)

在这里插入图片描述

前端轮播图展示功能
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

<template>
  <div id="banner">
    <el-space direction="vertical" :size="20" style="width: 100%">
      <h1>轮播图管理</h1>
      <div style="text-align: right">
        <el-button type="primary" @click="onAddButtonClick">
          <el-icon><plus /></el-icon>
          添加轮播图
        </el-button>
      </div>
      <el-table :data="banners" style="width: 100%">
        <el-table-column prop="name" label="名称" width="250px" />
        <el-table-column label="图片">
          <template #default="scope">
            <img :src="formatImageUrl(scope.row.image_url)" style="width: 200px;height: 60px;" />
          </template>
        </el-table-column>
        <el-table-column label="跳转链接">
          <template #default="scope">
            <a :href="scope.row.link_url" target="_blank">{{scope.row.link_url}}</a>
          </template>
        </el-table-column>
        <el-table-column prop="priority" label="优先级" width="100px" />
        <el-table-column>
          <template #default="scope">
            <el-button type="primary" circle @click="onEditEvent(scope.$index)">
              <el-icon><edit /></el-icon>
            </el-button>
            <el-button type="danger" circle @click="onDeleteEvent(scope.$index)">
              <el-icon><delete /></el-icon>
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-space>

    <el-dialog v-model="bannerDialogVisible" title="添加/修改轮播图" width="30%">
      <el-form :model="form" :rules="rules" ref="dialogForm">
        <el-form-item label="名称" prop="name">
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="图片" prop="image_url">
          <div style="display: flex;">
            <el-input v-model="form.image_url" autocomplete="off" style="margin-right:10px;"></el-input>
            <el-upload
              :action="$http.server_host+'/cmsapi/banner/image/upload'"
              name="image"
              :headers="{'Authorization': 'Bearer '+$auth.token}"
              :show-file-list="false"
              accept="image/jpeg, image/png"
              :on-success="onImageUploadSuccess"
              :on-error="onImageUploadError"
            >
              <el-button size="small" type="primary">上传图片</el-button>
            </el-upload>
          </div>
        </el-form-item>
        <el-form-item label="跳转" prop="link_url">
          <el-input v-model="form.link_url" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="优先级" prop="priority">
          <el-input v-model="form.priority" autocomplete="off" type="number"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="bannerDialogVisible = false">取消</el-button>
          <el-button type="primary" @click="onDialogSubmitEvent">确认</el-button>
        </span>
      </template>
    </el-dialog>

    <!-- 删除轮播图确认对话框 -->
    <el-dialog
      v-model="deleteDialogVisible"
      title="提示"
      width="30%"
    >
      <span>您确定要删除这个轮播图吗?</span>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="deleteDialogVisible = false">取消</el-button>
          <el-button type="primary" @click="onConfirmDeleteEvent">确定</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>

<script>
import { Plus, Edit, Delete } from "@element-plus/icons";
import {ElMessage} from "element-plus";
export default {
  name: "Banner",
  components: {
    Plus,
    Edit,
    Delete
  },
  data(){
    return {
      bannerDialogVisible: false,
      deleteDialogVisible: false,
      deleteingIndex: 0,
      editingIndex: 0,
      banners: [],
      form: {
        name: "",
        image_url: "",
        link_url: "",
        priority: 0
      },
      rules: {
        name: [{required: true,message: '请输入轮播图名称!',trigger: 'blur'}],
        image_url: [{required: true,message: '请上传轮播图!',trigger: 'blur'}],
        link_url: [{required: true,message: '请输入轮播图跳转链接!',trigger: 'blur'}],
        priority: [
          {required: true,message: '请输入轮播图优先级!',trigger: 'blur'}
        ],
      }
    }
  },
  mounted() {
    this.$http.getBannerList().then(res => {
      if(res['code'] == 200){
        let banners = res['data'];
        this.banners = banners;
      }else{
        ElMessage.error(res['message']);
      }
    })
  },
  methods: {
    formatImageUrl(image_url){
      if(image_url.startsWith("http")){
        return image_url;
      }else{
        return this.$http.server_host + image_url;
      }
    },
    initForm(banner){
      if(banner){
        this.form.id = banner.id;
        this.form.name = banner.name;
        this.form.image_url = banner.image_url;
        this.form.link_url = banner.link_url;
        this.form.priority = banner.priority;
      }else{
        this.form = {
          name: "",
          image_url: "",
          link_url: "",
          priority: 0
        }
      }
    },
    onAddButtonClick(){
      this.initForm();
      this.bannerDialogVisible = true;
    },
    onImageUploadSuccess(response){
      if(response['code'] == 200){
        var image_name = response['data']['image_url'];
        var image_url = "/media/banner/" + image_name
        this.form.image_url = image_url;
      }
    },
    onImageUploadError(err, file, fileList){
      console.log(err);
      console.log(file);
      console.log(fileList);
    },
    onDialogSubmitEvent(){
      this.$refs["dialogForm"].validate((valid) => {
        if(!valid){
          ElMessage.error("请确保数据输入正确!");
          return;
        }
        if(this.form.id){
          // 走编辑操作
          this.$http.editBanner(this.form).then((result) => {
            let code = result['code'];
            if(code === 200){
              let banner = result['data'];
              // this.banners.push(banner);
              // 需要使用splice才能完成替换操作,不能直接通过下标修改元素
              // 直接通过下标修改元素,页面上不会自动改变
              this.banners.splice(this.editingIndex, 1, banner);
              ElMessage.success("轮播图编辑成功!");
              this.bannerDialogVisible = false;
            }
          })
        }else{
          // 走添加操作
          this.$http.addBanner(this.form).then((result) => {
            let code = result['code'];
            if(code === 200){
              let banner = result['data'];
              this.banners.push(banner);
              ElMessage.success("轮播图添加成功!");
              this.bannerDialogVisible = false;
            }
          }).catch(() => {
            ElMessage.error("服务器开小差了,请稍后再试!");
            this.bannerDialogVisible = false
          })
        }
      })
    },
    // 编辑轮播图
    onEditEvent(index){
      this.editingIndex = index;
      let banner = this.banners[index];
      this.initForm(banner);
      this.bannerDialogVisible = true;
    },
    // 每次点击添加轮播图就初始化表单
    onAddButtonClick(){
      this.initForm();
      this.bannerDialogVisible = true;
    },


    onDeleteEvent(index){
      this.deleteingIndex = index;
      this.deleteDialogVisible = true;
    },
    onConfirmDeleteEvent(){
      let banner = this.banners[this.deleteingIndex];
      this.$http.deleteBanner(banner.id).then(res => {
        let result = res['data'];
        let code = result['code'];
        if(code === 200){
          this.deleteDialogVisible = false;
          this.banners.splice(this.deleteingIndex, 1);
          ElMessage.success("轮播图删除成功!");
        }
      })
    }
  }
};
</script>

<style scoped>
.el-space {
  display: block;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】DQnet: Cross-Model Detail Querying for Camouflaged Object Detection

DQnet: Cross-Model Detail Querying for Camouflaged Object Detection DQnet&#xff1a;伪装目标检测中的跨模型细节查询 论文地址&#xff1a;https://arxiv.org/abs/2212.08296 这篇文章提出了一个交叉模型框架&#xff08;CNN-Transformer并行&#xff09;来检测伪装目…

Cocoapods 集成与初始化 - swift

基于新的 swift 工程集成 cocoapods,操作过程与 object-c 类似, 如下操作基于已成功安装 cocoapods 的基础之上; 首先,终端访问到工程根目录下 cd xxx工程文件夹路径xxx 其次,创建 Podfile 文件 vim Podfile 再其次,创建成功后工程根目录下会得到一个 Podfile 文件,通过终…

MySQL事务机制、导入导出、数据表设计案例(六)

目录 一、数据库事务机制1.1 undo和redo日志1.2 开启事务、提交事务、回滚事务1.3 事务的ACID属性1.4 事务的并发性1.4.1 业务案例1&#xff1a;抢车票1.4.2 业务案例2&#xff1a;转账1.4.3 业务案例3 电商涨价1.4.4 事务的序列化 二、数据导出与导入2.1 SQL文件的导出与导入2…

【操作教程】在EasyCVR平台实现播放MP4视频的两种方法

目前EasyCVR平台可支持国标GB28181、RTSP/Onvif、RTMP、海康Ehome、SDK等方式接入&#xff0c;这些接入方式主要是针对设备或视频流的接入。在有些项目现场也会遇到播放MP4视频文件的需求&#xff0c;今天我们来介绍下&#xff0c;如何在EasyCVR平台实现MP4视频文件的播放&…

vue-element-template管理模板(一)

模板下载 选择分支&#xff1a;https://github.com/PanJiaChen/vue-admin-template/tree/permission-control 端口修改、关闭Eslint 修改vue.config.js文件&#xff08;用放大镜搜索“9528”定位文件&#xff09; const port 9528 lintOnSave: false国际化设置 import lo…

PHP8知识详解:PHP是什么?

PHP是什么&#xff1f; 杨泽业从下面几点为你讲清楚什么是PHP。 1、PHP最开始是Personal Home Page&#xff08;个人主页&#xff09;的缩写&#xff0c;已经正式更名为 “PHP: Hypertext Preprocessor”&#xff0c;超文本预处理器的字母缩写。 2、PHP是一种被广泛应用的、…

改进的减法优化器算法优化BP神经网络---回归+分类两种案例

今天采用前一阵改进最为成功的智能优化算法---融合黄金正弦的减法优化器算法(GSABO)优化BP神经网络。该算法不仅是2023年较新的算法&#xff0c;而且改进后的收敛速度和寻优精度都是极佳&#xff01;点击链接跳转GSABO算法&#xff1a;融合黄金正弦&#xff0c;十种混沌映射&am…

【在英伟达nvidia的jetson-orin-nx-工控机入门了解-自我学习-资料记录-熟悉了解】

【在英伟达nvidia的jetson-orin-nx-工控机入门了解-自我学习-资料记录-熟悉了解】 1、概述2、实验环境3-1初次接触工控机版本-真的好多-新手一脸懵逼3-2 啥是载板和核心板3-3 查看资源资料3-4 了解外设资源3-5 查看博客论坛3-6 底层配置pinmux3-7 Linux驱动开发3-8 AI相关3-8 j…

【基于CentOS 7 的NFS服务】

目录 一、概述 二、应用场景 三、安装 四、启动服务 五、目录结构 1.nfs的主配置文件 2.存储配置文件 六、命令解析 1.共享存储管理命令 2.共享目录查看 七、配置 八、客户端访问 1.查看nfs服务器的共享目录 2.挂载 九、实际案例 一、概述 network filesystemt…

7.12 redis未授权访问漏洞

在1.txt添加存在redis未授权访问漏洞的IP redis.py输入脚本 redis-cli exe -h IP -p 端口号

SQL 常见函数整理 _ CONCAT() 和 CONCAT_WS()

CONCAT() 1. 用法&#xff1a; 用于将多个字符串连接在一起。 2. 基本语法&#xff1a; CONCAT(str1, str2, ...)其中&#xff0c;str1, str2, … 是要连接的字符串。可以指定任意数量的参数。 3. 应用示例 Address表&#xff1a; 如果想将城市、区、街道合并到一个字段中 …

uniapp 小程序如何从主包页面跳转到分包页面

在uniapp开发小程序的时候&#xff0c;“分包”概念一定要提前了解下&#xff0c;具体我就不多说了&#xff0c;自己看下关网的相关配置。 那么&#xff0c;如果从主包页面&#xff0c;跳转至分包的页面呢&#xff1f;如图所示 我的页面->详情页 在我的页面创建好自己的链…

面试之JVM类的生命周期

按照Java虚拟机规范&#xff0c;从class文件到加载到内存中的类&#xff0c;到类卸载出内存为止&#xff0c;它的整个生命周期包括如下7个阶段&#xff1a; 加载: 类的加载指的是将类的.class文件中的二进制数据读取到内存中&#xff0c;存放在运行时数据区的方法去中。 在加…

java版本Spring Cloud + Spring Boot +二次开发+企业电子招标采购系统

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…

2.css公共样式、LOGO SEO优化、常用模块和注册页类名命名、tab栏布局原理、Web服务器

2.1 css公共样式 模块开发&#xff1a; ●有些样式和结构在很多页面都会出现, 比如页面头部和底部, 大部分页面都有。此时, 可以把这些结构和样式单独作为一个模块, 然后重复使用 ●这里最典型的应用就是common.css公共样式。写好一个样式, 其余的页面用到这些相同的样式 ●模…

基于php+mysql日志审计管理系统

基于phpmysql日志审计管理系统 一、系统介绍二、系统展示1.用户登陆2.监控日志3.监控规则4.用户管理 三、代码展示四.其它系统五、获取源码 一、系统介绍 本系统实现了&#xff1a;用户登陆、日志审计、监控规则、用户管理。 二、系统展示 1.用户登陆 2.监控日志 3.监控规则…

Postman接口测试实战-接口断言/newman执行集成(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试用例 接…

2023年项目管理系统排名:客观分析+推荐解决方案

一个高效的项目管理系统可以帮助企业提高生产力、降低成本并确保按时交付高质量的产品或服务。然而&#xff0c;市场上有众多的项目管理系统供选择&#xff0c;使得消费者在做出决策时可能会感到困惑。本文将对当前市场上最受欢迎的项目管理系统进行客观分析&#xff0c;并提供…

原型和原型链条、ES6、前后端交互Ajax

一、原型和原型链条 1.原型<script>/*原型 解决问题> 当你需要给实例对象添加方法> 直接书写在构造函数体内> 这个行为并不好> 我们的原型就是解决了这个问题 不好的原因> 当我把方法书写在构造函数体内> 每次创建实例的时候, 都会创建一个函数数据类…

21matlab数据分析牛顿插值(matlab程序)

1.简述 一、牛顿插值法原理 1.牛顿插值多项式   定义牛顿插值多项式为&#xff1a; N n ( x ) a 0 a 1 ( x − x 0 ) a 2 ( x − x 0 ) ( x − x 1 ) ⋯ a n ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 1 ) N_n\left(x\right)a_0a_1\left(x-x_0\right)a_2\left(x-x_0\…