关于毕业设计的整理

关于毕业设计的想法

在毕业设计的题目,我是比较纠结的,有想过利用.Net Core和Google Optimization Tools去做一个智能调度排班系统的,但后来经过深入的了解,发现智能调度排班系统并没有那么容易实现.回忆大学生涯,学生网管这个工作其实还在给我带来了不少的回忆.于是就决定开发一个网络故障报修系统.

采用的架构

一直有开发一个前后端分离的系统的想法,刚好借这个机会去尝试一下,就决定采用前后端分离的开发模式.服务端采用Asp.Net Core WebApi,前端采用Vue+Router+Element ui+axios.

关于跨域

  • 问题原因

    既然使用了前后端分离的架构,不可避免的就是跨域访问的问题.前后端可能不在同个server上,即便是在同个server上,由于前后端分离,前后端对应的端口号也可能是不一样的,所以跨域访问是必须的.

  • 解决方案

    服务端是基于Asp.Net Core开发的WebApi,支持cors非常方便,只需要引入Microsoft.AspNetCore.Cors,问题就很轻易的解决了.

    在Startup.cs中ConfigureServices方法中添加Cors服务,在Configure方法中使用Cors服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void ConfigureServices(IServiceCollection services)
    {
    services.AddCors(options => options.AddPolicy("Domain", builder => builder.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    app.UseCors("Domain");
    }

关于用户权限

  • 问题原因

    在系统中涉及到不同的角色,它们之间的权限不一样,对应的菜单也就存在着差异.关于权限的部分,有着几种不同的解决方案,一种是在前端预设写死页面的权限设置,前端通过后台返回的角色信息,生成对应的菜单,另一种则是在后台动态配置权限,当用户登录时,根据角色信息,后端返回一个对应的权限表,前端通过权限表生成对应的菜单.

  • 解决方案

    在本系统中,采用的是后一种解决方案,前端中存在完整的路由表,用户在登录后,获得相应的路由信息,根据路由信息去比对完整的路由表,生成当前用户可访问的页面,通过router.addRoutes动态挂载到router上.

关于前端

系统的前端是基于vueAdmin-template进行二次开发,修改了其关于用户权限的设置

关于服务端

系统的后端采用的是Asp.Net Core WebApi,MVC模式,架构分为BLL(业务层)-Dal(数据访问层),数据库访问是通过EF Core实现.使用EF Core Code Frist 创建数据库,使用Migrations完成对数据库的迁移..Net Core MVC三层架构框架里面架构进行了详细介绍.

Token

系统中,登录成功后,服务端会返回一个 token(该token的是一个能唯一标示用户身份的一个key),之后我们将token存储在本地cookie之中,这样下次打开页面或者刷新页面的时候能记住用户的登录状态,不用再去登录页面重新登录了。

实现方案

LoginControllers.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using Microsoft.IdentityModel.Tokens;
using System.Security.Claims;
using Microsoft.Extensions.Configuration;

public class LoginController : Controller
{
private readonly IConfiguration _configuration;
public LoginController(IConfiguration configuration)
{
_configuration = configuration;
}

public string RequestToken([FromBody] TokenRequest request, string token, int expires_in)
{
var claims = new[]
{
new Claim(ClaimTypes.Name, request.Username)
};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SecurityKey"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

/**
* Claims (Payload)
Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:
iss: The issuer of the token,token 是给谁的
sub: The subject of the token,token 主题
exp: Expiration Time。 token 过期时间,Unix 时间戳格式
iat: Issued At。 token 创建时间, Unix 时间戳格式
jti: JWT ID。针对当前 token 的唯一标识
除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
* */
var tokens = new JwtSecurityToken(
issuer: "yourdomain.com",
audience: "yourdomain.com",
claims: claims,
expires: DateTime.Now.AddMinutes(10),
signingCredentials: creds);

return token = new JwtSecurityTokenHandler().WriteToken(tokens);
}


public class TokenRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
}

appsettings.json

1
2
3
{
"SecurityKey": "dd%88*377f6d&f£$$£$FdddFF33fssDG^!3"
}

GitHub地址

网络故障报修管理系统


关于毕业设计的整理
http://blog.chcaty.cn/2018/06/05/guan-yu-bi-ye-she-ji-de-zheng-li/
作者
caty
发布于
2018年6月5日
许可协议