环境:.net 5,Oracle 11g
ef core马上学完了,突然就想弄个东西玩玩,
具体实现了1用户登录 2翻页 3借书
由于一般都不使用外键所以我也没有使用,然后就是Fluent Api 和code first 。这是个纯控制台页面,具体往下看
1,登录及第一页展示,登录用的是手机号,正常11位,我这里随便弄了个,手机号也是用户Id,还有就是,如果输入不正确就会一直输入,给我输!!!
2,翻页展示,输入页数,就可以翻页,非法页数会显示警告
3,借书展示,被借的书状态会直接变成对应的手机号码
就很简单的功能,但是确实,看别人打好打,自己到用来一下午。
源码;
using System;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
namespace 图书分页查询
{
internal class Program
{
static async Task Main(string[] args)
{
using (LContext ctx = new LContext())
{
//LBook book1 = new LBook() {Name="C#入门到入土" };
//LBook book2 = new LBook() {Name="A母猪产后护理" };
//LBook book3 = new LBook() {Name= "C#.ASP.NET大成" };
//LBook book4 = new LBook() {Name="C#项目实战" };
//LBook book5 = new LBook() {Name= "计算机数据结构" };
//LBook book6 = new LBook() {Name="计算机操作系统" };
//LBook book7 = new LBook() {Name="富婆电话簿" };
//LBook book8 = new LBook() {Name="富婆重金求子" };
//LBook book9 = new LBook() {Name="A演员的自我修养" };
//LBook book10 = new LBook() {Name="大话西游" };
//LBook book11 = new LBook() {Name="大闹天宫" };
//LBook book12 = new LBook() {Name="计算机网络" };
//ctx.LBooks.Add(book1);
//ctx.LBooks.Add(book2);
//ctx.LBooks.Add(book3);
//ctx.LBooks.Add(book4);
//ctx.LBooks.Add(book5);
//ctx.LBooks.Add(book6);
//ctx.LBooks.Add(book7);
//ctx.LBooks.Add(book8);
//ctx.LBooks.Add(book9);
//ctx.LBooks.Add(book10);
//ctx.LBooks.Add(book11);
//ctx.LBooks.Add(book12);
//LUser user1 = new LUser() {PId=12138,Name="Root",PaW="12138" };
//ctx.LUsers.Add(user1);
//await ctx.SaveChangesAsync();
//数据插入结束
var all_Us = ctx.LUsers;
int user_Pid;
string user_Paw;
while (true)//用户的登录判断
{
Console.WriteLine("请输入账号:");
user_Pid = int.Parse(Console.ReadLine());
Console.WriteLine("请输入密码:");
user_Paw = Console.ReadLine();
//取用户输入值
var _Pid = all_Us.Where(a => a.PId == user_Pid);
var _Paw = all_Us.Where(a => a.PaW == user_Paw);
if (_Pid == null || _Paw == null)
Console.WriteLine("重新输入");
else break;
}
var a = all_Us.Single(a => a.PId == user_Pid).Name;
Console.WriteLine($"Welcome ++++++++{a}+++++++");
Console.WriteLine("===================================================");
// 登陆完成
var all_lb = ctx.LBooks;
// var all_lb5 = ctx.LBooks.Take(5);
int page = 0;
while (true)
{
var all_lb5 = ctx.LBooks.Skip(page*5).Take(5);
Console.WriteLine("-Id-|书名--------------|----状态 ");
Console.WriteLine("-------------------------------------");
foreach (var item in all_lb5)
{
Console.WriteLine($"{item.Id,4}|{padRightPro(item.Name, 18)}| {item.St,7}");//使用自建padRightPro()方法对齐输出
}
Console.WriteLine("-------------------------------------");
//输出对齐表格完成
int all_page = (int)(Math.Ceiling(all_lb.ToList().Count * 1.0 / 5));
//for (int i = 0;i< all_page; i++)
Console.WriteLine();
Console.WriteLine("当前在:第-【{0}】-页 共-【{1}】-页",page+1,all_page);
Console.WriteLine();
if (page> all_page-1||page<0)
{
Console.WriteLine("!!!!!!!!ERROR!!!!!!!!!没有此页");
}
Console.Write("请输入要跳转的页数(或者输入J+书的Id,借书):");
//设置目录完成
string request = Console.ReadLine();//读取下一步指令
/*if (int.TryParse(request, out int page1))//如果是数值,则是翻页
{
page = page1 - 1;
}*/
if (!request.Contains("J"))//如果是数值,则是翻页
{
page = int.Parse(request) - 1;
}
else//如果有J则是借书
{
string result = System.Text.RegularExpressions.Regex.Replace(request,@"[^\d.\d]", "");
/*使用此方法,对字符串进行正则表达式匹配,取出数字*/
int result1;
int.TryParse(result,out result1);
Console.WriteLine(result);
var upd_St =ctx.LBooks.SingleOrDefault(a =>a.Id== result1);
upd_St.St= user_Pid;
await ctx.SaveChangesAsync();
}
//借书完成呢
//Console.Write(page);
Console.WriteLine();
}
}
static string padRightPro(string str, int totalLength)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);/*使用GB2312需要安装包System.Text.Encoding.CodePages
* 并且使用Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
* 进行注册,才可以使用GB2312
*/
Encoding encoding = Encoding.GetEncoding("gb2312");
int cCount = 0;
foreach (var ch in str.ToCharArray())
{
if (encoding.GetByteCount(ch.ToString()) == 2)
{ cCount++; }// 所有长度为2的就是中文,一个中文记一次
}
//Console.WriteLine(cCount);
string w = str.PadRight(totalLength - cCount);/*限定长度时所有中文长度减一*/
return w;
}//从网上超来的,用于中英文混杂字符串输出限定长度,用于对齐
}
}
}
两个实体;
上下文类,只有个ORacle连接字符串,Config类中,加了点列的要求,就懒得放出来了
收获;
1,页面因为书名是中英文混杂,所以不好对齐,从网上找到了自定义的对齐方法加上了
2,深刻了解了,输出里面的左对齐(padLeft),右对齐(padright)
3,学会了剔除字符串; System.Text.RegularExpressions.Regex.Replace(request,@"[^\d.\d]", "")
4,不要一直用int.prase(),会报错的,应该用int.tryparse()
5,代码真的难打
不足;
1,密码需要保护,正常时要加密的,还没做
2,防止注入漏洞攻击,没有
3,状态列,应该加入并发控制,防止一块多人借同一本书,没加
4,这相当于,简易的用户界面,注册功能没加,哦,删除也没有
5,图书需要被搜索,搜索功能,模糊查询功能没加
6,还有可能悠然需要查没有被借出的书,这只需要状态=0,就行了,没加。同理,看被借出的书,状态 >0,就行了。
大概就这些了,我是真的很想加上这些功能,可是只能等到后天了,因为明天鸣潮公测了。含泪打游戏T~T。