计算机专业毕业设计项目推荐11-博客项目(Go+Vue+Mysql)

news2024/12/23 10:11:18

博客项目(Go+Vue+Mysql)

    • **介绍**
    • **系统总体开发情况-功能模块**
    • **各部分模块实现**

介绍

  • 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业毕业设计流程以及模式,在编写的过程中可以说几乎是参照毕业设计目录样式来进行的.
  • 博主分享的基本都是自己接触过的项目Demo,整理了一下自己做过的项目,将可以作为毕业设计的项目分享给大家。(注:项目基本都是博主自己用过的,所以不存在远古代码无法使用

系列的文章后端都是采用Java或者Go语言,前端主要是采用的原生JsVue框架搭建的。数据都是采用Mysql。还有较少的微信小程序开发。开发工具这些可以自己选择,我分享一下自己的Go语言开发我用的Vscode,前端用的HBuilder X,测试接口Postman,Java开发用的IDEA。数据库查看用的navicat,上传服务器Xshell 7和Xftp 7。

系统总体开发情况-功能模块

各部分模块实现

今天主要是将后端实现登录效果和改一些前端的代码

前端:
在这里插入图片描述
在这里插入图片描述

因为原始代码是将侧边栏写在了App.vue里面,所以我改了一下增加了Sidebar.vue将侧边栏新建了一个文件保存。然后在App.vue里面引用。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(这也是我的项目哈,俺叫王先生以前的名字)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package model

import (
	
	"github.com/dgrijalva/jwt-go"
)


//User表
type User struct {
	Id       int    `json:"id"`
	Username string `json:"username"`
	Password string `json:"password"`
}

// UserLogin 用户登录
func UserLogin(username string) (User,error){
	mod := User{}
	
	err :=Db.Get(&mod, "select * from userlogin where username=? limit 1", username)
	
	return mod,err
}

//UserClaims    token 携带的数据

type UserClaims struct {
	Id       int    `json:"id"`
	Username string `json:"username"`
	Password string `json:"password"`
	
	jwt.StandardClaims
}



package route

import (
	// "fmt"
	"github.com/zxysilent/utils"
	"github.com/dgrijalva/jwt-go"
	"blog_go/model"
	"github.com/labstack/echo"
)

// ServerHeader middleware adds a `Server` header to the response.
func ServerHeader(next echo.HandlerFunc) echo.HandlerFunc {
	return func(ctx echo.Context) error {
		ctx.Response().Header().Set(echo.HeaderServer, "Echo/3.0")
	
		
		// fmt.Println(ctx.Response().Header())
		tokenString := ctx.FormValue("token")
		claims := model.UserClaims{}
		
		token, err := jwt.ParseWithClaims(tokenString, &claims, func(token *jwt.Token) (interface{}, error) {
			return []byte("123"), nil
		})

		if err==nil && token.Valid {
			return next(ctx)
		} else {
			return ctx.JSON(utils.ErrToken("验证失败"))
		}
		
	}
}



package route

import (

	"github.com/labstack/echo/middleware"
	"blog_go/control"
	"github.com/labstack/echo"
)

func Run(){
	blog := echo.New()
	
	blog.Use(middleware.CORS())
	
	blog.Use(middleware.Logger())
	blog.Use(middleware.Recover())
	//用户登录
	blog.POST("/admin/login", control.UserLogin)
	adm:=blog.Group("/admin",ServerHeader)
	
	blog.GET("/", control.Index)
	
	
	blog.Logger.Fatal(blog.Start(":1323"))
	// blog.Start(":1323")
}

package control

import (
	// "fmt"
	"time"
	"github.com/zxysilent/utils"
	"blog_go/model"
	"github.com/dgrijalva/jwt-go"
	"github.com/labstack/echo"
)

type login struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

func UserLogin(ctx echo.Context) error {
	
	ipt := login{}
	err:=ctx.Bind(&ipt)
	if err!=nil{
		return ctx.JSON(utils.ErrIpt("输入有误", err.Error()))
	}
	mod, err :=model.UserLogin(ipt.Username)
	
	if err!=nil {
		return ctx.JSON(utils.ErrIpt("用户名错误", err.Error()))
	}
	if mod.Password !=ipt.Password{
		return ctx.JSON(utils.ErrIpt("密码错误"))
	}
		// Create the UserClaims 生成
	claims := model.UserClaims{
		Id:mod.Id,
		Username:mod.Username,
		Password:mod.Password,

		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(2*time.Hour).Unix(),
			
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
		//自己的密钥
	ss, err := token.SignedString([]byte("123"))
	// fmt.Printf("%v %v", ss, err)
	return ctx.JSON(utils.Succ("登录成功", ss))
}	
	
前端写的路由守卫:

```javascript
import Vue from 'vue'
import Router from 'vue-router'

// import Login from '@/view/Login'
Vue.use(Router)

const router = new Router({
	routes: [
		{
			 path: '/',
			 redirect: '/login'
		},
		{
		      path: '/login',
		      
		      component: resolve => require(['@/view/login'], resolve),
			  meta: {
			  	title: '后台登陆'
			  },
		    },

		{
			path: '/organizationManage',
			component: resolve => require(['@/view/index/index'], resolve),
			meta: {
				title: '首页'
			},
			redirect: to => {
			  return '/organizationManage'
			},
			children:[
				{
					path: '/organizationManage',
					component: resolve => require(['@/view/organization_manage/index'], resolve),
					meta: {
						title: '组织管理'
					},
				},
				{
					path: '/staffManage',
					component: resolve => require(['@/view/staff_manage/index'], resolve),
					meta: {
						title: '员工管理'
					},
				},
			],
		},
		{
			path: '/personManage',
			component: resolve => require(['@/view/index/index'], resolve),
			meta: {
				title: '个人管理'
			},
			redirect: to => {
			  return '/personManage'
			},
			children:[
				{
					path: '/personManage',
					component: resolve => require(['@/view/personal/personinformation'], resolve),
					meta: {
						title: '个人管理1'
					},
				},
				// {
				// 	path: '/staffManage',
				// 	component: resolve => require(['@/view/staff_manage/index'], resolve),
				// 	meta: {
				// 		title: '员工管理'
				// 	},
				// },
			],
		},
	]
});

//导航守卫限制页面
// 使用 router.beforeEach 注册一个全局前置守卫,判断用户是否登陆
router.beforeEach((to, from, next) => {
  if (to.path === '/login') {
    next();
  } else {
    let token = localStorage.getItem('token');
 
    if (token === null || token === '') {
      next('/');
    } else {
      next();
    }
  }
});

export default router;

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

 async submitForm(formName) {
			  
			 
	        this.$refs[formName].validate(async (valid) => {
	          if (valid) {
				  const res = await useredit({
				  	token: getStore('token'),
					nickname:this.formLabelAlign.nickname,
					email:this.formLabelAlign.email,
					signature:this.formLabelAlign.signature
				  	
				  })
				console.log(res)
					
				if(res.code==200){
					     console.log('submit!');
				}else{
					  console.log("修改失败");
				}
	      
	          } else {
	            console.log('error submit!!');
	            return false;
	          }
	        });
	      },

// UserEdit 个人信息修改
func UserEdit(nickname,email,signature,token string) error {
	tx,_ :=Db.Begin()//事务

	result, err :=tx.Exec("update userinformation set `nickname`=?,email=?,signature=? where token=?", nickname,email,signature,token)

	if err!=nil{
		tx.Rollback()
		return err
	}
	rows,_ :=result.RowsAffected()
	if rows<1	{
		tx.Rollback()
		return errors.New("row affecter<1")

	}
	tx.Commit()
	return nil
}

文章管理
在这里插入图片描述
后台管理页面:
在这里插入图片描述
在这里插入图片描述

编辑删除功能都做啦。当然也少不了新增。

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

最后想说的
对项目有任何疑问,或者说想学习项目开发的都可以来问博主哦~。也可以选题,开题指导,论文整体框架或者项目整体开发指导。

计算机专业毕业设计项目(附带有配套源码以及相关论文,有需要的同学可以联系博主,但是不免费哦)。

联系方式
微信号:wxid_rrun0cqao5ny22

在这里插入图片描述

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

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

相关文章

正点原子嵌入式linux驱动开发——U-boot启动流程详解

在上一篇笔记中详细分析了uboot的顶层Makefile&#xff0c;理清了uboot的编译流程。本章来详细的分析一下uboot的启动流程&#xff0c;理清uboot是如何启动的。通过对uboot启动流程的梳理&#xff0c;可以掌握一些外设是在哪里被初始化的&#xff0c;这样当需要修改这些外设驱动…

14885-2010 固定资产分类与代码 思维导图

声明 本文是学习GB-T 14885-2010 固定资产分类与代码…pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了固定资产的分类、代码及计量单位。 本标准适用于固定资产管理、清查、登记、统计等工作。 2 术语和定义 下列术语和定义…

由[哈希/散列]模拟实现[unordered_map/unordered_set] (手撕迭代器)

文章目录 1.迭代器分析2.细节处理3.完整代码3.1HashTable.h3.2unordered_set.h3.3unordered_map.h3.4Test.cpp 1.迭代器分析 2.细节处理 以下两篇文章均为笔者的呕心沥血想要搞懂本篇文章的uu请自行查阅 哈希/散列的细节实现 哈希/散列–哈希表[思想到结构][修订版] 手撕迭代器…

硬件知识:U盘相关知识介绍,值得收藏

目录 什么是U盘&#xff1f; U盘根据结构有哪几种&#xff1f; 根据U盘的存储介质、外形、功能分类有哪几种&#xff1f; 什么是U盘&#xff1f; U盘&#xff0c;全称为USB闪存盘&#xff0c;是一种以闪存芯片作为数据存储介质的移动存储设备。U盘的历史可以追溯到1998年&am…

vue3 中使用 echarts 图表——准备篇

我们常常在项目中使用图表来表示数据&#xff0c;而目前最常用的图标就是echarts&#xff0c;接下来我们就开始学习在vue中使用echarts图标。 一、准备一个vue项目&#xff08;一般通过vite来构建&#xff0c;而不是vue-cli&#xff09; 1.找到打开vite官网 2. 运行创建命令 …

MySQL进阶-存储引擎

目录 1.MySQL体系结构 体系结构图 各层的作用 2.存储引擎简介 2.1查看当前表的存储引擎 2.2 查询mysql支持的存储引擎 2.3 InnoDB简介 2.4 MyISAM简介 2.5 Memory简介 3.存储引擎的选择 1.MySQL体系结构 mysql体系结构主要有四层结构&#xff0c;从上到下依次是&#…

Spring Cloud zuul扩展能力设计和心得

前言 实际上Spring Cloud已经废弃zuul了&#xff0c;改用gateway&#xff0c;但是webflux的技术并没在实际项目大规模普及&#xff0c;还有很多servlet NIO的应用&#xff0c;所以zuul还是很有必要改造的&#xff0c;实测zuul调优&#xff08;调节转发的连接池&#xff09;跟g…

【算法挨揍日记】day11——852. 山脉数组的峰顶索引、162. 寻找峰值

852. 山脉数组的峰顶索引 852. 山脉数组的峰顶索引 题目描述&#xff1a; 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < ... arr[i-1] < …

数据结构:二叉树(超详解析)

目录​​​​​​​ 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.3.1孩子兄弟表示法&#xff1a; 1.3.2双亲表示法&#xff1a;只存储双亲的下标或指针 两节点不在同一树上&#xff1a; 2.二叉树概念及结构 2.1.概念 2.2.特殊的二叉树&#xff1a; 2…

掌握交易时机!

“您是否知道您选择购买和出售加密货币的时间会产生很大的影响&#xff1f;当然&#xff0c;大多数交易者都知道高价卖出和低价买入的基本知识。然而&#xff0c;在选择交易加密货币的最佳时机时&#xff0c;还需要考虑许多其他小细节。加密货币市场分析表明&#xff0c;一天中…

【MyBatis-Plus】快速精通Mybatis-plus框架—核心功能

刚才的案例中都是以id为条件的简单CRUD&#xff0c;一些复杂条件的SQL语句就要用到一些更高级的功能了。 1.条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外&#xff0c;还支持…

ES 关于 remote_cluster 的一记小坑

最近有小伙伴找到我们说 Kibana 上添加不了 Remote Cluster&#xff0c;填完信息点 Save 直接跳回原界面了。具体页面&#xff0c;就和没添加前一样。 我们和小伙伴虽然隔着网线但还是进行了深入、详细的交流&#xff0c;梳理出来了如下信息&#xff1a; 两个集群&#xff1a;…

Java常见API---split()

package daysreplace;public class SplitTest {public static void main(String[] args) {String str"武汉市|孝感市|长沙市|北京市|上海市";String[] array str.split("\\|");System.out.println(array[0]);System.out.println(array[1]);System.out.pri…

[黑马程序员TypeScript笔记]------一篇就够了

目录&#xff1a; TypeScript 介绍 TypeScript 是什么&#xff1f;TypeScript 为什么要为 JS 添加类型支持&#xff1f;TypeScript 相比 JS 的优势TypeScript 初体验 安装编译 TS 的工具包 编译并运行 TS 代码 简化运行 TS 的步骤 TypeScript 常用类型 概述类型注解常用基础…

​“债务飙升!美国一天内增加2750亿美元,金融震荡的前奏已拉开帷幕!”

2023年10月4日&#xff0c;美国政府向美国债务追加2750亿美元&#xff0c;相当于现在比特币&#xff08;BTC&#xff09;总市值的一半还多。 有人会说:多一点、少一点&#xff0c;没什么区别.....确实&#xff0c;当你看美国债务时&#xff0c;2750亿美元并没有什么意义&#x…

oringin的x轴(按x轴规定值)绘制不规律的横坐标

1.双击x轴 2.选择刻度线标签 3.选择刻度

【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.冒泡排序 2.快速排序 2.1Hoare版 2.2占…

二叉树的初步认识

二叉树是这么一种树状结构&#xff1a;每个节点最多有两个孩子&#xff0c;左孩子和右孩子 重要的二叉树结构 完全二叉树&#xff08;complete binary tree&#xff09;是一种二叉树结构&#xff0c;除最后一层以外&#xff0c;每一层都必须填满&#xff0c;填充时要遵从先左后…

YOLOv5报错:TypeError: load() missing 1 required positional argument: ‘Loader‘

报错信息 报错位置 解决办法 将 self.update(yaml.load(fo.read())) 改为&#xff1a; self.update(yaml.safe_load(fo.read()))

信息学 学习/复习 抽签器(附源码)

问你一个问题&#xff0c;你考试前怎么复习呀&#xff1f; 效果图 以下是源代码&#xff0c;可自行修改 [C] #include<bits/stdc.h> #include<windows.h> using namespace std; vector<string>item; int main(void) {item.push_back("Manacher"…