C语言实现简单员工工资管理系统
本文实例为大家分享了C语言实现简单员工工资管理系统的具体代码,供大家参考,具体内容如下
(一)公司现状分析
1、公司主要有经理、技术员、销售员、销售经理4类岗位人员,他们都有基本信息:职工号、姓名、性别、部门、岗位、工龄、当月工资等。一个部门最多只能有一个销售经理,一个部门可以有多个销售员,一个部门可以有若干个经理和若干技术员。
2、员工数据包括基本资料数据和工资数据两部分,员工基本资料数据包括职工号、姓名、性别、部门、岗位、工龄;员工工资数据包括工作时间、小时工资、销售额、底薪、当月工资。
3、员工当月工资的计算办法。
A.经理:底薪(8000)+工龄×35;
B.技术员:工作时间×小时工资(100元每小时)+工龄×35;
C.销售员:销售额×4%提成+工龄×35;
D.销售经理:底薪(8000)+所辖部门销售额总额×0.5%+工龄×35。
现在需要开发一个公司员工工资管理系统对员工工资进行有效管理。
(二)系统的功能要求
数据维护管理:要求对员工的基本资料数据和工资数据分开管理。基本资料数据的维护管理功能包括添加(批量、单个)、修改、删除、查询等;工资数据的维护管理功能包括输入(批量、单个)、修改、删除、查询等。
【C语言实现简单员工工资管理系统】A. 基本资料数据的维护管理
(1).添加:(批量、单个)添加员工基本资料数据。基本资料数据包括职工号、姓名、性别、部门、岗位、工龄。
(2).修改:根据职工号来修改任意员工的除职工号外的其他基本资料数据。
(3).删除:根据职工号删除一个员工。
(4).查询:根据职工号查询一个员工的基本资料数据。
B. 工资数据的维护管理
(1).输入:(批量、单个)输入员工工资数据。工资数据根据员工类型的不同而有区别,输入的相关数据也应不同。注意:当月工资是计算项,不能输入。
(2).修改:根据职工号来修改任意员工的相关工资数据(注意:不同类别员工相关数据不同)。
(3).删除:根据职工号删除一个员工(不能删除,只需将相关数据项设置成-1)。
(4).查询:根据职工号查询一个员工的工资数据。
(5).计算:批量计算所有技术员、销售员和销售经理的当月工资额。注意,① 销售经理所辖部门销售额总额为本部门所有销售员当月销售额之和。② 只有各项数据都为有效数据时(-1为无效数据),才能计算。
查询数据
1、分页显示全部员工的信息。分页功能:每页显示10条员工的信息,有上一页、下一页、首页和最后一页的功能。
2、按部门显示本部门全部员工信息。注意:无需分页显示。
3、分类显示4种岗位的员工信息。注意:无需分页显示。
4、根据工号或者姓名查询员工信息。
排序:
1、所有员工信息按当月工资从高到低排序并显示。注意:无需分页显示。
2、某个岗位的员工信息按当月工资从高到低排序并显示。注意:无需分页显示。
统计:
1、统计并显示某个部门的平均工资、最低工资、最高工资。
2、统计并显示某个部门超出平均工资的人数与员工信息。注意:无需分页显示。
3、统计并显示所有员工中的最低工资和最高工资员工的信息。
4、统计并显示所有员工超出平均工资的人数与员工信息。注意:无需分页显示。
(三)系统的实现技术要求
1、员工用结构体表示,全体员工用一个链表来表示。某一岗位的员工,可以只使用员工结构体的部分成员,比如:经理只使用基本信息成员,而不使用销售额成员、工作时间成员。
2、必须用文件来存储员工信息:开始运行程序时从文件中读取员工信息到链表,退出程序时将员工信息保存到文件中。
3、主菜单有一个菜单项能够将员工信息保存到文件。
4、数据约束:
1)、职工号:整型、不能重复、从1开始依次递增、由软件自动计算产生,不能修改。
2)、岗位:枚举类型,分别表示经理、技术员、销售员、销售经理。
3)、员工的其他信息不能为空。
4)、其他:至少有两层菜单。
#include #include #include typedef struct employee{int num; /* 工号*/char name[20]; /* 姓名*/int sex; /* 性别 1 man 2 madam*/int department; /* 部门*/int post; /* 1为经理、2为技术员、3为销售员、4为销售经理*/int lengthservice; /* 工龄*/int hour; /* 工作时间 */int hoursalary; /* 时薪*/int sales; /* 销售额*/int basicsalary; /* 底薪*/int salary; /* 工资总数*/struct employee *next; }employee; struct Employee{int num; char name[20]; /* 姓名*/int sex; /* 性别 1 man 2 madam*/int department; /* 部门*/int post; /* 1为经理、2为技术员、3为销售员、4为销售经理*/int lengthservice; /* 工龄*/int hour; /* 工作时间 */int hoursalary; /* 时薪*/int sales; /* 销售额*/int basicsalary; /* 底薪*/int salary; /* 工资总数*/}; void main(){int num=0,flag,a,NUM; char name[20]; employee *list,*rare; //头节点list无数据 尾指针rare有数据int increase(employee *rare,int *num); void DecendOrder(employee *list); void Statistics(employee *list); void queryAll(employee *list); void querybasic(employee *list,int num); void Delete(employee *list,int num); void DeleteSalary(employee *list,int num); void querysalary(employee *list,int num); void change(employee *list,int num); void changesalary(employee *list,int num); void Statistics2(employee *list); void querynum(employee *list,int num); employee *import(employee *list,int *num); void salary(employee *list); void Statistics3(employee *list); void Statistics4(employee *list); void save(employee *list); void queryname(employee *list,char name[20]); void querydepart(employee *list,int num); void querypost(employee *list); void DecendOrder2(employee *list); list=(employee *)malloc(sizeof(employee)); list->next=NULL; rare=import(list,&num); if(num==0)increase(list,&num); salary(list); while(1){begin:printf("菜单:添加数据:1修改数据:2删除数据:3查询数据:4保存数据:5统计数据:6数据排序:7退出:0\n"); scanf("%d",&flag); if(flag==0){save(list); exit(0); }switch(flag){case 1:increase(rare,&num); salary(list); save(list); break; case 2:printf("修改基本信息:1 修改工资信息:2 返回:0\n"); scanf("%d",&a); switch(a){case 0:goto begin; break; case 1:printf("请输入要修改的工号\n"); scanf("%d",&NUM); change(list,NUM); break; case 2:printf("请输入要修改的工号\n"); scanf("%d",&NUM); changesalary(list,NUM); break; }break; case 3:printf("删除基本信息:1 删除工资信息:2 返回:0\n"); scanf("%d",&a); switch(a){case 0:goto begin; break; case 1:printf("请输入要删除的工号\n"); scanf("%d",&NUM); Delete(list,NUM); break; case 2:printf("请输入要删除的工号\n"); scanf("%d",&NUM); DeleteSalary(list,NUM); break; }break; case 4:printf("查询基本信息:1 查询工资信息:2查询全部信息:3查询部门信息:4查询各个岗位信息:5工号查询信息:6姓名查询信息:7 返回:0\n"); scanf("%d",&a); switch(a){case 0:goto begin; break; case 1:printf("请输入要查询的工号\n"); scanf("%d",&NUM); querybasic(list,NUM); break; case 2:printf("请输入要查询的工号\n"); scanf("%d",&NUM); querysalary(list,NUM); break; case 3:queryAll(list); break; case 4:printf("请输入要查询的部门号\n"); scanf("%d",&NUM); querydepart(list,NUM); break; case 5:querypost(list); break; case 6:printf("请输入要查询的工号\n"); scanf("%d",&NUM); querynum(list,NUM); break; case 7:printf("请输入想查询的姓名\n"); scanf("%s",name); queryname(list,name); break; }break; case 5:save(list); break; case 6:printf("统计部门平均工资,最低,最高工资:1统计部门超过平均工资的人数与员工信息:2\n统计所有员工最低工资和最高工资员工的信息:3统计所有员工超出平均工资的人数与员工信息:4\n 返回:0\n"); scanf("%d",&a); switch(a){case 0:goto begin; break; case 1:Statistics(list); break; case 2:Statistics2(list); break; case 3:Statistics3(list); break; case 4:Statistics4(list); break; }break; case 7:DecendOrder2(list); break; default:printf("输入错误"); goto begin; }} }int increase(employee *rare,int *num)//添加数据{employee *p,*q; char name[20]; int sex,department,post,lengthservice,hour,hoursalary,sales,basicsalary; q=rare; printf("请输入姓名,性别(1为男,2为女),部门,职位(1为经理、2为技术员、3为销售员、4为销售经理),工龄,工作时间,时薪,销售额,底薪:(工时为-1时停止输入)\n"); scanf("%s%d%d%d%d%d%d%d%d",name,&sex,&department,&post,&lengthservice,&hour,&hoursalary,&sales,&basicsalary); while(hour!=-1){num++; p=(employee *)malloc(sizeof(employee)); strcpy(p->name,name); p->num=*num; p->sex=sex; p->department=department; p->post=post; p->lengthservice=lengthservice; p->hour=hour; p->hoursalary=hoursalary; p->sales=sales; p->basicsalary=basicsalary; if(*num==1)rare->next=p; elseq->next=p; q=p; p->next=NULL; scanf("%s%d%d%d%d%d%d%d%d",name,&sex,&department,&post,&lengthservice,&hour,&hoursalary,&sales,&basicsalary); }return *num; }void salary(employee *list)//计算工资{employee *p=list->next,*q=list->next; int sales=0; while(p!=NULL){if(p->hour==-1)p=p->next; if(p->post==3)p->salary=p->sales*4/100+35*p->lengthservice; else if(p->post==2)p->salary=100*p->hour+35*p->lengthservice; else if(p->post==1)p->salary=8000+p->lengthservice*35; else if(p->post==4){while(q!=NULL){if(q->post==3&&q->department==p->department)sales+=q->sales; q=q->next; }p->salary=sales*5/1000+8000+p->lengthservice*35; q=list->next; }p=p->next; }}void querybasic(employee *list,int num)//查询基本信息{employee *p; p=list->next; while(p->num!=num&&p!=NULL)p=p->next; if(p->num==num){printf("工号 名字 性别 部门 职位 工龄\n"); printf("%-5d%-5s%-5d%-5d%-5d%-5d\n",p->num,p->name,p->sex,p->department,p->post,p->lengthservice); }if(p==NULL)printf("该工号不存在\n"); }void querysalary(employee *list,int num)//查询工资信息{employee *p; p=list->next; while(p->num!=num&&p!=NULL)p=p->next; if(p->num==num){printf("工号工时时薪销售额底薪工资\n"); printf("%-6d%-6d%-6d%-8d%-6d%-6d\n",p->num,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); }if(p==NULL)printf("该工号不存在\n"); }void Delete(employee *list,int num)//删除基本信息{employee *p,*q; p=list->next; q=p->next; while(p->next->num!=num){p=p->next; q=p->next; }if(q->num==num)p->next=q->next; else printf("职工号在范围外"); q=q->next; while(q!=NULL){q->num--; q=q->next; } }void DeleteSalary(employee *list,int num)//删除工资信息{employee *p; p=list->next; while(p->num!=num)p=p->next; if(p->num==num){p->hour=-1; p->hoursalary=-1; p->sales=-1; p->basicsalary=-1; }else printf("该工号超出范围"); }employee *import(employee *list,int *num)//读取文件{ FILE *fp; struct Employee stu; employee *q,*p; if((fp=fopen("employee.dat","rb"))==NULL){printf("文件不存在,输入数据以建立一个文件存储信息\n"); return 0; }q=(employee *)malloc(sizeof(employee)); while(!feof(fp)){if((fread(&stu,sizeof(struct Employee),1,fp))!=1)break; *num=*num+1; p=(employee *)malloc(sizeof(employee)); strcpy(p->name,stu.name); p->num=*num; p->sex=stu.sex; p->department=stu.department; p->post=stu.post; p->lengthservice=stu.lengthservice; p->hour=stu.hour; p->hoursalary=stu.hoursalary; p->sales=stu.sales; p->basicsalary=stu.basicsalary; p->salary=stu.salary; if(*num==1)list->next=p; elseq->next=p; q=p; p->next=NULL; }fclose(fp); return q; }void save(employee *list)//存储到文件{struct Employee stu; FILE *fp; employee *p; p=list->next; if((fp=fopen("employee.dat","wb"))==NULL){printf("error"); exit(0); }while(p!=NULL){stu.num=p->num; strcpy(stu.name,p->name); stu.sex=p->sex; stu.department=p->department; stu.post=p->post; stu.lengthservice=p->lengthservice; stu.hour=p->hour; stu.hoursalary=p->hoursalary; stu.sales=p->sales; stu.basicsalary=p->basicsalary; stu.salary=p->salary; if((fwrite(&stu,sizeof(struct Employee),1,fp))!=1)printf("error"); p=p->next; }fclose(fp); }void change(employee *list,int num)//改变基本数据{char name[20]; int sex,department,post,lengthservice; employee *p=list->next; while(p->num!=num&&p->next!=NULL)p=p->next; if(p->num==num){printf("请输入修改后的姓名 性别 部门 岗位 工龄\n"); scanf("%s%d%d%d%d",name,&sex,&department,&post,&lengthservice); strcpy(p->name,name); p->sex=sex; p->department=department; p->post=post; p->lengthservice=lengthservice; }else printf("职工号超出范围"); }void changesalary(employee *list,int num)//改变工资数据{int hour,hoursalary,sales,basicsalary; employee *p=list->next; while(p->num!=num)p=p->next; if(p->num==num){printf("请输入修改后的工作时间 小时工资 销售额 底薪 \n"); scanf("%d%d%d%d",&hour,&hoursalary,&sales,&basicsalary); p->hour=hour; p->hoursalary=hoursalary; p->sales=sales; p->basicsalary=basicsalary; }else printf("职工号超出范围"); }void queryAll(employee *list)//分页查询所有信息{employee *p,*page[100]; int n,i,top=0,flag=0,max; p=list->next; while(p!=NULL){page[++top]=p; i=1; while(i<=10){i++; p=p->next; if(p==NULL)break; }}max=top; top=0; p=page[++top]; printf("工号 姓名 性别 部门 岗位 工龄 工时 时薪 销售额 底薪 工资\n"); while(1){i=1; while(i<=10){i++; printf("%-5d%-5s%-5d%-5d%-5d%-5d%-5d%-5d%-7d%-5d%-5d\n",p->num,p->name,p->sex,p->department,p->post,p->lengthservice,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); p=p->next; if(p==NULL)break; }begin:printf("当前页码%d首页->1上一页->2下一页->3尾页->4退出->0\n",top); scanf("%d",&n); if(n==0)break; else if(n==1)top=1,p=page[1]; else if(n==2){if(top==1){printf("当前已经是第一页\n"); goto begin; }else p=page[--top]; }else if(n==3){if(top==max){printf("当前已经是最后一页\n"); goto begin; }else p=page[++top]; }else if(n==4)top=max,p=page[max]; else goto begin; }}void querydepart(employee *list,int num)//输出该部门全部员工信息{employee *p=list->next; printf("%d部门的全部员工信息为:\n",num); printf("工号 姓名 性别 部门 岗位 工龄 工时 时薪 销售额 底薪 工资\n"); while(p!=NULL){if(p->department==num)printf("%-5d%-5s%-5d%-5d%-5d%-5d%-5d%-5d%-7d%-5d%-5d\n",p->num,p->name,p->sex,p->department,p->post,p->lengthservice,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); p=p->next; }}void querypost(employee *list)//分类显示四个岗位的员工信息{employee *p; int i=0; while(i<4){switch(i){case 0:printf("经理岗位的信息为(若为空则无):\n"); break; case 1:printf("技术员岗位的信息为(若为空则无):\n"); break; case 2:printf("销售员岗位的信息为(若为空则无):\n"); break; case 3:printf("销售经理岗位的信息为(若为空则无):\n"); break; }p=list->next; i++; while(p!=NULL){if(p->post==i)printf("%d %s %d %d %d %d %d %d %d %d %d\n",p->num,p->name,p->sex,p->department,p->post,p->lengthservice,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); p=p->next; }}}void querynum(employee *list,int num)//工号查询个人全部信息{employee *p; p=list->next; while(p!=NULL){if(p->num==num)break; p=p->next; }if(p->num==num){printf("工号 姓名 性别 部门 岗位 工龄 工时 时薪 销售额 底薪 工资\n"); printf("%-5d%-5s%-5d%-5d%-5d%-5d%-5d%-5d%-7d%-5d%-5d\n",p->num,p->name,p->sex,p->department,p->post,p->lengthservice,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); }else printf("工号超出范围"); }void queryname(employee *list,char name[20])//用姓名查询数据{employee *p; p=list->next; while(p!=NULL){if(strcmp(p->name,name)==0)break; p=p->next; }if(strcmp(p->name,name)==0){printf("工号 姓名 性别 部门 岗位 工龄 工时 时薪 销售额 底薪 工资\n"); printf("%-5d%-5s%-5d%-5d%-5d%-5d%-5d%-5d%-7d%-5d%-5d\n",p->num,p->name,p->sex,p->department,p->post,p->lengthservice,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); }else printf("该姓名不存在"); }void Statistics(employee *list){employee *p=list->next,*q=list->next,*max=list->next,*k; //p,q作为循环指针,max指针指向最大的employee *headis=NULL; //用来保存部门的信息employee *Max,*Min; //最大和最小值的成员int i=0; //计算部门的人数;int sum=0,avar=0; //总值,平均值int department; //用来接收想要统计的部门printf("请输入你想要统计的部门:\n"); scanf("%d",&department); //提取所要统计的部门的成员while(p){ if(p->num==-1){p=p->next; continue; }if(department==p->department){q=(employee *)malloc(sizeof(employee)); *q=*p; q->next=NULL; if(!headis)headis=q; else k->next=q; k=q; }p=p->next; } //计算最大、最小和平均值p=headis; q=headis; Max=headis; Min=headis; while(p){if(p->num==-1){p=p->next; continue; }if(p->salary>Max->salary)Max=p; else if(p->salarysalary)Min=p; sum+=p->salary ; p=p->next; i++; } avar=sum/i; printf("部门:%d\n",department); printf("平均工资:%d\n",avar); printf("最低工资:%d\n",Min->salary); printf("最高工资:%d\n",Max->salary); }void Statistics2(employee *list){ employee *p=list->next,*q=list->next,*max=list->next,*k; //p,q作为循环指针,max指针指向最大的employee *headis=NULL; //用来保存部门的信息int j=0,i=0; //用j来计算人数,i计算工资大于平均工资的人数int sum=0,avar=0; //平均值int department; //用来接收想要统计的部门printf("请输入你想要统计的部门:\n"); scanf("%d",&department); //提取所要统计的部门的成员while(p!=NULL){ if(p->num==-1){p=p->next; continue; }if(department==p->department){j++; q=(employee*)malloc(sizeof(employee)); *q=*p; q->next=NULL; if(!headis)headis=q; else k->next=q; k=q; }p=p->next; } //计算最大、最小和平均值p=headis; q=headis; while(p!=NULL){if(p->num==-1){p=p->next; continue; }sum+=p->salary ; p=p->next; }avar=sum/j; p=q; headis=0; //提取超过平均工资的部门的成员while(p!=NULL){ if(p->num==-1){p=p->next; continue; }if((p->salary)>avar){ i++; q=(employee *)malloc(sizeof(employee)); *q=*p; q->next=NULL; if(!headis)headis=q; else k->next=q; k=q; }p=p->next; } p=headis; printf("部门:%d\n",department); printf("超出平均工资的人数为:%d\n",i); if(i!=0){printf("这些成员的信息如下:\n"); printf("工号工时时薪销售额底薪工资\n"); while(p!=NULL){if(p->num==-1){p=p->next; continue; }printf("%-6d%-6d%-6d%-8d%-6d%-6d\n",p->num,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); p=p->next ; }}}void Statistics3(employee *list){employee *Max,*Min; //指向最大和最小值的成员employee*p=list->next; //p作为循环指针Max=list->next; Min=list->next; while(p){if(p->num==-1){p=p->next; continue; }if(p->salary >Max->salary )Max=p; if(p->salary salary)Min=p; p=p->next; } p=Min; printf("在所有员工中:"); printf("最低工资的员工信息:\n"); printf("工号工时时薪销售额底薪工资\n"); printf("%-6d%-6d%-6d%-8d%-6d%-6d\n",p->num,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); p=Max; printf("最高工资的员工信息:\n"); printf("工号工时时薪销售额底薪工资\n"); printf("%-6d%-6d%-6d%-8d%-6d%-6d\n",p->num,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); }void Statistics4(employee *list){employee *p=list->next,*q=list->next,*k; //p,q作为循环指针employee *headis=0; //用来保存工资超过平均工资的成员int i=0; //用i来计算人数double sum=0,avar=0; //总值,平均值 //求平均值while(p){if(p->num==-1){p=p->next; continue; }i++; sum+=p->salary ; p=p->next; }avar=sum/i; //提取出超过平均工资的成员,并且计算人数i=0; p=list; while(p){if(p->num==-1){p=p->next; continue; }if(p->salary >avar){i++; q=(employee *)malloc(sizeof(employee)); *q=*p; q->next=NULL; if(!headis)headis=q; else k->next=q; k=q; }p=p->next; }p=headis; printf("超出平均工资的人数:%d\n",i); printf("工号工时时薪销售额底薪工资\n"); while(p){if(p->num==-1){p=p->next; continue; }printf("%-6d%-6d%-6d%-8d%-6d%-6d\n",p->num,p->hour,p->hoursalary,p->sales,p->basicsalary,p->salary); p=p->next; }}void DecendOrder(employee *list){employee *p,*q,*a,*b,*s; int j=0; p=list->next; q=p->next; a=list; b=a->next; while(q!=NULL){a=list; b=a->next; j=0; while(a!=p){if(q->salary>b->salary){p->next=q->next; q->next=b; a->next=q; j=1; break; }a=b; b=b->next; }if(j==1)q=p->next; else{p=q; q=q->next; }}s=list->next; while(s!=NULL){printf("工号 姓名 性别 部门 岗位 工龄 工时 时薪 销售额 底薪 工资\n"); printf("%-5d%-5s%-5d%-5d%-5d%-5d%-5d%-5d%-7d%-5d%-5d\n",s->num,s->name,s->sex,s->department,s->post,s->lengthservice,s->hour,s->hoursalary,s->sales,s->basicsalary,s->salary); s=s->next; }}void DecendOrder2(employee *list){employee *p,*q,*a,*b,*s,*z,*x=NULL,*v,*head; int j=0,post; printf("请输入岗位\n"); scanf("%d",&post); p=list->next; head=(employee *)malloc(sizeof(employee)); while(p!=NULL){if(p->post==post){z=(employee *)malloc(sizeof(employee)); *z=*p; z->next=NULL; if(x==NULL)x=z; elsev->next=z; v=z; }p=p->next; }head->next=x; p=x; q=p->next; while(q!=NULL){a=head; b=a->next; j=0; while(a!=p){if(q->salary>b->salary){p->next=q->next; q->next=b; a->next=q; j=1; break; }a=b; b=b->next; }if(j==1)q=p->next; else{p=q; q=q->next; }}s=head->next; while(s!=NULL){printf("工号 姓名 性别 部门 岗位 工龄 工时 时薪 销售额 底薪 工资\n"); printf("%-5d%-5s%-5d%-5d%-5d%-5d%-5d%-5d%-7d%-5d%-5d\n",s->num,s->name,s->sex,s->department,s->post,s->lengthservice,s->hour,s->hoursalary,s->sales,s->basicsalary,s->salary); s=s->next; }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- 使用纯 python 实现 Instruments 协议,跨平台 (win,mac,linux) 获取 iOS 性能数据
- 图书管理系统c语言大作业,C语言图书管理系统简洁版
- 机器学习|模型评价指标说明和scikit-learn代码实现
- java|Java实现表单的自定义字段功能(动态管理不同类型的字段数据)
- HTML/CSS|html+css实现漂亮的登录页面
- java|JAVA使用EasyExcel数据库动态导出Excel,超简单!
- vue实现拖拽滑动分割面板
- C语言中有哪些字符处理函数你知道吗
- 详解.NET|详解.NET 6如何实现获取当前登录用户信息
- Redis|Redis 中的 set 和 sorted set 如何使用,源码实现分析