Skip to content

Commit 8e8f628

Browse files
committed
update vue template, fix user sql injection, add text for localization file zh-hans.xml
1 parent 2ed9b12 commit 8e8f628

File tree

8 files changed

+192
-23
lines changed

8 files changed

+192
-23
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Abp.Application.Services.Dto;
2+
using System;
3+
4+
namespace AbpCompanyName.AbpProjectName.Users.Dto
5+
{
6+
//custom PagedResultRequestDto
7+
public class PagedUserResultRequestDto : PagedResultRequestDto
8+
{
9+
public string UserName { get; set; }
10+
public string Name { get; set; }
11+
public bool? IsActive { get; set; }
12+
public DateTimeOffset? From { get; set; }//javascript date within timezone
13+
public DateTimeOffset? To { get; set; }//javascript date within timezone
14+
}
15+
}

aspnet-core/src/AbpCompanyName.AbpProjectName.Application/Users/IUserAppService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace AbpCompanyName.AbpProjectName.Users
88
{
9-
public interface IUserAppService : IAsyncCrudAppService<UserDto, long, PagedResultRequestDto, CreateUserDto, UserDto>
9+
public interface IUserAppService : IAsyncCrudAppService<UserDto, long, PagedUserResultRequestDto, CreateUserDto, UserDto>
1010
{
1111
Task<ListResultDto<RoleDto>> GetRoles();
1212

aspnet-core/src/AbpCompanyName.AbpProjectName.Application/Users/UserAppService.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
using AbpCompanyName.AbpProjectName.Authorization.Users;
1717
using AbpCompanyName.AbpProjectName.Roles.Dto;
1818
using AbpCompanyName.AbpProjectName.Users.Dto;
19+
using Abp.Linq.Extensions;
20+
using Abp.Extensions;
1921

2022
namespace AbpCompanyName.AbpProjectName.Users
2123
{
2224
[AbpAuthorize(PermissionNames.Pages_Users)]
23-
public class UserAppService : AsyncCrudAppService<User, UserDto, long, PagedResultRequestDto, CreateUserDto, UserDto>, IUserAppService
25+
public class UserAppService : AsyncCrudAppService<User, UserDto, long, PagedUserResultRequestDto, CreateUserDto, UserDto>, IUserAppService
2426
{
2527
private readonly UserManager _userManager;
2628
private readonly RoleManager _roleManager;
@@ -124,9 +126,15 @@ protected override UserDto MapToEntityDto(User user)
124126
return userDto;
125127
}
126128

127-
protected override IQueryable<User> CreateFilteredQuery(PagedResultRequestDto input)
129+
protected override IQueryable<User> CreateFilteredQuery(PagedUserResultRequestDto input)
128130
{
129-
return Repository.GetAllIncluding(x => x.Roles);
131+
return
132+
Repository.GetAllIncluding(x => x.Roles)
133+
.WhereIf(!input.UserName.IsNullOrWhiteSpace(), x => x.UserName.Contains(input.UserName))
134+
.WhereIf(!input.Name.IsNullOrWhiteSpace(), x => x.Name.Contains(input.Name))
135+
.WhereIf(input.IsActive.HasValue, x => x.IsActive)
136+
.WhereIf(input.From.HasValue, x => x.CreationTime >= input.From.Value.LocalDateTime)
137+
.WhereIf(input.To.HasValue, x => x.CreationTime <= input.To.Value.LocalDateTime);
130138
}
131139

132140
protected override async Task<User> GetEntityByIdAsync(long id)
@@ -141,7 +149,7 @@ protected override async Task<User> GetEntityByIdAsync(long id)
141149
return user;
142150
}
143151

144-
protected override IQueryable<User> ApplySorting(IQueryable<User> query, PagedResultRequestDto input)
152+
protected override IQueryable<User> ApplySorting(IQueryable<User> query, PagedUserResultRequestDto input)
145153
{
146154
return query.OrderBy(r => r.UserName);
147155
}

aspnet-core/src/AbpCompanyName.AbpProjectName.Core/Localization/SourceFiles/AbpProjectName-zh-Hans.xml

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,46 @@
2020
<text name="LogIn" value="登录" />
2121

2222
<text name="LoginFailed" value="登录失败!" />
23-
23+
24+
<text name="AppName" >AbpProjectName</text>
25+
<text name="UserNamePlaceholder" >请输入账户</text>
26+
<text name="PasswordPlaceholder" >请输入密码</text>
27+
<text name="CopyRight" >© 2018 AbpProjectName</text>
28+
<text name="LoginPrompt" >正在登陆,请稍候!</text>
29+
30+
<text name="UserProfile" >用户资料</text>
31+
<text name="Users" >用户</text>
32+
<text name="Roles" >角色</text>
33+
<text name="Tenants" >租户</text>
34+
<text name="Logout" >注销</text>
35+
36+
<text name="ManageMenu" >菜单</text>
37+
<text name="LabelOptions" >页签操作</text>
38+
<text name="ClearAll" >关闭所有</text>
39+
<text name="ClearOthers" >关闭其他</text>
40+
<text name="Create" >创建</text>
41+
<text name="Add" >添加</text>
42+
<text name="Edit" >编辑</text>
43+
<text name="Delete">删除</text>
44+
<text name="Find" >查找</text>
45+
<text name="CreationTime">创建时间</text>
46+
<text name="Actions">操作</text>
47+
<text name="Keyword">关键字</text>
48+
<text name="NoDatas">没有结果</text>
49+
<text name="Select">请选择</text>
50+
<text name="SelectDate">请选择</text>
51+
<text name="Tips">提示</text>
52+
<text name="DeleteConfirm">确定删除?</text>
53+
<text name="Title" >标题</text>
54+
<text name="Content" >内容</text>
55+
56+
<text name="ChangePassword" >修改密码</text>
57+
58+
<text name="PasswordComplexityNotSatisfied">密码复杂度要求不符.</text>
59+
<text name="PasswordRequireDigit">密码至少需要一位是0到9的数字.</text>
60+
<text name="PasswordRequireLowercase">密码至少需要一位是a到z的小写字母.</text>
61+
<text name="PasswordRequireNonAlphanumeric">密码至少需要包含一个特殊字符(非字母或数字的字符).</text>
62+
<text name="PasswordRequireUppercase">密码至少需要一位是A到Z的大写字母.</text>
63+
<text name="PasswordTooShort">密码长度太短</text>
2464
</texts>
2565
</localizationDictionary>

rename.ps1

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# 设置输出格式
2+
$OutputEncoding = [Text.UTF8Encoding]::UTF8
3+
4+
## 公共参数
5+
6+
# 替换前的公司名称
7+
$oldCompanyName="AbpCompanyName"
8+
# 替换后的公司名称
9+
$newCompanyName="FamilySrv"
10+
11+
# 替换前的项目名称
12+
$oldProjectName="AbpProjectName"
13+
# 替换后的项目名称
14+
$newProjectName="PlanFork"
15+
16+
# 文件类型名称
17+
$fileType="FileInfo"
18+
19+
# 目录类型名称
20+
$dirType="DirectoryInfo"
21+
22+
#复制一份
23+
Write-Host '开始复制文件夹'
24+
$newRoot=$newCompanyName+"."+$newProjectName
25+
mkdir $newRoot
26+
Copy-Item -Recurse .\aspnet-core\ .\$newRoot\
27+
Copy-Item -Recurse .\vue\ .\$newRoot\
28+
Copy-Item .gitignore .\$newRoot\
29+
Copy-Item LICENSE .\$newRoot\
30+
Copy-Item README.md .\$newRoot\
31+
32+
# sln所在目录
33+
$slnFolder = (Get-Item -Path "./$newRoot/aspnet-core/" -Verbose).FullName
34+
$vueFolder = (Get-Item -Path "./$newRoot/vue/" -Verbose).FullName
35+
36+
function Rename {
37+
param (
38+
$TargetFolder,
39+
$PlaceHolderCompanyName,
40+
$PlaceHolderProjectName,
41+
$NewCompanyName,
42+
$NewProjectName
43+
)
44+
# 需要修改文件内容的文件后缀名
45+
$include=@("*.cs","*.cshtml","*.asax","*.ps1","*.ts","*.csproj","*.sln","*.xaml","*.json","*.js","*.xml","*.config","Dockerfile")
46+
47+
$elapsed = [System.Diagnostics.Stopwatch]::StartNew()
48+
49+
Write-Host "[$TargetFolder]开始重命名文件夹"
50+
# 重命名文件夹
51+
Ls $TargetFolder -Recurse | Where { $_.GetType().Name -eq $dirType -and ($_.Name.Contains($PlaceHolderCompanyName) -or $_.Name.Contains($PlaceHolderProjectName)) } | ForEach-Object{
52+
Write-Host 'directory ' $_.FullName
53+
$newDirectoryName=$_.Name.Replace($PlaceHolderCompanyName,$NewCompanyName).Replace($PlaceHolderProjectName,$NewProjectName)
54+
Rename-Item $_.FullName $newDirectoryName
55+
}
56+
Write-Host "[$TargetFolder]结束重命名文件夹"
57+
Write-Host '-------------------------------------------------------------'
58+
59+
60+
# 替换文件中的内容和文件名
61+
Write-Host "[$TargetFolder]开始替换文件中的内容和文件名"
62+
Ls $TargetFolder -Include $include -Recurse | Where { $_.GetType().Name -eq $fileType} | ForEach-Object{
63+
$fileText = Get-Content $_ -Raw -Encoding UTF8
64+
if($fileText.Length -gt 0 -and ($fileText.contains($PlaceHolderCompanyName) -or $fileText.contains($PlaceHolderProjectName))){
65+
$fileText.Replace($PlaceHolderCompanyName,$NewCompanyName).Replace($PlaceHolderProjectName,$NewProjectName) | Set-Content $_ -Encoding UTF8
66+
Write-Host 'file(change text) ' $_.FullName
67+
}
68+
If($_.Name.contains($PlaceHolderCompanyName) -or $_.Name.contains($PlaceHolderProjectName)){
69+
$newFileName=$_.Name.Replace($PlaceHolderCompanyName,$NewCompanyName).Replace($PlaceHolderProjectName,$NewProjectName)
70+
Rename-Item $_.FullName $newFileName
71+
Write-Host 'file(change name) ' $_.FullName
72+
}
73+
}
74+
Write-Host "[$TargetFolder]结束替换文件中的内容和文件名"
75+
Write-Host '-------------------------------------------------------------'
76+
77+
$elapsed.stop()
78+
write-host "[$TargetFolder]共花费时间: $($elapsed.Elapsed.ToString())"
79+
}
80+
81+
Rename -TargetFolder $slnFolder -PlaceHolderCompanyName $oldCompanyName -PlaceHolderProjectName $oldProjectName -NewCompanyName $newCompanyName -NewProjectName $newProjectName
82+
Rename -TargetFolder $vueFolder -PlaceHolderCompanyName $oldCompanyName -PlaceHolderProjectName $oldProjectName -NewCompanyName $newCompanyName -NewProjectName $newProjectName
83+

vue/src/views/setting/role/role.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
this.getpage();
7777
}
7878
async getpage(){
79-
let where= Util.buildFilters(this.filters);//TODO@personball fix this sql injection
79+
let where= Util.buildFilters(this.filters);//TODO fix this sql injection. see user.vue
8080
let pagerequest=new PageRequest();
8181
pagerequest.maxResultCount=this.pageSize;
8282
pagerequest.skipCount=(this.currentPage-1)*this.pageSize;

vue/src/views/setting/tenant/tenant.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
this.getpage();
9090
}
9191
async getpage(){
92-
let where= Util.buildFilters(this.filters);//TODO@personball fix this sql injection
92+
let where= Util.buildFilters(this.filters);//TODO fix this sql injection. see user.vue
9393
let pagerequest=new PageRequest();
9494
pagerequest.maxResultCount=this.pageSize;
9595
pagerequest.skipCount=(this.currentPage-1)*this.pageSize;

vue/src/views/setting/user/user.vue

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
<Row :gutter="16">
77
<Col span="6">
88
<FormItem :label="L('UserName')+':'" style="width:100%">
9-
<Input v-model="filters[0].Value"></Input>
9+
<Input v-model="filterUserName"></Input>
1010
</FormItem>
1111
</Col>
1212
<Col span="6">
1313
<FormItem :label="L('Name')+':'" style="width:100%">
14-
<Input v-model="filters[1].Value"></Input>
14+
<Input v-model="filterName"></Input>
1515
</FormItem>
1616
</Col>
1717
<Col span="6">
@@ -25,7 +25,7 @@
2525
</Col>
2626
<Col span="6">
2727
<FormItem :label="L('CreationTime')+':'" style="width:100%">
28-
<DatePicker v-model="filters[2].Value" type="datetimerange" format="yyyy-MM-dd" style="width:100%" placement="bottom-end" :placeholder="L('SelectDate')"></DatePicker>
28+
<DatePicker v-model="filterCreationTime" type="datetimerange" format="yyyy-MM-dd" style="width:100%" placement="bottom-end" :placeholder="L('SelectDate')"></DatePicker>
2929
</FormItem>
3030
</Col>
3131
</Row>
@@ -53,19 +53,30 @@
5353
import PageRequest from '../../../store/entities/page-request'
5454
import CreateUser from './create-user.vue'
5555
import EditUser from './edit-user.vue'
56+
57+
class PageUserRequest extends PageRequest{
58+
userName:string='';
59+
name:string='';
60+
isActive:boolean=null;
61+
from:Date=null;
62+
to:Date=null;
63+
}
64+
//should update IUserAppService in AbpCompanyName.AbpProjectName.Application
65+
//create PagedUserResultRequestDto derived from PagedResultRequestDto, to replace PagedResultRequestDto in declaration of IUserAppService
66+
5667
@Component({
5768
components:{CreateUser,EditUser}
5869
})
5970
export default class Users extends AbpBase{
6071
edit(){
6172
this.editModalShow=true;
6273
}
63-
filters:Filter[]=[
64-
{Type:FieldType.String,Value:'',FieldName:'UserName',CompareType:CompareType.Contains},
65-
{Type:FieldType.String,Value:'',FieldName:'Name',CompareType:CompareType.Contains},
66-
{Type:FieldType.DataRange,Value:'',FieldName:'CreationTime',CompareType:CompareType.Contains},
67-
{Type:FieldType.Boolean,Value:null,FieldName:'IsActive',CompareType:CompareType.Equal}
68-
]
74+
75+
filterUserName:string='';
76+
filterName:string='';
77+
filterCreationTime:Date[]=[];
78+
filterIsActive:boolean=null;
79+
6980
createModalShow:boolean=false;
7081
editModalShow:boolean=false;
7182
get list(){
@@ -79,11 +90,11 @@
7990
}
8091
isActiveChange(val:string){
8192
if(val==='Actived'){
82-
this.filters[3].Value=true;
93+
this.filterIsActive=true;
8394
}else if(val==='NoActive'){
84-
this.filters[3].Value=false;
95+
this.filterIsActive=false;
8596
}else{
86-
this.filters[3].Value=null;
97+
this.filterIsActive=null;
8798
}
8899
}
89100
pageChange(page:number){
@@ -95,11 +106,23 @@
95106
this.getpage();
96107
}
97108
async getpage(){
98-
let where= Util.buildFilters(this.filters);//TODO@personball fix this sql injection
99-
let pagerequest=new PageRequest();
109+
//let where= Util.buildFilters(this.filters);//sql injection
110+
let pagerequest=new PageUserRequest();
100111
pagerequest.maxResultCount=this.pageSize;
101112
pagerequest.skipCount=(this.currentPage-1)*this.pageSize;
102-
pagerequest.where=where;
113+
114+
pagerequest.userName=this.filterUserName;
115+
pagerequest.name=this.filterName;
116+
pagerequest.isActive=this.filterIsActive;
117+
118+
if (this.filterCreationTime.length>0) {
119+
pagerequest.from=this.filterCreationTime[0];
120+
}
121+
122+
if (this.filterCreationTime.length>1) {
123+
pagerequest.to=this.filterCreationTime[1];
124+
}
125+
103126
await this.$store.dispatch({
104127
type:'user/getAll',
105128
data:pagerequest

0 commit comments

Comments
 (0)