Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
projecttwo
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangtao
projecttwo
Commits
f3a6524f
Commit
f3a6524f
authored
Jun 26, 2025
by
wangtao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
学习资料
parent
39b9b3aa
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
127 additions
and
35 deletions
+127
-35
AdminBase.php
app/admin/controller/AdminBase.php
+21
-2
index.html
app/admin/view/article_category/index.html
+2
-1
index.html
app/admin/view/cert/cert_category/index.html
+2
-1
detail.html
app/admin/view/cert/cert_order/detail.html
+1
-1
index.html
app/admin/view/course/course_category/index.html
+2
-1
detail.html
app/admin/view/project/project/detail.html
+1
-1
index.html
app/admin/view/project/project_category/index.html
+1
-1
index.html
app/admin/view/users/business/index.html
+1
-1
index.html
app/admin/view/users/school/index.html
+1
-1
User.php
app/api/controller/User.php
+72
-10
Wecaht.php
app/api/controller/Wecaht.php
+17
-15
User.php
app/api/controller/mine/User.php
+4
-0
UserValidate.php
app/api/validate/UserValidate.php
+2
-0
No files found.
app/admin/controller/AdminBase.php
View file @
f3a6524f
...
...
@@ -14,6 +14,7 @@ use app\BaseController;
use
app\model\system\SystemRoles
as
Roles
;
use
app\model\system\SystemManager
as
Manager
;
use
think\facade\Db
;
use
think\helper\Str
;
/**
*【后台控制器抽象基类】
...
...
@@ -72,7 +73,25 @@ abstract class AdminBase extends BaseController
//载入权限菜单
$this
->
loadMenusRoles
();
//构组路由: 控制器 + 方法 + (参数action的传值)
$this
->
routeUri
=
strtolower
(
$this
->
request
->
ADDON_APP
.
$this
->
request
->
controller
()
.
"/"
.
$this
->
request
->
action
()
.
((
$action
=
$this
->
request
->
get
(
'action'
))
?
'/'
.
$action
:
''
));
$controler
=
$this
->
request
->
controller
();
$controlerarr
=
explode
(
'.'
,
$controler
);
//下划线转驼峰(首字母小写)
$firstcc
=
Str
::
camel
(
$controlerarr
[
0
]);
$firstcc
=
Str
::
snake
(
$firstcc
,
$delimiter
=
'_'
);
$routeuri_controler
=
$firstcc
;
if
(
isset
(
$controlerarr
[
1
])
&&
$controlerarr
[
1
]){
//下划线转驼峰(首字母小写)
$ss
=
Str
::
camel
(
$controlerarr
[
1
]);
$ss
=
Str
::
snake
(
$ss
,
$delimiter
=
'_'
);
$routeuri_controler
=
$controlerarr
[
0
]
.
'.'
.
$ss
;
}
// print_r($routeuri_controler);exit;
$this
->
routeUri
=
strtolower
(
$this
->
request
->
ADDON_APP
.
$routeuri_controler
.
"/"
.
$this
->
request
->
action
()
.
((
$action
=
$this
->
request
->
get
(
'action'
))
?
'/'
.
$action
:
''
));
// $this->routeUri = strtolower($this->request->ADDON_APP . $this->request->controller() . "/" . $this->request->action() . (($action = $this->request->get('action')) ? '/' . $action : ''));
//验证权限
$this
->
isPower
();
}
...
...
@@ -123,6 +142,7 @@ abstract class AdminBase extends BaseController
*/
private
function
isPower
()
{
if
(
$this
->
manUser
[
'userid'
]
>
1
&&
!
in_array
(
$this
->
routeUri
,
$this
->
manUser
[
'actions'
]))
{
$this
->
exitMsg
(
'抱歉,您没有该项权限请联系管理员!'
,
$this
->
request
->
isAjax
()
?
401
:
400
);
}
...
...
@@ -167,5 +187,4 @@ abstract class AdminBase extends BaseController
}
}
\ No newline at end of file
app/admin/view/article_category/index.html
View file @
f3a6524f
...
...
@@ -45,7 +45,8 @@
cols
:
[[
{
field
:
'id'
,
width
:
50
,
unresize
:
true
,
align
:
'center'
,
title
:
'ID'
},
{
field
:
'thumb'
,
width
:
80
,
height
:
80
,
align
:
'center'
,
title
:
'缩略图'
,
templet
:
'<div class="files_itemw"><img src="{{d.thumbpath}}" lay-event="article-event-image" /></div>'
},
// {field:'thumb',width:80,height:80,align:'center',title:'缩略图',templet:'
<
div
class
=
"files_itemw"
><
img
src
=
"{{d.thumbpath}}"
lay
-
event
=
"article-event-image"
/><
/div>'}
,
{
field
:
'thumbpath'
,
width
:
50
,
align
:
'center'
,
title
:
'缩略图'
,
templet
:
function
(
d
){
return
'<div><div class="files_itemw"><img src="'
+
(
d
.
thumbpath
?
d
.
thumbpath
:
''
)
+
'" lay-event="article-event-image" /></div></div>'
;}},
{
field
:
'title'
,
align
:
'left'
,
title
:
'分类'
,},
{
field
:
'typetxt'
,
width
:
100
,
align
:
'center'
,
title
:
'类型'
},
{
field
:
'sort'
,
width
:
100
,
align
:
'center'
,
title
:
'排序'
,
edit
:
'text'
},
...
...
app/admin/view/cert/cert_category/index.html
View file @
f3a6524f
...
...
@@ -54,7 +54,8 @@
cols
:
[[
{
field
:
'id'
,
width
:
50
,
align
:
'center'
,
title
:
'ID'
},
{
field
:
'title'
,
align
:
'left'
,
title
:
'分类'
,
edit
:
'text'
},
{
field
:
'thumb'
,
width
:
50
,
align
:
'center'
,
title
:
'缩略图'
,
templet
:
'<div><div class="files_itemw1"><img src="{{d.thumbpath}}" lay-event="article-event-image" /></div></div>'
},
// {field:'thumb',width:50,align:'center',title:'缩略图',templet:'
<
div
><
div
class
=
"files_itemw1"
><
img
src
=
"{{d.thumbpath}}"
lay
-
event
=
"article-event-image"
/><
/div></
div
>
'},
{field:'
thumbpath
',width:50,align:'
center
',title:'
缩略图
',templet:function(d){return '
<
div
><
div
class
=
"files_itemw1"
><
img
src
=
"'+(d.thumbpath ? d.thumbpath : '')+'"
lay
-
event
=
"article-event-image"
/><
/div></
div
>
';}},
{field:'
sort
',width:50,align:'
center
',title:'
排序
',edit:'
text
'},
{fixed:'
right
',width:130,align:'
center
',toolbar:'
<
div
><
a
class
=
"layui-btn layui-btn-xs"
lay
-
event
=
"edit"
>
编辑
<
/a><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</
a
><
/div>',title:'操作'
}
]],
...
...
app/admin/view/cert/cert_order/detail.html
View file @
f3a6524f
...
...
@@ -79,7 +79,7 @@
{in name="data.fileext" value="jpg,png,jpeg"}
<img
src=
"{$data.fileurl}"
width=
"50"
height=
"50"
class=
"imgclick"
>
{else/}
<a
class=
"layui-btn layui-btn-xs"
href=
"/admin/c
ourse.course_work
/downloadfile?fileid={$data.fileid}"
target=
"_blank"
>
下载
</a>
<a
class=
"layui-btn layui-btn-xs"
href=
"/admin/c
ert.cert_order
/downloadfile?fileid={$data.fileid}"
target=
"_blank"
>
下载
</a>
{/in}
</td>
</tr>
...
...
app/admin/view/course/course_category/index.html
View file @
f3a6524f
...
...
@@ -54,7 +54,8 @@
cols
:
[[
{
field
:
'id'
,
width
:
50
,
align
:
'center'
,
title
:
'ID'
},
{
field
:
'title'
,
align
:
'left'
,
title
:
'分类'
,
edit
:
'text'
},
{
field
:
'thumb'
,
width
:
50
,
align
:
'center'
,
title
:
'缩略图'
,
templet
:
'<div><div class="files_itemw1"><img src="{{d.thumbpath}}" lay-event="article-event-image" /></div></div>'
},
{
field
:
'thumbpath'
,
width
:
50
,
align
:
'center'
,
title
:
'缩略图'
,
templet
:
function
(
d
){
return
'<div><div class="files_itemw1"><img src="'
+
(
d
.
thumbpath
?
d
.
thumbpath
:
''
)
+
'" lay-event="article-event-image" /></div></div>'
;}},
// {field:'thumb',width:50,align:'center',title:'缩略图',templet:'
<
div
><
div
class
=
"files_itemw1"
><
img
src
=
"{{d.thumbpath}}"
lay
-
event
=
"article-event-image"
/><
/div></
div
>
'},
{field:'
sort
',width:50,align:'
center
',title:'
排序
',edit:'
text
'},
{field:"is_tj",width:80,align:'
center
',title:"是否推荐",templet:function(d){return '
<
input
type
=
"checkbox"
name
=
"is_tj"
lay
-
skin
=
"switch"
lay
-
text
=
"是|否"
lay
-
filter
=
"is_tj-chang"
value
=
"'+d.is_tj+'"
data
-
json
=
"'+encodeURIComponent(JSON.stringify(d))+'"
'+(d.is_tj==1 ? '
checked
' : '')+'
>
';},unresize:true,},
{fixed:'
right
',width:130,align:'
center
',toolbar:'
<
div
><
a
class
=
"layui-btn layui-btn-xs"
lay
-
event
=
"edit"
>
编辑
<
/a><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</
a
><
/div>',title:'操作'
}
...
...
app/admin/view/project/project/detail.html
View file @
f3a6524f
...
...
@@ -75,7 +75,7 @@
{in name="data.fileext" value="jpg,png,jpeg"}
<img
src=
"{$data.fileurl}"
width=
"50"
height=
"50"
class=
"imgclick"
>
{else/}
<a
class=
"layui-btn layui-btn-xs"
href=
"/admin/
course.course_work
/downloadfile?fileid={$data.fileid}"
target=
"_blank"
>
下载
</a>
<a
class=
"layui-btn layui-btn-xs"
href=
"/admin/
project.project
/downloadfile?fileid={$data.fileid}"
target=
"_blank"
>
下载
</a>
{/in}
</td>
</tr>
...
...
app/admin/view/project/project_category/index.html
View file @
f3a6524f
...
...
@@ -54,7 +54,7 @@
cols
:
[[
{
field
:
'id'
,
width
:
50
,
align
:
'center'
,
title
:
'ID'
},
{
field
:
'title'
,
align
:
'left'
,
title
:
'分类'
,
edit
:
'text'
},
{
field
:
'thumb
'
,
width
:
50
,
align
:
'center'
,
title
:
'缩略图'
,
templet
:
'<div><div class="files_itemw1"><img src="{{d.thumbpath}}" lay-event="article-event-image" /></div></div>'
},
{
field
:
'thumb
path'
,
width
:
50
,
align
:
'center'
,
title
:
'缩略图'
,
templet
:
function
(
d
){
return
'<div><div class="files_itemw1"><img src="'
+
(
d
.
thumbpath
?
d
.
thumbpath
:
''
)
+
'" lay-event="article-event-image" /></div></div>'
;}
},
{
field
:
'sort'
,
width
:
50
,
align
:
'center'
,
title
:
'排序'
,
edit
:
'text'
},
{
field
:
"is_tj"
,
width
:
80
,
align
:
'center'
,
title
:
"是否推荐"
,
templet
:
function
(
d
){
return
'<input type="checkbox" name="is_tj" lay-skin="switch" lay-text="是|否" lay-filter="is_tj-chang" value="'
+
d
.
is_tj
+
'" data-json="'
+
encodeURIComponent
(
JSON
.
stringify
(
d
))
+
'"'
+
(
d
.
is_tj
==
1
?
' checked'
:
''
)
+
'>'
;},
unresize
:
true
,},
{
fixed
:
'right'
,
width
:
130
,
align
:
'center'
,
toolbar
:
'<div><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a></div>'
,
title
:
'操作'
}
...
...
app/admin/view/users/business/index.html
View file @
f3a6524f
...
...
@@ -192,7 +192,7 @@
function
shajax
(
id
,
shstatus
,
errordesc
=
''
){
$
.
ajax
({
method
:
"post"
,
url
:
layui
.
cache
.
maps
+
'
/
users.business/shenhebusiness'
,
url
:
layui
.
cache
.
maps
+
'users.business/shenhebusiness'
,
data
:
{
id
:
id
,
shstatus
:
shstatus
,
errordesc
:
errordesc
},
dataType
:
"json"
,
success
:
function
(
res
){
...
...
app/admin/view/users/school/index.html
View file @
f3a6524f
...
...
@@ -195,7 +195,7 @@
function
shajax
(
id
,
shstatus
,
errordesc
=
''
){
$
.
ajax
({
method
:
"post"
,
url
:
layui
.
cache
.
maps
+
'
/
users.school/shenheschool'
,
url
:
layui
.
cache
.
maps
+
'users.school/shenheschool'
,
data
:
{
id
:
id
,
shstatus
:
shstatus
,
errordesc
:
errordesc
},
dataType
:
"json"
,
success
:
function
(
res
){
...
...
app/api/controller/User.php
View file @
f3a6524f
...
...
@@ -10,6 +10,7 @@ use app\BaseController;
use
app\Request
;
use
app\model\project\User
as
userModel
;
use
think\exception\ValidateException
;
use
think\facade\Cache
;
class
User
extends
BaseController
{
...
...
@@ -49,7 +50,7 @@ class User extends BaseController
public
function
register
(
Request
$request
)
{
$vo
=
(
new
UserValidate
())
->
goCheck
([
'name'
,
'mobile'
,
'password'
,
'code'
,
'role'
,
'password2'
]);
$vo
=
(
new
UserValidate
())
->
goCheck
([
'name'
,
'mobile'
,
'password'
,
'code'
,
'role'
,
'password2'
]);
if
(
$vo
!==
true
)
{
return
$vo
;
}
...
...
@@ -67,7 +68,13 @@ class User extends BaseController
return
$this
->
returnMsg
(
'验证码错误'
);
}
}
if
(
isset
(
$data
[
'cachekey'
])
&&
!
empty
(
$data
[
'cachekey'
]))
{
$cachekey
=
$data
[
'cachekey'
];
$openid
=
Cache
::
get
(
$cachekey
.
'_wxopenid'
);
if
(
$openid
){
$user
[
'wx_openid'
]
=
$openid
;
}
}
$user
[
'username'
]
=
$data
[
'name'
];
$user
[
'mobile'
]
=
$data
[
'mobile'
];
...
...
@@ -87,10 +94,45 @@ class User extends BaseController
return
$this
->
returnMsg
(
'注册成功'
,
1
);
}
//微信登录成功绑定手机号
//微信登录成功绑定
已有
手机号
public
function
bindmobile
(
Request
$request
)
{
$vo
=
(
new
UserValidate
())
->
goCheck
([
'user_id'
,
'name'
,
'mobile'
,
'password'
,
'code'
,
'password2'
]);
$vo
=
(
new
UserValidate
())
->
goCheck
([
'cachekey'
,
'mobile'
,
'code'
]);
if
(
$vo
!==
true
)
{
return
$vo
;
}
$data
=
$request
->
param
();
$user
=
userModel
::
where
([
'mobile'
=>
$data
[
'mobile'
]])
->
where
(
'is_del'
,
0
)
->
find
();
if
(
empty
(
$user
))
{
return
$this
->
returnMsg
(
'手机号未注册'
);
}
$checkSmsCode
=
UtilService
::
checkSmsCode
(
$data
[
'mobile'
],
$data
[
'code'
]);
if
(
!
$checkSmsCode
)
{
// return $this->returnMsg('验证码错误');
}
$cachekey
=
$data
[
'cachekey'
];
$openid
=
Cache
::
get
(
$cachekey
.
'_wxopenid'
);
if
(
empty
(
$openid
))
{
return
$this
->
returnMsg
(
'微信登录生效请重新扫码登录'
);
}
//绑定微信openid
userModel
::
where
(
'id'
,
$user
[
'id'
])
->
save
([
'wx_openid'
=>
$openid
]);
$user
[
'wx_openid'
]
=
$openid
;
//登录
$token
=
TokenService
::
generateToken
(
$user
[
'id'
],
$user
->
toArray
());
$update
[
'token'
]
=
$token
;
$update
[
'last_login_time'
]
=
time
();
userModel
::
where
([
'id'
=>
$user
[
'id'
]])
->
update
(
$update
);
return
$this
->
returnMsg
(
'操作成功'
,
1
,
[
'token'
=>
$token
,
'expires_in'
=>
TokenService
::
EXPIRE
]);
}
//微信登录后新建账号 不用了
public
function
bindregister
(
Request
$request
)
{
$vo
=
(
new
UserValidate
())
->
goCheck
([
'cachekey'
,
'name'
,
'mobile'
,
'password'
,
'code'
,
'password2'
,
'role'
]);
if
(
$vo
!==
true
)
{
return
$vo
;
}
...
...
@@ -101,20 +143,40 @@ class User extends BaseController
}
$checkSmsCode
=
UtilService
::
checkSmsCode
(
$data
[
'mobile'
],
$data
[
'code'
]);
if
(
!
$checkSmsCode
)
{
//
return $this->returnMsg('验证码错误');
return
$this
->
returnMsg
(
'验证码错误'
);
}
$cachekey
=
$data
[
'cachekey'
];
$openid
=
Cache
::
get
(
$cachekey
.
'_wxopenid'
);
if
(
empty
(
$openid
))
{
return
$this
->
returnMsg
(
'微信登录生效请重新扫码登录'
);
}
$is_exit
=
userModel
::
where
([
'wx_openid'
=>
$openid
])
->
where
(
'is_del'
,
0
)
->
count
();
if
(
$is_exit
)
{
return
$this
->
returnMsg
(
'此微信已绑定其它账号'
);
}
//绑定用户信息
$user
[
'wx_openid'
]
=
$openid
;
$user
[
'username'
]
=
$data
[
'name'
];
$user
[
'mobile'
]
=
$data
[
'mobile'
];
$user
[
'salt'
]
=
random
(
4
);
$user
[
'reg_time'
]
=
time
();
$user
[
'create_time'
]
=
time
();
$user
[
'is_del'
]
=
0
;
$user
[
'password'
]
=
md5
(
$data
[
'password'
]
.
$user
[
'salt'
]);
$user
[
'last_login_time'
]
=
time
();
$token
=
TokenService
::
generateToken
(
$data
[
'user_id'
],
$user
);
$user
[
'token'
]
=
$token
;
userModel
::
where
(
'id'
,
$data
[
'user_id'
])
->
update
(
$user
);
$user
[
'role'
]
=
$data
[
'role'
]
??
1
;
$user
[
'headico'
]
=
vconfig
(
'default_user'
)
??
null
;
$user
=
userModel
::
create
(
$user
);
if
(
!
$user
)
{
return
$this
->
returnMsg
(
'注册失败'
,
0
);
}
//登录
$token
=
TokenService
::
generateToken
(
$user
->
id
,
$user
->
toArray
());
$update
[
'token'
]
=
$token
;
$update
[
'last_login_time'
]
=
time
();
userModel
::
where
([
'id'
=>
$user
->
id
])
->
update
(
$update
);
return
$this
->
returnMsg
(
'操作成功'
,
1
,
[
'token'
=>
$token
,
'expires_in'
=>
TokenService
::
EXPIRE
]);
}
...
...
app/api/controller/Wecaht.php
View file @
f3a6524f
...
...
@@ -38,15 +38,16 @@ class Wecaht extends BaseController
if
(
$cachekey
==
$array
[
'Ticket'
])
{
$openid
=
$array
[
'FromUserName'
];
Log
::
write
(
'扫描成功'
);
Cache
::
set
(
$EventKey
,
$openid
,
1000
);
$user
=
User
::
where
(
'wx_openid'
,
$openid
)
->
find
();
if
(
empty
(
$user
))
{
$user
[
'wx_openid'
]
=
$openid
;
$user
[
'is_del'
]
=
1
;
$user
[
'create_time'
]
=
time
();
$user
[
'headico'
]
=
vconfig
(
'default_user'
)
??
null
;
userModel
::
insert
(
$user
);
}
Cache
::
set
(
$EventKey
.
'_wxopenid'
,
$openid
,
3000
);
// $user = User::where('wx_openid', $openid)->find();
// if (empty($user)) {
// $user['wx_openid'] = $openid;
// $user['is_del'] = 1;
// $user['create_time'] = time();
// $user['headico'] = vconfig('default_user') ?? null;
// userModel::insert($user);
// }
}
}
...
...
@@ -105,10 +106,13 @@ class Wecaht extends BaseController
{
$param
=
$this
->
request
->
post
();
$cachekey
=
$param
[
'cachekey'
];
$openid
=
Cache
::
get
(
$cachekey
);
$openid
=
Cache
::
get
(
$cachekey
.
'_wxopenid'
);
if
(
empty
(
$openid
))
{
return
$this
->
returnMsg
(
"等待用户扫码关注"
,
1
);
}
$user
=
User
::
where
(
'wx_openid'
,
$openid
)
->
find
();
if
(
isset
(
$user
[
'id'
])
&&
empty
(
$user
[
'mobile'
]
))
{
$redata
=
[
'token'
=>
''
,
'expires_in'
=>
0
,
'user_id'
=>
$user
[
'id'
]
,
'is_mobile'
=>
0
];
if
(
empty
(
$user
))
{
$redata
=
[
'token'
=>
''
,
'expires_in'
=>
0
,
'user_id'
=>
0
,
'is_mobile'
=>
0
];
}
elseif
(
$user
)
{
if
(
$user
[
'status'
]
!=
1
)
{
return
$this
->
returnMsg
(
'账号禁止登录'
,
0
);
...
...
@@ -121,10 +125,8 @@ class Wecaht extends BaseController
$update
[
'last_login_time'
]
=
time
();
User
::
where
([
'id'
=>
$user
[
'id'
]])
->
update
(
$update
);
$redata
=
[
'token'
=>
$token
,
'expires_in'
=>
TokenService
::
EXPIRE
,
'user_id'
=>
$user
[
'id'
],
'is_mobile'
=>
1
];
}
else
{
return
$this
->
returnMsg
(
"登录失败,请重新扫码"
,
0
);
}
}
return
$this
->
returnMsg
(
"success"
,
1
,
$redata
);
}
...
...
app/api/controller/mine/User.php
View file @
f3a6524f
...
...
@@ -31,6 +31,7 @@ class User extends BaseController
public
function
getUserInfo
(
Request
$request
)
{
$vo
=
(
new
UserValidate
())
->
goCheck
([
'token'
]);
if
(
$vo
!==
true
)
{
return
$vo
;
...
...
@@ -38,9 +39,12 @@ class User extends BaseController
$data
=
$request
->
header
();
$user
=
UserService
::
getUserInfo
(
$data
[
'token'
]);
if
(
!
$user
)
{
return
$this
->
returnMsg
(
'token无效'
,
0
);
}
$info_status
=
''
;
if
(
$user
[
'role'
]
==
2
)
{
$info_status
=
Db
::
name
(
'business'
)
->
where
(
'user_id'
,
$user
[
'id'
])
->
value
(
'status'
);
...
...
app/api/validate/UserValidate.php
View file @
f3a6524f
...
...
@@ -27,9 +27,11 @@ class UserValidate extends BaseValidate
'reset_token'
=>
'require'
,
'role'
=>
'require'
,
'user_id'
=>
'require'
,
'cachekey'
=>
'require'
,
];
protected
$message
=
[
'cachekey.require'
=>
'微信登录唯一标识不能为空'
,
'user_id.require'
=>
'用户id不能为空'
,
'name.require'
=>
'名称必须'
,
'mobile.require'
=>
'手机号不能为空'
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment