初始代码

This commit is contained in:
lisong 2021-12-28 11:12:24 +08:00
commit 31943f4c53
4041 changed files with 645686 additions and 0 deletions

7
333.htaccess Executable file
View File

@ -0,0 +1,7 @@
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>

26
404.html Executable file
View File

@ -0,0 +1,26 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>404</title>
<style>
body{
background-color:#444;
font-size:14px;
}
h3{
font-size:60px;
color:#eee;
text-align:center;
padding-top:30px;
font-weight:normal;
}
</style>
</head>
<body>
<h3>404,您请求的文件不存在!</h3>
</body>
</html>

32
LICENSE.txt Executable file
View File

@ -0,0 +1,32 @@
ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
All rights reserved。
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
Apache Licence是著名的非盈利开源组织Apache采用的协议。
该协议和BSD类似,鼓励代码共享和尊重原作者的著作权,
允许代码修改,再作为开源或商业软件发布。需要满足
的条件:
1. 需要给代码的用户一份Apache Licence ;
2. 如果你修改了代码,需要在被修改的文件中说明;
3. 在延伸的代码中(修改和有源代码衍生的代码中)需要
带有原来代码中的协议,商标,专利声明和其他原来作者规
定需要包含的说明;
4. 如果再发布的产品中包含一个Notice文件,则在Notice文
件中需要带有本协议内容。你可以在Notice中增加自己的
许可,但不可以表现为对Apache Licence构成更改。
具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

45
README.md Executable file
View File

@ -0,0 +1,45 @@
## 功能一览
### 登录模块
- token验证
- 图形验证码
- 极验滑动验证
### 轮播模块
- 轮播管理
### 用户模块
- 用户管理
- 用户等级管理
### 新闻模块
- 文章管理
- 文章分类管理
- 标签管理
### 商城模块
- 品牌管理
- 商品管理
- 商品分类管理
- 订单管理
- 快递管理
- 收货地址管理
### 杂项演示
- 邮件发送
- 短信发送
- 二维码生成
### 微信模块
- 服务端验证
- 接收 & 回复用户消息
- 获取用户信息
- 发送模版消息
- 统一下单
- 更多...
### 人事管理
- 员工管理
- 部门管理
- 职位管理
### 系统管理
- 用户管理
- 角色管理
- 菜单管理
- 操作日志
- 个人资料
- 代码生成
3333333444

141
application/admin/common.php Executable file
View File

@ -0,0 +1,141 @@
<?php
const URL_CURRENT = 'url://current';
const URL_RELOAD = 'url://reload';
const URL_BACK = 'url://back';
use think\exception\HttpResponseException;
use think\Response;
use think\response\Redirect;
use app\common\model\MallImage;
use think\db;
if (!function_exists('success')) {
function success($msg = '操作成功', $url = URL_BACK, $data = '', $wait = 0, array $header = [])
{
result(1, $msg, $data, $url, $wait, $header);
}
}
if (!function_exists('error')) {
function error($msg = '操作失败', $url = URL_CURRENT, $data = '', $wait = 0, array $header = [])
{
result(0, $msg, $data, $url, $wait, $header);
}
}
if (!function_exists('result')) {
function result($code = 0, $msg = 'unknown', $data = '', $url = null, $wait = 3, array $header = [])
{
if (request()->isPost()) {
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : url($url);
$result = [
'code' => $code,
'msg' => $msg,
'data' => $data,
'url' => $url,
'wait' => $wait,
];
$response = Response::create($result, 'json')->header($header);
throw new HttpResponseException($response);
}
if ($url === null) {
$url = request()->server('HTTP_REFERER') ?? 'admin/index/index';
}
$response = new Redirect($url);
$response->code(302)->params($data)->with([$code ? 'success_message' : 'error_message' => $msg, 'url' => $url]);
throw new HttpResponseException($response);
}
}
if(!function_exists('goods_imgs_upload')){
/**
* 简单对称加密算法之解密
* @param String $union_id 指定id
* @param String $type 类型
* @param String $ori_img 原图
* @param String $thumb_img 缩略图
* @param String $ori_fm_img 原图封面
* @param String $thumb_img_f 缩略图封面
* @param String $goods_imgs 编辑时数据库中图片
* @date 20190906
* @return li
*/
//上传商品图片
function goods_imgs_upload($union_id,$type,$ori_img, $thumb_img,$ori_fm_img,$thumb_img_f,$goods_imgs=array())
{
$_goodsimgsModel= new MallImage();
//$tps = C('TMPL_PARSE_STRING');
$inequality_img=array();
if($ori_img){
$ori_img_ys=array();
if($goods_imgs){
foreach ($goods_imgs as $key=> $v){
$ori_img_ys[$v['id']]=$v['ori_image'];
$goods_imgs[$v['id']]=$v;
}
$inequality_img = array_diff($ori_img_ys,$ori_img);//前端踢掉的图片
}
foreach ($ori_img as $key=> $v){
if(in_array($v,$ori_img_ys,TRUE)){
if($v==$ori_fm_img && $thumb_img_f=$thumb_img[$key]){
$data3['is_cover']=1;
}else{
$data3['is_cover']=0;
}
$_goodsimgsModel->where(array('ori_image'=>$v))->update($data3);
continue;
}
$ori_img_url=trim($v);
if(!$ori_img_url){
$array = array(
'code' =>400,
'msg' =>'上传文件处理失败',
);
return $array;
}
$thumb_img_url=trim($thumb_img[$key]);
if(!$thumb_img_url){
$array = array(
'code' =>400,
'msg' =>'上传文件处理失败',
);
return $array;
}
$data1['ori_image']=$yu_url=$ori_img_url;
$data1['thumb_image']=$slt_url=$thumb_img_url;
if($v==$ori_fm_img && $thumb_img_f=$thumb_img[$key]){
$data1['is_cover']=1;
}else{
$data1['is_cover']=0;
}
$data1['type']=$type;
$data1['union_id']=$union_id;
$_goodsimgsModel::create($data1);
}
if($inequality_img){
foreach ($inequality_img as $key1=> $v1){
$mag=Db::table('mall_image')->where('id',$key1)->delete();
if($mag){
$ori_image_del=Env::get('root_path').'public'.$goods_imgs[$key1]['ori_image'];
if(file_exists($ori_image_del))
{
unlink($ori_image_del);
}
$thumb_image_del=Env::get('root_path').'public'.$goods_imgs[$key1]['thumb_image'];
if(file_exists($thumb_image_del))
{
unlink($thumb_image_del);
}
}
}
}
}
}
}

View File

@ -0,0 +1,53 @@
<?php
/**
* 会员账户流水记录表控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\AccountLog;
use app\common\validate\AccountLogValidate;
class AccountLogController extends Controller
{
//积分记录
public function integrallist(Request $request, AccountLog $model)
{
$SOURCE_TYPE=$model->SOURCE_TYPE;
$param = $request->param();
$where = [];
if(isset($param['source_type']) && $param['source_type']){
$source_type = $param['source_type'];
$where[] = ['source_type','in',$source_type];
}
if(isset($param['keyword']) && $param['keyword']){
$where[] = [$param['keyword_type'],'like','%'.$param['keyword'].'%'];
}
if (isset($param['start_time']) && $param['start_time'] && isset($param['end_time']) && $param['end_time']) {
$where[] = ['al.create_time', 'between', [strtotime($param['start_time']), strtotime($param['end_time'])]];
}
$model = $model
->alias('al')
->field('al.*,u.mobile,u.nickname,u.sn as user_sn,u.avatar')
->join('user u', 'u.id = al.user_id')
->where($where)
->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query'=>$request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
'source_type_list'=>$SOURCE_TYPE,
]);
return $this->fetch();
}
}

View File

@ -0,0 +1,53 @@
<?php
/**
* 后台操作日志控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use app\admin\model\AdminLog;
use app\admin\model\AdminUser;
use think\Request;
class AdminLogController extends Controller
{
public function index(Request $request, AdminLog $model)
{
$param = $request->param();
$data = $model->where(function ($query) use ($param) {
if (isset($param['create_time_range']) && !empty($param['create_time_range'])) {
$range = explode(' - ', $param['create_time_range']);
$query->whereTime('create_time', 'between', $range);
}
})
->scope('where', $param)
->paginate($this->admin['per_page'], false, ['query' => $request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
'admin_user_list' => AdminUser::all(),
]);
return $this->fetch();
}
//日志详情
public function view($id, AdminLog $model)
{
$data = $model::get($id);
$this->assign([
'data' => $data
]);
return $this->fetch();
}
}

View File

@ -0,0 +1,171 @@
<?php
/**
* 后台菜单控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use think\Request;
use app\admin\model\AdminMenu;
use app\admin\validate\AdminMenuValidate;
class AdminMenuController extends Controller
{
public function index(AdminMenu $model)
{
//查询所有菜单并以树的形式显示
$result = $model->order('sort_id asc, id asc')->column('*', 'id');
foreach ($result as $n => $r) {
$result[$n]['level'] = $this->getLevel($r['id'], $result);
$result[$n]['parent_id_node'] = $r['parent_id'] ? ' class="child-of-node-' . $r['parent_id'] . '"' : '';
$result[$n]['str_manage'] = '<a href="' . url('edit', ['id' => $r['id']]) . '" class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip"><i class="fa fa-pencil"></i></a> ';
$result[$n]['str_manage'] .= '<a class="btn btn-danger btn-xs AjaxButton" data-id="' . $r['id'] . '" data-url="del.html" data-confirm-title="删除确认" data-confirm-content=\'您确定要删除ID为 <span class="text-red"> ' . $r['id'] . ' </span> 的数据吗\' data-toggle="tooltip" title="删除"><i class="fa fa-trash"></i></a>';
$result[$n]['is_show'] = (int)$r['is_show'] === 1 ? '显示' : '隐藏';
$result[$n]['log_method'] = $r['log_method'];
}
$str = "<tr id='node-\$id' data-level='\$level' \$parent_id_node><td><input type='checkbox' onclick='checkThis(this)'
name='data-checkbox' data-id='\$id\' class='checkbox data-list-check' value='\$id' placeholder='选择/取消'>
</td><td>\$id</td><td>\$spacer\$name</td><td>\$url</td>
<td>\$parent_id</td><td><i class='fa \$icon'></i><span>(\$icon)</span></td>
<td>\$sort_id</td><td>\$is_show</td><td>\$log_method</td><td class='td-do'>\$str_manage</td></tr>";
$this->initTree($result);
$data = $this->getTree(0, $str);
$this->assign('data', $data);
return $this->fetch('index');
}
public function add(Request $request, AdminMenu $model, AdminMenuValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $model::create($param);
//如果
if (isset($param['is_more']) && $param['is_more'] == 1) {
$name = $param['more_name'];
$url = explode('/', $param['url']);
$str = '/';
$data = [
[
'parent_id' => $result->id,
'name' => '添加' . $name,
'url' => $url[0] . $str . $url[1] . $str . 'add',
'icon' => 'fa-plus',
'is_show' => 0,
'log_method' => 'POST',
],
[
'parent_id' => $result->id,
'name' => '修改' . $name,
'url' => $url[0] . $str . $url[1] . $str . 'edit',
'icon' => 'fa-pencil',
'is_show' => 0,
'log_method' => 'POST',
],
[
'parent_id' => $result->id,
'name' => '删除' . $name,
'url' => $url[0] . $str . $url[1] . $str . 'del',
'icon' => 'fa-trash',
'is_show' => 0,
'log_method' => 'POST',
]
];
$model->saveAll($data);
}
unset($url);
$url = URL_BACK;
if (isset($param['_create']) && $param['_create'] == 1) {
$url = URL_RELOAD;
}
return $result ? success('添加成功', $url) : error();
}
$parent_id = $request->param('parent_id') ?? 0;
$parents = $this->menu($parent_id);
$this->assign([
'parents' => $parents,
'log_method' => $model->logMethod
]);
return $this->fetch();
}
public function edit($id, Request $request, AdminMenu $model, AdminMenuValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $data->save($param);
return $result ? success() : error();
}
$parent_id = $data->parent_id;
$parents = $this->menu($parent_id);
$this->assign([
'data' => $data,
'parents' => $parents,
'log_method' => $model->logMethod,
]);
return $this->fetch('add');
}
public function del($id, Request $request, AdminMenu $model)
{
//判断是否有子菜单
$have_son = $model->whereIn('parent_id', $id)->find();
if ($have_son) {
return error('有子菜单不可删除!');
}
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
//菜单选择 select树形选择
protected function menu($selected = 1, $current_id = 0)
{
$result = AdminMenu::where('id', '<>', $current_id)->order('sort_id', 'asc')->order('id', 'asc')->column('id,parent_id,name,sort_id', 'id');
foreach ($result as $r) {
$r['selected'] = (int)$r['id'] === (int)$selected ? 'selected' : '';
}
$str = "<option value='\$id' \$selected >\$spacer \$name</option>";
$this->initTree($result);
return $this->getTree(0, $str, $selected);
}
}

View File

@ -0,0 +1,190 @@
<?php
/**
* 后台角色控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use app\admin\model\AdminMenu;
use app\admin\model\AdminRole;
use app\admin\validate\AdminRoleValidate;
use think\Request;
class AdminRoleController extends Controller
{
public function index(Request $request, AdminRole $model)
{
$param = $request->param();
$data = $model->scope('where', $param)
->paginate($this->admin['per_page'], false, ['query' => $request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, AdminRole $model, AdminRoleValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $model::create($param);
$url = URL_BACK;
if (isset($param['_create']) && $param['_create'] == 1) {
$url = URL_RELOAD;
}
return $result ? success('添加成功', $url) : error();
}
return $this->fetch();
}
//修改
public function edit($id, Request $request, AdminRole $model, AdminRoleValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $data->save($param);
return $result ? success() : error();
}
$this->assign([
'data' => $data
]);
return $this->fetch('add');
}
//删除
public function del($id, AdminRole $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
//角色授权
public function access($id, Request $request, AdminRole $model)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
if (!isset($param['url'])) {
return error('请至少选择一项权限');
}
if (!in_array(1, $param['url'])) {
return error('首页权限必选');
}
if (false !== $data->save($param)) {
return success();
}
return error();
}
$menu = AdminMenu::order('sort_id', 'asc')->order('id', 'asc')->column('*', 'id');
$html = $this->authorizeHtml($menu, $data->url);
$this->assign([
'data' => $data,
'html' => $html,
]);
return $this->fetch();
}
//启用
public function enable($id, AdminRole $model)
{
$result = $model->whereIn('id', $id)->update(['status' => 1]);
return $result ? success('操作成功', URL_RELOAD) : error();
}
//禁用
public function disable($id, AdminRole $model)
{
$result = $model->whereIn('id', $id)->update(['status' => 0]);
return $result ? success('操作成功', URL_RELOAD) : error();
}
//生成授权html
protected function authorizeHtml($menu, $auth_menus = [])
{
foreach ($menu as $n => $t) {
$menu[$n]['checked'] = in_array($t['id'], $auth_menus) ? ' checked' : '';
$menu[$n]['level'] = $this->getLevel($t['id'], $menu);
$menu[$n]['width'] = 100 - $menu[$n]['level'];
}
$this->initTree($menu);
$this->text = [
'other' => "<label class='checkbox' >
<input \$checked name='url[]' value='\$id' level='\$level'
onclick='javascript:checkNode(this);' type='checkbox'>
\$name
</label>",
'0' => [
'0' => "<dl class='checkmod'>
<dt class='hd'>
<label class='checkbox'>
<input \$checked name='url[]' value='\$id' level='\$level'
onclick='javascript:checkNode(this);'
type='checkbox'>
\$name
</label>
</dt>
<dd class='bd'>",
'1' => '</dd></dl>',
],
'1' => [
'0' => "
<div class='menu_parent'>
<label class='checkbox'>
<input \$checked name='url[]' value='\$id' level='\$level'
onclick='javascript:checkNode(this);' type='checkbox'>
\$name
</label>
</div>
<div class='rule_check' style='width: \$width%;'>",
'1' => "</div><span class='child_row'></span>",
]
];
return $this->getAuthTreeAccess(0);
}
}

View File

@ -0,0 +1,170 @@
<?php
/**
* 后台用户控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use app\common\model\Attachment;
use think\Request;
use app\admin\model\AdminRole;
use app\admin\model\AdminUser;
use app\admin\validate\AdminUserValidate;
class AdminUserController extends Controller
{
//列表
public function index(Request $request, AdminUser $model)
{
$param = $request->param();
$data = $model->scope('where', $param)
->paginate($this->admin['per_page'], false, ['query' => $request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, AdminUser $model, AdminUserValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $model::create($param);
$url = URL_BACK;
if (isset($param['_create']) && $param['_create'] == 1) {
$url = URL_RELOAD;
}
return $result ? success('添加成功', $url) : error();
}
$role = AdminRole::all(function ($query) {
$query->column('id,name', 'id');
});
$this->assign([
'role' => $role
]);
return $this->fetch();
}
//修改
public function edit($id, Request $request, AdminUser $model, AdminUserValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $data->save($param);
return $result ? success() : error();
}
$role = AdminRole::all(function ($query) {
$query->column('id,name', 'id');
});
$this->assign([
'data' => $data,
'role' => $role
]);
return $this->fetch('add');
}
//删除
public function del($id, AdminUser $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
//启用
public function enable($id, AdminUser $model)
{
$result = $model->whereIn('id', $id)->update(['status' => 1]);
return $result ? success('操作成功', URL_RELOAD) : error();
}
//禁用
public function disable($id, AdminUser $model)
{
$result = $model->whereIn('id', $id)->update(['status' => 0]);
return $result ? success('操作成功', URL_RELOAD) : error();
}
//个人资料
public function profile(Request $request, AdminUser $model, AdminUserValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
if ($param['update_type'] === 'password') {
$validate_result = $validate->scene('password')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
if (!password_verify($param['password'], $this->user->password)) {
return error('当前密码不正确');
}
$param['password'] = $param['new_password'];
} else if ($param['update_type'] === 'avatar') {
if (!$request->file('avatar')) {
return error('请上传新头像');
}
$attachment = new Attachment();
$file = $attachment->upload('avatar');
if ($file) {
$param['avatar'] = $file->url;
} else {
return error($attachment->getError());
}
}
if (false !== $this->user->save($param)) {
return success('修改成功', URL_RELOAD);
}
return error();
}
return $this->fetch();
}
}

View File

@ -0,0 +1,151 @@
<?php
/**
* 后台登录退出控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use Exception;
use think\captcha\Captcha;
use think\Request;
use app\admin\model\AdminUser;
use app\admin\validate\AdminUserValidate;
use tools\GeeTest;
class AuthController extends Controller
{
protected $authExcept = [
'admin/auth/login',
'admin/auth/logout',
'admin/auth/captcha',
'admin/auth/initgeetest',
];
//登录
public function login(Request $request, AdminUser $model, AdminUserValidate $validate)
{
if ($request->isPost()) {
$login_config = config('admin.login');
$param = $request->param();
//如果需要验证码
if ($login_config['captcha'] > 0) {
if ($login_config['captcha'] == 1) {
if (!captcha_check($param['captcha'])) {
return error('验证码错误');
}
} else if ($login_config['captcha'] == 2) {
$config = config('geetest.');
$geeTest = new GeeTest($config['id'], $config['key']);
$data = array(
'user_id' => session('gt_uid'),
'client_type' => 'web',
'ip_address' => $request->ip(),
);
if (session('gt_server') == 1) {
$gee_test_result = $geeTest->successValidate($param['geetest_challenge'], $param['geetest_validate'], $param['geetest_seccode'], $data);
if (!$gee_test_result) {
return error('验证失败');
}
} else {
if (!$geeTest->failValidate($param['geetest_challenge'], $param['geetest_validate'])) {
return error('验证失败');
}
}
}
}
$validate_result = $validate->scene('login')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
//如果需要验证登录token
if ($login_config['token']) {
$token_validate = \think\Validate::make();
$token_validate_result = $token_validate->rule('__token__', 'token')
->check($param);
if (!$token_validate_result) {
return error($token_validate->getError());
}
}
try {
$user = $model::login($param);
} catch (Exception $e) {
return error($e->getMessage());
}
$remember = isset($param['remember']) ? true : false;
self::authLogin($user, $remember);
$redirect = session('redirect') ?? url('admin/index/index');
return success('登录成功', $redirect);
}
$this->admin['title'] = '登录';
$this->assign([
//登录设置,参考/config/admin/admin.php文件配置
'login_config' => config('admin.login'),
]);
return $this->fetch();
}
//退出
public function logout()
{
self::authLogout();
return redirect(url('admin/auth/login'));
}
//极验初始化
public function initGeeTest(Request $request)
{
$config = config('geetest.');
$geeTest = new GeeTest($config['id'], $config['key']);
$ip = $request->ip();
$ug = $request->header('user-agent');
$data = array(
'gt_uid' => md5($ip . $ug),
'client_type' => 'web',
'ip_address' => $ip,
);
$status = $geeTest->preProcess($data);
session('gt_server', $status);
session('gt_uid', $data['gt_uid']);
return success($status, URL_CURRENT, $geeTest->getResponse());
}
//ThinkPHP 图形验证码
public function captcha()
{
$config = [
// 验证码字体大小
'fontSize' => 30,
// 验证码位数
'length' => 4,
// 关闭验证码杂点
'useNoise' => false,
];
$captcha = new Captcha($config);
return $captcha->entry();
}
}

View File

@ -0,0 +1,438 @@
<?php
/**
* 寄卖订单控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\Goods;
use app\common\model\ConsignmentOrder;
use app\common\model\ConsignmentOrderGoods;
use app\common\model\ConsignmentOrderLog;
use app\common\model\Notice;
use app\common\model\MallImage;
use app\common\validate\OrderValidate;
use app\common\validate\ConsignmentOrderValidate;
class ConsignmentOrderController extends Controller
{
//列表
public function index(Request $request, ConsignmentOrder $model)
{
$param = $request->param();
$where = [];
//订单搜素
if (!empty($param['search_key']) && !empty($param['keyword'])) {
$keyword = $param['keyword'];
switch ($param['search_key']) {
case 'order_sn':
$where[] = ['o.order_sn', 'like', '%' . $keyword . '%'];
break;
case 'user_sn':
$where[] = ['u.sn', 'like', '%' . $keyword . '%'];
break;
case 'nickname':
$where[] = ['u.nickname', 'like', '%' . $keyword . '%'];
break;
case 'user_mobile':
$where[] = ['u.mobile', 'like', '%' . $keyword . '%'];
break;
}
}
//商品名称
if (isset($param['goods_name']) && $param['goods_name'] != '') {
$where[] = ['g.goods_name', 'like', '%' . $param['goods_name'] . '%'];
}
//订单类型
if (isset($param['order_type']) && $param['order_type'] != '') {
$where[] = ['o.order_status', '=', $param['order_type']];
}
//下单时间
if (isset($param['start_time']) && $param['start_time'] != '') {
$where[] = ['o.create_time', '>=', strtotime($param['start_time'])];
}
if (isset($param['end_time']) && $param['end_time'] != '') {
$where[] = ['o.create_time', '<=', strtotime($param['end_time'])];
}
$model = $model
->alias('o')
->field('o.*,u.mobile,u.nickname,u.sn,u.avatar')
->join('user u', 'u.id = o.user_id')
->join('consignment_order_goods g', 'g.order_id = o.id')
->with(['consignment_order_goods'])
->append(['delivery_address'])
->where($where)
->order('o.id desc')
->group('o.id')
->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query'=>$request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
/**
* Desc: 订单详情
*/
public function detail($id, Request $request, ConsignmentOrder $model, MallImage $mimodel)
{
$order = new ConsignmentOrder();
$data = $order
->with(['user', 'consignment_order_goods','logs'])
->where('id', $id)
->find();
foreach ($data['consignment_order_goods'] as &$consignment_order_goods){
$mi_list=$mimodel->where(array('union_id'=>$consignment_order_goods['id'],'type'=>2))->select();
$consignment_order_goods['img_list']=$mi_list;
}
$this->assign([
'detail' => $data,
]);
return $this->fetch();
}
/**
* Desc: 订单审核
*/
public function examine($id, Request $request, ConsignmentOrder $model, MallImage $mimodel)
{
$order = new ConsignmentOrder();
$data = $order
->with(['user', 'consignment_order_goods','logs'])
->where('id', $id)
->find();
foreach ($data['consignment_order_goods'] as &$consignment_order_goods){
$mi_list=$mimodel->where(array('union_id'=>$consignment_order_goods['id'],'type'=>2))->select();
$consignment_order_goods['img_list']=$mi_list;
}
$this->assign([
'detail' => $data,
]);
return $this->fetch();
}
/**
* Desc: 同意
*/
public function agree(Request $request)
{
if ($this->request->isAjax()) {
$param = $request->param();
// 启动事务
ConsignmentOrderGoods::startTrans();
try{
$order_goods = ConsignmentOrderGoods::get(['id' => $param['id']]);
$order_goods->refund_status = 1;
$order_goods->evaluation_price =$param['evaluation_price'];
$order_goods->save();
$goods_count=ConsignmentOrderGoods::where(array('order_id'=>$order_goods['order_id'],'refund_status'=>0))->count();
$quanbu=0;
if($goods_count==0){
$order = ConsignmentOrder::get(['id' =>$order_goods['order_id']]);
$order->order_status = 3;
$order->total_amount =$order['total_amount']+$param['evaluation_price'];
$order->update_time = time();
$order->save();
//记录日志
ConsignmentOrderLog::record(
$order['id'],
'平台已估价'
);
$data_info=[
'user_id' => $order['user_id'],
'jm_order_id' => $order['id'],
'scene' =>102,
'time' => date('Y-m-d H:i:s')
];
Notice::noticeByScene($order['user_id'],$data_info);
$quanbu=1;
}
// 提交事务
ConsignmentOrderGoods::commit();
}catch(\Exception $e){
// 回滚事务
ConsignmentOrderGoods::rollback();
return error($e->getMessage());
}
return success('操作成功','',$quanbu);
}
}
/**
* Desc: 拒绝
*/
public function refuse(Request $request, ConsignmentOrder $model)
{
if ($this->request->isAjax()) {
$param = $request->param();
// 启动事务
ConsignmentOrderGoods::startTrans();
try{
$order_goods = ConsignmentOrderGoods::get(['id' => $param['id']]);
$order_goods->refund_status = 2;
$order_goods->refund_remarks =$param['remark'];
$order_goods->save();
$goods_count=ConsignmentOrderGoods::where(array('order_id'=>$order_goods['order_id'],'refund_status'=>0))->count();
$quanbu=0;
if($goods_count==0){
$order = ConsignmentOrder::get(['id' =>$order_goods['order_id']]);
$order->order_status = 1;
$order->update_time = time();
$order->save();
//记录日志
ConsignmentOrderLog::record(
$order['id'],
'平台已估价'
);
$data_info=[
'user_id' => $order['user_id'],
'jm_order_id' => $order['id'],
'scene' =>102,
'time' => date('Y-m-d H:i:s')
];
Notice::noticeByScene($order['user_id'],$data_info);
$quanbu=1;
}
// 提交事务
ConsignmentOrderGoods::commit();
}catch(\Exception $e){
// 回滚事务
ConsignmentOrderGoods::rollback();
return error($e->getMessage());
}
return success('操作成功','',$quanbu);
}
}
/**
* Desc: 订单取货
*/
public function pickup($id, Request $request, ConsignmentOrder $model, MallImage $mimodel)
{
$order = new ConsignmentOrder();
$data = $order
->with(['user', 'consignment_order_goods','logs'])
->where('id', $id)
->find();
foreach ($data['consignment_order_goods'] as &$consignment_order_goods){
$mi_list=$mimodel->where(array('union_id'=>$consignment_order_goods['id'],'type'=>2))->select();
$consignment_order_goods['img_list']=$mi_list;
}
$this->assign([
'detail' => $data,
]);
return $this->fetch();
}
/**
* Desc: 取货操作
*/
public function pickuphandle(Request $request, ConsignmentOrder $model, OrderValidate $validate)
{
if ($request->isAjax()) {
$param = $request->param();
$validate_result = $validate->scene('hansle')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$order_id = $param['order_id'];
$order = ConsignmentOrder::get(['id' => $order_id]);
if ($order['order_status']!='4'){
return error('该订单状态下,无法进行取货操作');
}
// 启动事务
ConsignmentOrder::startTrans();
try{
//更新订单下商品的发货状态
$order->update_time = time();
$order->order_status = 5;
$order->save();
//记录日志
ConsignmentOrderLog::record(
$order['id'],
'平台安排取货',
'物流公司:'.$param['invoice_name'].',物流单号:'.$param['invoice_no']
);
$data_info=[
'user_id' => $order['user_id'],
'jm_order_id' => $order['id'],
'scene' =>103,
'shipping_name' => $param['invoice_name'],
'invoice_no' => $param['invoice_no'],
'time' => date('Y-m-d H:i:s')
];
Notice::noticeByScene($order['user_id'],$data_info);
// 提交事务
ConsignmentOrder::commit();
}catch(\Exception $e){
// 回滚事务
ConsignmentOrder::rollback();
return error($e->getMessage());
}
return success('操作成功');
}
}
/**
* Desc: 订单商品退回
*/
public function return($id, Request $request, ConsignmentOrder $model, MallImage $mimodel)
{
$order = new ConsignmentOrder();
$data = $order
->with(['user', 'consignment_order_goods','logs'])
->where('id', $id)
->find();
foreach ($data['consignment_order_goods'] as &$consignment_order_goods){
$mi_list=$mimodel->where(array('union_id'=>$consignment_order_goods['id'],'type'=>2))->select();
$consignment_order_goods['img_list']=$mi_list;
}
$this->assign([
'detail' => $data,
]);
return $this->fetch();
}
/**
* Desc: 退回操作
*/
public function returnhandle(Request $request)
{
if ($this->request->isAjax()) {
$param = $request->param();
// 启动事务
ConsignmentOrderGoods::startTrans();
try{
$order_goods = ConsignmentOrderGoods::get(['id' => $param['id']]);
$order_goods->refund_status = 3;
$order_goods->refund_remarks ='物流公司:'.$param['invoice_name'].',物流单号:'.$param['invoice_no'];
$order_goods->save();
$goods_count=ConsignmentOrderGoods::where(array('order_id'=>$order_goods['order_id'],'refund_status'=>1))->count();
$order = ConsignmentOrder::get(['id' =>$order_goods['order_id']]);
$order->order_status = 6;
$quanbu=0;
if($goods_count==0){
$quanbu=1;
$order->order_status = 7;
}
$order->total_amount =$order['total_amount']-$order_goods['evaluation_price'];
$order->update_time = time();
$order->save();
//记录日志
ConsignmentOrderLog::record(
$order['id'],
'平台退回商品',
'商品名称:'.$order_goods['goods_name'].',物流公司:'.$param['invoice_name'].',物流单号:'.$param['invoice_no']
);
$data_info=[
'user_id' => $order['user_id'],
'jm_order_id' => $order['id'],
'scene' =>104,
'shipping_name' => $param['invoice_name'],
'invoice_no' => $param['invoice_no'],
'time' => date('Y-m-d H:i:s')
];
Notice::noticeByScene($order['user_id'],$data_info);
// 提交事务
ConsignmentOrderGoods::commit();
}catch(\Exception $e){
// 回滚事务
ConsignmentOrderGoods::rollback();
return error($e->getMessage());
}
return success('操作成功','',$quanbu);
}
}
/**
* Desc: 订单商品上架
*/
public function shelves($id, Request $request, ConsignmentOrder $model, MallImage $mimodel)
{
$order = new ConsignmentOrder();
$data = $order
->with(['user', 'consignment_order_goods','logs'])
->where('id', $id)
->find();
foreach ($data['consignment_order_goods'] as &$consignment_order_goods){
$mi_list=$mimodel->where(array('union_id'=>$consignment_order_goods['id'],'type'=>2))->select();
$consignment_order_goods['img_list']=$mi_list;
}
$this->assign([
'detail' => $data,
]);
return $this->fetch();
}
/**
* Desc: 上架操作
*/
public function shelveshandle(Request $request)
{
if ($this->request->isAjax()) {
$param = $request->param();
$order_goods = ConsignmentOrderGoods::get(['id' => $param['id']]);
$goods = Goods::get(['code' =>$param['goods_sn']]);
if(!$goods){
return error('该商品未上架,无法找到给商品信息');
}
$goods_l_count=ConsignmentOrderGoods::where(array('goods_id'=>$goods['id']))->count();
if($goods_l_count>0){
return error('该商品已上架,无需重复上架该商品');
}
// 启动事务
ConsignmentOrderGoods::startTrans();
try{
$order_goods->refund_status = 4;
$order_goods->goods_id =$goods['id'];
$order_goods->save();
$goods_count=ConsignmentOrderGoods::where(array('order_id'=>$order_goods['order_id'],'refund_status'=>1))->count();
$order = ConsignmentOrder::get(['id' =>$order_goods['order_id']]);
$quanbu=0;
if($goods_count==0){
$quanbu=1;
$order->order_status = 2;
$order->update_time = time();
$order->save();
}
//记录日志
ConsignmentOrderLog::record(
$order['id'],
'平台上架商品',
'商品名称:'.$order_goods['goods_name']
);
$data_info=[
'user_id' => $order['user_id'],
'jm_order_id' => $order['id'],
'scene' =>105,
'time' => date('Y-m-d H:i:s')
];
Notice::noticeByScene($order['user_id'],$data_info);
// 提交事务
ConsignmentOrderGoods::commit();
}catch(\Exception $e){
// 回滚事务
ConsignmentOrderGoods::rollback();
return error($e->getMessage());
}
return success('操作成功','',$quanbu);
}
}
}

View File

@ -0,0 +1,147 @@
<?php
/**
* 后台基础控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use app\admin\model\AdminMenu;
use app\admin\model\AdminUser;
use app\admin\traits\{AdminAuth, AdminTree, PhpOffice};
class Controller extends \think\Controller
{
use AdminAuth, AdminTree, PhpOffice;
/**
* 当前url
* @var string
*/
protected $url;
/**
* 当前用户ID
* @var int
*/
protected $uid = 0;
/**
* 当前用户
* @var AdminUser
*/
protected $user;
/**
* 后台变量
* @var array
*/
protected $admin;
/**
* 无需验证权限的url
* @var array
*/
protected $authExcept = [
'admin/auth/login',
'admin/auth/logout',
'admin/editor/server',
];
//初始化基础控制器
protected function initialize()
{
$request = $this->request;
//获取当前访问url
$this->url = parse_name($request->module()) . '/' .
parse_name($request->controller()) . '/' .
parse_name($request->action());
//验证权限
if (!in_array($this->url, $this->authExcept)) {
if (!$this->isLogin()) {
error('未登录', 'auth/login');
} else if ($this->user->id !== 1 && !$this->authCheck($this->user)) {
error('无权限', $this->request->isGet() ? null : URL_CURRENT);
}
}
if ((int)$request->param('check_auth') === 1) {
success();
}
//记录日志
$menu = AdminMenu::get(['url' => $this->url]);
if ($menu) {
$this->admin['title'] = $menu->name;
if ($menu->log_method === $request->method()) {
$this->createAdminLog($this->user, $menu);
}
}
$this->admin['per_page'] = cookie('admin_per_page') ?? 10;
$this->admin['per_page'] = $this->admin['per_page'] < 100 ? $this->admin['per_page'] : 100;
}
//重写fetch
protected function fetch($template = '', $vars = [], $config = [])
{
$this->admin['pjax'] = $this->request->isPjax();
$this->admin['user'] = $this->user;
$this->setAdminInfo();
if (!$this->admin['pjax'] && 'admin/auth/login' !== $this->url) {
$this->admin['menu'] = $this->getLeftMenu($this->user);
}
$this->assign('debug', config('app.app_debug') ? 'true' : 'false');
$this->assign('cookie_prefix', config('cookie.prefix') ?? '');
$this->assign('admin', $this->admin);
return parent::fetch($template, $vars, $config);
}
//空方法
public function _empty()
{
$this->admin['title'] = '404';
return $this->fetch('template/404');
}
//设置前台显示的后台信息
protected function setAdminInfo()
{
if (!$this->admin['pjax']) {
$admin_info = [
'name' => config('admin.name'),
'author' => config('admin.author'),
'version' => config('admin.version'),
'short_name' => config('admin.short_name'),
];
cache('admin_info', json_encode($admin_info), 8640000);
} else {
$admin_info = cache('admin_info');
if (!$admin_info) {
$admin_info = [
'name' => config('admin.name'),
'author' => config('admin.author'),
'version' => config('admin.version'),
'short_name' => config('admin.short_name'),
];
} else {
$admin_info = json_decode($admin_info, true);
}
}
$this->admin = array_merge($this->admin, $admin_info);
}
}

View File

@ -0,0 +1,17 @@
<?php
/**
* 访问空控制器,用于访问不存在的控制器跳转
* @author yupoxiong <i@yufuping.com>
*/
namespace app\admin\controller;
class ErrorController extends Controller
{
public function index()
{
$this->admin['title'] = '404';
return $this->fetch('template/404');
}
}

View File

@ -0,0 +1,54 @@
<?php
/**
* 文件控制器(暂未完成)
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use think\facade\Env;
use think\Request;
class FileController extends Controller
{
protected $authExcept = [
'admin/file/icon',
];
//文件列表
public function index(Request $request)
{
}
//文件上传
public function upload()
{
$file = request()->file('file');
}
//上传图片修改
public function icon(Request $request)
{
$param = $request->param();
$file = request()->file('image');
if($file){
$info = $file->validate(['size'=>10*1024*1024,'ext'=>'jpg,png,gif'])->move(Env::get('root_path').'public/uploads/attachment');
if($info){
$data['avatar_logo_thum']='';
$data['avatar_logo']='';
if($param['type']==1){
$width=$param['width'] ?? '200';
$heigh=$param['heigh'] ?? '200';
$avatar_thum=thumbnail_img($info,$width,$heigh,'attachment');
$data['avatar_logo_thum']=$avatar_thum;
}
$data['avatar_logo']='/uploads/attachment/'.$info->getSaveName();
return success('上传成功','',$data);
}else{
// 上传失败获取错误信息
return client_error($file->getError());
}
}else{
return client_error('请上传图片');
}
}
}

View File

@ -0,0 +1,24 @@
<?php
/**
* 后台首页控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use app\admin\model\AdminLog;
use app\admin\model\AdminMenu;
use app\admin\model\AdminRole;
use app\admin\model\AdminUser;
use tools\SystemInfo;
use think\Request;
class FinanceController extends Controller
{
public function lists(Request $request)
{
return $this->fetch();
}
}

View File

@ -0,0 +1,293 @@
<?php
/**
* 代码自动生成控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use app\admin\model\AdminMenu;
use Error;
use Exception;
use generate\field\Ip;
use generate\field\Map;
use generate\field\Province;
use generate\field\Url;
use generate\field\File;
use generate\field\Icon;
use generate\field\Year;
use generate\field\Text;
use generate\field\Date;
use generate\field\Color;
use generate\field\Email;
use generate\field\Field;
use generate\field\Radio;
use generate\field\Image;
use generate\field\Select;
use generate\field\Mobile;
use generate\field\IdCard;
use generate\field\Number;
use generate\field\Editor;
use generate\field\Datetime;
use generate\field\Checkbox;
use generate\field\Password;
use generate\field\Textarea;
use generate\field\YearMonth;
use generate\field\YearRange;
use generate\field\MultiFile;
use generate\field\DateRange;
use generate\field\MultiImage;
use generate\field\SwitchField;
use generate\field\MultiSelect;
use generate\field\DatetimeRange;
use generate\field\YearMonthRange;
use think\Db;
use think\db\Connection;
use think\Request;
use generate\Generate;
class GenerateController extends Controller
{
//首页
public function index()
{
return $this->fetch();
}
//自动生成页面
public function add()
{
$this->assign([
'table' => (new Generate())->getTable(),
'menus' => $this->menu(10000),
]);
return $this->fetch();
}
//获取表数据
public function getTable()
{
return success('success', URL_CURRENT, (new Generate())->getTable());
}
public function getMenu()
{
return success('success', URL_CURRENT, (new Generate())->getMenu());
}
//自动生成代码接口
public function create(Request $request)
{
$param = $request->param();
$data = [
'table' => $param['table_name'],
'cn_name' => $param['cn_name'],
'menu' => [
//创建菜单-1为不创建,0为顶级菜单
'create' => $param['create_menu'],
'menu' => $param['create_menu_list']
],
'controller' => [
'module' => 'admin',
'create' => $param['create_controller'] ?? 0,
'name' => $param['controller_name'],
'action' => $param['controller_action_list'],
],
'model' => [
'module' => 'common',
'create' => $param['create_model'] ?? 0,
'name' => $param['model_name'],
'timestamp' => $param['auto_timestamp'] ?? 0,
'soft_delete' => $param['soft_delete'] ?? 0,
],
'validate' => [
'module' => 'common',
'create' => $param['create_validate'] ?? 0,
'name' => $param['validate_name'],
],
'view' => [
'enable' => $param['list_enable'] ?? 0,
'delete' => $param['list_delete'] ?? 0,
'create' => $param['list_create'] ?? 0,
'export' => $param['list_export'] ?? 0,
],
];
/**
* 字段数据组装
*/
$field_data = [];
foreach ($param['field_name'] as $key => $value) {
$field_data[] = [
//字段名
'field_name' => $param['field_name'][$key][0],
//字段类型
'field_type' => $param['field_type'][$key][0],
//表单名称/中文名称
'form_name' => $param['form_name'][$key][0] ?? '',
//是否为列表字段
'is_list' => $param['is_list'][$key][0] ?? 0,
//是否为列表搜索字段
'is_search' => $param['is_search'][$key][0] ?? 0,
//是否为表单字段
'is_form' => $param['is_form'][$key][0] ?? 0,
//表单类型
'form_type' => $param['form_type'][$key][0] ?? 0,
//验证规则
'form_validate' => $param['form_validate'][$key] ?? 0,
//默认值
'field_default' => $param['field_default'][$key][0] ?? 0,
//获取器/修改器
'getter_setter' => $param['getter_setter'][$key][0] ?? 0,
//是否参与列表排序
'list_sort' => $param['list_sort'][$key][0] ?? 0,
//验证场景
'field_scene' => $param['field_scene'][$key] ?? 0,
//关联
'is_relation' => $param['is_relation'][$key][0] ?? 0,
//关联类型
'relation_type' => $param['relation_type'][$key][0] ?? 1,
//关联表
'relation_table' => $param['relation_table'][$key][0] ?? '',
//关联显示字段
'relation_show' => $param['relation_show'][$key][0] ?? 'name',
];
}
$data['data'] = $field_data;
//已经组装好data,先生成表,再生成模型,验证器,控制器,视图
$generate = new Generate($data);
$msg = '生成成功';
$result = false;
try {
$generate->run();
$result = true;
} catch (Exception $e) {
$msg = $e->getMessage();
}
return $result ? success($msg, URL_CURRENT) : error($msg);
}
//自动生成form表单字段
public function form()
{
return $this->fetch();
}
//生成表单字段html接口
public function formField(Request $request)
{
$param = $request->param();
if (empty($param['form_name']) || empty($param['field_name']) || empty($param['form_type'])) {
return error('信息不完整');
}
$result = false;
try {
if ($param['form_type'] === 'switch') {
$param['form_type'] = 'switch_field';
}
$param['field_default'] = '';
$class_name = parse_name($param['form_type'], 1);
$class = '\\generate\\field\\' . $class_name;
$data = $class::create($param);
$result = true;
$msg = '生成表单html成功';
} catch (Exception $exception) {
$msg = $exception->getMessage();
} catch (Error $error) {
$msg = $error->getMessage();
}
return $result ? success($msg, URL_CURRENT, $data) : error($msg);
}
//根据字段返回相关表单类型和验证
public function getField(Request $request)
{
$param = $request->param();
$name = $param['name'];
$data = (new Generate())->getAll($name);
return success('success', URL_CURRENT, $data);
}
//获取验证select内容
/**
* @param Request $request
* @return \think\response\Json|void
*/
public function getValidateSelect(Request $request)
{
$param = $request->param();
$result = false;
try {
if ($param['form_type'] === 'switch') {
$param['form_type'] = 'switch_field';
}
$class_name = parse_name($param['form_type'], 1);
$class = '\\generate\\field\\' . $class_name;
$data = $class::rule();
$result = true;
$msg = '获取字段验证规则成功';
} catch (Exception $exception) {
$msg = $exception->getMessage();
} catch (Error $error) {
$msg = $error->getMessage();
}
return $result ? success($msg, URL_CURRENT, $data) : error($msg);
}
//菜单选择
protected function menu($selected = 1, $current_id = 0)
{
$result = AdminMenu::where('id', '<>', $current_id)->order('sort_id', 'asc')->order('id', 'asc')->column('id,parent_id,name,sort_id', 'id');
foreach ($result as $r) {
$r['selected'] = (int)$r['id'] === (int)$selected ? 'selected' : '';
}
$str = "<option value='\$id' \$selected >\$spacer \$name</option>";
$this->initTree($result);
return $this->getTree(0, $str, $selected);
}
}

View File

@ -0,0 +1,107 @@
<?php
/**
* 商品品牌控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\GoodsBrand;
use app\common\validate\GoodsBrandValidate;
class GoodsBrandController extends Controller
{
//列表
public function index(Request $request, GoodsBrand $model)
{
$param = $request->param();
$model = $model->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query'=>$request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, GoodsBrand $model, GoodsBrandValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $model::create($param);
$url = URL_BACK;
if(isset($param['_create']) && $param['_create']==1){
$url = URL_RELOAD;
}
return $result ? success('添加成功',$url) : error();
}
$this->assign([
'capital' => range('A','Z'),
]);
return $this->fetch();
}
//修改
public function edit($id, Request $request, GoodsBrand $model, GoodsBrandValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $data->save($param);
return $result ? success() : error();
}
$this->assign([
'data' => $data,
'capital' => range('A','Z'),
]);
return $this->fetch('add');
}
//删除
public function del($id, GoodsBrand $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
}

View File

@ -0,0 +1,101 @@
<?php
/**
* 商品分类控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\GoodsCategory;
use app\common\validate\GoodsCategoryValidate;
class GoodsCategoryController extends Controller
{
//列表
public function index(GoodsCategory $model)
{
$data = $this->getTreeList($model);
$this->assign([
'data' => $data,
]);
return $this->fetch();
}
//添加
public function add(Request $request, GoodsCategory $model, GoodsCategoryValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $model::create($param);
$url = URL_BACK;
if (isset($param['_create']) && $param['_create'] == 1) {
$url = URL_RELOAD;
}
return $result ? success('添加成功', $url) : error();
}
$this->assign([
'cat_list' => $this->getSelectList($model),
]);
return $this->fetch();
}
//修改
public function edit($id, Request $request, GoodsCategory $model, GoodsCategoryValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $data->save($param);
return $result ? success() : error();
}
$this->assign([
'data' => $data,
'cat_list' => $this->getSelectList($model, $data->parent_id),
]);
return $this->fetch('add');
}
//删除
public function del($id, GoodsCategory $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
}

View File

@ -0,0 +1,195 @@
<?php
/**
* 商品控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\Goods;
use app\common\model\MallImage;
use app\common\model\GoodsCategory;
use app\common\model\GoodsBrand;
use app\common\model\GoodsAttrCategory;
use app\common\model\ShopConfig;
use app\common\model\GoodsItem;
use app\common\validate\GoodsValidate;
class GoodsController extends Controller
{
//列表
public function index(Request $request, Goods $model)
{
$param = $request->param();
$model = $model->with('goods_category')->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query' => $request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, Goods $model,MallImage $mimode,GoodsItem $gimode, GoodsValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$goods_ids=$param['goods_ids'];
$field_data = array();
foreach ($goods_ids as $key => $value) {
if($param['goods_ids'][$key][0]){
$field_data[] =$param['goods_ids'][$key][0];
}
}
$param['collocation_goods']=json_encode(array_unique($field_data));
// 启动事务
$model->startTrans();
try{
$model::create($param);
$goods_id=$model->getLastInsID();
goods_imgs_upload($goods_id,1,$param['ori_img'],$param['thumb_img'],$param['ori_fm_img'],$param['thumb_img_f']);
$gimode->goods_item_upload($goods_id,$param);
// 提交事务
$model->commit();
}catch(\Exception $e){
// 回滚事务
$model->rollback();
return error($e->getMessage());
}
$url = URL_BACK;
if(isset($param['_create']) && $param['_create']==1){
$url = URL_RELOAD;
}
return success('添加成功',$url);
}
$size_list=ShopConfig::get('website', 'size');
$size_list=explode(',',$size_list);
foreach ($size_list as $key => $value) {
$size[$key]['size']=$value;
$size[$key]['num']=0;
}
$this->assign([
'goods_category_list' => $this->getSelectList(new GoodsCategory),
'brand_list' =>GoodsBrand::all(),
'imgurl_list'=>array(),
'number'=>0,
'collocation_goods'=>array(),
'size_list' =>$size,
'goods_list' => Goods::all()
]);
return $this->fetch();
}
//修改
public function edit($id, Request $request, Goods $model ,MallImage $mimode,GoodsItem $gimode, GoodsValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$goods_ids=$param['goods_ids'];
$field_data = array();
foreach ($goods_ids as $key => $value) {
if($param['goods_ids'][$key][0]){
$field_data[] =$param['goods_ids'][$key][0];
}
}
$param['collocation_goods']=json_encode(array_unique($field_data));
// 启动事务
$model->startTrans();
try{
$data->save($param);
$MallImage=$mimode->where(array('type'=>1,'union_id'=>$id))->select();
goods_imgs_upload($id,1,$param['ori_img'],$param['thumb_img'],$param['ori_fm_img'],$param['thumb_img_f'],$MallImage);
$gimode->goods_item_upload($id,$param);
// 提交事务
$model->commit();
}catch(\Exception $e){
// 回滚事务
$model->rollback();
return error($e->getMessage());
}
return success();
}
$ori_img='';
$thumb_img='';
$imgurl_list=$mimode->field('thumb_image,ori_image,is_cover')->where(array('type'=>1,'union_id'=>$id))->select();
foreach ($imgurl_list as $key => $v) {
$is_cover=$v['is_cover']>0 ? $v['is_cover']:'0';
if ($is_cover == 1) {
$ori_img = $v['ori_image'];
$thumb_img = $v['thumb_image'];
}
}
$collocation_goods=json_decode($data['collocation_goods']);
$goods_item_list=GoodsItem::where(array('goods_id'=>$id))->select();
$goods_item=array();
foreach ($goods_item_list as $key => $value) {
$goods_item[$value['spec_value']]=$value['stock'];
}
$size_list=ShopConfig::get('website', 'size');
$size_list=explode(',',$size_list);
foreach ($size_list as $key => $value) {
$size[$key]['size']=$value;
$num=$goods_item[$value]??'0';
$size[$key]['num']=$num;
}
$this->assign([
'data' => $data,
'goods_category_list' => $this->getSelectList(new GoodsCategory, $data->goods_category_id),
'brand_list' =>GoodsBrand::all(),
'ori_img'=>$ori_img,
'thumb_img'=>$thumb_img,
'imgurl_list'=>$imgurl_list,
'number'=>count($collocation_goods),
'collocation_goods'=>$collocation_goods,
'size_list' =>$size,
'goods_list' => Goods::all()
]);
return $this->fetch('add');
}
//删除
public function del($id, Goods $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
}

View File

@ -0,0 +1,131 @@
<?php
/**
* 首页栏目商品控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\GoodsIndex;
use app\common\model\Goods;
use app\common\validate\GoodsIndexValidate;
class GoodsIndexController extends Controller
{
//列表
public function index(Request $request, GoodsIndex $model)
{
$param = $request->param();
$model = $model->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query'=>$request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, GoodsIndex $model, GoodsIndexValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$goods_ids=$param['goods_id'];
$field_data = array();
foreach ($goods_ids as $key => $value) {
if($param['goods_id'][$key][0]){
$field_data[] =$param['goods_id'][$key][0];
}
}
if(count($field_data)=='0'){
return error('请选择商品');
}
$param['goods_ids']=json_encode(array_unique($field_data));
$result = $model::create($param);
$url = URL_BACK;
if(isset($param['_create']) && $param['_create']==1){
$url = URL_RELOAD;
}
return $result ? success('添加成功',$url) : error();
}
$this->assign([
'goods_list' => Goods::all(),
'number'=>0,
'goods_ids'=>array()
]);
return $this->fetch();
}
//修改
public function edit($id, Request $request, GoodsIndex $model, GoodsIndexValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$goods_ids=$param['goods_id'];
$field_data = array();
foreach ($goods_ids as $key => $value) {
if($param['goods_id'][$key][0]){
$field_data[] =$param['goods_id'][$key][0];
}
}
if(count($field_data)=='0'){
return error('请选择商品');
}
$param['goods_ids']=json_encode(array_unique($field_data));
$result = $data->save($param);
return $result ? success() : error();
}
$goods_ids=json_decode($data['goods_ids']);
$this->assign([
'data' => $data,
'number'=>count($goods_ids),
'goods_list' => Goods::all(),
'goods_ids'=>$goods_ids
]);
return $this->fetch('add');
}
//删除
public function del($id, GoodsIndex $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
}

View File

@ -0,0 +1,105 @@
<?php
/**
* 后台首页控制器
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\controller;
use app\admin\model\AdminLog;
use app\admin\model\AdminMenu;
use app\admin\model\AdminRole;
use app\admin\model\AdminUser;
use tools\SystemInfo;
use think\Request;
use think\Db;
class IndexController extends Controller
{
public function index(Request $request)
{
//更新时间
$time = date('Y-m-d H:i:s', time());
//今日成交订单
$order_num_today = Db::name('order')
->where(['order_status' =>1])
->whereTime('create_time', 'today')
->count();
//昨日
$order_num_yesterday = Db::name('order')
->where(['order_status' =>1])
->whereTime('create_time', 'yesterday')
->count();
//变化
$order_num_change = $order_num_today - $order_num_yesterday;
if ($order_num_change >= 0) {
$order_num_change = '+' . $order_num_change;
}
//总
$order_num_all = Db::name('order')
->where(['order_status' =>1])
->count();
//今日销售金额(元)
$order_amount_today = Db::name('order')
->where(['order_status' =>1])
->whereTime('create_time', 'today')
->sum('total_amount');
//昨日
$order_amount_yesterday = Db::name('order')
->where(['order_status' =>1])
->whereTime('create_time', 'yesterday')
->sum('total_amount');
//总
$order_amount_all = Db::name('order')
->where(['order_status' =>1])
->sum('total_amount');
//变化
$order_amount_change = $order_amount_today - $order_amount_yesterday;
if ($order_amount_change >= 0) {
$order_amount_change = '+' . $order_amount_change;
}
// 今天新增会员数量
$add_user_today = Db::name('user')
->whereTime('create_time', 'today')
->count();
//昨天
$add_user_yesterday = Db::name('user')
->whereTime('create_time', 'yesterday')
->count();
//总
$user_all = Db::name('user')
->count();
//变化
$add_change = $add_user_today - $add_user_yesterday;
if ($add_change >= 0) {
$add_change = '+' . $add_change;
}
$date=[
'time' => $time,
'order_num_today' => $order_num_today,
'order_num_yesterday' => $order_num_yesterday,
'order_num_change' => $order_num_change,
'order_amount_today' => $order_amount_today,
'order_amount_yesterday' => $order_amount_yesterday,
'order_amount_change' => $order_amount_change,
'add_user_today' => $add_user_today,
'add_user_yesterday' => $add_user_yesterday,
'add_user_change' => $add_change,
'order_num_all' => $order_num_all,
'order_amount_all' => $order_amount_all,
'user_all' => $user_all,
];
$this->assign([
'res'=>$date,
]);
return $this->fetch();
}
}

View File

@ -0,0 +1,161 @@
<?php
/**
* 订单控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\Order;
use app\common\model\MallImage;
use app\common\validate\OrderValidate;
class OrderController extends Controller
{
//列表
public function index(Request $request, Order $model, MallImage $mimodel)
{
$param = $request->param();
$where = [];
//订单搜素
if (!empty($param['search_key']) && !empty($param['keyword'])) {
$keyword = $param['keyword'];
switch ($param['search_key']) {
case 'order_sn':
$where[] = ['o.order_sn', 'like', '%' . $keyword . '%'];
break;
case 'user_sn':
$where[] = ['u.sn', 'like', '%' . $keyword . '%'];
break;
case 'nickname':
$where[] = ['u.nickname', 'like', '%' . $keyword . '%'];
break;
case 'user_mobile':
$where[] = ['u.mobile', 'like', '%' . $keyword . '%'];
break;
}
}
//商品名称
if (isset($param['goods_name']) && $param['goods_name'] != '') {
$where[] = ['g.goods_name', 'like', '%' . $param['goods_name'] . '%'];
}
//订单类型
if (isset($param['order_type']) && $param['order_type'] != '') {
$where[] = ['o.order_status', '=', $param['order_type']];
}
//下单时间
if (isset($param['start_time']) && $param['start_time'] != '') {
$where[] = ['o.create_time', '>=', strtotime($param['start_time'])];
}
if (isset($param['end_time']) && $param['end_time'] != '') {
$where[] = ['o.create_time', '<=', strtotime($param['end_time'])];
}
$model = $model
->alias('o')
->field('o.*,u.mobile,u.nickname,u.sn,u.avatar')
->join('user u', 'u.id = o.user_id')
->join('order_goods g', 'g.order_id = o.id')
->with(['order_goods'])
->append(['delivery_address'])
->where($where)
->order('o.id desc')
->group('o.id')
->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query'=>$request->get()]);
foreach ($data as $key => $value) {
foreach ($value['order_goods'] as &$order_goods){
$mi_info=$mimodel->where(array('union_id'=>$order_goods['goods_id'],'type'=>1,'is_cover'=>1))->find();
$order_goods['img']=$mi_info['thumb_image'];
}
}
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
/**
* Desc: 订单详情
*/
public function detail($id, Request $request, Order $model, MallImage $mimodel)
{
$order = new Order();
$data = $order
->with(['user', 'order_goods'])
->where('id', $id)
->append(['delivery_address'])
->find();
foreach ($data['order_goods'] as &$order_goods){
$mi_info=$mimodel->where(array('union_id'=>$order_goods['goods_id'],'type'=>1,'is_cover'=>1))->find();
$order_goods['img']=$mi_info['thumb_image'];
}
$this->assign([
'detail' => $data,
]);
return $this->fetch();
}
/**
* Desc: 订单详情
*/
public function delivery($id, Request $request, Order $model, MallImage $mimodel)
{
$order = new Order();
$data = $order
->with(['user', 'order_goods'])
->where('id', $id)
->append(['delivery_address'])
->find();
foreach ($data['order_goods'] as &$order_goods){
$mi_info=$mimodel->where(array('union_id'=>$order_goods['goods_id'],'type'=>1,'is_cover'=>1))->find();
$order_goods['img']=$mi_info['thumb_image'];
}
$this->assign([
'detail' => $data,
]);
return $this->fetch();
}
/**
* Desc: 发货操作
*/
public function deliveryHandle(Request $request, Order $model, OrderValidate $validate)
{
if ($request->isAjax()) {
$param = $request->param();
$validate_result = $validate->scene('hansle')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$model->delivery_handle($param);
return success('发货成功');
}
}
/**
* Desc: 确认收货
*/
public function confirm(Request $request, Order $model)
{
if ($this->request->isAjax()) {
$param = $request->param();
$order = Order::get(['id' => $param['order_id']]);
$order->order_status = 3;
$order->update_time = time();
$order->confirm_take_time = time();
$order->save();
return success('确认成功');
}
}
}

View File

@ -0,0 +1,106 @@
<?php
/**
* 品相配置控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\PhaseConfig;
use app\common\validate\PhaseConfigValidate;
class PhaseConfigController extends Controller
{
//列表
public function index(Request $request, PhaseConfig $model)
{
$param = $request->param();
$model = $model->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query'=>$request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, PhaseConfig $model, PhaseConfigValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $model::create($param);
$url = URL_BACK;
if(isset($param['_create']) && $param['_create']==1){
$url = URL_RELOAD;
}
return $result ? success('添加成功',$url) : error();
}
return $this->fetch();
}
//修改
public function edit($id, Request $request, PhaseConfig $model, PhaseConfigValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $data->save($param);
return $result ? success() : error();
}
$this->assign([
'data' => $data,
]);
return $this->fetch('add');
}
//删除
public function del($id, PhaseConfig $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
}

View File

@ -0,0 +1,39 @@
<?php
/**
* 公共控制器
*/
namespace app\admin\controller;
use app\common\model\Article;
use app\common\model\Goods;
use think\Request;
class PubController extends Controller
{
protected $authExcept = [
'admin/pub/getslidetargetdata'
];
public function getSlideTargetData(Request $request)
{
$param = $request->param();
switch ($param['type_id']) {
case 1:
$data = Goods::all();
break;
case 2:
$data = Article::all();
break;
default:
$data = Goods::all();
break;
}
return success('success', URL_CURRENT, $data);
}
}

View File

@ -0,0 +1,108 @@
<?php
/**
* 配置表控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\ShopConfig;
use app\common\model\Goods;
use app\common\validate\ShopConfigValidate;
class ShopConfigController extends Controller
{
//政策协议
public function policy(Request $request, ShopConfig $model, ShopConfigValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
ShopConfig::set('policy', 'procedure', $param['procedure']);
ShopConfig::set('policy', 'rule', $param['rule']);
ShopConfig::set('policy', 'contactus', $param['contactus']);
ShopConfig::set('policy', 'community', $param['community']);
ShopConfig::set('policy', 'privacy', $param['privacy']);
ShopConfig::set('policy', 'clause', $param['clause']);
ShopConfig::set('policy', 'consignment', $param['consignment']);
$url = URL_RELOAD;
return success('添加成功',$url);
}
$config = [
'procedure' => ShopConfig::get('policy', 'procedure'),
'rule' => ShopConfig::get('policy', 'rule'),
'contactus' => ShopConfig::get('policy', 'contactus'),
'community' => ShopConfig::get('policy', 'community'),
'privacy' => ShopConfig::get('policy', 'privacy'),
'clause' => ShopConfig::get('policy', 'clause'),
'consignment' => ShopConfig::get('policy', 'consignment'),
];
$this->assign([
'config' => $config,
]);
return $this->fetch();
}
//会员提现
public function withdraw(Request $request, ShopConfig $model, ShopConfigValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
ShopConfig::set('withdraw', 'min_withdraw', $param['min_withdraw']);
ShopConfig::set('withdraw', 'max_withdraw', $param['max_withdraw']);
ShopConfig::set('withdraw', 'poundage', $param['poundage']);
ShopConfig::set('withdraw', 'poundage_type', $param['poundage_type']);
$url = URL_RELOAD;
return success('添加成功',$url);
}
$config = [
'min_withdraw' => ShopConfig::get('withdraw', 'min_withdraw'),
'max_withdraw' => ShopConfig::get('withdraw', 'max_withdraw'),
'poundage' => ShopConfig::get('withdraw', 'poundage'),
'poundage_type' => ShopConfig::get('withdraw', 'poundage_type'),
];
$this->assign([
'config' => $config,
]);
return $this->fetch();
}
//网站设置
public function website(Request $request, ShopConfig $model, ShopConfigValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
ShopConfig::set('website', 'APPID', $param['APPID']);
ShopConfig::set('website', 'APPSECRET', $param['APPSECRET']);
ShopConfig::set('website', 'img_url', $param['img_url']);
ShopConfig::set('website', 'size', $param['size']);
ShopConfig::set('website', 'size_img', $param['size_img']);
ShopConfig::set('website', 'channel', $param['channel']);
ShopConfig::set('website', 'jmnum', $param['jmnum']);
ShopConfig::set('website', 'MCHID', $param['MCHID']);
ShopConfig::set('website', 'WXPAYKEY', $param['WXPAYKEY']);
ShopConfig::set('website', 'notify_url', $param['notify_url']);
$url = URL_RELOAD;
return success('添加成功',$url);
}
$config = [
'APPID' => ShopConfig::get('website', 'APPID'),
'APPSECRET' => ShopConfig::get('website', 'APPSECRET'),
'img_url' => ShopConfig::get('website', 'img_url'),
'size' => ShopConfig::get('website', 'size'),
'size_img' => ShopConfig::get('website', 'size_img'),
'channel' => ShopConfig::get('website', 'channel'),
'jmnum' => ShopConfig::get('website', 'jmnum'),
'MCHID' => ShopConfig::get('website', 'MCHID'),
'WXPAYKEY' => ShopConfig::get('website', 'WXPAYKEY'),
'notify_url' => ShopConfig::get('website', 'notify_url'),
];
$this->assign([
'config' => $config,
]);
return $this->fetch();
}
}

View File

@ -0,0 +1,110 @@
<?php
/**
* 轮播控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\Slide;
use app\common\validate\SlideValidate;
class SlideController extends Controller
{
//列表
public function index(Request $request, Slide $model)
{
$param = $request->param();
$model = $model->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query' => $request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, Slide $model, SlideValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $model::create($param);
$url = URL_BACK;
if (isset($param['_create']) && $param['_create'] == 1) {
$url = URL_RELOAD;
}
return $result ? success('添加成功', $url) : error();
}
$this->assign([
'jump_type' => $model->jumpType,
'banner_list' => $model->BannerList,
]);
return $this->fetch();
}
//修改
public function edit($id, Request $request, Slide $model, SlideValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
$result = $data->save($param);
return $result ? success() : error();
}
$this->assign([
'data' => $data,
'jump_type' => $model->jumpType,
'banner_list' => $model->BannerList,
]);
return $this->fetch('add');
}
//删除
public function del($id, Slide $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
}

View File

@ -0,0 +1,20 @@
<?php
/**
* 统计示例控制器
*/
namespace app\admin\controller;
class StatisticsController extends Controller
{
//统计概览
public function index()
{
return $this->fetch();
}
}

View File

@ -0,0 +1,213 @@
<?php
/**
* 用户控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\User;
use app\common\model\Order;
use app\common\model\Goods;
use app\common\model\AccountLog;
use app\common\validate\UserValidate;
use app\common\validate\OrderValidate;
class UserController extends Controller
{
//列表
public function index(Request $request, User $model)
{
$param = $request->param();
$where = [];
//查询
if(isset($param['keyword']) && $param['keyword']){
$where[] = [$param['keyword_type'],'like','%'.$param['keyword'].'%'];
}
//等级查询
if(isset($param['level']) && $param['level'] != ''){
$where[] = ['user_level_id','=',$param['level']];
}
//提现积分
if(isset($param['integral_start']) && $param['integral_start']){
$where[] = ['user_money','>=',$param['integral_start']];
}
if(isset($param['integral_end']) && $param['integral_end']){
$where[] = ['user_money','<=',$param['integral_end']];
}
//注册时间
if(isset($param['start_time']) && $param['start_time']!=''){
$where[] = ['create_time','>=',strtotime($param['start_time'])];
}
if(isset($param['end_time']) && $param['end_time']!=''){
$where[] = ['create_time','<=',strtotime($param['end_time'])];
}
$model = $model->where($where)->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query' => $request->get()]);
foreach ($data as $key => $value) {
// 上级推荐人
$value['first_leader_info'] = User::getUserInfo($value['first_leader']);
//推荐下级人数
$value['fans'] = User::where([
['first_leader|second_leader', '=', $value['id']]
])->count();
//设备数量
$value['sb_num'] = Order::where([
['user_id', '=', $value['id']]
])->count();
}
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
]);
return $this->fetch();
}
//添加
public function add(Request $request, User $model, UserValidate $validate)
{
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('add')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
//处理头像上传
$attachment_avatar = new \app\common\model\Attachment;
$file_avatar = $attachment_avatar->upload('avatar');
if ($file_avatar) {
$param['avatar'] = $file_avatar->url;
} else {
return error($attachment_avatar->getError());
}
$result = $model::create($param);
$url = URL_BACK;
if (isset($param['_create']) && $param['_create'] == 1) {
$url = URL_RELOAD;
}
return $result ? success('添加成功', $url) : error();
}
return $this->fetch();
}
//修改
public function edit($id, Request $request, User $model, UserValidate $validate)
{
$data = $model::get($id);
if ($request->isPost()) {
$param = $request->param();
$validate_result = $validate->scene('edit')->check($param);
if (!$validate_result) {
return error($validate->getError());
}
//处理头像上传
if (!empty($_FILES['avatar']['name'])) {
$attachment_avatar = new \app\common\model\Attachment;
$file_avatar = $attachment_avatar->upload('avatar');
if ($file_avatar) {
$param['avatar'] = $file_avatar->url;
}
}
$result = $data->save($param);
return $result ? success() : error();
}
$this->assign([
'data' => $data,
]);
return $this->fetch('add');
}
//删除
public function del($id, User $model)
{
if (count($model->noDeletionId) > 0) {
if (is_array($id)) {
if (array_intersect($model->noDeletionId, $id)) {
return error('ID为' . implode(',', $model->noDeletionId) . '的数据无法删除');
}
} else if (in_array($id, $model->noDeletionId)) {
return error('ID为' . $id . '的数据无法删除');
}
}
if ($model->softDelete) {
$result = $model->whereIn('id', $id)->useSoftDelete('delete_time', time())->delete();
} else {
$result = $model->whereIn('id', $id)->delete();
}
return $result ? success('操作成功', URL_RELOAD) : error();
}
//启用
public function enable($id, User $model)
{
$result = $model->whereIn('id', $id)->update(['status' => 1]);
return $result ? success('操作成功', URL_RELOAD) : error();
}
//禁用
public function disable($id, User $model)
{
$result = $model->whereIn('id', $id)->update(['status' => 0]);
return $result ? success('操作成功', URL_RELOAD) : error();
}
//账户调整
public function adjust_account($id, Request $request, User $model)
{
$data = $model::get($id);
if ($request->isPost()) {
$post_data = $request->param();
User::startTrans();
try {
$number = $post_data['money'];
$change_type = 1;
$money_sql = User::raw('user_money + ' . $post_data['money']);
if ($post_data['money_handle'] == 0) {
$change_type = 2;
$money_sql = User::raw('user_money - ' . $post_data['money']);
}
$update_data['user_money'] = $money_sql;
User::where('id', $post_data['id'])->update($update_data);
//账户变动记录
AccountLog::AccountRecord(
$post_data['id'],
$post_data['money'],
$change_type,
100,
$post_data['money_remark']
);
User::commit();
} catch (Exception $e) {
User::rollback();
return error($e->getMessage());
}
return success('调整成功');
}
$this->assign([
'info' => $data,
]);
return $this->fetch();
}
}

View File

@ -0,0 +1,149 @@
<?php
/**
* 提现申请记录表控制器
*/
namespace app\admin\controller;
use think\Request;
use app\common\model\WithdrawApply;
use app\common\model\AccountLog;
use app\common\model\User;
use app\common\validate\WithdrawApplyValidate;
class WithdrawController extends Controller
{
//列表
public function lists(Request $request, WithdrawApply $model)
{
$WITHDRAW_TYPE=$model->WITHDRAW_TYPE;
$STATUS_TYPE=$model->STATUS_TYPE;
$param = $request->param();
$where = [];
// 会员信息
if (!empty($param['search_key']) && !empty($param['keyword'])) {
$keyword = $param['keyword'];
if ($param['search_key'] == 'user_sn') {
$where[] = ['u.sn', '=', $keyword];
} elseif ($param['search_key'] == 'nickname'){
$where[] = ['u.nickname', 'like', '%' . $keyword . '%'];
}
}
//提现单号
if (isset($param['withdraw_sn']) && $param['withdraw_sn'] != '') {
$where[] = ['w.sn', '=', $param['withdraw_sn']];
}
//提现方式
if (isset($param['type']) && $param['type'] != '') {
$where[] = ['type', '=', $param['type']];
}
//提现状态
if (isset($param['status']) && $param['status'] != '') {
$where[] = ['w.status', '=', $param['status']];
}
// 提现时间
if (isset($param['start_time']) && $param['start_time'] && isset($param['end_time']) && $param['end_time']) {
$where[] = ['w.create_time', 'between', [strtotime($param['start_time']), strtotime($param['end_time'])]];
}
$model = $model
->alias('w')
->field('w.*,u.mobile,u.nickname,u.sn as user_sn,u.avatar')
->join('user u', 'u.id = w.user_id')
->where($where)
->scope('where', $param);
$data = $model->paginate($this->admin['per_page'], false, ['query'=>$request->get()]);
//关键词,排序等赋值
$this->assign($request->get());
$this->assign([
'data' => $data,
'page' => $data->render(),
'total' => $data->total(),
'type_list' =>$WITHDRAW_TYPE,
'status_list'=>$STATUS_TYPE,
]);
return $this->fetch();
}
public function review($id,Request $request, WithdrawApply $model)
{
$this->assign([
'id' => $id,
]);
return $this->fetch();
}
//审核通过
public function confirm(Request $request, WithdrawApply $model)
{
$param = $request->param();
$id = $param['id'];
$withdraw =$model
->where('id', $id)
->find();
// 判断提现单是否为待提现状态 1
if($withdraw['status'] != 1) {
return error('不是待提现申请单');
}
// 启动事务
$model->startTrans();
try{
// 直接标识为审核成功状态
$model
->where('id', $id)
->update(['status' =>2, 'update_time' => time(),'description'=>$param['description']]);
// 提交事务
$model->commit();
}catch(\Exception $e){
// 回滚事务
$model->rollback();
return error($e->getMessage());
}
return success('审核通过');
}
//审核拒绝
public function refuse(Request $request, WithdrawApply $model)
{
$model->startTrans();
$param = $request->param();
try{
$withdraw_apply = WithdrawApply::where('id', $param['id'])->find();
$withdraw_apply->status =3; // 提现失败
$withdraw_apply->description = $param['description'];
$withdraw_apply->update_time = time();
$withdraw_apply->save();
//拒绝提现,回退佣金
$user = User::get($withdraw_apply['user_id']);
$user->integral = ['inc', $withdraw_apply['money']];
$user->save();
//增加账户变动记录
AccountLog::AccountRecord(
$withdraw_apply['user_id'],
$withdraw_apply['money'],
1,
130,
'',
$withdraw_apply['id'],
$withdraw_apply['sn']
);
$model->commit();
} catch (Exception $e){
$model->rollback();
return error($e->getMessage());
}
return success('提现失败已回退用户账户');
}
}

View File

@ -0,0 +1,47 @@
<?php
/**
* 后台操作日志模型
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\model;
class AdminLog extends Model
{
protected $name = 'admin_log';
public $softDelete = false;
public $methodText = [
1=>'GET',
2=>'POST',
3=>'PUT',
4=>'DELETE',
];
protected $autoWriteTimestamp = true;
protected $updateTime= false;
protected $searchField = [
'name',
'url',
'log_ip'
];
protected $whereField = [
'admin_user_id'
];
//关联用户
public function adminUser()
{
return $this->belongsTo(AdminUser::class, 'admin_user_id', 'id');
}
//关联详情
public function adminLogData()
{
return $this->hasOne(AdminLogData::class,'admin_log_id','id');
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* 后台管理员操作日志数据模型
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\model;
use tools\Crypt;
class AdminLogData extends Model
{
protected $name = 'admin_log_data';
public $softDelete = false;
//关联log
public function adminLog()
{
return $this->belongsTo('app\admin\AdminLog','admin_log_id','id');
}
public function getDataAttr($value)
{
$data = Crypt::decrypt($value, config('app.app_key'));
return json_encode(json_decode($data, true), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
}

View File

@ -0,0 +1,28 @@
<?php
/**
* 后台菜单(权限)模型
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\model;
class AdminMenu extends Model
{
protected $name = 'admin_menu';
public $softDelete = false;
public $logMethod = [
0 => '不记录',
1 => 'GET',
2 => 'POST',
3 => 'PUT',
4 => 'DELETE'
];
public $noDeletionId = [
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
];
}

View File

@ -0,0 +1,41 @@
<?php
/**
* 后台角色模型
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\model;
class AdminRole extends Model
{
protected $name = 'admin_role';
public $softDelete = false;
protected $searchField = [
'name',
'description'
];
public $noDeletionId = [
1
];
public static function init()
{
//添加首页,系统管理,个人资料菜单/权限
self::event('before_insert', static function ($data) {
$data->url = [1,2,18];
});
}
protected function getUrlAttr($value)
{
return $value !== '' ? explode(',', $value) : [];
}
protected function setUrlAttr($value)
{
return $value !== '' ? implode(',', $value) : [];
}
}

View File

@ -0,0 +1,142 @@
<?php
/**
* 后台用户模型
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\model;
use think\model\concern\SoftDelete;
/**
* @property int id
* @property mixed sign_str
* @property mixed auth_url
* @property mixed role
* @property string password
*/
class AdminUser extends Model
{
use SoftDelete;
protected $name = 'admin_user';
protected $searchField = [
'nickname',
'username'
];
public $noDeletionId = [
1, 2
];
public static function init()
{
//添加自动加密密码
self::event('before_insert', static function ($data) {
$data->password = password_hash($data->password, 1);
});
//修改密码自动加密
self::event('before_update', function ($data) {
$old = (new static())::get($data->id);
if ($data->password !== $old->password) {
$data->password = password_hash($data->password, 1);
}
});
}
//关联操作日志
public function adminLog()
{
return $this->hasMany(AdminLog::class, 'admin_user_id', 'id');
}
//角色获取器
protected function getRoleAttr($value)
{
return explode(',', $value);
}
//角色修改器
protected function setRoleAttr($value)
{
return implode(',', $value);
}
//用户角色名称
protected function getRoleTextAttr($value, $data)
{
return AdminRole::where('id', 'in', $data['role'])->column('id,name', 'id');
}
/**
* 获取已授权url
* @param $value
* @param $data
* @return array
*/
protected function getAuthUrlAttr($value, $data)
{
$role_urls = AdminRole::where('id', 'in', $data['role'])->where('status', 1)->column('url');
$url_id_str = '';
foreach ($role_urls as $key => $val) {
$url_id_str .= $key == 0 ? $val : ',' . $val;
}
$url_id = array_unique(explode(',', $url_id_str));
$auth_url = [];
if (count($url_id) > 0) {
$auth_url = AdminMenu::where('id', 'in', $url_id)->column('url');
}
return $auth_url;
}
//加密字符串,用在登录的时候加密处理
protected function getSignStrAttr($value, $data)
{
$ua = request()->header('user-agent');
return sha1($data['id'] . $data['username'] . $ua);
}
//获取当前用户已授权的显示菜单
public function getShowMenu()
{
if ($this->id === 1) {
return AdminMenu::where('is_show', 1)->order('sort_id', 'asc')->order('id', 'asc')->column('id,parent_id,name,url,icon,sort_id', 'id');
}
$role_urls = AdminRole::where('id', 'in', $this->role)->where('status', 1)->column('url');
$url_id_str = '';
foreach ($role_urls as $key => $val) {
$url_id_str .= $key == 0 ? $val : ',' . $val;
}
$url_id = array_unique(explode(',', $url_id_str));
return AdminMenu::where('id', 'in', $url_id)->where('is_show', 1)->order('sort_id', 'asc')->order('id', 'asc')->column('id,parent_id,name,url,icon,sort_id', 'id');
}
//用户登录
public static function login($param)
{
$username = $param['username'];
$password = $param['password'];
$user = self::get(['username' => $username]);
if (!$user) {
exception('用户不存在');
}
if (!password_verify($password, $user->password)) {
exception('密码错误');
}
if ((int)$user->status !== 1) {
exception('用户被冻结');
}
return $user;
}
}

View File

@ -0,0 +1,66 @@
<?php
/**
* 后台基础模型
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\model;
use think\db\Query;
class Model extends \think\Model
{
//是否字段,使用场景:用户的是否冻结,文章是否为热门等等。
const BOOLEAN_TEXT = [0 => '否', 1 => '是'];
//是否为软删除
public $softDelete = true;
//软删除字段默认值
protected $defaultSoftDelete = 0;
//可搜索字段
protected $searchField = [];
//可作为条件的字段
protected $whereField = [];
//禁止删除的数据id
public $noDeletionId = [];
/**
* 查询处理
* @var Query $query
* @var array $param
*/
public function scopeWhere($query, $param)
{
//关键词like搜索
$keywords = $param['_keywords'] ?? '';
if (!empty($keywords) && count($this->searchField) > 0) {
$this->searchField = implode('|', $this->searchField);
$query->where($this->searchField, 'like', '%' . $keywords . '%');
}
//字段条件查询
if (count($this->whereField) > 0 && count($param) > 0) {
foreach ($param as $key => $value) {
if (!empty($value) && in_array($key, $this->whereField)) {
$query->where($key, $value);
}
}
}
//排序
$order = $param['_order'] ?? '';
$by = $param['_by'] ?? 'desc';
$query->order($order ?: 'id', $by ?: 'desc');
}
//状态获取器
public function getStatusTextAttr($value, $data)
{
return self::BOOLEAN_TEXT[$data['status']];
}
}

View File

@ -0,0 +1,133 @@
<?php
/**
* 登录、退出、记录日志相关
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\traits;
use app\admin\model\AdminLog;
use app\admin\model\AdminUser;
use tools\Crypt;
use tools\SafeCookie;
use think\facade\Session;
trait AdminAuth
{
public static $admin_user_id = 'admin_user_id';
public static $admin_user_id_sign = 'admin_user_sign';
//是否登录
protected function isLogin()
{
//这里要写个判断数据库的才行
$admin_user_id = Session::get(self::$admin_user_id);
$user = false;
$this->user = &$user;
if (empty($admin_user_id)) {
if (SafeCookie::has(self::$admin_user_id) && SafeCookie::has(self::$admin_user_id_sign)) {
$admin_user_id = SafeCookie::get(self::$admin_user_id);
$sign = SafeCookie::get(self::$admin_user_id_sign);
$user = AdminUser::get($admin_user_id);
if ($user && $user->sign_str === $sign) {
Session::set(self::$admin_user_id, $admin_user_id);
Session::set(self::$admin_user_id_sign, $sign);
return true;
}
}
return false;
}
$user = AdminUser::get($admin_user_id);
if(!$user) {
return false;
}
$this->uid = $user->id;
return Session::get(self::$admin_user_id_sign) === $user->sign_str;
}
/**
* session 与cookie登录
* @param $user AdminUser
* @param bool $remember
* @return bool
*/
public static function authLogin($user, $remember = false)
{
Session::set(self::$admin_user_id, $user->id);
Session::set(self::$admin_user_id_sign, $user->sign_str);
//记住登录
if ($remember === true) {
SafeCookie::set(self::$admin_user_id, $user->id);
SafeCookie::set(self::$admin_user_id_sign, $user->sign_str);
} else if (SafeCookie::has(self::$admin_user_id) || SafeCookie::has(self::$admin_user_id_sign)) {
SafeCookie::delete(self::$admin_user_id);
SafeCookie::delete(self::$admin_user_id_sign);
}
//记录登录日志
self::loginLog($user);
return true;
}
//退出
public static function authLogout()
{
Session::delete(self::$admin_user_id);
Session::delete(self::$admin_user_id_sign);
if (SafeCookie::has(self::$admin_user_id) || SafeCookie::has(self::$admin_user_id_sign)) {
SafeCookie::delete(self::$admin_user_id);
SafeCookie::delete(self::$admin_user_id_sign);
}
return true;
}
/**
* 权限检查
* @param $user AdminUser
* @return bool
*/
public function authCheck($user)
{
return in_array($this->url, $this->authExcept, true) || in_array($this->url, $user->auth_url, true);
}
//登录记录
public static function loginLog($user)
{
$data = AdminLog::create([
'admin_user_id' => $user->id,
'name' => '登录',
'url' => 'admin/auth/login',
'log_method' => 'POST',
'log_ip' => request()->ip()
]);
$crypt_data = Crypt::encrypt(json_encode(request()->param()), config('app.app_key'));
$log_data = [
'data' => $crypt_data
];
$data->adminLogData()->save($log_data);
}
//创建操作日志
public function createAdminLog($user, $menu)
{
$data = [
'admin_user_id' => $user->id,
'name' => $menu->name,
'log_method' => $menu->log_method,
'url' => request()->pathinfo(),
'log_ip' => request()->ip()
];
$log = AdminLog::create($data);
//加密数据,防脱库
$crypt_data = Crypt::encrypt(json_encode(request()->param()), config('app.app_key'));
$log_data = [
'data' => $crypt_data
];
$log->adminLogData()->save($log_data);
}
}

View File

@ -0,0 +1,375 @@
<?php
/**
* 后台tree(左侧菜单,菜单列表,权限操作)相关
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\traits;
use app\admin\model\AdminUser;
trait AdminTree
{
public $text, $html;
/**
* 生成树型结构所需要的2维数组
* @var array
*/
public $array;
/**
* 生成树型结构所需修饰符号,可以换成图片
* @var array
*/
public $icon = array('│', '├', '└');
public $space = '&nbsp;&nbsp;';
/**
* @access private
*/
public $ret = '';
/**
* 构造函数,初始化类
* @param array $arr
* @return bool
*/
public function initTree($arr=[])
{
$this->array = $arr;
$this->ret = '';
$this->html = '';
return is_array($arr);
}
/**
* 得到树型结构
* @param int $my_id ,表示获得这个ID下的所有子级
* @param string $str 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>"
* @param int $sid 被选中的ID,比如在做树型下拉框的时候需要用到
* @param string $adds
* @param string $str_group
* @return string
*/
public function getTree($my_id, $str, $sid = 0, $adds = '', $str_group = '')
{
$parent_id = '';
$n_str = '';
$number = 1;
$child = $this->getChild($my_id);
if (is_array($child)) {
$total = count($child);
foreach ($child as $id => $value) {
$j = $k = '';
if ($number == $total) {
$j .= $this->icon[2];
} else {
$j .= $this->icon[1];
$k = $adds ? $this->icon[0] : '';
}
$spacer = $adds ? $adds . $j : '';
$selected = $id == $sid ? 'selected' : '';
extract($value);
0 == $parent_id && $str_group ? eval("\$n_str = \"$str_group\";") : eval("\$n_str = \"$str\";");
$this->ret .= $n_str;
$space = $this->space;
$this->getTree($id, $str, $sid, $adds . $k . $space, $str_group);
$number++;
}
}
return $this->ret;
}
/**
* 获取后台左侧菜单
* @param $my_id
* @param $current_id
* @param $parent_ids
* @return mixed
*/
public function get_authTree($my_id, $current_id, $parent_ids)
{
$n_str = '';
$child = $this->getChild($my_id);
if (is_array($child)) {
$menu = current($child);
//获取当前等级的html
$text = $this->text[$menu['level']] ?? end($this->text);
foreach ($child as $k => $v) {
@extract($v);
//如果有下级菜单
if ($this->getChild($k)) {
if (in_array($k, $parent_ids, true)) {
//如果下级菜单是当前页面
eval("\$n_str = \"$text[1]\";");
$this->html .= $n_str;
} else {
//如果下级菜单不是当前页面
eval("\$n_str = \"$text[0]\";");
$this->html .= $n_str;
}
self::get_authTree($k, $current_id, $parent_ids);
eval("\$n_str = \"$text[2]\";");
$this->html .= $n_str;
} else if ($k == $current_id) {
$a = $this->text['current'];
eval("\$n_str = \"$a\";");
$this->html .= $n_str;
} else {
$a = $this->text['other'];
eval("\$n_str = \"$a\";");
$this->html .= $n_str;
}
}
}
return $this->html;
}
/**
* 得到子级数组
* @param int $pid
* @return bool|array
*/
public function getChild($pid)
{
$result = [];
foreach ($this->array as $key => $value) {
if ($value['parent_id'] == $pid) {
$result[$key] = $value;
}
}
return $result;
}
/**
* 递归获取级别
* @param int $id ID
* @param array $array 所有菜单
* @param int $i 所在级别
* @return int
*/
public function getLevel($id, $array, $i = 0)
{
if ($array[$id]['parent_id'] == 0 || empty($array[$array[$id]['parent_id']]) || $array[$id]['parent_id'] == $id) {
return $i;
}
$i++;
return self::getLevel($array[$id]['parent_id'], $array, $i);
}
//获取权限树
public function getAuthTreeAccess($my_id)
{
$id = '';
$n_str = '';
$child = $this->getChild($my_id);
if (is_array($child)) {
$level = current($child);
$text = $this->text[$level['level']] ?? end($this->text);
foreach ($child as $k => $v) {
@extract($v);
if ($this->getChild($k)) {
eval("\$n_str = \"$text[0]\";");
$this->html .= $n_str;
self::getAuthTreeAccess($k);
eval("\$n_str = \"$text[1]\";");
$this->html .= $n_str;
} else {
$a = $this->text['other'];
eval("\$n_str = \"$a\";");
$this->html .= $n_str;
}
}
}
return $this->html;
}
/**
* 获取左侧菜单
* @param $user AdminUser
* @return mixed
*/
protected function getLeftMenu($user)
{
$menu = $user->getShowMenu();
$max_level = 0;
$current_id = 1;
$parent_ids = array(0 => 0);
foreach ($menu as $k => $v) {
if ($v['url'] == $this->url) {
$parent_ids = $this->getMenuParent($menu, $v['id']);
$current_id = $v['id'];
}
}
if ($parent_ids == false) {
$parent_ids = array(0 => 0);
}
foreach ($menu as $k => $v) {
$url = url($v['url']);
$menu[$k]['icon'] = $v['icon'];
$menu[$k]['level'] = $this->getLevel($v['id'], $menu);
$max_level = $max_level <= $menu[$k]['level'] ? $menu[$k]['level'] : $max_level;
$menu[$k]['url'] = $url;
}
$this->initTree($menu);
$text_base_one = "<li class='treeview";
$text_hover = ' active';
$text_base_two = "'><a href='javascript:void(0);'>
<i class='fa \$icon'></i>
<span>
\$name
</span>
<span class='pull-right-container'><i class='fa fa-angle-left pull-right'></i></span>
</a><ul class='treeview-menu";
$text_open = ' menu-open';
$text_base_three = "'>";
$text_base_four = '<li';
$text_hover_li = " class='active'";
$text_base_five = ">
<a href='\$url'>
<i class='fa \$icon'></i>
<span>\$name</span>
</a>
</li>";
$text_0 = $text_base_one . $text_base_two . $text_base_three;
$text_1 = $text_base_one . $text_hover . $text_base_two . $text_open . $text_base_three;
$text_2 = '</ul></li>';
$text_current = $text_base_four . $text_hover_li . $text_base_five;
$text_other = $text_base_four . $text_base_five;
for ($i = 0; $i <= $max_level; $i++) {
$this->text[$i]['0'] = $text_0;
$this->text[$i]['1'] = $text_1;
$this->text[$i]['2'] = $text_2;
}
$this->text['current'] = $text_current;
$this->text['other'] = $text_other;
return $this->get_authTree(0, $current_id, $parent_ids);
}
//获取父级菜单
protected function getMenuParent($arr, $my_id, $parent_ids = array())
{
$a = array();
if (is_array($arr)) {
foreach ($arr as $id => $a) {
if (($a['id'] === $my_id) && $a['parent_id'] !== 0) {
$parent_ids[] = $a['parent_id'];
$parent_ids = $this->getMenuParent($arr, $a['parent_id'], $parent_ids);
}
}
}
return !empty($parent_ids) ? $parent_ids : false;
}
//获取当前导航
protected function getCurrentNav($arr, $my_id, $parent_ids = array(), $current_nav = '')
{
$a = array();
if (is_array($arr)) {
foreach ($arr as $id => $a) {
if (($a['id'] === $my_id) && $a['parent_id'] !== 0) {
$parent_ids[] = $a['parent_id'];
$ru = '<li><a><i class="fa ' . $a['icon'] . '"></i> ' . $a['name'] . '</a></li>';
$current_nav = $ru . $current_nav;
$temp_result = $this->getCurrentNav($arr, $a['parent_id'], $parent_ids, $current_nav);
$parent_ids = $temp_result[0];
$current_nav = $temp_result[1];
}
}
}
return !empty([$parent_ids, $current_nav]) ? [$parent_ids, $current_nav] : false;
}
/**
* 获取树形数据列表
* @param $model
* @return string
*/
protected function getTreeList($model)
{
$data = $model->column('id,name,parent_id', 'id');
foreach ($data as $key => $value) {
//左侧选择
$data[$key]['select_html'] = '<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox"
data-id="' . $value['id'] . '" class="checkbox data-list-check" value="' . $value['id'] . '"
placeholder="选择/取消">
</td>';
//右侧操作
$data[$key]['todo_html'] = '<td class="td-do">
<a href="' . url('edit', ['id' => $value['id']]) . '"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除"
data-id="' . $value['id'] . '" data-confirm-title="删除确认"
data-confirm-content=\'您确定要删除ID为 <span class="text-red">' . $value['id'] . '</span> 的数据吗\'
data-url="' . url('del') . '" >
<i class="fa fa-trash"></i>
</a>
</td>';
}
$this->initTree($data);
$html = "<tr>
\$select_html
<td>\$id</td>
<td>\$spacer \$name</td>
\$todo_html
</tr>";
return $this->getTree(0, $html);
}
/**
* 获取树形选择列表
* @param $model
* @param int $selected
* @return string
*/
protected function getSelectList($model, $selected = 0)
{
$data = $model->column('id,parent_id,name', 'id');
$html = "<option value='\$id' \$selected >\$spacer \$name</option>";
$this->initTree($data);
return $this->getTree(0, $html, $selected);
}
}

View File

@ -0,0 +1,12 @@
<?php
/**
* 登录验证码
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\traits;
class LoginCaptcha
{
}

View File

@ -0,0 +1,81 @@
<?php
/**
* phpOffice相关操作
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\traits;
use Exception;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
trait PhpOffice
{
public function exportData($head, $body, $name = '', $version = '2007',$title='导出记录')
{
try {
// 输出 Excel 文件头
if(empty($name)){
$name =date('Y-m-d-H-i-s');
}
$spreadsheet = new Spreadsheet();
$sheetPHPExcel = $spreadsheet->setActiveSheetIndex(0);
$char_index = range('A', 'Z');
//处理超过26列
$a = 'A';
foreach ($char_index as $item){
$char_index[] = $a . $item;
}
// Excel 表格头
foreach ($head as $key => $val) {
$sheetPHPExcel->setCellValue("{$char_index[$key]}1", $val);
}
$spreadsheet->getActiveSheet()->setTitle($title);
// Excel body 部分
foreach ($body as $key => $val) {
$row = $key + 2;
$col = 0;
foreach ($val as $k => $v) {
$spreadsheet->getActiveSheet()->setCellValue("{$char_index[$col]}{$row}", $v);
$col++;
}
}
// 版本差异信息
$version_opt = [
'2007' => [
'mime' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'ext' => '.xlsx',
'write_type' => 'Xlsx',
],
'2003' => ['mime' => 'application/vnd.ms-excel',
'ext' => '.xls',
'write_type' => 'Xls',
],
'pdf' => ['mime' => 'application/pdf',
'ext' => '.pdf',
'write_type' => 'PDF',
],
'ods' => ['mime' => 'application/vnd.oasis.opendocument.spreadsheet',
'ext' => '.ods',
'write_type' => 'OpenDocument',
],
];
header('Content-Type: ' . $version_opt[$version]['mime']);
header('Content-Disposition: attachment;filename="' . $name . $version_opt[$version]['ext'] . '"');
header('Cache-Control: max-age=0');
$objWriter = IOFactory::createWriter($spreadsheet, 'Xlsx');
return $objWriter->save('php://output');
} catch (Exception $e) {
return $e->getMessage();
}
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* 后台菜单证类
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\validate;
class AdminMenuValidate extends Validate
{
protected $rule = [
'parent_id|上级' => 'require|egt:0',
'name|名称' => 'require',
'url|url' => 'require|unique:admin_menu',
'icon|图标' => 'require',
'sort_id|排序' => 'require',
'is_show|是否显示' => 'require',
'log_method|记录类型' => 'require',
];
protected $message = [
'parent_id.egt' => '请选择上级菜单',
];
protected $scene = [
'add' => ['parent_id', 'title', 'url', 'icon', 'sort_id', 'is_show', 'log_method'],
'edit' => ['parent_id', 'title', 'url', 'icon', 'sort_id', 'is_show', 'log_method'],
];
}

View File

@ -0,0 +1,21 @@
<?php
/**
* 后台角色验证类
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\validate;
class AdminRoleValidate extends Validate
{
protected $rule = [
'name|名称' => 'require|unique:admin_role',
'description|介绍' => 'require',
'rules|权限' => 'require',
];
protected $scene = [
'add' => ['name', 'description'],
'edit' => ['name', 'description'],
];
}

View File

@ -0,0 +1,38 @@
<?php
/**
* 后台用户验类
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\validate;
class AdminUserValidate extends Validate
{
protected $rule = [
'username|帐号' => 'require|unique:admin_user',
'password|密码' => 'require',
'new_password|新密码' => 'require',
'renew_password|确认新密码' => 'require|confirm:new_password',
'nickname|昵称' => 'require',
'role|角色' => 'require',
'status|状态' => 'require',
];
protected $message = [
'role.require' => '请选择角色',
];
protected $scene = [
'add' => ['username', 'password', 'nickname', 'role'],
'edit' => ['username', 'nickname', 'role'],
'password' => ['password', 'new_password', 'renew_password'],
'nickname' => ['nickname'],
];
public function sceneLogin()
{
$this->only(['username', 'password'])
->remove('username', 'unique');
}
}

View File

@ -0,0 +1,12 @@
<?php
/**
* 后台基础验证类
* @author yupoxiong<i@yufuping.com>
*/
namespace app\admin\validate;
class Validate extends \think\Validate
{
}

View File

@ -0,0 +1,174 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<style type="text/css">
.layui-table-cell {
height: auto;
white-space: normal;
}
.layui-card-header.layuiadmin-card-header-auto {
padding-top: 15px;
padding-bottom: 15px;
height: auto;
}
.layui-form-label{ width:100px; }
</style>
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('integrallist')}" method="GET">
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">订单搜索:</label>
<div class="layui-input-inline" style="width: 200px;">
<select name="keyword_type" id="keyword_type">
<option value="sn" {if isset($keyword_type) && $keyword_type=='sn'}selected{/if}>会员编号</option>
<option value="nickname" {if isset($keyword_type) && $keyword_type=='nickname'}selected{/if}>会员昵称</option>
<option value="mobile" {if isset($keyword_type) && $keyword_type=='mobile'}selected{/if}>会员手机号码</option>
</select>
</div>
<div class="layui-input-inline" style="width: 200px;">
<input type="text" id="keyword" name="keyword" value="{$keyword?$keyword:'';}" placeholder="请输入关键词" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">变动类型:</label>
<div class="layui-input-inline">
<select name="source_type" id="source_type">
<option value="0">全部</option>
{foreach $source_type_list as $key => $value}
<option value="{$key}" {if isset($source_type) && $source_type==$key}selected{/if}>{$value}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">下单时间:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="start_time" name="start_time" value="{$start_time?$start_time:'';}" autocomplete="off">
</div>
<div class="layui-input-inline" style="margin-right: 5px;width: 10px;">
<label class="layui-form-mid">-</label>
</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="end_time" name="end_time" value="{$end_time?$end_time:'';}" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<div class="layui-inline">
<button class="btn btn-success btn-sm" type="submit" >查询</button>
</div>
<div class="layui-inline">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>流水单号(20位)</th>
<th>会员昵称</th>
<th>会员编号</th>
<th>手机号码</th>
<th>来源类型</th>
<th>来源单号</th>
<th>变动总数</th>
<th>剩余总数</th>
<th>变动时间</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>{$item.log_sn}</td>
<td>{$item.nickname}</td>
<td>{$item.user_sn}</td>
<td>{$item.mobile}</td>
<td>{$item.source_type_text}</td>
<td>{$item.source_sn}</td>
<td>{$item.change_amount}</td>
<td>{$item.left_amount}</td>
<td>{$item.create_time}</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
<script type="text/javascript">
layui.use(['form','table'], function(){
var form = layui.form;
form.render('select');
});
//日期时间范围
laydate.render({
elem: '#start_time'
,type: 'datetime'
,trigger: 'click'
});
//日期时间范围
laydate.render({
elem: '#end_time'
,type: 'datetime'
,trigger: 'click'
});
</script>
{/block}

View File

@ -0,0 +1,125 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="操作/URL/IP">
</div>
<div class="form-group">
<select name="admin_user_id" id="admin_user_id" class="form-control input-sm">
<option value="">选择用户</option>
{foreach name='admin_user_list' id='item'}
<option value="{$item.id}"
{if isset($admin_user_id)&& $admin_user_id==$item.id}selected{/if}
>
{$item.nickname}[{$item.username}]
</option>
{/foreach}
</select>
</div>
<script>
$('#admin_user_id').select2();
</script>
<div class="form-group">
<input value="{$create_time_range ?? '' ;}"
name="create_time_range" id="create_time_range" class="form-control input-sm date-range" placeholder="日期">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>ID</th>
<th>用户</th>
<th>操作</th>
<th>URL</th>
<th>请求方式</th>
<th>IP</th>
<th>日期</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name='data' item='list'}
<tr>
<td>{$list.id}</td>
<td>{$list->adminUser->nickname}</td>
<td>{$list.name}</td>
<td>{$list.url}</td>
<td>{$list.log_method}</td>
<td>{$list.log_ip}</td>
<td>{$list.create_time}</td>
<td class="td-do">
<a data-id="{$list.id}" data-url="view" data-confirm="2" data-type="2"
class="btn btn-default btn-xs AjaxButton" title="查看详情" data-toggle="tooltip">
<i class="fa fa-eye"></i>
</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
<script>
laydate.render({
elem: '.date-range'
,range: true
,type:'datetime'
});
</script>
{/block}

View File

@ -0,0 +1,53 @@
{include file='public/head_css'}
{include file='public/head_js'}
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body table-responsive no-padding">
<table class="table table-bordered table-striped">
<tbody>
<tr>
<th colspan="4" class="text-bold text-center">日志摘要</th>
</tr>
<tr>
<td class="text-bold">日志ID</td>
<td>{$data.id}</td>
</tr>
<tr>
<td class="text-bold">操作用户</td>
<td>{$data->adminUser->nickname}</td>
</tr>
<tr>
<td class="text-bold">操作</td>
<td>{$data.name}</td>
</tr>
<tr>
<td class="text-bold">url</td>
<td>{$data.url}</td>
</tr>
<tr>
<td class="text-bold">类型</td>
<td>{$data.log_method}</td>
</tr>
<tr>
<td class="text-bold">ip</td>
<td>{$data.log_ip}</td>
</tr>
<tr>
<td class="text-bold">日期</td>
<td>{$data.create_time}</td>
</tr>
<tr style="border-top:2px solid #d2d6de;">
<th colspan="2" class="text-bold text-center">数据详情</th>
</tr>
<tr>
<td colspan="2" >
<pre>{$data.adminLogData.data}</pre>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,213 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<form id="dataForm" class="dataForm form-horizontal" action="" method="post"
enctype="multipart/form-data">
<div class="box-body">
<div class="fields-group">
<div class="form-group">
<label for="parent_id" class="col-sm-2 control-label">上级菜单</label>
<div class="col-sm-10 col-md-4">
<select name="parent_id" id="parent_id" class="form-control select2">
<option value="0">/</option>
{$parents|raw}
</select>
</div>
</div>
<script>
$('#parent_id').select2();
</script>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">名称</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="name" name="name" value="{$data.name|default=''}"
class="form-control" placeholder="请输入菜单名称">
</div>
</div>
<div class="form-group">
<label for="url" class="col-sm-2 control-label">url</label>
<div class="col-sm-10 col-md-4">
<input maxlength="100" id="url" name="url" value="{$data.url|default=''}"
class="form-control" placeholder="菜单url">
</div>
</div>
<div class="form-group">
<label for="icon" class="col-sm-2 control-label">图标</label>
<div class="col-sm-10 col-md-4">
<div class="input-group iconpicker-container">
<span class="input-group-addon"><i class="fa fa-pencil"></i></span>
<input maxlength="30" id="icon" name="icon"
value="{$data.icon|default='fa-list'}" class="form-control "
placeholder="请输入图标class">
</div>
</div>
</div>
<script>
$('#icon').iconpicker({placement: 'bottomLeft'});
</script>
<div class="form-group">
<label for="sort_id" class="col-sm-2 control-label">排序</label>
<div class="col-sm-10 col-md-4">
<div class="input-group">
<input max="9999" min="1" type="number" id="sort_id" name="sort_id"
value="{$data.sort_id|default='1000'}"
class="form-control input-number field-number" placeholder="默认1000">
</div>
</div>
</div>
<script>
$('#sort_id')
.bootstrapNumber({
upClass: 'success',
downClass: 'primary',
center: true
});
</script>
<div class="form-group">
<label for="is_show" class="col-sm-2 control-label">是否显示</label>
<div class="col-sm-10 col-md-4">
<input class="input-switch" id="is_show" value="1"
{if !isset($data) || ($data.is_show==1)}checked{/if} type="checkbox"/>
<input class="switch" name="is_show" value="{$data.is_show|default='1'}"
placeholder="" hidden/>
</div>
</div>
<script>
$('#is_show').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script>
<div class="form-group">
<label for="log_method" class="col-sm-2 control-label">日志请求方式</label>
<div class="col-sm-10 col-md-4">
<select name="log_method" id="log_method" class="form-control select2">
{foreach name='log_method' item='item'}
<option value="{$item}" {if isset($data) && $data.log_method==$item}selected{/if}>
{$item}
</option>
{/foreach}
</select>
</div>
</div>
<script>
$('#log_method').select2();
</script>
{if !isset($data)}
<div class="form-group">
<label for="is_more" class="col-sm-2 control-label">是否自动生成增删改菜单</label>
<div class="col-sm-10 col-md-4">
<input id="is_more" class="input-switch" placeholder="" type="checkbox"/>
<input class="switch" name="is_more" value="0" hidden/>
</div>
</div>
<script>
$('#is_more').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script>
<div class="form-group">
<label for="more_name" class="col-sm-2 control-label">增删改操作名称</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="more_name" name="more_name"
value="{$data.more_name|default=''}" class="form-control"
placeholder="请输入操作名称">
</div>
</div>
{/if}
</div>
</div>
<!--表单底部-->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
$("#dataForm").validate({
rules: {
name: {
required: true,
},
url: {
required: true
},
icon: {
required: true
},
sort_id: {
required: true
}
},
messages: {
name: {
required: "名称不能为空",
},
url: {
required: "url不能为空",
},
icon: {
required: "图标不能为空",
},
sort_id: {
required: "排序不能为空",
},
},
});
</script>
{/block}

View File

@ -0,0 +1,51 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box">
<!--列表头部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据" data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked" data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新" data-id="checked" data-url="{:url('del')}">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<!--数据内容-->
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox" placeholder="全选/取消">
</th>
<th>ID</th>
<th>菜单名称</th>
<th>url</th>
<th>父级ID</th>
<th>图标</th>
<th>排序</th>
<th>状态</th>
<th>日志记录方式</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{$data|raw}
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,137 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
{css href="__ADMIN_CSS__/access.css" /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<div class="box-header with-border">
<h3 class="box-title">【{$data->name|raw}】授权</h3>
<label class="checkbox" for="check_all">
<input class="checkbox-inline" type="checkbox" name="check_all" id="check_all">全选
</label>
</div>
<div class="box-body" id="all_check">
<form id="dataForm" class="form-horizontal dataForm" action="" method="post" enctype="multipart/form-data">
<div class="box-body">
<div class="table_full">
<table width="100%" cellspacing="0">
<tbody>
{$html|raw}
</tbody>
</table>
</div>
</div>
<!--表单底部-->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<script>
$("#check_all").click(function(){
if(this.checked){
$("#all_check").find(":checkbox").prop("checked", true);
}else{
$("#all_check").find(":checkbox").prop("checked", false);
}
});
function checkNode(obj) {
var level_bottom;
var chk = $("input[type='checkbox']");
var count = chk.length;
var num = chk.index(obj);
var level_top = level_bottom = chk.eq(num).attr('level');
for (var i = num; i >= 0; i--) {
var le = chk.eq(i).attr('level');
if (eval(le) < eval(level_top)) {
chk.eq(i).prop("checked", true);
level_top = level_top - 1;
}
}
for (var j = num + 1; j < count; j++) {
le = chk.eq(j).attr('level');
if (chk.eq(num).prop("checked")) {
if (eval(le) > eval(level_bottom)) {
chk.eq(j).prop("checked", true);
}
else if (eval(le) == eval(level_bottom)) {
break;
}
} else {
if (eval(le) > eval(level_bottom)) {
chk.eq(j).prop("checked", false);
} else if (eval(le) == eval(level_bottom)) {
break;
}
}
}
var all_length = $("input[name='menu_id[]']").length;
var checked_length = $("input[name='menu_id[]']:checked").length;
console.log(all_length);
console.log(checked_length);
if(all_length==checked_length){
$("#check_all").prop("checked",true);
}else{
$("#check_all").prop("checked",false);
}
}
</script>
</div>
</section>
<script>
$("#dataForm").validate({
rules: {
'url[]': {
required: true
}
},
messages: {
'url[]': {
required: "请选择权限",
},
},
});
</script>
{/block}

View File

@ -0,0 +1,112 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<form id="dataForm" class="form-horizontal dataForm" action="" method="post"
enctype="multipart/form-data">
<div class="box-body">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">名称</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="name" name="name" value="{$data.name|default=''}"
class="form-control" placeholder="请输入名称">
</div>
</div>
<div class="form-group">
<label for="description" class="col-sm-2 control-label">简介</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="description" name="description"
value="{$data.description|default=''}" class="form-control" placeholder="请输入简介">
</div>
</div>
<div class="form-group">
<label for="status" class="col-sm-2 control-label">启用状态</label>
<div class="col-sm-10 col-md-4">
<input class="input-switch" id="status" value="1" {if(!isset($data) ||$data.status==1)}checked{/if} type="checkbox" />
<input class="switch field-switch" placeholder="启用状态" name="status" value="{$data.status|default='1'}" hidden />
</div>
</div>
<script>
$('#status').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script>
</div>
<!--表单底部-->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
$("#dataForm").validate({
rules: {
name: {
required: true,
},
description: {
required: true
}
},
messages: {
name: {
required: "名称不能为空",
},
description: {
required: "简介不能为空",
}
},
});
</script>
{/block}

View File

@ -0,0 +1,153 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="名称/简介">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据"
data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked"
data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm AjaxButton" data-toggle="tooltip" title="启用选中数据"
data-confirm-title="启用确认" data-confirm-content="您确定要启用选中的数据吗?" data-id="checked"
data-url="{:url('enable')}">
<i class="fa fa-circle"></i> 启用
</a>
<a class="btn btn-warning btn-sm AjaxButton" data-toggle="tooltip" title="禁用选中数据"
data-confirm-title="禁用确认" data-confirm-content="您确定要禁用选中的数据吗?" data-id="checked"
data-url="{:url('disable')}">
<i class="fa fa-circle"></i> 禁用
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新"
data-id="checked" data-url="{:url('del')}">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox"
placeholder="全选/取消">
</th>
<th>ID</th>
<th>名称</th>
<th>简介</th>
<th>是否启用</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox"
data-id="{$item.id}" class="checkbox data-list-check" value="{$item.id}"
placeholder="选择/取消">
</td>
<td>{$item.id}</td>
<td>{$item.name}</td>
<td>{$item.description}</td>
<td>{$item.status_text}</td>
<td class="td-do">
<a href="{:url('admin_role/access',['id'=>$item.id])}"
class="btn btn-warning btn-xs" data-toggle="tooltip" title="授权">
<i class="fa fa-key"></i>
</a>
<a href="{:url('admin_role/edit',['id'=>$item.id])}"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除"
data-id="{$item.id}" data-confirm-title="删除确认"
data-confirm-content='您确定要删除ID为 <span class="text-red">{$item.id}</span> 的数据吗'
data-url="{:url('del')}">
<i class="fa fa-trash"></i>
</a>
{if $item.status==1}
<a class="btn btn-warning btn-xs AjaxButton" data-toggle="tooltip" title="禁用"
data-id="{$item.id}" data-confirm-title="禁用确认"
data-confirm-content='您确定要禁用ID为 <span class="text-red">{$item.id}</span> 的数据吗'
data-url="{:url('disable')}">
<i class="fa fa-circle"></i>
</a>
{else/}
<a class="btn btn-success btn-xs AjaxButton" data-toggle="tooltip" title="启用"
data-id="{$item.id}" data-confirm-title="启用确认"
data-confirm-content='您确定要启用ID为 <span class="text-red">{$item.id}</span> 的数据吗'
data-url="{:url('enable')}">
<i class="fa fa-circle"></i>
</a>
{/if}
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,155 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<form id="dataForm" class="form-horizontal dataForm" action="" method="post"
enctype="multipart/form-data">
<div class="box-body">
<div class="form-group">
<label for="role" class="col-sm-2 control-label">角色</label>
<div class="col-sm-10 col-md-4">
<select name="role[]" id="role" class="form-control field-multi-select"
multiple="multiple">
{foreach name='role' item='item'}
<option value="{$item.id}" {if isset($data) && in_array($item.id,$data.role)}selected{/if}>
{$item.name}
</option>
{/foreach}
</select>
</div>
</div>
<script>
$('#role').select2();
</script>
<div class="form-group">
<label for="nickname" class="col-sm-2 control-label">昵称</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="nickname" name="nickname" value="{$data.nickname|default=''}"
class="form-control" placeholder="请输入昵称">
</div>
</div>
<div class="form-group">
<label for="username" class="col-sm-2 control-label">账号</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="username" autocomplete="off" name="username"
value="{$data.username|default=''}" class="form-control" placeholder="请输入账号">
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10 col-md-4">
<input maxlength="255" id="password" autocomplete="off" type="password" name="password"
value="{$data.password|default=''}" class="form-control" placeholder="请输入密码">
</div>
</div>
<div class="form-group">
<label for="status" class="col-sm-2 control-label">启用状态</label>
<div class="col-sm-10 col-md-4">
<input class="input-switch" id="status" value="1" {if(!isset($data)
||$data.status==1)}checked{/if} type="checkbox"/>
<input class="switch field-switch" name="status" value="{$data.status|default='1'}"
hidden/>
</div>
</div>
<script>
$('#status').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script>
</div>
<!--表单底部-->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
$("#dataForm").validate({
rules: {
nickname: {
required: true,
minlength: 2
},
username: {
required: true,
minlength: 2
},
password: {
required: true,
minlength: 6
},
},
messages: {
nickname: {
required: "请输入昵称",
minlength: "名称长度不能小于2"
},
username: {
required: "请输入账号",
minlength: "用户名长度不能小于2"
},
password: {
required: "请输入密码",
minlength: "密码长度不能小于6"
},
},
});
</script>
{/block}

View File

@ -0,0 +1,148 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="昵称/账号">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据" data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked" data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm AjaxButton" data-toggle="tooltip" title="启用选中数据"
data-confirm-title="启用确认" data-confirm-content="您确定要启用选中的数据吗?" data-id="checked"
data-url="{:url('enable')}">
<i class="fa fa-circle"></i> 启用
</a>
<a class="btn btn-warning btn-sm AjaxButton" data-toggle="tooltip" title="禁用选中数据"
data-confirm-title="禁用确认" data-confirm-content="您确定要禁用选中的数据吗?" data-id="checked"
data-url="{:url('disable')}">
<i class="fa fa-circle"></i> 禁用
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新" data-id="checked" data-url="{:url('del')}">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox" placeholder="全选/取消">
</th>
<th>ID</th>
<th>昵称</th>
<th>账号</th>
<th>角色</th>
<th>是否启用</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox"
data-id="{$item.id}" class="checkbox data-list-check" value="{$item.id}"
placeholder="选择/取消">
</td>
<td>{$item.id}</td>
<td>{$item.nickname}</td>
<td>{$item.username}</td>
<td>
{foreach name='item.role_text' id='role'}
<small class="label bg-blue">{$role}</small>
{/foreach}
</td>
<td>{$item.status_text}</td>
<td class="td-do">
<a href="{:url('admin_user/edit',['id'=>$item.id])}"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除" data-id="{$item.id}" data-confirm-title="删除确认" data-confirm-content='您确定要删除ID为 <span class="text-red">{$item.id}</span> 的数据吗' data-url="{:url('del')}">
<i class="fa fa-trash"></i>
</a>
{if $item.status==1}
<a class="btn btn-warning btn-xs AjaxButton" data-toggle="tooltip" title="禁用"
data-id="{$item.id}" data-confirm-title="禁用确认"
data-confirm-content='您确定要禁用ID为 <span class="text-red">{$item.id}</span> 的数据吗'
data-url="{:url('disable')}">
<i class="fa fa-circle"></i>
</a>
{else/}
<a class="btn btn-success btn-xs AjaxButton" data-toggle="tooltip" title="启用"
data-id="{$item.id}" data-confirm-title="启用确认"
data-confirm-content='您确定要启用ID为 <span class="text-red">{$item.id}</span> 的数据吗'
data-url="{:url('enable')}">
<i class="fa fa-circle"></i>
</a>
{/if}
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,168 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-3">
<div class="box box-primary">
<div class="box-body box-profile">
<img class="profile-user-img img-responsive img-circle" src="{$admin.user.avatar}" alt="头像">
<h3 class="profile-username text-center">{$admin.user.nickname}</h3>
<p class="text-muted text-center">{$admin.user.username}</p>
<p>
{foreach name='admin.user.role_text' id='role'}
<small class="label bg-blue">{$role}</small>
{/foreach}
</p>
</div>
</div>
</div>
<div class="col-md-9">
<div class="nav-tabs-custom">
<ul class="nav nav-tabs">
<li class="active"><a href="#profile" data-toggle="tab" aria-expanded="true">个人信息</a></li>
<li class=""><a href="#privacy" data-toggle="tab" aria-expanded="false">修改密码</a></li>
<li class=""><a href="#avatars" data-toggle="tab" aria-expanded="false">修改头像</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="profile">
<form class="dataForm form-horizontal" id="dataForm1" action="" method="post">
<input type="hidden" value="profile" name="update_type" placeholder="请勿修改">
<div class="form-group">
<label for="nickname" class="col-sm-2 control-label">昵称</label>
<div class="col-sm-10 col-md-4">
<input class="form-control" value="{$admin.user.nickname}" name="nickname"
id="nickname" maxlength="30"
placeholder="请输入昵称">
</div>
</div>
{:token()}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-danger">保存</button>
</div>
</div>
</form>
</div>
<div class="tab-pane" id="privacy">
<form class="dataForm form-horizontal" id="dataForm2" action="" method="post">
<input type="hidden" value="password" name="update_type" placeholder="请勿修改">
<div class="form-group">
<label for="password" class="col-sm-2 control-label">当前密码</label>
<div class="col-sm-10 col-md-4">
<input type="password" autocomplete='password' class="form-control" name="password" id="password"
placeholder="请输入当前密码">
</div>
</div>
<div class="form-group">
<label for="new_password" class="col-sm-2 control-label">新密码</label>
<div class="col-sm-10 col-md-4">
<input type="password" class="form-control" autocomplete='off' name="new_password" id="new_password"
placeholder="请输入新密码">
</div>
</div>
<div class="form-group">
<label for="renew_password" class="col-sm-2 control-label">确认新密码</label>
<div class="col-sm-10 col-md-4">
<input type="password" class="form-control" autocomplete='off' name="renew_password" id="renew_password"
placeholder="再次输入新密码">
</div>
</div>
{:token()}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-danger">保存</button>
</div>
</div>
</form>
</div>
<div class="tab-pane" id="avatars">
<form class="dataForm form-horizontal" id="dataForm3" action="" method="post" enctype="multipart/form-data">
<input type="hidden" value="avatar" name="update_type" placeholder="请勿淘气修改">
<div class="form-group">
<label for="avatar" class="col-sm-2 control-label">头像</label>
<div class="col-sm-10 col-md-4">
<input type="file" class="form-control" name="avatar" id="avatar"
placeholder="头像可空">
</div>
</div>
{:token()}
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-danger">保存</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
<script>
$("#dataForm1").validate({
rules: {
nickname: {
required: true,
minlength: 2,
maxlength: 10
}
},
messages: {
nickname: {
required: "请输入昵称",
minlength: "昵称长度不能小于2",
maxlength: "昵称长度不能大于10"
}
}
});
$("#dataForm2").validate({
rules: {
password: {
required: true,
minlength: 6
},
new_password: {
required: true,
minlength: 6
},
renew_password: {
required: true,
minlength: 6
}
},
messages: {
password: {
required: "请输入当前密码",
minlength: "当前密码长度不能小于6"
},
new_password: {
required: "请输入新密码",
minlength: "新密码长度不能小于6"
},
renew_password: {
required: "请输入确认新密码",
minlength: "确认新密码长度不能小于6"
}
}
});
$("#dataForm3").validate({
rules: {
avatar: {
required: true
}
},
messages: {
avatar: {
required: "请选择文件"
}
}
});
</script>
{/block}

View File

@ -0,0 +1,26 @@
<div class="row" style="margin-bottom: 15px;">
<div class="col-sm-8">
<input type="text" id="captcha" class=" form-control" name="captcha" placeholder="验证码" maxlength="6">
</div>
<div class="col-sm-4" style="padding-left: 0">
<img style="width: 100%" src="{:url('auth/captcha')}" alt="图形验证码" id="captchaImg" height="34" onclick="refreshCaptcha('captchaImg')">
</div>
</div>
<script>
function refreshCaptcha(dom) {
let $dom = $('#'+dom);
$dom.attr('src','{:url("auth/captcha")}?'+img_name_random());
}
//图片后缀随机数
function img_name_random() {
var rand_one = parseInt(100 * Math.random());
var rand_two = parseInt(100 * Math.random());
return String(rand_one) + String(rand_two);
}
</script>

View File

@ -0,0 +1,53 @@
{js href="__ADMIN_PLUGINS__/gee-test/gee-test.min.js" /}
<div id="wait" class="text-center" style="height: 44px;font-size: 18px;">
正在加载验证码...
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group text-center">
<div id="embed-captcha" style="width: 300px;margin: 0 auto;;"></div>
</div>
</div>
</div>
<script>
var handlerEmbed = function (captchaObj) {
$("#loginButton").click(function (e) {
var validate = captchaObj.getValidate();
if (!validate) {
layer.msg('请先完成验证',{icon:2});
e.preventDefault();
}
});
// 将验证码加到id为captcha的元素里,同时会有三个input的值:geetest_challenge, geetest_validate, geetest_seccode
captchaObj.appendTo("#embed-captcha");
captchaObj.onReady(function () {
//$("#loginButton").attr("disabled",false);
$("#wait").hide();
});
};
$(function () {
$.ajax({
// 获取id,challenge,success(是否启用failback)
url: "{:url('auth/initGeeTest')}",
type: "POST",
dataType: "JSON",
success: function (result) {
let data = result.data;
// 使用initGeetest接口
// 参数1:配置参数
// 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
initGeetest({
with: '300px',
gt: data.gt,
challenge: data.challenge,
new_captcha: data.new_captcha,
product: "embed", // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效
offline: !data.success // 表示用户后台检测极验服务器是否宕机,一般不需要关注
}, handlerEmbed);
}
});
});
</script>

View File

@ -0,0 +1,160 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
<title>{$admin.title} | {$admin.name|default='OneWeekBackend'}</title>
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
{css href="__ADMIN_PLUGINS__/bootstrap/css/bootstrap.min.css" /}
{css href="__ADMIN_PLUGINS__/font-awesome/css/font-awesome.min.css" /}
{css href="__ADMIN_CSS__/AdminLTE.min.css" /}
{css href="__ADMIN_CSS__/admin.css" /}
<!-- 如果有登录背景 -->
{if $login_config.background}
<style>
.login-page{
background-color: #ececec;
background-image: url({$login_config.background});
background-repeat: no-repeat;
background-size: cover;
background-attachment: fixed;
background-position: 50% 50%;
}
</style>
{/if}
<script>
var adminDebug = {$debug};
</script>
{js href="__ADMIN_PLUGINS__/jquery/jquery.min.js" /}
{js href="__ADMIN_PLUGINS__/bootstrap/js/bootstrap.min.js" /}
{js href="__ADMIN_PLUGINS__/jquery-validation/jquery.validate.min.js" /}
{js href="__ADMIN_PLUGINS__/jquery-validation/localization/messages_zh.min.js" /}
{js href="__ADMIN_PLUGINS__/layer/layer.js" /}
{js href="__ADMIN_JS__/admin.js" /}
<!--[if lt IE 9]>
{js href="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js" /}
{js href="https://oss.maxcdn.com/respond/1.4.2/respond.min.js" /}
<![endif]-->
</head>
<body class="hold-transition login-page">
<div class="login-box">
<div class="login-logo">
<a>{$admin.name|default=''}</a>
</div>
<div class="login-box-body">
<p class="login-box-msg">登录</p>
<form class="dataForm" id="dataForm" action="" method="post">
<div class="form-group has-feedback">
<input name="username" id="username" type="text" class="form-control" placeholder="用户名">
<span class="glyphicon glyphicon-user form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input name="password" id="password" type="password" class="form-control" placeholder="密码">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
{if $login_config.token}
{:token()}
{/if}
{if $login_config.captcha==1}
{include file='auth/captcha' /}
{else/}
{if $login_config.captcha==2}
{include file='auth/gee_test' /}
{/if}
{/if}
<div class="row">
<div class="col-xs-8">
<div class="checkbox">
<label>
<input id="remember" name="remember" value="1" type="checkbox"> 记住我
</label>
</div>
</div>
<div class="col-xs-4">
{:token()}
<button type="submit" id="loginButton" class="btn btn-primary btn-block btn-flat">登录</button>
</div>
</div>
</form>
</div>
</div>
<div id="browser_warning" style="display: none">
<div class=" margin text-center">
<p class="text-red ">请使用现代浏览器(谷歌浏览器、360极速或其他国产浏览器极速模式)操作本后台!</p>
<a class="btn btn-success" target="_blank" href="https://www.google.cn/chrome/" data-toggle="tooltip"
title="点击去下载谷歌浏览器">谷歌浏览器</a>
<a class="btn btn-success" target="_blank" href="https://browser.360.cn/ee/index.html" data-toggle="tooltip"
title="点击去下载360极速浏览器">360极速浏览器</a>
<a class="btn btn-success" target="_blank" href="https://browser.qq.com/" title="点击去下载QQ浏览器"
data-toggle="tooltip">QQ浏览器</a>
</div>
</div>
<script>
$(document).ready(function () {
$("#dataForm").validate({
rules: {
username: {
required: true,
minlength: 2
},
password: {
required: true,
minlength: 6
},
},
messages: {
username: {
required: "请输入用户名",
minlength: "用户名长度不能小于2"
},
password: {
required: "请输入密码",
minlength: "密码长度不能小于6"
},
}
});
$('#username').focus();
});
checkBrowser();
/*检查浏览器*/
function checkBrowser() {
if (isIE()) {
console.log('古代浏览器');
layer.open({
type: 1,
content: $('#browser_warning').html(),
icon: 5,
title: '警告',
area: ['500px', '300px'],
closeBtn: 0,
moveType: 1,
resize: false
});
} else {
console.log('现代浏览器');
}
}
function isIE() {
return !!window.ActiveXObject || "ActiveXObject" in window;
}
</script>
</body>
</html>

View File

@ -0,0 +1,272 @@
{extend name="layout1" /}
{block name='content'}
<style>
.layui-form-label{
width:180px;
}
.div-flex {
display: flex;
align-items: center;
justify-content: left;
}
.width-160 {
width: 200px;
float: left;
display: block;
padding: 9px 15px;
font-weight: 400;
}
.layui-table th {
text-align: center;
}
.table-margin{
margin-left: 50px;
margin-right: 50px;
text-align: center;
}
.image{
height:50px;
width: 50px;
}
.mt50{
margin-left: 50px;
}
</style>
<div class="layui-card-body" >
<!--基本信息-->
<div class="layui-form" lay-filter="layuiadmin-form-order" id="layuiadmin-form-order" >
<input type="hidden" class="order_id" name="order_id" value="{$detail.id}">
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>订单信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">订单编号:</label>
<div class="width-160">{$detail.order_sn}</div>
<label class="layui-form-label ">订单状态:</label>
<div class="width-160">{$detail.order_status_text}</div>
<label class="layui-form-label ">下单时间:</label>
<div class="width-160">{$detail.create_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>会员信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">会员编号:</label>
<div class="width-160">{$detail.user.sn}</div>
<label class="layui-form-label ">会员昵称:</label>
<div class="width-160">{$detail.user.nickname}</div>
<label class="layui-form-label ">手机号码:</label>
<div class="width-160">{$detail.user.mobile}</div>
<label class="layui-form-label ">注册时间:</label>
<div class="width-160">{$detail.user.create_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>取货信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">取货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">取货地址:</label>
<div class="width-160">{$detail.address}</div>
<label class="layui-form-label ">取货时间:</label>
<div class="width-160">{$detail.takeparts_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>退货信息</legend>
</fieldset>
</div>
{eq name="$detail.is_return" value="1"}
<div class="layui-form-item div-flex">
<label class="layui-form-label ">退货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">退货地址:</label>
<div class="width-160">{$detail.address}</div>
</div>
{else/}
<div class="layui-form-item div-flex">
<label class="layui-form-label"></label>
<div class="width-160">无需退回</div>
</div>
{/eq}
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>商品信息</legend>
</fieldset>
</div>
<div class="layui-form-item table-margin">
<table class="layui-table">
<colgroup>
<col width="250">
<col width="200">
<col width="200">
<col width="100">
<col width="200">
<col width="100">
</colgroup>
<thead>
<tr>
<th>图片</th>
<th>商品名称</th>
<th>商品信息</th>
<th>估计</th>
<th>备注</th>
<th>状态</th>
</tr>
</thead>
<tbody>
{foreach $detail.consignment_order_goods as $k => $goods}
<tr>
<td>
<div style="text-align: left">
{foreach $goods.img_list as $k1 => $img}
<div style="float:left; margin-right: 10px;">
<img src="{$img.ori_image}" class="image-show image" >
</div>
{/foreach}
</div>
</td>
<td>
<div style="text-align: left">
{$goods.goods_name}
</div>
</td>
<td>
<div style="text-align: left">
<div class="layui-col-md9">
<p style="margin-top: 10px">购买价格:{$goods.goods_price}</p>
<p>尺寸:{$goods.item_value}</p>
<p>品牌:{$goods.brand_name}</p>
<p>品类:{$goods.class_name}</p>
<p>品相:{$goods.phase_name}</p>
<p>购买渠道:{$goods.channel_name}</p>
</div>
</div>
</td>
<td>
<div style="text-align: left">
¥{$goods.evaluation_price}
</div>
</td>
<td>
<div style="text-align: left">
{$goods.refund_remarks}
</div>
</td>
<td>
<div style="text-align: left">
{$goods.refund_status_text}
</div>
</td>
</tr>
{/foreach}
<tr>
<td colspan="6" style="text-align: right;">
<p>商品总估计金额:¥{$detail.total_amount}</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>订单操作</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex ">
<div class="layui-input-block ">
{eq name="$detail.order_status" value="0"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 " id="examine">审核</button>
{/eq}
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary width_160 " id="back">返回</button>
</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>订单流程</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<div class="layui-input-block ">
<ul class="layui-timeline">
{volist name="$detail.logs" id="vo"}
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h3 class="layui-timeline-title">{$vo.remark}({$vo.create_time})</h3>
<!--日志备注-->
{notempty name="$vo.extra"}
<h4>{$vo.extra}</h4>
{/notempty}
</div>
</li>
{/volist}
</ul>
</div>
</div>
</div>
</div>
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like'], function () {
var $ = layui.$;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,400);
});
$('#back').click(function () {
var index=parent.layer.getFrameIndex(window.name); //获取当前窗口的name
parent.layer.close(index);
parent.layui.table.reload('order-lists');
return true;
});
//发货
$('#examine').click(function () {
var id = $('.order_id').val();
layer.open({
type: 2
,title: '订单审核'
,content: '{:url("consignment_order/examine")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
});
</script>
{/block}

View File

@ -0,0 +1,246 @@
{extend name="layout1" /}
{block name='content'}
<style>
.layui-form-label{
width:180px;
}
.div-flex {
display: flex;
align-items: center;
justify-content: left;
}
.width-160 {
width: 200px;
float: left;
display: block;
padding: 9px 15px;
font-weight: 400;
}
.layui-table th {
text-align: center;
}
.table-margin{
margin-left: 50px;
margin-right: 50px;
text-align: center;
}
.image{
height:50px;
width: 50px;
}
.mt50{
margin-left: 50px;
}
</style>
<div class="layui-card-body" >
<!--基本信息-->
<div class="layui-form" lay-filter="layuiadmin-form-order" id="layuiadmin-form-order" >
<input type="hidden" class="order_id" name="order_id" value="{$detail.id}">
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>取货信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">取货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">取货地址:</label>
<div class="width-160">{$detail.address}</div>
<label class="layui-form-label ">取货时间:</label>
<div class="width-160">{$detail.takeparts_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>退货信息</legend>
</fieldset>
</div>
{eq name="$detail.is_return" value="1"}
<div class="layui-form-item div-flex">
<label class="layui-form-label ">退货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">退货地址:</label>
<div class="width-160">{$detail.address}</div>
</div>
{else/}
<div class="layui-form-item div-flex">
<label class="layui-form-label"></label>
<div class="width-160">无需退回</div>
</div>
{/eq}
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>商品信息</legend>
</fieldset>
</div>
<div class="layui-form-item table-margin">
<table class="layui-table">
<colgroup>
<col width="250">
<col width="200">
<col width="200">
<col width="100">
</colgroup>
<thead>
<tr>
<th>图片</th>
<th>商品名称</th>
<th>商品信息</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach $detail.consignment_order_goods as $k => $goods}
<tr>
<td>
<div style="text-align: left">
{foreach $goods.img_list as $k1 => $img}
<div style="float:left; margin-right: 10px;">
<img src="{$img.ori_image}" class="image-show image" >
</div>
{/foreach}
</div>
</td>
<td>
<div style="text-align: left">
{$goods.goods_name}
</div>
</td>
<td>
<div style="text-align: left">
<div class="layui-col-md9">
<p style="margin-top: 10px">购买价格:{$goods.goods_price}</p>
<p>尺寸:{$goods.item_value}</p>
<p>品牌:{$goods.brand_name}</p>
<p>品类:{$goods.class_name}</p>
<p>品相:{$goods.phase_name}</p>
<p>购买渠道:{$goods.channel_name}</p>
</div>
</div>
</td>
<td>
{if condition="$goods.refund_status=='0' && $goods.is_confirm=='1'"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 agree" goods_id="{$goods.id}">同意</button>
<button type="submit" class="layui-btn layui-btn-sm layui-btn-danger width_160 refuse" goods_id="{$goods.id}">拒绝</button>
{/if}
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like'], function () {
var $ = layui.$;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,400);
});
//商家同意
$('.agree').click(function () {
var id=$(this).attr('goods_id');
layer.confirm(
"商品估价:"+"<input type=‘text’ name=‘evaluation_price’ id='evaluation_price' placeholder='请输入估价' autocomplete=‘off’ class=‘layui-input’ style='height:40px'>", {
btn: ['确认','取消'] //按钮
}, function(){
var evaluation_price = $('#evaluation_price').val();
if (evaluation_price == null || evaluation_price == undefined || evaluation_price == ''){
layer.msg('请填写估价!');
return false;
}
like.ajax({
url: '{:url("consignment_order/agree")}'
, data: {'id': id,'evaluation_price':evaluation_price}
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
if(res.data==1){
var index = parent.layer.getFrameIndex(window.name);
parent.location.reload();
parent.layer.close(index);
}else{
location.reload();
}
});
}else{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 2
, time: 1000
})
}
}
});
return false;
});
});
//商家拒绝
$('.refuse').click(function () {
var id=$(this).attr('goods_id');
layer.confirm(
"拒绝原因:"+"<textarea id='remark' name='remark' class='layui-textarea' type='text' style='height:100px'></textarea>", {
btn: ['确认','取消'] //按钮
}, function(){
var remark = $('#remark').val();
if (remark == null || remark == undefined || remark == ''){
layer.msg('请填写拒绝原因!');
return false;
}
like.ajax({
url: '{:url("consignment_order/refuse")}'
, data: {'id': id,'remark':remark}
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
if(res.data==1){
var index = parent.layer.getFrameIndex(window.name);
parent.location.reload();
parent.layer.close(index);
}else{
location.reload();
}
});
}else{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 2
, time: 1000
})
}
}
});
return false;
});
});
});
</script>
{/block}

View File

@ -0,0 +1,335 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<style type="text/css">
.layui-table-cell {
height: auto;
white-space: normal;
}
.layui-card-header.layuiadmin-card-header-auto {
padding-top: 15px;
padding-bottom: 15px;
height: auto;
}
.layui-form-label{ width:100px; }
</style>
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form-item">
<div class="layui-row">
<div class="layui-inline">
<label class="layui-form-label">订单搜索:</label>
<div class="layui-input-block">
<select name="search_key">
<option value="order_sn" {if isset($search_key) && $search_key=='order_sn'}selected{/if}>订单编号</option>
<option value="nickname" {if isset($search_key) && $search_key=='nickname'}selected{/if}>会员昵称</option>
<option value="user_mobile" {if isset($search_key) && $search_key=='user_mobile'}selected{/if}>会员手机号码</option>
<option value="user_sn" {if isset($search_key) && $search_key=='user_sn'}selected{/if}>会员编号</option>
</select>
</div>
</div>
<div class="layui-inline">
<input type="text" name="keyword" id="keyword" value="{$keyword?$keyword:'';}" placeholder="请输入搜索内容"
autocomplete="off" class="layui-input">
</div>
<div class="layui-inline">
<label class="layui-form-label">商品名称:</label>
<div class="layui-input-block">
<input type="text" name="goods_name" id="goods_name" value="{$goods_name?$goods_name:'';}" placeholder="请输入商品名称"
autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-row">
<div class="layui-inline">
<label class="layui-form-label">订单类型:</label>
<div class="layui-input-block">
<select name="order_type" id="order_type">
<option value="">全部</option>
<option value="0" {if isset($order_type) && $order_type=='0'}selected{/if}>审核中</option>
<option value="1" {if isset($order_type) && $order_type=='1'}selected{/if}>待上架</option>
<option value="2" {if isset($order_type) && $order_type=='2'}selected{/if}>已上架</option>
<option value="3" {if isset($order_type) && $order_type=='3'}selected{/if}>待客户确认</option>
<option value="4" {if isset($order_type) && $order_type=='4'}selected{/if}>客户已确认</option>
<option value="5" {if isset($order_type) && $order_type=='5'}selected{/if}>已取货</option>
<option value="6" {if isset($order_type) && $order_type=='6'}selected{/if}>部分退回</option>
<option value="7" {if isset($order_type) && $order_type=='7'}selected{/if}>全部退回</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">下单时间:</label>
<div class="layui-input-inline">
<div class="layui-input-inline">
<input type="text" name="start_time" class="layui-input" id="start_time"
placeholder="" autocomplete="off" value="{$start_time?$start_time:'';}">
</div>
</div>
<div class="layui-input-inline" style="margin-right: 5px;width: 20px;">
<label class="layui-form-mid">至</label>
</div>
<div class="layui-input-inline">
<input type="text" name="end_time" class="layui-input" id="end_time"
placeholder="" autocomplete="off" value="{$end_time?$end_time:'';}">
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<button class="btn btn-success btn-sm" type="submit" >查询</button>
</div>
<div class="layui-inline">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<div class="layui-table-cell" style="width:240px;text-align:center;">订单信息</div>
</th>
<th>
<div style="width:400px;text-align:center;">用户信息</div>
</th>
<th>
<div style="width:300px;text-align:center;">商品信息</div>
</th>
<th>
<div style="width:200px;text-align:center;">取货信息</div>
</th>
<th>
<div style="width:200px;text-align:center;">退货信息</div>
</th>
<th><div class="layui-table-cell" style="width:280px;text-align:center;">操作</div></th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td class="layui-table-col-special">
<div class="layui-table-cell laytable-cell-1-0-2">
<div class="layui-input-inline" style="text-align:left;width: 240px;">
<p>订单编号:{$item.order_sn}</p>
<p>订单状态:{$item.order_status_text}</p>
<p>订单金额:{$item.total_amount}</p>
<p>下单时间:{$item.create_time}</p>
</div>
</div>
</td>
<td class="layui-table-col-special">
<div class="layui-table-cell laytable-cell-1-0-2">
<img src="{$item.avatar}" style="height:80px;width: 80px;margin-right: 10px;" class="image-show">
<div class="layui-input-inline" style="text-align:left;width: 240px;">
<p>用户编号:{$item.sn}</p>
<p>用户昵称:{$item.nickname}</p>
<p>用户手机:{$item.mobile}</p>
</div>
</div>
</td>
<td class="layui-table-col-special">
{foreach name="item.consignment_order_goods" item="item1"}
<div style="text-align: left; width:300px" class="goods-data">
<div class="layui-input-inline layui-col-md8">
<span class="layui-col-md7 goods_name_hide">{$item1.goods_name}</span>
<span class="layui-col-md5">¥{$item1.goods_price}</span>
<br>
<span class="layui-col-md7 goods_name_hide">{$item1.item_value}</span>
</div>
</div>
{/foreach}
</td>
<td class="layui-table-col-special">
<div class="layui-table-cell laytable-cell-1-0-2">
<div class="layui-input-inline" style="text-align:left;width: 200px;">
<p>取货人:{$item.consignee}</p>
<p>手机号码:{$item.mobile}</p>
<p>取货地址:{$item.address}</p>
</div>
</div>
</td>
<td class="layui-table-col-special">
{eq name="$item.is_return" value="1"}
<div class="layui-table-cell laytable-cell-1-0-2">
<div class="layui-input-inline" style="text-align:left;width: 200px;">
<p>退货人:{$item.th_consignee}</p>
<p>手机号码:{$item.th_mobile}</p>
<p>退货地址:{$item.th_address}</p>
</div>
</div>
{else}
无需退回
{/eq}
</td>
<td>
<div class="layui-table-cell" style="width: 280px;">
<button type="submit" class="layui-btn layui-btn-sm layui-btn-primary width_160 detail" order_id="{$item.id}">查看详情</button>
{eq name="$item.order_status" value="0"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 examine" order_id="{$item.id}">审核</button>
{/eq}
{if condition="$item.order_status=='4'"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 pickup" order_id="{$item.id}">取货</button>
{/if}
{if condition="($item.order_status=='5' || $item.order_status=='6') && $item.is_return=='1'"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 return" order_id="{$item.id}">退回</button>
{/if}
{if condition="$item.order_status=='5' || $item.order_status=='6'"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 shelves" order_id="{$item.id}">上架</button>
{/if}
</div>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
<script>
layui.use('form', function(){
var form = layui.form;
form.render('select');
});
//日期时间范围
laydate.render({
elem: '#start_time'
,type: 'datetime'
,trigger: 'click'
});
//日期时间范围
laydate.render({
elem: '#end_time'
,type: 'datetime'
,trigger: 'click'
});
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like'], function () {
var $ = layui.$;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,600);
});
//查看详情
$('.detail').click(function () {
var id = $(this).attr('order_id');
layer.open({
type: 2
,title: '订单详情'
,content: '{:url("consignment_order/detail")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
//审核
$('.examine').click(function () {
var id = $(this).attr('order_id');
layer.open({
type: 2
,title: '订单审核'
,content: '{:url("consignment_order/examine")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
//取货
$('.pickup').click(function () {
var id = $(this).attr('order_id');
layer.open({
type: 2
,title: '订单取货'
,content: '{:url("consignment_order/pickup")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
//退回
$('.return').click(function () {
var id = $(this).attr('order_id');
layer.open({
type: 2
,title: '订单商品退回'
,content: '{:url("consignment_order/return")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
//上架
$('.shelves').click(function () {
var id = $(this).attr('order_id');
layer.open({
type: 2
,title: '订单商品上架'
,content: '{:url("consignment_order/shelves")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
});
</script>
{/block}

View File

@ -0,0 +1,244 @@
{extend name="layout1" /}
{block name='content'}
<style>
.layui-form-label{
width:180px;
}
.div-flex {
display: flex;
align-items: center;
justify-content: left;
}
.width-160 {
width: 200px;
float: left;
display: block;
padding: 9px 15px;
font-weight: 400;
}
.layui-table th {
text-align: center;
}
.table-margin{
margin-left: 50px;
margin-right: 50px;
text-align: center;
}
.image{
height:50px;
width: 50px;
}
.mt50{
margin-left: 50px;
}
</style>
<div class="layui-card-body" >
<!--基本信息-->
<div class="layui-form" lay-filter="layuiadmin-form-express" id="layuiadmin-form-express" >
<input type="hidden" class="order_id" name="order_id" value="{$detail.id}">
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>取货信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">取货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">取货地址:</label>
<div class="width-160">{$detail.address}</div>
<label class="layui-form-label ">取货时间:</label>
<div class="width-160">{$detail.takeparts_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>退货信息</legend>
</fieldset>
</div>
{eq name="$detail.is_return" value="1"}
<div class="layui-form-item div-flex">
<label class="layui-form-label ">退货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">退货地址:</label>
<div class="width-160">{$detail.address}</div>
</div>
{else/}
<div class="layui-form-item div-flex">
<label class="layui-form-label"></label>
<div class="width-160">无需退回</div>
</div>
{/eq}
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>商品信息</legend>
</fieldset>
</div>
<div class="layui-form-item table-margin">
<table class="layui-table">
<colgroup>
<col width="250">
<col width="200">
<col width="200">
<col width="100">
<col width="100">
</colgroup>
<thead>
<tr>
<th>图片</th>
<th>商品名称</th>
<th>商品信息</th>
<th>估价</th>
<th>状态</th>
</tr>
</thead>
<tbody>
{foreach $detail.consignment_order_goods as $k => $goods}
<tr>
<td>
<div style="text-align: left">
{foreach $goods.img_list as $k1 => $img}
<div style="float:left; margin-right: 10px;">
<img src="{$img.ori_image}" class="image-show image" >
</div>
{/foreach}
</div>
</td>
<td>
<div style="text-align: left">
{$goods.goods_name}
</div>
</td>
<td>
<div style="text-align: left">
<div class="layui-col-md9">
<p style="margin-top: 10px">购买价格:{$goods.goods_price}</p>
<p>尺寸:{$goods.item_value}</p>
<p>品牌:{$goods.brand_name}</p>
<p>品类:{$goods.class_name}</p>
<p>品相:{$goods.phase_name}</p>
<p>购买渠道:{$goods.channel_name}</p>
</div>
</div>
</td>
<th>
<div style="text-align: left">
{$goods.evaluation_price}
</div>
</th>
<td>
{if condition="$goods.is_confirm=='1'"}
<div style="text-align: left">
已同意估价
</div>
{elseif condition="$goods.is_confirm=='0'"/}
<div style="text-align: left">
未同意估价
</div>
{else condition="$goods.refund_status=='2'"/}
<div style="text-align: left">
{$goods.refund_remarks}
</div>
{/if}
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>取货物流</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex select-express">
<label class="layui-form-label ">快递公司:</label>
<div>
<input type="text" name="invoice_name" placeholder="请输入快递公司" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-form-item div-flex select-express" >
<label class="layui-form-label ">快递单号:</label>
<div>
<input type="text" name="invoice_no" placeholder="请输入快递单号" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-form-item div-flex ">
<div class="layui-input-block ">
<input type="button" class="layui-btn layui-btn-sm layui-btn-normal width_160" lay-submit lay-filter="send" id="send" value="取货">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary width_160 " id="back">返回</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like', 'form'], function () {
var $ = layui.$
, form = layui.form;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,600);
});
$('#back').click(function () {
var index=parent.layer.getFrameIndex(window.name); //获取当前窗口的name
parent.layer.close(index);
parent.layui.table.reload('order-lists');
return true;
});
//发货
form.on('submit(send)', function (data) {
var field = data.field;
like.ajax({
url: '{:url("consignment_order/pickuphandle")}'
, data: field
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
var index = parent.layer.getFrameIndex(window.name);
parent.location.reload();
parent.layer.close(index);
});
}else{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 2
, time: 1000
});
}
},
});
})
});
</script>
{/block}

View File

@ -0,0 +1,208 @@
{extend name="layout1" /}
{block name='content'}
<style>
.layui-form-label{
width:180px;
}
.div-flex {
display: flex;
align-items: center;
justify-content: left;
}
.width-160 {
width: 200px;
float: left;
display: block;
padding: 9px 15px;
font-weight: 400;
}
.layui-table th {
text-align: center;
}
.table-margin{
margin-left: 50px;
margin-right: 50px;
text-align: center;
}
.image{
height:50px;
width: 50px;
}
.mt50{
margin-left: 50px;
}
</style>
<div class="layui-card-body" >
<!--基本信息-->
<div class="layui-form" lay-filter="layuiadmin-form-order" id="layuiadmin-form-order" >
<input type="hidden" class="order_id" name="order_id" value="{$detail.id}">
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>取货信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">取货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">取货地址:</label>
<div class="width-160">{$detail.address}</div>
<label class="layui-form-label ">取货时间:</label>
<div class="width-160">{$detail.takeparts_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>退货信息</legend>
</fieldset>
</div>
{eq name="$detail.is_return" value="1"}
<div class="layui-form-item div-flex">
<label class="layui-form-label ">退货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">退货地址:</label>
<div class="width-160">{$detail.address}</div>
</div>
{else/}
<div class="layui-form-item div-flex">
<label class="layui-form-label"></label>
<div class="width-160">无需退回</div>
</div>
{/eq}
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>商品信息</legend>
</fieldset>
</div>
<div class="layui-form-item table-margin">
<table class="layui-table">
<colgroup>
<col width="250">
<col width="200">
<col width="200">
<col width="100">
</colgroup>
<thead>
<tr>
<th>图片</th>
<th>商品名称</th>
<th>商品信息</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach $detail.consignment_order_goods as $k => $goods}
<tr>
<td>
<div style="text-align: left">
{foreach $goods.img_list as $k1 => $img}
<div style="float:left; margin-right: 10px;">
<img src="{$img.ori_image}" class="image-show image" >
</div>
{/foreach}
</div>
</td>
<td>
<div style="text-align: left">
{$goods.goods_name}
</div>
</td>
<td>
<div style="text-align: left">
<div class="layui-col-md9">
<p style="margin-top: 10px">购买价格:{$goods.goods_price}</p>
<p>尺寸:{$goods.item_value}</p>
<p>品牌:{$goods.brand_name}</p>
<p>品类:{$goods.class_name}</p>
<p>品相:{$goods.phase_name}</p>
<p>购买渠道:{$goods.channel_name}</p>
</div>
</div>
</td>
<td>
{if condition="$goods.refund_status=='1'"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 return" goods_id="{$goods.id}">退回</button>
{/if}
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like'], function () {
var $ = layui.$;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,400);
});
//退回
$('.return').click(function () {
var id=$(this).attr('goods_id');
layer.confirm(
"物流公司:"+"<input type=‘text’ name=invoice_name id='invoice_name' placeholder='请输入物流公司' autocomplete=‘off’ class=‘layui-input’ style='height:30px'><br><br>"+
"物流单号:"+"<input type=‘text’ name=invoice_no id='invoice_no' placeholder='请输入物流单号' autocomplete=‘off’ class=‘layui-input’ style='height:30px'>", {
btn: ['确认','取消'] //按钮
}, function(){
var invoice_name = $('#invoice_name').val();
if (invoice_name == null || invoice_name == undefined || invoice_name == ''){
layer.msg('请填写物流公司!');
return false;
}
var invoice_no = $('#invoice_no').val();
if (invoice_no == null || invoice_no == undefined || invoice_no == ''){
layer.msg('请填写物流单号!');
return false;
}
like.ajax({
url: '{:url("consignment_order/returnhandle")}'
, data: {'id': id,'invoice_name':invoice_name,'invoice_no':invoice_no}
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
if(res.data==1){
var index = parent.layer.getFrameIndex(window.name);
parent.location.reload();
parent.layer.close(index);
}else{
location.reload();
}
});
}else{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 2
, time: 1000
})
}
}
});
return false;
});
});
});
</script>
{/block}

View File

@ -0,0 +1,167 @@
{extend name="layout1" /}
{block name='content'}
<style>
.layui-form-label{
width:180px;
}
.div-flex {
display: flex;
align-items: center;
justify-content: left;
}
.width-160 {
width: 200px;
float: left;
display: block;
padding: 9px 15px;
font-weight: 400;
}
.layui-table th {
text-align: center;
}
.table-margin{
margin-left: 50px;
margin-right: 50px;
text-align: center;
}
.image{
height:50px;
width: 50px;
}
.mt50{
margin-left: 50px;
}
</style>
<div class="layui-card-body" >
<!--基本信息-->
<div class="layui-form" lay-filter="layuiadmin-form-order" id="layuiadmin-form-order" >
<input type="hidden" class="order_id" name="order_id" value="{$detail.id}">
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>商品信息</legend>
</fieldset>
</div>
<div class="layui-form-item table-margin">
<table class="layui-table">
<colgroup>
<col width="250">
<col width="200">
<col width="200">
<col width="100">
</colgroup>
<thead>
<tr>
<th>图片</th>
<th>商品名称</th>
<th>商品信息</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach $detail.consignment_order_goods as $k => $goods}
<tr>
<td>
<div style="text-align: left">
{foreach $goods.img_list as $k1 => $img}
<div style="float:left; margin-right: 10px;">
<img src="{$img.ori_image}" class="image-show image" >
</div>
{/foreach}
</div>
</td>
<td>
<div style="text-align: left">
{$goods.goods_name}
</div>
</td>
<td>
<div style="text-align: left">
<div class="layui-col-md9">
<p style="margin-top: 10px">购买价格:{$goods.goods_price}</p>
<p>尺寸:{$goods.item_value}</p>
<p>品牌:{$goods.brand_name}</p>
<p>品类:{$goods.class_name}</p>
<p>品相:{$goods.phase_name}</p>
<p>购买渠道:{$goods.channel_name}</p>
</div>
</div>
</td>
<td>
{if condition="$goods.refund_status=='1'"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 shelves" goods_id="{$goods.id}">上架</button>
{/if}
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like'], function () {
var $ = layui.$;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,400);
});
//上架
$('.shelves').click(function () {
var id=$(this).attr('goods_id');
layer.confirm(
"商品编号:"+"<input type=‘text’ name='goods_sn' id='goods_sn' placeholder='请输入商品编号' autocomplete=‘off’ class=‘layui-input’ style='height:30px'>", {
btn: ['确认','取消'] //按钮
}, function(){
var goods_sn = $('#goods_sn').val();
if (goods_sn == null || goods_sn == undefined || goods_sn == ''){
layer.msg('请填写商品编号!');
return false;
}
like.ajax({
url: '{:url("consignment_order/shelveshandle")}'
, data: {'id': id,'goods_sn':goods_sn}
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
if(res.data==1){
var index = parent.layer.getFrameIndex(window.name);
parent.location.reload();
parent.layer.close(index);
}else{
location.reload();
}
});
}else{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 2
, time: 1000
})
}
}
});
return false;
});
});
});
</script>
{/block}

View File

@ -0,0 +1,177 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<style>
.layui-card .header-title {
font-size: 16px;
font-weight: bold;
}
.layui-card .header-title::before {
content: '';
display: inline-block;
width: 4px;
height: 18px;
vertical-align: -4px;
margin-right: 5px;
background: #3A91FB;
}
.layui-card .survey-list {
display: flex;
flex-wrap: wrap;
}
.layui-card .survey-list .item {
width: 20%;
min-width: 200px;
}
.layui-card .survey-list .item .title {
display: flex;
align-items: center;
}
.layui-card .survey-list .item .title img {
width: 30px;
height: 30px;
margin-right: 12px;
}
.layui-card .survey-list .item .layuiadmin-big-font {
margin-left: 42px;
color: #333;
font-size: 25px;
}
</style>
<section class="content">
<!-- 订单-->
<div class="layui-card">
<div class="layui-card-header">
<div class="header-title">订单概况</div>
</div>
<div class="layui-card-body layuiadmin-card-list survey-list">
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/month_order_amount.png" alt="">
<div>本月订单金额(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/total_order_amount.png" alt="">
<div>订单总金额(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/order_num.png" alt="">
<div>订单总数(笔)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/refund_amount.png" alt="">
<div>退款订单总额(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/refund_num.png" alt="">
<div>退款订单总数(笔)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
</div>
</div>
<!--会员-->
<div class="layui-card">
<div class="layui-card-header">
<div class="header-title">会员概况</div>
</div>
<div class="layui-card-body layuiadmin-card-list survey-list">
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/total_user_money.png" alt="">
<div>会员余额(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/total_user_integral.png" alt="">
<div>会员积分 </div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/able_earnings.png" alt="">
<div>会员可提现佣金(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/have_withdraw_earnings.png" alt="">
<div>会员已提现佣金(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
</div>
</div>
<!--分销-->
<div class="layui-card">
<div class="layui-card-header">
<div class="header-title">分销概况</div>
</div>
<div class="layui-card-body layuiadmin-card-list survey-list">
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/month_earnings.png" alt="">
<div>本月分销佣金(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/distribution_earnings.png" alt="">
<div>分销总佣金(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/wait_earnings.png" alt="">
<div>提现中佣金(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
<div class="item">
<div class="title">
<img class="icon" src="__PUBLIC__/static/common/image/finance/distribution_have_withdraw.png" alt="">
<div>已提现佣金(元)</div>
</div>
<p class="layuiadmin-big-font">1</p>
</div>
</div>
</div>
</section>
<script>
</script>
{/block}

View File

@ -0,0 +1,810 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<script>
//收起左侧菜单,留出更大空间
if (!$('body').hasClass('sidebar-collapse')) {
$('body').addClass('sidebar-collapse');
}
</script>
<section class="content">
<style scoped>
#dataBody th, #dataBody td {
min-width: 60px;
}
td label {
font-weight: normal;
}
.box-header .select2 {
min-width: 130px;
}
.form-type-th {
min-width: 150px;
}
.form-validate-th {
min-width: 200px;
}
.form-validate-label, .form-validate-select, .form-type-label, .form-type-select {
width: 100%;
}
#create_menu_list {
min-width: 400px;
}
#controller_action_list {
min-width: 400px;
}
.form-inline .form-group {
margin-right: 20px;
}
.extend-div {
display: none;
position: absolute;
z-index: 2;
}
#model_relation .form-group {
margin-bottom: 10px;
}
.more-setting .extend-div {
width: 570px;
margin-right: 0;
margin-left: -500px;
}
.more-setting .more-from {
margin-bottom: 20px;
}
.modelRelationDiv .form-group .form-control {
margin-right: 20px;
}
</style>
<form id="dataForm" class="dataForm" action="create" method="post">
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">代码自动生成</h3>
</div>
<!-- 表和菜单 -->
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="table_name">选择表</label>
<select data-id="table_name" name="table_name" class="select2 form-control input-sm"
id="table_name" data-placeholder="请选择表">
<option value=""></option>
{foreach name='table' id='item'}
<option value="{$item}">{$item}</option>
{/foreach}
</select>
<button onclick="refreshTable()" type="button" class="btn btn-flat btn-success"
data-toggle="tooltip" title="刷新表数据">
<i class="fa fa-refresh"></i>
</button>
</div>
<div class="form-group">
<label for="cn_name">中文名</label>
<input name="cn_name" id="cn_name" class="form-control input-sm" placeholder="请填写中文名"
title="表及功能的中文名字,例如用户表,就填写[用户]" data-toggle="tooltip">
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="auto_class_name"
name="auto_class_name"
title="自动生成控制器|模型|验证器类名" data-toggle="tooltip">自动生成类名</label>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="list_delete"
name="list_delete"
title="列表删除功能" data-toggle="tooltip">列表删除</label>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="list_create"
name="list_create"
title="列表添加功能" data-toggle="tooltip">列表添加</label>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" id="list_refresh"
name="list_refresh"
title="列表刷新功能" data-toggle="tooltip">列表刷新</label>
</div>
<div class="form-group checkbox">
<label><input type="checkbox" value="1" id="list_export"
name="list_export"
title="列表导出功能" data-toggle="tooltip">列表导出</label>
</div>
<div class="form-group checkbox">
<label><input type="checkbox" value="1" id="list_enable"
name="list_enable"
title="列表启用/禁用功能" data-toggle="tooltip">列表启用/禁用</label>
</div>
</div>
</div>
<!-- 控制器 -->
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_menu">菜 单</label>
<select data-id="create_menu" name="create_menu" class="select2 form-control input-sm"
id="create_menu" data-placeholder="不选择为不生成菜单">
<option value="-1">不生成</option>
<option value="0">顶级菜单</option>
{$menus|raw}
</select>
<button onclick="refreshMenu()" type="button" class="btn btn-flat btn-success"
data-toggle="tooltip" title="刷新菜单">
<i class="fa fa-refresh"></i>
</button>
</div>
<div class="form-group">
<label for="create_menu_list">菜单选择</label>
<select name="create_menu_list[]" class="select2 form-control input-sm"
id="create_menu_list" multiple="multiple" data-placeholder="默认生成增删改菜单">
<option value="1" disabled selected>列表</option>
<option value="2" selected>添加</option>
<option value="3" selected>修改</option>
<option value="4" selected>删除</option>
<option value="5">启用/禁用</option>
</select>
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_controller">控制器</label>
<select data-id="create_controller" name="create_controller"
class="select2 form-control input-sm"
id="create_controller" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
<div class="form-group">
<label for="controller_name">控制器名</label>
<input name="controller_name" id="controller_name"
class="form-control input-sm" title="默认会根据表名自动生成" placeholder="请填写控制器名"
data-toggle="tooltip">
</div>
<div class="form-group">
<label for="controller_action_list">控制器方法</label>
<select name="controller_action_list[]" class="select2 form-control input-sm"
id="controller_action_list" multiple="multiple" data-placeholder="默认生成增删改方法">
<option value="1" selected>列表</option>
<option value="2" selected>添加</option>
<option value="3" selected>修改</option>
<option value="4" selected>删除</option>
<option value="5">启用/禁用</option>
</select>
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_model">模 型</label>
<select data-id="create_model" name="create_model" class="select2 form-control input-sm"
id="create_model" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
<div class="form-group">
<label for="model_name">模型名</label>
<input name="model_name" id="model_name" class="form-control input-sm"
placeholder="模型名" title="默认会根据表名自动生成" data-toggle="tooltip">
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" name="auto_timestamp"
title="自动添加create_time和update_time字段" data-toggle="tooltip">自动时间戳</label>
</div>
<div class="form-group checkbox">
<label><input checked type="checkbox" value="1" name="soft_delete"
title="自动添加delete_time字段,默认为0" data-toggle="tooltip">软删除</label>
</div>
<div>
</div>
</div>
</div>
<div class="box-header with-border">
<div class="form-inline">
<div class="form-group">
<label for="create_validate">验证器</label>
<select data-id="create_validate" name="create_validate"
class="select2 form-control input-sm"
id="create_validate" data-placeholder="默认生成">
<option value="1">生成</option>
<option value="0">不生成</option>
</select>
</div>
<div class="form-group">
<label for="validate_name">验证器名</label>
<input name="validate_name" id="validate_name" class="form-control input-sm"
placeholder="验证器名" title="默认会根据表名自动生成" data-toggle="tooltip">
</div>
</div>
</div>
<div class="box-body table-responsive">
<table id="dataList" class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr class="input-type">
<th>操作</th>
<th title="字段名为小写下划线形式">字段</th>
<th title="字段类型,例如varchar(255),int(10),decimal(12,2)">类型</th>
<th title="中文名称,例如username为用户名">名称</th>
<th title="是否在列表页显示">列表</th>
<th title="是否为列表页搜索字段">搜索</th>
<th title="是否为添加/修改页字段">表单</th>
<th class="form-type-th" title="表单类型">表单类型</th>
<th class="form-validate-th" title="表单验证">表单验证</th>
<th title="字段更多设置">更多</th>
</tr>
</thead>
<tbody id="dataBody">
</tbody>
</table>
</div>
<div class="box-footer">
<a class="btn btn-primary btn-sm btn-success" onclick="addNewField(null,2)">添加一行</a>
<button class="btn btn-primary btn-sm pull-right" type="submit">提交</button>
</div>
</div>
</div>
</div>
</form>
<table>
<tbody id="data-template" style="display: none">
<tr>
<td>
<a class="btn btn-xs btn-primary" onclick="addNewField(this,1)">插入</a>
<a class="btn btn-xs btn-success" onclick="addNewField(this,2)">追加</a>
<a class="btn btn-xs btn-danger" onclick="delThisField(this,1)">删除</a>
</td>
<td>
<label>
<input class="form-control" name="field_nameFORM_INDEX[]" value="" placeholder="字段"
>
</label>
</td>
<td>
<label>
<input class="form-control field-type" value="" name="field_typeFORM_INDEX[]"
placeholder="字段类型,例如varchar(255),int(10),decimal(12,2)">
</label>
</td>
<td>
<label>
<input class="form-control" name="form_nameFORM_INDEX[]" placeholder="名称">
</label>
</td>
<td>
<label class="bodyFormCheckbox">
<input type="checkbox" value="1" id="is_listFORM_INDEX[]" name="is_listFORM_INDEX[]">列表
</label>
</td>
<td>
<label class="bodyFormCheckbox">
<input type="checkbox" value="1" id="is_searchFORM_INDEX[]" name="is_searchFORM_INDEX[]">搜索
</label>
</td>
<td>
<label class="bodyFormCheckbox">
<input type="checkbox" value="1" id="is_formFORM_INDEX[]" name="is_formFORM_INDEX[]">表单
</label>
</td>
<td>
<label class="form-type-label">
<select class="form-control select2 form-type-select" name="form_typeFORM_INDEX[]"
onchange="selectField(this)">
<option value="text">文本[text]</option>
<option value="number">数字[number]</option>
<option value="password">密码[password]</option>
<option value="mobile">手机号[mobile]</option>
<option value="email">邮箱[email]</option>
<option value="id_card">身份证号[id_card]</option>
<option value="url">网址[url]</option>
<option value="ip">IP地址[ip]</option>
<option value="textarea">文本域[textarea]</option>
<option value="checkbox">复选[checkbox]</option>
<option value="switch">开关[switch]</option>
<option value="radio">单选[radio]</option>
<option value="select">选择列表[select]</option>
<option value="multi_select">多项选择列表[multi-select]</option>
<option value="image">图片上传[image]</option>
<option value="multi_image">多图上传[multi-image]</option>
<option value="file">文件上传[file]</option>
<option value="multi_file">多文件上传[multi-file]</option>
<option value="date">日期[date]</option>
<option value="date_range">日期范围[date-range]</option>
<option value="datetime">日期时间[datetime]</option>
<option value="datetime_range">日期时间范围[datetime-range]</option>
<option value="year">年[year]</option>
<option value="year_range">年范围[year-range]</option>
<option value="year_month">年月[year-month]</option>
<option value="year_month_range">年月范围[year-month-range]</option>
<option value="map">地图选点[map]</option>
<option value="color">颜色选择[color]</option>
<option value="icon">图标选择[icon]</option>
<option value="editor">富文本编辑器[editor]</option>
</select>
</label>
</td>
<td class="form-validate-td">
<label class="form-validate-label">
<select class="form-control form-validate-select select2" multiple="multiple"
name="form_validateFORM_INDEX[]">
<option value="required">非空</option>
<!--当前采用微信号的规则6至20位,以字母开头,字母,数字,减号,下划线 /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/-->
<option value="account">账号</option>
<!--验证简单中文名字2-4个汉字, /[\u4E00-\u9FA5]{2,4}/如有特殊名字请手动更改规则长度-->
<option value="cn_name">中文姓名</option>
<!--/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/-->
<option value="car_number">车牌号</option>
</select>
</label>
</td>
<td class="more-setting" data-id="INDEX_ID">
<!-- 这里放更多设置
例如:date,date_time类型的自动加时间转换功能
is_xxx同时是switch的字段自动加is_xxx_text功能
-->
<a class="btn btn-default btn-sm setting-more" data-id="INDEX_ID">更多设置</a>
<div class="extend-div" id="field_setting_div_INDEX_ID" data-id="INDEX_ID">
<div class="box box-warning box-solid">
<div class="box-header with-border">
<h3 class="box-title">字段更多设置</h3>
</div>
<div class="box-body" id="field_setting_INDEX_ID">
<div class="more-from">
<div class="form-inline">
<div class="form-group">
<label for="field_defaultINEDEX_ID">默认值</label>
<input name="field_defaultFORM_INDEX[]"
class="form-control input-sm"
id="field_defaultINEDEX_ID" placeholder="请填写默认值">
</div>
<div class="form-group">
<label for="getter_setterFORM_INDEX">获取/修改器</label>
<select name="getter_setterFORM_INDEX[]"
class="select2 form-control input-sm"
id="getter_setterFORM_INDEX" data-placeholder="获取/修改器">
<option value="">无</option>
<option value="datetime">datetime</option>
<option value="switch">switch</option>
<option value="date">date</option>
</select>
</div>
<div class="form-group checkbox">
<label><input type="checkbox" value="1" name="list_sortFORM_INDEX[]"
title="是否参与列表排序" data-toggle="tooltip">列表排序</label>
</div>
</div>
</div>
<hr/>
<div class="more-from">
<div class="form-inline">
<div class="form-group">
<label for="is_relationFORM_INDEX">关联设置</label>
<select name="is_relationFORM_INDEX[]"
class="select2 form-control input-sm"
id="is_relationFORM_INDEX" data-placeholder="是否关联字段"
onchange="selectRelation(this)"
data-relation-table="relation_tableFORM_INDEX[]"
data-relation-show="relation_showFORM_INDEX[]">
<option value="0">非关联字段</option>
<option value="1">关联外键</option>
<option value="2">关联主键</option>
</select>
</div>
<div class="form-group">
<select name="relation_typeFORM_INDEX[]"
class="select2 form-control input-sm"
id="relation_typeFORM_INDEX" title="暂时只支持一对一和一对多" data-toggle="tooltip"
data-placeholder="关联方式">
<option value="1">一对多</option>
<option value="2">一对一</option>
</select>
</div>
<div class="form-group">
<input readonly name="relation_showFORM_INDEX[]"
class="form-control input-sm"
id="relation_showINEDEX_ID"
title="belongsTo填写,例如文章发布人user_id要显示成User模型的nickname,填写nickname即可"
data-toggle="tooltip" placeholder="关联显示字段">
</div>
<div class="form-group">
<input readonly name="relation_tableFORM_INDEX[]"
class="form-control input-sm"
id="relation_tableINEDEX_ID"
title="一般此字段为id,belongsTo的无须填写,hasOne/hasMany填写此字段,关联多个模型务必使用英文逗号隔开,例如用户关联多篇文章,多个积分记录,可以写成article,integral_log"
data-toggle="tooltip" placeholder="关联表/模型,用英文逗号隔开">
</div>
</div>
</div>
<hr/>
<div class="more-from">
<div class="form-inline">
<div class="form-group">
<label for="field_sceneINEDEX_ID">验证场景</label>
<select style="min-width: 380px;width: 420px;" name="field_sceneFORM_INDEX[]"
class="select2 form-control input-sm"
id="field_sceneINEDEX_ID" multiple="multiple"
data-placeholder="默认选择三大模块">
<option value="admin_add" selected>admin_add</option>
<option value="admin_edit" selected>admin_edit</option>
<option value="api_add" selected>api_add</option>
<option value="api_edit" selected>api_edit</option>
<option value="index_add" selected>index_add</option>
<option value="index_edit" selected>index_edit</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<script>
//刷新数据库表
function refreshTable() {
$.post('{:url("admin/generate/getTable")}', function (result) {
let html = '<option value=""></option>';
$.each(result.data, function (index, item) {
html += '<option value="' + item + '">' + item + '</option>';
});
$('#table_name').html(html).select2();
});
}
//表单索引
var formIndex = 0;
$(function () {
//获取表信息和字段等,进行页面填充
$("#table_name").on('change', function () {
getField($(this).val());
});
//列表启用/禁止关联菜单和控制器
$('#list_enable').change(function () {
console.log('启用/禁止选项');
let checked = $(this).is(':checked');
let $menu_list = $('#create_menu_list');
let $action_list = $('#controller_action_list');
$menu_list.find("option[value='5']").attr("selected", checked);
$action_list.find("option[value='5']").attr("selected", checked);
$menu_list.select2();
$action_list.select2();
});
//默认添加一行空的字段
addNewField(null, 1);
});
//添加新的字段
function addNewField(obj, type) {
formIndex++;
let template = $("#data-template").html().replace(/FORM_INDEX/g, '[' + formIndex + ']').replace(/INDEX_ID/g, formIndex);
if (obj == null) {
$("#dataBody").append(template);
} else {
if (type === 1) {
$(obj).parent().parent().before(template);
} else {
$(obj).parent().parent().after(template);
}
}
//刷新 dataBody DOM后的操作
dataBodyRefreshed();
}
//删除当前字段
function delThisField(obj) {
layer.confirm('您确认删除本行吗?', {title: '删除确认', closeBtn: 1, icon: 3}, function () {
$(obj).parent().parent().remove();
layer.closeAll();
});
}
//提交验证
$("#dataForm").validate({
rules: {
table_name: {
required: true,
},
cn_name: {
required: true,
},
},
messages: {
table_name: {
required: "表名不能为空",
},
cn_name: {
required: "中文名不能为空",
},
},
});
//选择表
$('#table_name').select2();
//生成菜单列表
$('#create_menu_list').select2();
//是否生成控制器
$('#create_controller').select2();
//是否生成模型
$('#create_model').select2();
//是否生成验证器
$('#create_validate').select2();
//控制器方法表
$('#controller_action_list').select2();
//选择父级菜单
$('#create_menu').select2();
//获取表信息
function getField(name) {
$.post('getField', {name: name}, function (result) {
if (result.code === 1) {
let $dataBody = $("#dataBody");
if (adminDebug) {
console.time('表信息与相关DOM操作耗时');
}
let controller = result.data.controller;
let model = result.data.model;
let validate = result.data.validate;
let field = result.data.field;
if (adminDebug) {
console.log('字段数量:' + field.length);
}
let table = result.data.table;
//中文名
$('#cn_name').val(table.cn_name);
//如果是自动生成类名
if ($('#auto_class_name').is(':checked')) {
$("#controller_name").val(controller.name);
$("#model_name").val(model.name);
$("#validate_name").val(validate.name);
}
$dataBody.html('');
//字段名
let field_name = "#data-template input[name='field_nameFORM_INDEX[]']";
//字段类型
let field_type = "#data-template input[name='field_typeFORM_INDEX[]']";
//是否为列表字段
let field_list = "#data-template [name='is_listFORM_INDEX[]']";
//是否为搜索字段
let field_search = "#data-template [name='is_searchFORM_INDEX[]']";
//是否为表单字段
let field_form = "#data-template [name='is_formFORM_INDEX[]']";
//中文名称
let form_name = "#data-template [name='form_nameFORM_INDEX[]']";
//表单类型
let form_type = "#data-template [name='form_typeFORM_INDEX[]']";
//表单验证
let form_validate = "#data-template [name='form_validateFORM_INDEX[]']";
//字段默认值
let field_form_default = "#data-template [name='field_defaultFORM_INDEX[]']";
//获取器/修改器
let getter_setter = "#data-template [name='getter_setterFORM_INDEX[]']";
//列表排序
let list_sort = "#data-template [name='list_sortFORM_INDEX[]']";
//
let listHtml = '';
$.each(field, function (index, item) {
//字段名
$(field_name).attr('value', item.name);
//字段类型
$(field_type).attr('value', item.field_type);
//中文名称
$(form_name).attr('value', item.cn_name);
//默认值
$(field_form_default).attr('value', item.default);
//表单类型
$(form_type).val(item.form_type);
//是否为列表字段
if (item.is_list === 1) {
$(field_list).attr('checked', true);
} else {
$(field_list).attr('checked', false);
}
//是否为搜索字段
if (item.is_search === 1) {
$(field_search).attr('checked', true);
} else {
$(field_search).attr('checked', false);
}
//是否为表单字段
if (item.is_form === 1) {
$(field_form).attr('checked', true);
} else {
$(field_form).attr('checked', false);
}
//表单类型
$(form_type).find("option[value='" + item.form_type + "']").attr("selected", true);
//表单验证内容
$(form_validate).html(item.validate_html);
//表单选项
$(form_validate).find("option[value='required']").attr("selected", true);
//获取器/修改器
if (item.getter_setter !== false) {
$(getter_setter).find("option[value='" + item.getter_setter + "']").attr("selected", true);
}
//优化生成DOM慢的问题
formIndex++;
listHtml += $("#data-template").html().replace(/FORM_INDEX/g, '[' + formIndex + ']').replace(/INDEX_ID/g, formIndex);
if (getter_setter !== false) {
$(getter_setter).find("option[value='" + item.getter_setter + "']").attr("selected", false);
}
$(form_type).find("option[value='" + item.form_type + "']").attr("selected", false);
$(field_name).attr('value', '');
$(field_type).attr('value', '');
$(form_validate).empty();
});
$dataBody.append(listHtml);
dataBodyRefreshed();
if (adminDebug) {
console.timeEnd('表信息与相关DOM操作耗时');
}
}
});
}
//表单元素类型改变
function selectField(field) {
let $field = $(field);
let form_type = $field.val();
console.log(form_type);
let $validate_select = $field.parent().parent().next().find('.form-validate-select');
$.post('getValidateSelect', {form_type: form_type}, function (result) {
if (1 === result.code) {
$validate_select.html(result.data);
$validate_select.select2();
} else {
layer.msg(result.msg);
}
});
}
//刷新菜单
function refreshMenu() {
//目前还没写,争取尽快完善
}
//字段更多设置
$("#pjax-container").off('click').on('click', '.setting-more', function () {
let $dom = $('#field_setting_div_' + $(this).data('id'));
$dom.is(":hidden") ? $dom.show() : $dom.hide();
});
//选择关联类型防呆设计
function selectRelation(obj) {
let $obj = $(obj);
let relation_type = parseInt($obj.val());
let relation_show = $obj.data('relationShow');
let relation_table = $obj.data('relationTable');
if (relation_type === 1) {
$('input[name="' + relation_table + '"]').attr('readonly', 'readonly');
$('input[name="' + relation_show + '"]').removeAttr('readonly');
} else if (relation_type === 2) {
$('input[name="' + relation_show + '"]').attr('readonly', 'readonly');
$('input[name="' + relation_table + '"]').removeAttr('readonly');
} else {
$('input[name="' + relation_table + '"]').attr('readonly', 'readonly');
$('input[name="' + relation_show + '"]').attr('readonly', 'readonly');
}
}
//列表刷新后的操作
function dataBodyRefreshed() {
$('[data-toggle="tooltip"]').tooltip();
$('#dataBody .select2').select2();
}
</script>
{/block}

View File

@ -0,0 +1,218 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-6">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<form id="dataForm" class="form-horizontal dataForm" action="formField" method="post"
enctype="multipart/form-data">
<div class="box-body">
<div class="form-group">
<label for="form_name" class="col-sm-2 control-label">名称</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="form_name" autocomplete="off" name="form_name"
class="form-control" placeholder="请输入名称">
</div>
</div>
<div class="form-group">
<label for="field_name" class="col-sm-2 control-label">字段</label>
<div class="col-sm-10 col-md-4">
<input maxlength="50" id="field_name" autocomplete="off" name="field_name"
class="form-control" placeholder="请输入字段">
</div>
</div>
<div class="form-group">
<label for="form_type" class="col-sm-2 control-label">类型</label>
<div class="col-sm-10 col-md-4">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-list"></i></span>
<select class="form-control select2 form-type-select" id="form_type"
name="form_type">
<option value="text">文本[text]</option>
<option value="number">数字[number]</option>
<option value="password">密码[password]</option>
<option value="mobile">手机号[mobile]</option>
<option value="email">邮箱[email]</option>
<option value="id_card">身份证号[id_card]</option>
<option value="url">网址[url]</option>
<option value="ip">IP地址[ip]</option>
<option value="texterea">文本域[textarea]</option>
<option value="checkbox">复选[checkbox]</option>
<option value="switch">开关[switch]</option>
<option value="radio">单选[radio]</option>
<option value="select">选择列表[select]</option>
<option value="multi_select">多项选择列表[multi-select]</option>
<option value="image">图片上传[image]</option>
<option value="multi_image">多图上传[multi-image]</option>
<option value="file">文件上传[file]</option>
<option value="multi_file">多文件上传[multi-file]</option>
<option value="date">日期[date]</option>
<option value="date_range">日期范围[date-range]</option>
<option value="datetime">日期时间[datetime]</option>
<option value="datetime_range">日期时间范围[datetime-range]</option>
<option value="year">年[year]</option>
<option value="year_range">年范围[year-range]</option>
<option value="year_month">年月[year-month]</option>
<option value="year_month_range">年月范围[year-month-range]</option>
<option value="map">地图选点[map]</option>
<option value="color">颜色选择[color]</option>
<option value="icon">图标选择[icon]</option>
<option value="editor">富文本编辑器[editor]</option>
<option value="province_city_district">省市区[三级联动]</option>
</select>
</div>
</div>
</div>
<script>
$('#form_type').select2();
</script>
</div>
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
生成
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="col-md-6">
<div class="box box-solid">
<div class="box-header with-border">
<h3 class="box-title">生成结果</h3>
</div>
<div class="box-body">
<textarea id="code" style="width: 100%" placeholder="生成结果" rows="6"></textarea>
</div>
<div class="box-footer">
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
<div class="btn-group">
<button class="clipboard-btn btn flat btn-info" data-clipboard-target="#code">
复制到剪切板
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<script>
// button的class的值
var clipboardDemos = new ClipboardJS('.clipboard-btn');
clipboardDemos.on('success', function (e) {
e.clearSelection();
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
layer.msg('复制成功');
});
clipboardDemos.on('error', function (e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
console.log('复制失败');
});
</script>
<script>
$(function () {
/**
* ajax表单提交
*/
$(".dataForm").submit(function (e) {
e.preventDefault();
var loadT = layer.msg('正在提交,请稍候…', {icon: 16, time: 0, shade: [0.3, "#000"]});
var form_action = $(this).attr('action');
var form_method = $(this).attr('method');
var form_data = new FormData($(this)[0]);
console.log('%cajax submit start!', ';color:#333333');
console.log('action:' + form_action);
console.log('method:' + form_method);
console.log('data:' + form_data);
$.ajax({
url: form_action,
dataType: 'json',
type: form_method,
data: form_data,
contentType: false,
processData: false,
success: function (result) {
layer.close(loadT);
layer.msg(result.msg, {
icon: result.code ? 1 : 2
});
console.log('submit success!');
if (result.code === 1) {
addCode(result.data);
console.log('%cresult success', ';color:#00a65a');
} else {
addCode('');
console.log('%cresult fail', ';color:#f39c12');
}
},
error: function (xhr, type, errorThrown) {
//异常处理;
console.log('%csubmit fail!', ';color:#dd4b39');
console.log();
console.log("type:" + type + ",readyState:" + xhr.readyState + ",status:" + xhr.status);
console.log("url:" + form_action);
console.log("data:" + form_data);
layer.close(loadT);
layer.msg('访问错误,代码' + xhr.status, {icon: 2});
}
}
);
return false;
}
);
});
function addCode(code) {
//$('#code').html(code);
$('#code').val(code);
}
</script>
{/block}

View File

@ -0,0 +1,29 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-3 col-sm-6 col-xs-12">
<div class="info-box">
<span class="info-box-icon bg-aqua"><i class="fa fa-file-code-o"></i></span>
<div class="info-box-content">
<span class="info-box-text">代码自动生成</span>
<a href="{:url('generate/add')}" class="info-box-number">点击跳转</a>
</div>
</div>
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
<div class="info-box">
<span class="info-box-icon bg-red"><i class="fa fa-code"></i></span>
<div class="info-box-content">
<span class="info-box-text">表单字段生成</span>
<a href="{:url('generate/form')}" class="info-box-number">点击跳转</a>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,521 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<script src="https://www.layuicdn.com/layui/layui.js"></script>
<link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui/css/layui.css">
<style type="text/css">
/* 图片展示
----------------------------------------------- */
ul.albums {
display: block;
min-height: 1px;
height: auto;
overflow: hidden;
padding: 5px 0;
margin: 0 15px;
border: 1px dashed #ccc;
}
ul.albums li {
position: relative;
display: inline-block;
padding: 5px;
border: 1px solid #e5e5e5;
margin: 5px 0 0 20px;
cursor: pointer;
}
ul.albums li a.btn-close {
display: block;
position: absolute;
z-index: 2;
top: -8px;
right: -10px;
width: 20px;
height: 20px;
}
ul.albums li a.btn-fm{width: 100px;
display:none;
height: 100px;
border: 0px;
opacity: 0.5;
background-color: #000;
line-height: 100px;
text-align: center;
color: #fff;
position: absolute;}
ul.albums li:hover a.btn-fm{ display: block; }
ul.albums li a.btn-fm_z{
display:none;
color: #ccc;
border: 0px;
background-color: #000;
position: absolute;
bottom: 5px;
left: 5px;
opacity: 0.6;
width: 40px;
text-align: center;
}
</style>
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post"
enctype="multipart/form-data">
<div class="box-body" style="min-height: 600px;">
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<ul class="layui-tab-title">
<li class="layui-this">基本设置</li>
<li>尺码库存</li>
<li>商品详情</li>
<li>精品搭配</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">商品名称</label>
<div class="col-sm-10 col-md-4">
<input id="name" name="name" value="{$data.name|default=''}" placeholder="请输入商品名称" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="code" class="col-sm-2 control-label">商品编号</label>
<div class="col-sm-10 col-md-4">
<input id="code" name="code" value="{$data.code|default=''}" placeholder="请输入商品编号" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="goods_category_id" class="col-sm-2 control-label">所属分类</label>
<div class="col-sm-10 col-md-4">
<select name="goods_category_id" id="goods_category_id"
class="form-control field-select" data-placeholder="请选择所属分类">
<option value=""></option>
{$goods_category_list|raw}
</select>
</div>
</div>
<script>
$('#goods_category_id').select2();
</script>
<div class="form-group">
<label for="brand_id" class="col-sm-2 control-label">所属品牌</label>
<div class="col-sm-10 col-md-4">
<select name="brand_id" id="brand_id"
class="form-control field-select" data-placeholder="请选择所属分类">
<option value=""></option>
{foreach name='brand_list' id='item'}
<option value="{$item.id}" {if isset($data.brand_id) &&
$data.brand_id==$item.id}selected{/if}>
{$item.name}
</option>
{/foreach}
</select>
</div>
</div>
<script>
$('#brand_id').select2();
</script>
<div class="form-group">
<label for="img" class="col-sm-2 control-label">上传图片</label>
<ul class="albums" id="albums">
{foreach name="imgurl_list" item="img1"}
<li class="img">
<a class="btn-close layui-btn-primary" title="删除" href="javascript:void(0)" onclick="removeImg(this)">
<i class="layui-icon" style="font-size: 20px; line-height: 20px;"></i>
</a>
<a class="btn-fm layui-btn-primary" title="设为封面" href="javascript:void(0)" onclick="removeImg_l(this)">设置为封面</a>
<a class="btn-fm_z layui-btn-primary" {if $img1.is_cover == 1}style="display: block;"{/if} title="封面" href="javascript:void(0)">封面</a>
<img src="{$img1['thumb_image']}" width="100" height="100">
<input type="hidden" name="ori_img[]" class="ori_img" value="{$img1['ori_image']}">
<input type="hidden" name="thumb_img[]" class="thumb_img" class="inputAlbums" value="{$img1['thumb_image']}">
</li>
{/foreach}
<li id="nophoto" ><img src="/static/admin/images/nophoto_100x100.png"></li>
</ul>
<input type="hidden" name="ori_fm_img" id="ori_fm_img" value="{$ori_img|default=''}">
<input type="hidden" name="thumb_img_f" id="thumb_img_f" value="{$thumb_img|default=''}">
</div>
<script type="text/javascript">
layui.use(['upload','laydate','form'], function(){
var form = layui.form;
var upload = layui.upload;
//执行实例
upload.render({
elem: '#nophoto' //绑定元素
,url: "{:url('file/icon')}" //接口url
,data:{type:1,width:370,heigh:478}
,field:'image'
,multiple: true
,done: function(res){
var html='';
html+='<li class="img">';
html+='<a class="btn-close layui-btn-primary" title="删除" href="javascript:void(0)" onclick="removeImg(this)">';
html+='<i class="layui-icon" style="font-size: 20px; line-height: 20px;">&#xe640;</i>';
html+='</a>';
html+='<a class="btn-fm layui-btn-primary" title="设为封面" href="javascript:void(0)" onclick="removeImg_l(this)" img="">设置为封面</a>';
html+='<a class="btn-fm_z layui-btn-primary" title="封面" href="javascript:void(0)">封面</a>';
html+='<img src="'+res.data.avatar_logo_thum+'" width="100" height="100">'
html+='<input type="hidden" name="ori_img[]" class="ori_img" value="'+res.data.avatar_logo+'">';
html+='<input type="hidden" name="thumb_img[]" class="thumb_img" class="inputAlbums" value="'+res.data.avatar_logo_thum+'">';
html+='</li>';
$(".albums").prepend(html);
}
,error: function(){
layer.tips('图片错误', '#btn');
return false;
}
});
});
function removeImg(obj){
$(obj).parent().remove();
var img=$('.img').length;
if(img==5){
$('#nophoto').hide();
}else{
$('#nophoto').show();
}
var ori_img=$(obj).siblings('.ori_img').val();
var thumb_img=$('#thumb_img').val();
if(ori_img==ori_fm_img){
$('#ori_fm_img').val('');
$('#thumb_img_f').val('');
}
}
function removeImg_l(obj){
var thumb_img=$(obj).siblings('.thumb_img').val();
var ori_img=$(obj).siblings('.ori_img').val();
$('#ori_fm_img').val(ori_img);
$('#thumb_img_f').val(thumb_img);
$('.btn-fm_z').css('display','none');
$(obj).siblings('.btn-fm_z').css('display','block');
}
</script>
<div class="form-group">
<label for="original_price" class="col-sm-2 control-label">原价</label>
<div class="col-sm-10 col-md-4">
<input id="original_price" name="original_price" value="{$data.original_price|default='0.00'}"
placeholder="请输入原价" type="number" class="form-control field-number">
</div>
</div>
<div class="form-group">
<label for="price" class="col-sm-2 control-label">售价</label>
<div class="col-sm-10 col-md-4">
<input id="price" name="price" value="{$data.price|default='0.00'}"
placeholder="请输入售价" type="number" class="form-control field-number">
</div>
</div>
<div class="form-group">
<label for="status" class="col-sm-2 control-label">是否上架</label>
<div class="col-sm-10 col-md-4">
<input class="input-switch" id="status" value="1" {if(!isset($data)
||$data.status==1)}checked{/if} type="checkbox"/>
<input class="switch field-switch" placeholder="是否上架" name="status"
value="{$data.status|default='1'}" hidden/>
</div>
</div>
<script>
$('#status').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script>
<div class="form-group">
<label for="sort_number" class="col-sm-2 control-label">排序(升序)</label>
<div class="col-sm-10 col-md-4">
<input id="sort_number" name="sort_number" value="{$data.sort_number|default='1000'}"
placeholder="请输入排序(升序)" type="text" class="form-control field-text">
</div>
</div>
<script>
$('#sort_number')
.bootstrapNumber({
upClass: 'success',
downClass: 'primary',
center: true
});
</script>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr class="input-type">
<th>尺码</th>
<th>库存</th>
</tr>
</thead>
<tbody>
{foreach name='size_list' key='k' id='item1'}
<tr>
<td>
<label>
<input class="form-control field-type" value="{$item1.size}" name="size[{$k}][]" placeholder="请输入数量" readonly="readonly">
</label>
</td>
<td>
<label>
<input class="form-control field-type" value="{$item1.num}" name="number[{$k}][]" placeholder="请输入数量">
</label>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
</div>
<div class="layui-tab-item">
<div class="form-group">
<label for="detail" class="col-sm-2 control-label">单品信息</label>
<div class="col-sm-10 col-md-4">
<textarea id="detail" name="detail" class="form-control" rows="3" placeholder="请输入描述">{$data.detail|default=''}</textarea>
</div>
</div>
<div class="form-group">
<label for="model" class="col-sm-2 control-label">模特信息</label>
<div class="col-sm-10 col-md-4">
<input id="model" name="model" value="{$data.model|default=''}"
placeholder="请输入模特信息" type="text" class="form-control field-number">
</div>
</div>
<div class="form-group">
<label for="goods_size" class="col-sm-2 control-label">尺码信息</label>
<div class="col-sm-10 col-md-4">
<textarea id="goods_size" name="goods_size" class="form-control" rows="3" placeholder="请输入尺码信息">{$data.goods_size|default=''}</textarea>
</div>
</div>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<table id="dataList" class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr class="input-type">
<th>商品名称</th>
<th>操作</th>
</tr>
</thead>
<tbody id="dataBody">
{foreach name='collocation_goods' key='k' id='item1'}
<tr>
<td>
<label>
<select style="min-width: 380px;width: 420px;" name="goods_ids[{$k}][]" class="select2" data-live-search="true" tabindex="-98">
{foreach name='goods_list' id='item'}
<option value="{$item.id}" {if isset($item1) &&
$item1==$item.id}selected{/if}>
{$item.name}
</option>
{/foreach}
</select>
</label>
</td>
<td>
<!-- <a class="btn btn-xs btn-primary" onclick="addNewField(this,1)">插入</a> -->
<a class="btn btn-xs btn-success" onclick="addNewField(this,2)">追加</a>
<a class="btn btn-xs btn-danger" onclick="delThisField(this,1)">删除</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<table>
<tbody id="data-template" style="display: none">
<tr>
<td>
<label>
<select name="goods_idsFORM_INDEX[]" style="min-width: 380px;width: 420px;" class="form-control field-select select2" data-placeholder="请选择商品">
<option value=""></option>
{foreach name='goods_list' id='item'}
<option value="{$item.id}">
{$item.name}
</option>
{/foreach}
</select>
</label>
</td>
<td>
<a class="btn btn-xs btn-success" onclick="addNewField(this,2)">追加</a>
<a class="btn btn-xs btn-danger" onclick="delThisField(this,1)">删除</a>
</td>
</tr>
</tbody>
</table>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'goods_category_id': {
required: true,
},
'brand_id': {
required: true,
},
'name': {
required: true,
},
'origin_price': {
required: true,
},
'price': {
required: true,
},
'attr': {
required: true,
},
'detail': {
required: true,
},
'weight': {
required: true,
},
'stock': {
required: true,
},
'sort_number': {
required: true,
},
'status': {
required: true,
},
},
messages: {
'goods_category_id': {
required: "所属分类不能为空",
},
'brand_id': {
required: "品牌不能为空",
},
'name': {
required: "名称不能为空",
},
'origin_price': {
required: "原价不能为空",
},
'price': {
required: "售价不能为空",
},
'attr': {
required: "规格不能为空",
},
'detail': {
required: "详情不能为空",
},
'weight': {
required: "重量不能为空",
},
'stock': {
required: "库存不能为空",
},
'sort_number': {
required: "排序(升序不能为空",
},
'status': {
required: "是否上架不能为空",
},
}
});
//------------------------------------精选配置开始-------------------------------//
//表单索引
var formIndex ='{$number}';
//添加新的字段
function addNewField(obj, type) {
formIndex++;
let template = $("#data-template").html().replace(/FORM_INDEX/g, '[' + formIndex + ']').replace(/INDEX_ID/g, formIndex);
if (obj == null) {
$("#dataBody").append(template);
} else {
if (type === 1) {
$(obj).parent().parent().before(template);
} else {
$(obj).parent().parent().after(template);
}
}
laydate.render({
elem: '#end_time'+formIndex
,type: 'datetime'
});
//刷新 dataBody DOM后的操作
dataBodyRefreshed();
}
$(function () {
//默认添加一行空的字段
if(formIndex==0){
addNewField(null, 1);
}else{
dataBodyRefreshed();
}
});
//删除当前字段
function delThisField(obj) {
layer.confirm('您确认删除本行吗?', {title: '删除确认', closeBtn: 1, icon: 3}, function () {
$(obj).parent().parent().remove();
layer.closeAll();
});
}
//列表刷新后的操作
function dataBodyRefreshed() {
$('[data-toggle="tooltip"]').tooltip();
$('#dataBody .select2').select2();
}
//------------------------------------精选配置结束-------------------------------//
</script>
{/block}

View File

@ -0,0 +1,166 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="名称">
</div>
<div class="form-group">
<select name="_order" id="_order" class="form-control input-sm index-order">
<option value="">排序字段</option>
<option value="id" {if isset($_order) && $_order=='id'}selected{/if}>ID</option>
<option value="origin_price" {if isset($_order) &&
$_order=='origin_price'}selected{/if}>原价
</option>
<option value="price" {if isset($_order) && $_order=='price'}selected{/if}>售价</option>
<option value="weight" {if isset($_order) && $_order=='weight'}selected{/if}>重量</option>
<option value="stock" {if isset($_order) && $_order=='stock'}selected{/if}>库存</option>
<option value="sort_number" {if isset($_order) && $_order=='sort_number'}selected{/if}>
排序(升序
</option>
<option value="status" {if isset($_order) && $_order=='status'}selected{/if}>是否上架
</option>
</select>
</div>
<div class="form-group">
<select name="_by" id="_by" class="form-control input-sm index-order">
<option value="">排序方式</option>
<option value="desc" {if isset($_by) && $_by=='desc'}selected{/if}>倒序</option>
<option value="asc" {if isset($_by) && $_by=='asc'}selected{/if}>正序</option>
</select>
</div>
<script>
$('#_order').select2();
$('#_by').select2();
</script>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据"
data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked"
data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox"
placeholder="全选/取消">
</th>
<th>ID</th>
<th>名称</th>
<th>所属分类</th>
<th>售价</th>
<th>总库存</th>
<th>排序(升序)</th>
<th>是否上架</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox"
data-id="{$item.id}" class="checkbox data-list-check" value="{$item.id}"
placeholder="选择/取消">
</td>
<td>{$item.id}</td>
<td>{$item.name}</td>
<td>{$item.goods_category.name|default=''}</td>
<td>{$item.price}</td>
<td>{$item.stock}</td>
<td>{$item.sort_number}</td>
<td>{$item.status_text}</td>
<td>{$item.create_time}</td>
<td class="td-do">
<a href="{:url('edit',['id'=>$item.id])}"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除"
data-id="{$item.id}" data-confirm-title="删除确认"
data-confirm-content='您确定要删除ID为 <span class="text-red">{$item.id}</span> 的数据吗'
data-url="{:url('del')}">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,134 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post" enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">品牌名称</label>
<div class="col-sm-10 col-md-4">
<input id="name" name="name" value="{$data.name|default=''}" placeholder="请输入品牌名称" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="initial" class="col-sm-2 control-label">品牌首字母</label>
<div class="col-sm-10 col-md-4">
<select name="initial" id="initial" class="form-control field-select" data-placeholder="请选择品牌首字母">
<option value=""></option>
{foreach name='capital' id='item'}
<option value="{$item}" {if isset($data) &&
$data.initial==$item}selected{/if}>{$item}
</option>
{/foreach}
</select>
</div>
</div>
<script>
$('#initial').select2();
</script>
<div class="form-group">
<label for="is_show" class="col-sm-2 control-label">是否显示</label>
<div class="col-sm-10 col-md-4">
<input class="input-switch" id="is_show" value="1" {if(!isset($data) ||$data.is_show==1)}checked{/if} type="checkbox" />
<input class="switch field-switch" placeholder="是否显示:1-是.0-否" name="is_show" value="{$data.is_show|default='1'}" hidden />
</div>
</div>
<script>
$('#is_show').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script><div class="form-group">
<label for="sort" class="col-sm-2 control-label">排序</label>
<div class="col-sm-10 col-md-4">
<input id="sort" name="sort" value="{$data.sort|default='0'}" placeholder="请输入排序" type="text" class="form-control field-text">
</div>
</div>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'name': {
required: true,
},
'initial': {
required: true,
},
'is_show': {
required: true,
},
'sort': {
required: true,
},
},
messages: {
'name': {
required: "品牌名称不能为空",
},
'initial': {
required: "品牌首字母不能为空",
},
'is_show': {
required: "是否显示:1-是.0-否不能为空",
},
'sort': {
required: "排序不能为空",
},
}
});
</script>
{/block}

View File

@ -0,0 +1,126 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="品牌名称">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据" data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked" data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox" placeholder="全选/取消">
</th>
<th>品牌名称</th>
<th>品牌首字母</th>
<th>是否显示</th>
<th>排序</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox" data-id="{$item.id}" class="checkbox data-list-check" value="{$item.id}" placeholder="选择/取消">
</td>
<td>{$item.name}</td>
<td>{$item.initial}</td>
<td>{$item.is_show_text}</td>
<td>{$item.sort}</td>
<td>{$item.create_time}</td>
<td class="td-do">
<a href="{:url('edit',['id'=>$item.id])}"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除" data-id="{$item.id}" data-confirm-title="删除确认" data-confirm-content='您确定要删除ID为 <span class="text-red">{$item.id}</span> 的数据吗' data-url="{:url('del')}">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,98 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post"
enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body">
<div class="form-group">
<label for="parent_id" class="col-sm-2 control-label">上级分类</label>
<div class="col-sm-10 col-md-4">
<select name="parent_id" id="parent_id" class="form-control field-select"
data-placeholder="请选择上级分类">
<option value="0">顶级分类</option>
{$cat_list|raw}
</select>
</div>
</div>
<script>
$('#parent_id').select2();
</script>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">名称</label>
<div class="col-sm-10 col-md-4">
<input id="name" name="name" value="{$data.name|default=''}" placeholder="请输入名称"
type="text" class="form-control field-text">
</div>
</div>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'parent_id': {
required: true,
},
'name': {
required: true,
},
},
messages: {
'parent_id': {
required: "上级分类不能为空",
},
'name': {
required: "名称不能为空",
},
}
});
</script>
{/block}

View File

@ -0,0 +1,85 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="名称">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据"
data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked"
data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox"
placeholder="全选/取消">
</th>
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{$data|raw}
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,227 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post" enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">栏目名称</label>
<div class="col-sm-10 col-md-4">
<input id="name" name="name" value="{$data.name|default=''}" placeholder="请输入栏目名称" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="type" class="col-sm-2 control-label">显示模式</label>
<div class="col-sm-10 col-md-4 layui-form">
<input type="radio" name="type" value="1" title="模式一" {if isset($data.type) && $data.type=='1'}checked{/if}>
<input type="radio" name="type" value="2" title="模式二" {if isset($data.type) && $data.type=='2'}checked{/if}>
<input type="radio" name="type" value="3" title="模式三" {if isset($data.type) && $data.type=='3'}checked{/if}>
</div>
</div>
<div class="form-group">
<label for="goods_ids" class="col-sm-2 control-label">商品列表</label>
<div class="col-sm-10">
<table id="dataList" class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr class="input-type">
<th>商品名称</th>
<th>操作</th>
</tr>
</thead>
<tbody id="dataBody">
{foreach name='goods_ids' key='k' id='item1'}
<tr>
<td>
<label>
<select style="min-width: 380px;width: 420px;" name="goods_id[{$k}][]" class="select2" data-live-search="true" tabindex="-98">
{foreach name='goods_list' id='item'}
<option value="{$item.id}" {if isset($item1) &&
$item1==$item.id}selected{/if}>
{$item.name}
</option>
{/foreach}
</select>
</label>
</td>
<td>
<!-- <a class="btn btn-xs btn-primary" onclick="addNewField(this,1)">插入</a> -->
<a class="btn btn-xs btn-success" onclick="addNewField(this,2)">追加</a>
<a class="btn btn-xs btn-danger" onclick="delThisField(this,1)">删除</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
<div class="form-group">
<label for="sort_number" class="col-sm-2 control-label">排序(升序)</label>
<div class="col-sm-10 col-md-4">
<input id="sort_number" name="sort_number" value="{$data.sort_number|default='1000'}" placeholder="请输入排序(升序)" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="status" class="col-sm-2 control-label">是否显示</label>
<div class="col-sm-10 col-md-4">
<input class="input-switch" id="status" value="1" {if(!isset($data) ||$data.status==1)}checked{/if} type="checkbox" />
<input class="switch field-switch" placeholder="是否显示" name="status" value="{$data.status|default='1'}" hidden />
</div>
</div>
<script>
$('#status').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<table>
<tbody id="data-template" style="display: none">
<tr>
<td>
<label>
<select name="goods_idFORM_INDEX[]" style="min-width: 380px;width: 420px;" class="form-control field-select select2" data-placeholder="请选择商品">
<option value=""></option>
{foreach name='goods_list' id='item'}
<option value="{$item.id}">
{$item.name}
</option>
{/foreach}
</select>
</label>
</td>
<td>
<a class="btn btn-xs btn-success" onclick="addNewField(this,2)">追加</a>
<a class="btn btn-xs btn-danger" onclick="delThisField(this,1)">删除</a>
</td>
</tr>
</tbody>
</table>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'name': {
required: true,
},
'sort_number': {
required: true,
},
'status': {
required: true,
},
},
messages: {
'name': {
required: "栏目名称不能为空",
},
'sort_number': {
required: "排序(升序)不能为空",
},
'status': {
required: "是否上架不能为空",
},
}
});
//表单索引
var formIndex ='{$number}';
//添加新的字段
function addNewField(obj, type) {
formIndex++;
let template = $("#data-template").html().replace(/FORM_INDEX/g, '[' + formIndex + ']').replace(/INDEX_ID/g, formIndex);
if (obj == null) {
$("#dataBody").append(template);
} else {
if (type === 1) {
$(obj).parent().parent().before(template);
} else {
$(obj).parent().parent().after(template);
}
}
laydate.render({
elem: '#end_time'+formIndex
,type: 'datetime'
});
//刷新 dataBody DOM后的操作
dataBodyRefreshed();
}
$(function () {
//默认添加一行空的字段
if(formIndex==0){
addNewField(null, 1);
}else{
dataBodyRefreshed();
}
});
//删除当前字段
function delThisField(obj) {
layer.confirm('您确认删除本行吗?', {title: '删除确认', closeBtn: 1, icon: 3}, function () {
$(obj).parent().parent().remove();
layer.closeAll();
});
}
//列表刷新后的操作
function dataBodyRefreshed() {
$('[data-toggle="tooltip"]').tooltip();
$('#dataBody .select2').select2();
}
layui.use('form', function(){
var form = layui.form;
form.render();
});
</script>
{/block}

View File

@ -0,0 +1,124 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="栏目名称">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据" data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked" data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox" placeholder="全选/取消">
</th>
<th>栏目名称</th>
<th>排序(升序)</th>
<th>是否上架</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox" data-id="{$item.id}" class="checkbox data-list-check" value="{$item.id}" placeholder="选择/取消">
</td>
<td>{$item.name}</td>
<td>{$item.sort_number}</td>
<td>{$item.status_text}</td>
<td>{$item.create_time}</td>
<td class="td-do">
<a href="{:url('edit',['id'=>$item.id])}"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除" data-id="{$item.id}" data-confirm-title="删除确认" data-confirm-content='您确定要删除ID为 <span class="text-red">{$item.id}</span> 的数据吗' data-url="{:url('del')}">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,155 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<style>
.header-font{
font-size: 20px
}
.layui-card .data-all {
display: flex;
justify-content: space-between;
margin-top: 20px;
}
.layui-card .text-style {
font-size: 16px;
}
.header-time{
margin-left: 20px
}
.layadmin-shortcut .shortcut-list {
padding: 30px 0;
display: flex;
flex-wrap: wrap;
}
.layadmin-shortcut .shortcut-list li {
min-width: 100px;
margin-bottom: 20px;
width: 12.5%;
}
.layadmin-shortcut .shortcut-list .icon{
width: 62px;
height: 62px;
margin-bottom: 5px;
}
.tips {
float: right;
padding: 0 10px;
margin-top: 10px;
height: 20px;
line-height: 20px;
font-size: 12px;
color: #3A91FB;
border-radius: 30px;
border: 1px #3A91FB solid;
background: #eaf3ff;
}
</style>
<section class="content">
<div class="layui-fluid" style="margin-bottom: 100px">
<div class="layui-card" >
<div class="layui-card-header">
<span class="header-font">运营数据</span>
<span class="header-time">更新时间:{$res.time}</span>
</div>
</div>
<div class="layui-row layui-col-space15">
<div class="layui-col-sm3">
<div class="layui-card">
<div class="layui-card-header">
成交订单(笔)
<span class="tips">今日</span>
</div>
<div class="layui-card-body layuiadmin-card-list">
<p class="layuiadmin-big-font">{$res.order_num_today}</p>
<p>昨日:<span class="text-style">{$res.order_num_yesterday}</span>
<span class="text-style" {if condition="$res.order_num_change lt 0" } style="color: #009688" {elseif condition="$res.order_num_change egt 0" } style="color: #FA2828" {/if}>{$res.order_num_change}</span></p>
<div class="data-all">成交订单总量(笔)<div class="text-style">{$res.order_num_all}</div></div>
</div>
</div>
</div>
<div class="layui-col-sm3 ">
<div class="layui-card">
<div class="layui-card-header">
销售金额(元)
<span class="tips">今日</span>
</div>
<div class="layui-card-body layuiadmin-card-list">
<p class="layuiadmin-big-font">{$res.order_amount_today}</p>
<p>昨日:<span class="text-style">{$res.order_amount_yesterday}</span>
<span class="text-style" {if condition="$res.order_amount_change lt 0" } style="color: #009688" {elseif condition="$res.order_amount_change egt 0" } style="color: #FA2828" {/if}>{$res.order_amount_change}</span></p>
<div class="data-all">销售总额(元)<div class="text-style">{$res.order_amount_all}</div></div>
</div>
</div>
</div>
<div class="layui-col-sm3 ">
<div class="layui-card">
<div class="layui-card-header">
新增会员(人)
<span class="tips">今日</span>
</div>
<div class="layui-card-body layuiadmin-card-list">
<p class="layuiadmin-big-font">{$res.add_user_today}</p>
<p >昨日:<span class="text-style">{$res.add_user_yesterday}</span>
<span class="text-style" {if condition="$res.add_user_change lt 0" } style="color: #009688" {elseif condition="$res.add_user_change egt 0" } style="color: #FA2828" {/if}>{$res.add_user_change}</span></p>
<div class="data-all">会员总量(人)<div class="text-style">{$res.user_all}</div></div>
</div>
</div>
</div>
<!--快捷功能-->
<div class="layui-col-sm12">
<div class="layui-card">
<div class="layui-card-header">快捷功能</div>
<div class="layui-card-body">
<div class="layadmin-shortcut">
<ul class="shortcut-list">
<li class="shop-item" >
<a lay-href="{:url('goods/index')}" data-id="29">
<img class="icon" src="__PUBLIC__/static/common/image/workbench/goods.png" alt="">
<cite>设备管理</cite>
</a>
</li>
<li class="shop-item">
<a lay-href="{:url('user/index')}" data-id="33">
<img class="icon" src="__PUBLIC__/static/common/image/workbench/user.png" alt="">
<cite>会员管理</cite>
</a>
</li>
<li class="shop-item">
<a lay-href="{:url('order/index')}" data-id="37">
<img class="icon" src="__PUBLIC__/static/common/image/workbench/order.png" alt="">
<cite>用户订单管理</cite>
</a>
</li>
<li class="shop-item">
<a lay-href="{:url('account_log/integrallist')}" data-id="39">
<img class="icon" src="__PUBLIC__/static/common/image/workbench/coupon.png" alt="">
<cite>积分记录</cite>
</a>
</li>
<li class="shop-item">
<a lay-href="{:url('withdraw/lists')}" data-id="39">
<img class="icon" src="__PUBLIC__/static/common/image/workbench/seckill.png" alt="">
<cite>提现记录</cite>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<script>
</script>
{/block}

View File

@ -0,0 +1,30 @@
{if !$admin.pjax}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
{/if}
{block name='title'}
<title>{$admin.title|default='Admin'} | {$admin.name|default='Admin'}</title>
{/block}
{if !$admin.pjax}
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link rel="stylesheet" href="/static/layui-admin/dist/layuiadmin/layui/css/layui.css?v=2.6.6.20211117" media="all">
<link rel="stylesheet" href="/static/layui-admin/dist/layuiadmin/style/like.css?v=2.6.6.20211117" media="all">
<script src="/static/layui-admin/dist/layuiadmin/layui/layui.js?v=2.6.6.20211117"></script>
</head>
<body class="hold-transition skin-blue sidebar-mini">
{/if}
<!-- 内容 -->
<div id="pjax-container">
{block name='content'}{/block}
</div>
{if !$admin.pjax}
{/if}
{if !$admin.pjax}
</body>
</html>
{/if}

View File

@ -0,0 +1,191 @@
{extend name="layout1" /}
{block name='content'}
<style>
.div-flex {
display: flex;
align-items: center;
justify-content: left;
}
.layui-form-label {
width: 100px;
}
.width-160 {
width: 200px;
}
.layui-table th {
text-align: center;
}
.table-margin {
margin-left: 50px;
margin-right: 50px;
text-align: center;
}
.image {
height: 80px;
width: 80px;
}
</style>
<div class="layui-card-body" >
<!--基本信息-->
<div class="layui-form" lay-filter="layuiadmin-form-express" id="layuiadmin-form-express" >
<input type="hidden" name="order_id" value="{$detail.id}">
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>收货信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">收货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">收货地址:</label>
<div class="width-160">{$detail.delivery_address}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>商品信息</legend>
</fieldset>
</div>
<div class="layui-form-item table-margin">
<table class="layui-table">
<colgroup>
<col width="250">
<col width="100">
<col width="100">
<col width="100">
</colgroup>
<thead>
<tr>
<th>商品信息</th>
<th>价格(元)</th>
<th>数量</th>
</tr>
</thead>
<tbody>
{foreach $detail.order_goods as $k => $goods}
<tr>
<td>
<div style="text-align: left">
<div class="layui-col-md3">
<img src="{$goods.img}" class="image-show image">
</div>
<div class="layui-col-md9">
<p style="margin-top: 10px">{$goods.goods_name}</p>
<br>
<p>{$goods.item_value}</p>
</div>
</div>
</td>
<td>¥{$goods.goods_price}</td>
<td>{$goods.goods_num}</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>快递配送</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex select-express">
<label class="layui-form-label ">快递公司:</label>
<div>
<input type="text" name="invoice_name" placeholder="请输入快递公司" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-form-item div-flex select-express" >
<label class="layui-form-label ">快递单号:</label>
<div>
<input type="text" name="invoice_no" placeholder="请输入快递单号" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-form-item div-flex ">
<div class="layui-input-block ">
<input type="button" class="layui-btn layui-btn-sm layui-btn-normal width_160" lay-submit lay-filter="send" id="send" value="发货">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary width_160 " id="back">返回</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like', 'form'], function () {
var $ = layui.$
, form = layui.form;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,600);
});
$('#back').click(function () {
var index=parent.layer.getFrameIndex(window.name); //获取当前窗口的name
parent.layer.close(index);
parent.layui.table.reload('order-lists');
return true;
});
//发货
form.on('submit(send)', function (data) {
var field = data.field;
like.ajax({
url: '{:url("order/deliveryHandle")}'
, data: field
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
var index = parent.layer.getFrameIndex(window.name);
parent.location.reload();
parent.layer.close(index);
});
}else{
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 2
, time: 1000
});
}
},
});
})
});
</script>
{/block}

View File

@ -0,0 +1,276 @@
{extend name="layout1" /}
{block name='content'}
<style>
.layui-form-label{
width:180px;
}
.div-flex {
display: flex;
align-items: center;
justify-content: left;
}
.width-160 {
width: 200px;
float: left;
display: block;
padding: 9px 15px;
font-weight: 400;
}
.layui-table th {
text-align: center;
}
.table-margin{
margin-left: 50px;
margin-right: 50px;
text-align: center;
}
.image{
height:80px;
width: 80px;
}
.mt50{
margin-left: 50px;
}
</style>
<div class="layui-card-body" >
<!--基本信息-->
<div class="layui-form" lay-filter="layuiadmin-form-order" id="layuiadmin-form-order" >
<input type="hidden" class="order_id" name="order_id" value="{$detail.id}">
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>订单信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">订单编号:</label>
<div class="width-160">{$detail.order_sn}</div>
<label class="layui-form-label ">订单状态:</label>
<div class="width-160">{$detail.order_status_text}</div>
<label class="layui-form-label ">下单时间:</label>
<div class="width-160">{$detail.create_time}</div>
<label class="layui-form-label ">支付时间:</label>
<div class="width-160">{$detail.pay_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>会员信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">会员编号:</label>
<div class="width-160">{$detail.user.sn}</div>
<label class="layui-form-label ">会员昵称:</label>
<div class="width-160">{$detail.user.nickname}</div>
<label class="layui-form-label ">手机号码:</label>
<div class="width-160">{$detail.user.mobile}</div>
<label class="layui-form-label ">注册时间:</label>
<div class="width-160">{$detail.user.create_time}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>收货信息</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex">
<label class="layui-form-label ">收货人:</label>
<div class="width-160">{$detail.consignee}</div>
<label class="layui-form-label ">手机号:</label>
<div class="width-160">{$detail.mobile}</div>
<label class="layui-form-label ">收货地址:</label>
<div class="width-160">{$detail.delivery_address}</div>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>快递信息</legend>
</fieldset>
</div>
{empty name="$detail.invoice_no"}
<div class="layui-form-item div-flex">
<label class="layui-form-label"></label>
<div class="width-160">暂无物流信息</div>
</div>
{else/}
<div class="layui-form-item div-flex">
<label class="layui-form-label ">发货时间:</label>
<div class="width-160">{$detail.shipping_time | default= "未知"}</div>
<label class="layui-form-label ">快递公司:</label>
<div class="width-160">{$detail.invoice_name | default="未知"}</div>
<label class="layui-form-label ">快递单号:</label>
<div class="width-160">{$detail.invoice_no | default= "未知"}</div>
</div>
{/empty}
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>商品信息</legend>
</fieldset>
</div>
<div class="layui-form-item table-margin">
<table class="layui-table">
<colgroup>
<col width="250">
<col width="100">
<col width="100">
<col width="100">
</colgroup>
<thead>
<tr>
<th>商品信息</th>
<th>价格(元)</th>
<th>数量</th>
</tr>
</thead>
<tbody>
{foreach $detail.order_goods as $k => $goods}
<tr>
<td>
<div style="text-align: left">
<div class="layui-col-md3">
<img src="{$goods.img}" class="image-show image" >
</div>
<div class="layui-col-md9">
<p style="margin-top: 10px">{$goods.goods_name}</p>
<br>
<p>{$goods.item_value}</p>
</div>
</div>
</td>
<td>¥{$goods.goods_price}</td>
<td>{$goods.goods_num}</td>
</tr>
{/foreach}
<tr>
<td colspan="2"></td>
<td style="text-align: left">
<p>商品金额:¥{$detail.goods_price}</p>
<p>应付金额:¥{$detail.order_amount}</p>
</td>
</tr>
</tbody>
</table>
</div>
<div class="layui-form-item">
<fieldset class="layui-elem-field layui-field-title">
<legend>订单操作</legend>
</fieldset>
</div>
<div class="layui-form-item div-flex ">
<div class="layui-input-block ">
{eq name="$detail.order_status" value="1"}
<!-- <button type="submit" class="layui-btn layui-btn-normal width_160 " id="refund">退款</button>-->
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 " id="delivery">发货</button>
{/eq}
{eq name="$detail.order_status" value="2"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 " id="confirm">确认收货</button>
{/eq}
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary width_160 " id="back">返回</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like'], function () {
var $ = layui.$;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,600);
});
$('#back').click(function () {
var index=parent.layer.getFrameIndex(window.name); //获取当前窗口的name
parent.layer.close(index);
parent.layui.table.reload('order-lists');
return true;
});
//取消订单
$('#cancel').click(function () {
var order_id = $('.order_id').val();
layer.confirm('确认取消订单吗?', {
btn: ['确认','取消'] //按钮
}, function(){
like.ajax({
url: '{:url("order/cancel")}'
, data: {'order_id': order_id}
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
location.reload();
});
}
}
});
});
});
//发货
$('#delivery').click(function () {
var id = $('.order_id').val();
layer.open({
type: 2
,title: '订单发货'
,content: '{:url("order/delivery")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
//确认收货
$('#confirm').click(function () {
var id = $('.order_id').val();
layer.confirm('确认订单商品已收货吗??', {
btn: ['确认','取消'] //按钮
}, function(){
like.ajax({
url: '{:url("order/confirm")}'
, data: {'order_id': id}
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
location.reload();
});
}
},
});
});
});
});
</script>
{/block}

View File

@ -0,0 +1,300 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<style type="text/css">
.layui-table-cell {
height: auto;
white-space: normal;
}
.layui-card-header.layuiadmin-card-header-auto {
padding-top: 15px;
padding-bottom: 15px;
height: auto;
}
.layui-form-label{ width:100px; }
</style>
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form-item">
<div class="layui-row">
<div class="layui-inline">
<label class="layui-form-label">订单搜索:</label>
<div class="layui-input-block">
<select name="search_key">
<option value="order_sn" {if isset($search_key) && $search_key=='order_sn'}selected{/if}>订单编号</option>
<option value="nickname" {if isset($search_key) && $search_key=='nickname'}selected{/if}>会员昵称</option>
<option value="user_mobile" {if isset($search_key) && $search_key=='user_mobile'}selected{/if}>会员手机号码</option>
<option value="user_sn" {if isset($search_key) && $search_key=='user_sn'}selected{/if}>会员编号</option>
</select>
</div>
</div>
<div class="layui-inline">
<input type="text" name="keyword" id="keyword" value="{$keyword?$keyword:'';}" placeholder="请输入搜索内容"
autocomplete="off" class="layui-input">
</div>
<div class="layui-inline">
<label class="layui-form-label">商品名称:</label>
<div class="layui-input-block">
<input type="text" name="goods_name" id="goods_name" value="{$goods_name?$goods_name:'';}" placeholder="请输入商品名称"
autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-row">
<div class="layui-inline">
<label class="layui-form-label">订单类型:</label>
<div class="layui-input-block">
<select name="order_type" id="order_type">
<option value="">全部</option>
<option value="0" {if isset($order_type) && $order_type=='0'}selected{/if}>待付款</option>
<option value="1" {if isset($order_type) && $order_type=='1'}selected{/if}>待发货</option>
<option value="2" {if isset($order_type) && $order_type=='2'}selected{/if}>待收货</option>
<option value="3" {if isset($order_type) && $order_type=='3'}selected{/if}>已完成</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">下单时间:</label>
<div class="layui-input-inline">
<div class="layui-input-inline">
<input type="text" name="start_time" class="layui-input" id="start_time"
placeholder="" autocomplete="off" value="{$start_time?$start_time:'';}">
</div>
</div>
<div class="layui-input-inline" style="margin-right: 5px;width: 20px;">
<label class="layui-form-mid">至</label>
</div>
<div class="layui-input-inline">
<input type="text" name="end_time" class="layui-input" id="end_time"
placeholder="" autocomplete="off" value="{$end_time?$end_time:'';}">
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<button class="btn btn-success btn-sm" type="submit" >查询</button>
</div>
<div class="layui-inline">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<div class="layui-table-cell" style="width:240px;text-align:center;">订单信息</div>
</th>
<th>
<div style="width:400px;text-align:center;">用户信息</div>
</th>
<th>
<div style="width:380px;text-align:center;">商品信息</div>
</th>
<th>
<div style="width:200px;text-align:center;">收货信息</div>
</th>
<th><div class="layui-table-cell" style="width:200px;text-align:center;">操作</div></th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td class="layui-table-col-special">
<div class="layui-table-cell laytable-cell-1-0-2">
<div class="layui-input-inline" style="text-align:left;width: 240px;">
<p>订单编号:{$item.order_sn}</p>
<p>订单状态:{$item.order_status_text}</p>
<p>订单金额:{$item.total_amount}</p>
<p>下单时间:{$item.create_time}</p>
</div>
</div>
</td>
<td class="layui-table-col-special">
<div class="layui-table-cell laytable-cell-1-0-2">
<img src="{$item.avatar}" style="height:80px;width: 80px;margin-right: 10px;" class="image-show">
<div class="layui-input-inline" style="text-align:left;width: 240px;">
<p>用户编号:{$item.sn}</p>
<p>用户昵称:{$item.nickname}</p>
<p>用户手机:{$item.mobile}</p>
</div>
</div>
</td>
<td class="layui-table-col-special">
{foreach name="item.order_goods" item="item1"}
<div style="text-align: left; width:380px; overflow: hidden;" class="goods-data">
<img src="{$item1.img}" style="height:80px;width: 80px" class="image-show layui-col-md4">
<div class="layui-input-inline layui-col-md8">
<span class="layui-col-md7 goods_name_hide">{$item1.goods_name}</span>
<span class="layui-col-md5">¥{$item1.goods_price}</span>
<br>
<span class="layui-col-md7 goods_name_hide">{$item1.item_value}</span>
<span class="layui-col-md5">{$item1.goods_num}件</span>
</div>
</div>
{/foreach}
</td>
<td class="layui-table-col-special">
<div class="layui-table-cell laytable-cell-1-0-2">
<div class="layui-input-inline" style="text-align:left;width: 200px;">
<p>收货人:{$item.consignee}</p>
<p>手机号码:{$item.mobile}</p>
<p>收货地址:{$item.delivery_address}</p>
</div>
</div>
</td>
<td>
<div class="layui-table-cell" style="width: 200px;">
<button type="submit" class="layui-btn layui-btn-sm layui-btn-primary width_160 detail" order_id="{$item.id}">查看详情</button>
{eq name="$item.order_status" value="1"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 delivery" order_id="{$item.id}">发货</button>
{/eq}
{eq name="$item.order_status" value="2"}
<button type="submit" class="layui-btn layui-btn-sm layui-btn-normal width_160 confirm" order_id="{$item.id}">确认收货</button>
{/eq}
</div>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
<script>
layui.use('form', function(){
var form = layui.form;
form.render('select');
});
//日期时间范围
laydate.render({
elem: '#start_time'
,type: 'datetime'
,trigger: 'click'
});
//日期时间范围
laydate.render({
elem: '#end_time'
,type: 'datetime'
,trigger: 'click'
});
//注意:选项卡 依赖 element 模块,否则无法进行功能性操作
layui.config({
version:"2.6.6.20211117",
base: '/static/layui-admin/dist/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'element', 'jquery', 'like'], function () {
var $ = layui.$;
var like = layui.like;
//主图放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src,600);
});
//查看详情
$('.detail').click(function () {
var id = $(this).attr('order_id');
layer.open({
type: 2
,title: '订单详情'
,content: '{:url("order/detail")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
//发货
$('.delivery').click(function () {
var id = $(this).attr('order_id');
layer.open({
type: 2
,title: '订单发货'
,content: '{:url("order/delivery")}?id='+id
,area: ['90%', '90%']
,yes: function(index, layero){
}
})
});
//确认收货
$('.confirm').click(function () {
var id = $(this).attr('order_id');
layer.confirm('确认订单商品已收货吗??', {
btn: ['确认','取消'] //按钮
}, function(){
like.ajax({
url: '{:url("order/confirm")}'
, data: {'order_id': id}
, type: 'post'
, success: function (res) {
if (res.code == 1) {
layui.layer.msg(res.msg, {
offset: '15px'
, icon: 1
, time: 1000
},function () {
location.reload();
});
}
},
});
});
});
});
</script>
{/block}

View File

@ -0,0 +1,88 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post" enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">名称</label>
<div class="col-sm-10 col-md-4">
<input id="name" name="name" value="{$data.name|default=''}" placeholder="请输入名称" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="describe" class="col-sm-2 control-label">描述</label>
<div class="col-sm-10 col-md-4">
<textarea id="describe" name="describe" class="form-control" rows="3" placeholder="请输入描述">{$data.describe|default=''}</textarea>
</div>
</div>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'name': {
required: true,
},
'describe': {
required: true,
},
},
messages: {
'name': {
required: "名称不能为空",
},
'describe': {
required: "描述不能为空",
},
}
});
</script>
{/block}

View File

@ -0,0 +1,122 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="名称/描述">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据" data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked" data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox" placeholder="全选/取消">
</th>
<th>名称</th>
<th>描述</th>
<th>添加时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox" data-id="{$item.id}" class="checkbox data-list-check" value="{$item.id}" placeholder="选择/取消">
</td>
<td>{$item.name}</td>
<td>{$item.describe}</td>
<td>{$item.create_time}</td>
<td class="td-do">
<a href="{:url('edit',['id'=>$item.id])}"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除" data-id="{$item.id}" data-confirm-title="删除确认" data-confirm-content='您确定要删除ID为 <span class="text-red">{$item.id}</span> 的数据吗' data-url="{:url('del')}">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,53 @@
{if !$admin.pjax}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
{/if}
{block name='title'}
<title>{$admin.title|default='Admin'} | {$admin.name|default='Admin'}</title>
{/block}
{if !$admin.pjax}
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
{include file='public/head_css' /}
{include file='public/head_js' /}
</head>
<body class="hold-transition skin-blue sidebar-mini">
<div class="wrapper">
{/if}
<!-- 顶部 -->
{block name='header'}
{include file='public/header' /}
{/block}
<!-- 左侧 -->
{block name='sidebar'}
{include file='public/sidebar' /}
{/block}
<!-- 内容 -->
<div class="content-wrapper" id="pjax-container">
{block name='content'}
{/block}
</div>
{block name='footer'}
{include file='public/footer' /}
{/block}
{block name='control_sidebar'}
{include file='public/control_sidebar' /}
{/block}
{if !$admin.pjax}
</div>
{/if}
{if !$admin.pjax}
</body>
</html>
{/if}

View File

@ -0,0 +1,32 @@
<!--内容头部-->
<section class="content-header">
<h1>
{$admin.title|default='admin'|raw}
</h1>
<ol class="breadcrumb">
<li><a href="{:url('index/index')}"><i class="fa fa-dashboard"></i> 主页</a></li>
<li class="active">{$admin.title|default='Admin'|raw}</li>
</ol>
</section>
{if $Think.session.error_message}
<!--如果有错误或者成功的消息-->
<script>
layer.msg('{$Think.session.error_message}',{icon:2});
$.pjax({
url: "{$Think.session.url}",
container: '#pjax-container'
});
</script>
{/if}
{if $Think.session.success_message}
<script>
layer.msg('{$Think.session.success_message}',{icon:1});
$.pjax({
url: '{$Think.session.url}',
container: '#pjax-container'
});
</script>
{/if}

View File

@ -0,0 +1,12 @@
<!--侧边栏-->
{if !$admin.pjax}
<aside class="control-sidebar control-sidebar-dark">
<ul class="nav nav-tabs nav-justified control-sidebar-tabs">
</ul>
<div class="tab-content">
<div class="tab-pane" id="control-sidebar-home-tab">
</div>
</div>
</aside>
<div class="control-sidebar-bg"></div>
{/if}

View File

@ -0,0 +1,10 @@
<!--页面底部-->
{if !$admin.pjax}
<footer class="main-footer">
<div class="pull-right hidden-xs">
<b>Version</b> {$admin.version|default='1.0'}
</div>
<strong>Copyright &copy; 2020 <a href="{$admin.link|default='#'}">{$admin.author|default='admin'}</a>.</strong> All rights
reserved.
</footer>
{/if}

View File

@ -0,0 +1,18 @@
<!--头部css-->
{css href="__ADMIN_PLUGINS__/bootstrap/css/bootstrap.min.css" /}
{js href="__ADMIN_PLUGINS__/bootstrap-switch/css/bootstrap-switch.min.css" /}
{css href="__ADMIN_PLUGINS__/font-awesome/css/font-awesome.min.css" /}
{css href="__ADMIN_PLUGINS__/iconpicker/css/iconpicker.min.css" /}
{css href="__ADMIN_PLUGINS__/select2/css/select2.min.css" /}
{css href="__ADMIN_PLUGINS__/fileinput/css/fileinput.min.css" /}
{css href="__ADMIN_PLUGINS__/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css" /}
{css href="__ADMIN_CSS__/AdminLTE.min.css" /}
{css href="__ADMIN_CSS__/admin.css" /}
{css href="__ADMIN_CSS__/_all-skins.min.css" /}
{css href="__ADMIN_CSS__/skins.css" /}
{css href="__ADMIN_PLUGINS__/nprogress/nprogress.css" /}
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->

View File

@ -0,0 +1,49 @@
<!--头部js-->
{if !$admin.pjax}
{js href="__ADMIN_PLUGINS__/js-cookie/js.cookie-2.2.0.min.js" /}
{js href="__ADMIN_PLUGINS__/jquery/jquery.min.js" /}
{js href="__ADMIN_PLUGINS__/jquery-ui/jquery-ui.min.js" /}
{js href="__ADMIN_PLUGINS__/layer/layer.js" /}
{js href="__ADMIN_PLUGINS__/laydate/laydate.js" /}
{js href="__ADMIN_PLUGINS__/bootstrap/js/bootstrap.min.js" /}
{js href="__ADMIN_PLUGINS__/jquery-slimscroll/jquery.slimscroll.min.js" /}
{js href="__ADMIN_PLUGINS__/jquery-validation/jquery.validate.min.js" /}
{js href="__ADMIN_PLUGINS__/jquery-validation/localization/messages_zh.min.js" /}
{js href="__ADMIN_PLUGINS__/bootstrap-switch/js/bootstrap-switch.min.js" /}
{js href="__ADMIN_PLUGINS__/bootstrap-number/bootstrap-number.min.js" /}
{js href="__ADMIN_PLUGINS__/fastclick/fastclick.min.js" /}
{js href="__ADMIN_PLUGINS__/select2/js/select2.full.min.js" /}
{js href="__ADMIN_PLUGINS__/nprogress/nprogress.min.js" /}
{js href="__ADMIN_PLUGINS__/iconpicker/js/iconpicker.min.js" /}
{js href="__ADMIN_PLUGINS__/ueditor/ueditor.config.js" /}
{js href="__ADMIN_PLUGINS__/ueditor/ueditor.all.min.js" /}
{js href="__ADMIN_PLUGINS__/ueditor/lang/zh-cn/zh-cn.min.js" /}
{js href="__ADMIN_PLUGINS__/clipboard/clipboard.min.js" /}
{js href="__ADMIN_PLUGINS__/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js" /}
{js href="__ADMIN_PLUGINS__/viewer/viewer.min.js" /}
{js href="__ADMIN_PLUGINS__/viewer/jquery-viewer.min.js" /}
{js href="__ADMIN_JS__/tag/jquery.tag-editor.js" /}
{css href="__ADMIN_JS__/tag/jquery.tag-editor.css" /}
<script src="https://www.layuicdn.com/layui/layui.js"></script>
<link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui/css/layui.css">
<!--勿必把地图api key更换成自己的-->
<script type="text/javascript" src='//webapi.amap.com/maps?v=1.4.15&key=cccf8ea926e153be0a013d55edd47c11&plugin=AMap.ToolBar'></script>
<!-- UI组件库 1.0 -->
<script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
<script>
//是否为debug模式
var adminDebug = {$debug};
//cookie前缀
var cookiePrefix = '{$cookie_prefix}';
//UEditor server地址
var UEServer = "{:url('editor/server')}";
//列表页当前选择的ID
var dataSelectIds = [];
</script>
{js href="__ADMIN_JS__/adminlte.min.js" /}
{js href="__ADMIN_JS__/jquery.pjax.js" /}
{js href="__ADMIN_JS__/admin.js" /}
{js href="__ADMIN_JS__/demo.js" /}
{js href="__ADMIN_JS__/app.js" /}
{/if}

View File

@ -0,0 +1,54 @@
<!--网页头部-->
{if !$admin.pjax}
<header class="main-header">
<a class="logo">
<span class="logo-mini">{$admin.short_name|default='Backend'}</span>
<span class="logo-lg">{$admin.name|default='Backend'}</span>
</a>
<nav class="navbar navbar-static-top">
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<div class="navbar-custom-menu">
<ul class="nav navbar-nav">
<li class="dropdown messages-menu">
<a href="#" class="dropdown-toggle ReloadButton" title="刷新页面" data-toggle="dropdown">
<i class="fa fa-refresh"></i>
</a>
</li>
<li class="dropdown user user-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<img src="{$admin.user.avatar|default='__ADMIN_IMAGES__/avatar.png'}" class="user-image" alt="用户头像">
<span class="hidden-xs">{$admin.user.nickname|default=''}</span>
</a>
<ul class="dropdown-menu">
<li class="user-header">
<img src="{$admin.user.avatar|default='__ADMIN_IMAGES__/avatar.png'}" class="img-circle" alt="用户头像">
<p>
{$admin.user.nickname|default=''}
<small>{$admin.user.username|default=''}</small>
</p>
</li>
<li class="user-footer">
<div class="pull-left">
<a href="{:url('admin_user/profile')}" class="btn btn-default btn-flat">个人资料</a>
</div>
<div class="pull-right">
<a href="{:url('auth/logout')}" class="btn btn-default btn-flat">退出</a>
</div>
</li>
</ul>
</li>
<li>
<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
</li>
</ul>
</div>
</nav>
</header>
{/if}

View File

@ -0,0 +1,30 @@
<!--左侧菜单-->
{if !$admin.pjax}
<aside class="main-sidebar">
<section class="sidebar">
<div class="user-panel">
<div class="pull-left image">
<img src="{$admin.user.avatar|default='__BACKEND_IMAGES__/avatar.png'}" class="img-circle" alt="用户头像">
</div>
<div class="pull-left info">
<p>{$admin.user.nickname|default=''}</p>
<a><i class="fa fa-circle text-success"></i> 在线</a>
</div>
</div>
<form method="get" class="sidebar-form" id="sidebar-form">
<div class="input-group">
<input type="text" name="q" class="form-control" placeholder="搜索菜单" id="search-input">
<span class="input-group-btn">
<button type="submit" name="search" id="search-btn" class="btn btn-flat">
<i class="fa fa-search"></i>
</button>
</span>
</div>
</form>
<ul class="sidebar-menu" data-widget="tree">
<li class="header">导航菜单</li>
{$admin.menu|default=''|raw}
</ul>
</section>
</aside>
{/if}

View File

@ -0,0 +1,174 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post" enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body" style="height: 550px;">
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<ul class="layui-tab-title">
<li class="layui-this">寄卖流程</li>
<li>寄卖规则</li>
<li>联系我们</li>
<li>社群与交流</li>
<li>隐私政策</li>
<li>条款与条件</li>
<li>寄卖成功提醒</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="form-group">
<div class="col-sm-10">
<script id="procedure" name="procedure" type="text/plain">{$config.procedure|raw|default=''}</script>
</div>
</div>
<script>
UE.delEditor('procedure');
var ue1 = UE.getEditor('procedure',{
serverUrl :UEServer,
});
ue1.ready(function() {
ue1.setHeight(250); //设置高度
});
</script>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<script id="rule" name="rule" type="text/plain">{$config.rule|raw|default=''}</script>
</div>
</div>
<script>
UE.delEditor('rule');
var ue = UE.getEditor('rule',{
serverUrl :UEServer,
});
ue.ready(function() {
ue.setHeight(250); //设置高度
});
</script>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<script id="contactus" name="contactus" type="text/plain">{$config.contactus|raw|default=''}</script>
</div>
</div>
<script>
UE.delEditor('contactus');
var ue2 = UE.getEditor('contactus',{
serverUrl :UEServer,
});
ue2.ready(function() {
ue2.setHeight(250); //设置高度
});
</script>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<script id="community" name="community" type="text/plain">{$config.community|raw|default=''}</script>
</div>
</div>
<script>
UE.delEditor('community');
var ue3 = UE.getEditor('community',{
serverUrl :UEServer,
});
ue3.ready(function() {
ue3.setHeight(250); //设置高度
});
</script>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<script id="privacy" name="privacy" type="text/plain">{$config.privacy|raw|default=''}</script>
</div>
</div>
<script>
UE.delEditor('privacy');
var ue4 = UE.getEditor('privacy',{
serverUrl :UEServer,
});
ue4.ready(function() {
ue4.setHeight(250); //设置高度
});
</script>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<script id="clause" name="clause" type="text/plain">{$config.clause|raw|default=''}</script>
</div>
</div>
<script>
UE.delEditor('clause');
var ue5 = UE.getEditor('clause',{
serverUrl :UEServer,
});
ue5.ready(function() {
ue5.setHeight(250); //设置高度
});
</script>
</div>
<div class="layui-tab-item">
<div class="form-group">
<div class="col-sm-10">
<script id="consignment" name="consignment" type="text/plain">{$config.consignment|raw|default=''}</script>
</div>
</div>
<script>
UE.delEditor('consignment');
var ue6 = UE.getEditor('consignment',{
serverUrl :UEServer,
});
ue6.ready(function() {
ue6.setHeight(250); //设置高度
});
</script>
</div>
</div>
<div>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'integral_rule': {
required: true,
},
},
messages: {
'integral_rule': {
required: "请输入积分规则",
},
}
});
</script>
{/block}

View File

@ -0,0 +1,201 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<style type="text/css">
/* 图片展示
----------------------------------------------- */
ul.albums {
display: block;
min-height: 1px;
height: auto;
overflow: hidden;
padding: 5px 0;
margin: 0 15px;
}
ul.albums li {
position: relative;
display: inline-block;
padding: 5px;
border: 1px solid #e5e5e5;
margin: 5px 0 0 20px;
cursor: pointer;
}
ul.albums li a.btn-close {
display: block;
position: absolute;
z-index: 2;
top: -8px;
right: -10px;
width: 20px;
height: 20px;
}
ul.albums li a.btn-fm{width: 100px;
display:none;
height: 100px;
border: 0px;
opacity: 0.5;
background-color: #000;
line-height: 100px;
text-align: center;
color: #fff;
position: absolute;}
ul.albums li:hover a.btn-fm{ display: block; }
ul.albums li a.btn-fm_z{
display:none;
color: #ccc;
border: 0px;
background-color: #000;
position: absolute;
bottom: 5px;
left: 5px;
opacity: 0.6;
width: 40px;
text-align: center;
}
</style>
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post" enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body" style="min-height: 500px;">
<div class="form-group">
<label for="APPID" class="col-sm-2 control-label">AppID</label>
<div class="col-sm-10 col-md-4">
<input id="APPID" name="APPID" value="{$config.APPID|default=''}" placeholder="请输入AppID" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="APPSECRET" class="col-sm-2 control-label">AppSecret</label>
<div class="col-sm-10 col-md-4">
<input id="APPSECRET" name="APPSECRET" value="{$config.APPSECRET|default=''}" placeholder="请输入AppSecret" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="MCHID" class="col-sm-2 control-label">商户号</label>
<div class="col-sm-10 col-md-4">
<input id="MCHID" name="MCHID" value="{$config.MCHID|default=''}" placeholder="请输入AppSecret" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="WXPAYKEY" class="col-sm-2 control-label">支付密钥</label>
<div class="col-sm-10 col-md-4">
<input id="WXPAYKEY" name="WXPAYKEY" value="{$config.WXPAYKEY|default=''}" placeholder="请输入支付密钥" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="notify_url" class="col-sm-2 control-label">回调地址</label>
<div class="col-sm-10 col-md-4">
<input id="notify_url" name="notify_url" value="{$config.notify_url|default=''}" placeholder="请输入回调地址" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="img_url" class="col-sm-2 control-label">图片访问地址</label>
<div class="col-sm-10 col-md-4">
<input id="img_url" name="img_url" value="{$config.img_url|default=''}" placeholder="请输入图片访问地址" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="channel" class="col-sm-2 control-label">购买渠道</label>
<div class="col-sm-10 col-md-4">
<input id="channel" name="channel" value="{$config.channel|default=''}" placeholder="购买渠道" type="text" class="form-control field-text">
<span id="min_withdraw-error" class="help-block">多个购买渠道请用英文逗号分隔</span>
</div>
</div>
<div class="form-group">
<label for="jmnum" class="col-sm-2 control-label">寄卖数量限制</label>
<div class="col-sm-10 col-md-4">
<input id="jmnum" name="jmnum" value="{$config.jmnum|default=''}" placeholder="寄卖数量限制" type="text" class="form-control field-text">
<span id="min_withdraw-error" class="help-block">寄卖满XX件才可下单</span>
</div>
</div>
<div class="form-group">
<label for="size" class="col-sm-2 control-label">尺码</label>
<div class="col-sm-10 col-md-4">
<input id="size" name="size" value="{$config.size|default=''}" placeholder="尺码" type="text" class="form-control field-text">
<span id="min_withdraw-error" class="help-block">多个尺寸请用英文逗号分隔</span>
</div>
</div>
<div class="form-group">
<label for="img" class="col-sm-2 control-label">尺码表图片</label>
<ul class="albums" id="albums">
<li id="nophoto" ><img src="{if isset($config.size_img)}{$config.size_img}{else}/static/admin/images/nophoto_100x100.png{/if}" style="width: 100px;height: 100px;"></li>
<input type="hidden" name="size_img" id="size_img" value="{$config.size_img|default=''}">
</ul>
</div>
<script type="text/javascript">
layui.use(['upload','laydate','form'], function(){
var form = layui.form;
var upload = layui.upload;
//执行实例
upload.render({
elem: '#nophoto' //绑定元素
,url: "{:url('file/icon')}" //接口url
,data:{type:0}
,field:'image'
,multiple: true
,done: function(res){
$(".albums img").attr('src',res.data.avatar_logo);
$("#size_img").val(res.data.avatar_logo);
}
,error: function(){
layer.tips('图片错误', '#btn');
return false;
}
});
});
</script>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'type': {
required: true,
},
'name': {
required: true,
},
'value': {
required: true,
},
},
messages: {
'type': {
required: "类型不能为空",
},
'name': {
required: "名称不能为空",
},
'value': {
required: "值不能为空",
},
}
});
</script>
{/block}

View File

@ -0,0 +1,70 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post" enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body" style="height: 500px;">
<div class="form-group">
<label for="min_withdraw" class="col-sm-2 control-label">最低提现金额</label>
<div class="col-sm-10 col-md-4">
<input id="min_withdraw" name="min_withdraw" value="{$config.min_withdraw|default=''}" placeholder="请输入最低提现金额" type="text" class="form-control field-text">
<span id="min_withdraw-error" class="help-block">会员提现需满足最低提现金额,才能提交提现申请。</span>
</div>
<label for="name" class="control-label">元</label>
</div>
<div class="form-group">
<label for="max_withdraw" class="col-sm-2 control-label">最高提现金额</label>
<div class="col-sm-10 col-md-4">
<input id="max_withdraw" name="max_withdraw" value="{$config.max_withdraw|default=''}" placeholder="请输入最高提现金额" type="text" class="form-control field-text">
<span id="min_withdraw-error" class="help-block">会员提现允许的最高提现金额。</span>
</div>
<label for="name" class="control-label">元</label>
</div>
<div class="form-group">
<label for="poundage_type" class="col-sm-2 control-label">手续费类型</label>
<div class="col-sm-10 col-md-4 layui-form">
<input type="radio" name="poundage_type" class="poundage_type" value="1" title="固定" {if isset($config.poundage_type) && $config.poundage_type=='1'}checked{/if}>
<input type="radio" name="poundage_type" class="poundage_type" value="2" title="百分比" {if isset($config.poundage_type) && $config.poundage_type=='2'}checked{/if}>
</div>
</div>
<div class="form-group">
<label for="poundage" class="col-sm-2 control-label">提现手续费</label>
<div class="col-sm-10 col-md-4">
<input id="poundage" name="poundage" value="{$config.poundage|default=''}" placeholder="请输入提现手续费" type="text" class="form-control field-text">
<span id="min_withdraw-error" class="help-block">会员提现时收取的手续费。</span>
</div>
<label for="name" class="control-label"></label>
</div>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate();
layui.use('form', function(){
var form = layui.form;
form.render();
});
</script>
{/block}

View File

@ -0,0 +1,264 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<style type="text/css">
/* 图片展示
----------------------------------------------- */
ul.albums {
display: block;
min-height: 1px;
height: auto;
overflow: hidden;
padding: 5px 0;
margin: 0 15px;
}
ul.albums li {
position: relative;
display: inline-block;
padding: 5px;
border: 1px solid #e5e5e5;
margin: 5px 0 0 20px;
cursor: pointer;
}
ul.albums li a.btn-close {
display: block;
position: absolute;
z-index: 2;
top: -8px;
right: -10px;
width: 20px;
height: 20px;
}
ul.albums li a.btn-fm{width: 100px;
display:none;
height: 100px;
border: 0px;
opacity: 0.5;
background-color: #000;
line-height: 100px;
text-align: center;
color: #fff;
position: absolute;}
ul.albums li:hover a.btn-fm{ display: block; }
ul.albums li a.btn-fm_z{
display:none;
color: #ccc;
border: 0px;
background-color: #000;
position: absolute;
bottom: 5px;
left: 5px;
opacity: 0.6;
width: 40px;
text-align: center;
}
</style>
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post"
enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">名称</label>
<div class="col-sm-10 col-md-4">
<input id="name" name="name" value="{$data.name|default=''}" placeholder="请输入名称"
type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="describe" class="col-sm-2 control-label">描述</label>
<div class="col-sm-10 col-md-4">
<textarea id="describe" name="describe" class="form-control" rows="3" placeholder="请输入描述">{$data.describe|default=''}</textarea>
</div>
</div>
<div class="form-group">
<label for="alias" class="col-sm-2 control-label">广告位置</label>
<div class="col-sm-10 col-md-4">
<select name="alias" id="alias" class="form-control field-select"
data-placeholder="请选择广告位置">
<option value=""></option>
{foreach name='banner_list' id='item'}
<option value="{$item.bm}" {if isset($data) &&
$data.alias==$item.bm}selected{/if}>{$item.name}
</option>
{/foreach}
</select>
</div>
</div>
<script>
$('#alias').select2();
</script>
<div class="form-group">
<label for="img" class="col-sm-2 control-label">图片</label>
<ul class="albums" id="albums">
<li id="nophoto" ><img src="{if isset($data.img)}{$data.img}{else}/static/admin/images/nophoto_100x100.png{/if}" style="width: 100px;height: 100px;"></li>
<input type="hidden" name="img" id="img" value="{$data.img|default=''}">
</ul>
</div>
<script type="text/javascript">
layui.use(['upload','laydate','form'], function(){
var form = layui.form;
var upload = layui.upload;
//执行实例
upload.render({
elem: '#nophoto' //绑定元素
,url: "{:url('file/icon')}" //接口url
,data:{type:0,width:200,heigh:200}
,field:'image'
,multiple: true
,done: function(res){
$(".albums img").attr('src',res.data.avatar_logo);
$("#img").val(res.data.avatar_logo);
}
,error: function(){
layer.tips('图片错误', '#btn');
return false;
}
});
});
</script>
<div class="form-group">
<label for="jump_type" class="col-sm-2 control-label">跳转类型</label>
<div class="col-sm-10 col-md-4">
<select name="jump_type" id="jump_type" class="form-control field-select"
data-placeholder="请选择跳转类型" onchange="getTargetList(this.value)">
<option value=""></option>
{foreach name='jump_type' id='item'}
<option value="{$item.id}" {if isset($data) &&
$data.jump_type==$item.id}selected{/if}>{$item.name}
</option>
{/foreach}
</select>
</div>
</div>
<script>
$('#jump_type').select2();
</script>
<div class="form-group">
<label for="jump_target" class="col-sm-2 control-label">跳转目标</label>
<div class="col-sm-10 col-md-4">
<select name="jump_target" id="jump_target" class="form-control field-select">
</select>
</div>
</div>
<script>
$('#jump_target').select2({
placeholder: '请选择跳转目标'
});
</script>
<div class="form-group">
<label for="sort_number" class="col-sm-2 control-label">排序</label>
<div class="col-sm-10 col-md-4">
<input id="sort_number" name="sort_number" value="{$data.sort_number|default='1000'}"
placeholder="请输入排序" type="text" class="form-control field-text">
</div>
</div>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'name': {
required: true,
},
'jump_type': {
required: true,
},
'jump_target': {
required: true,
},
'sort_number': {
required: true,
},
},
messages: {
'name': {
required: "名称不能为空",
},
'jump_type': {
required: "跳转类型不能为空",
},
'jump_target': {
required: "跳转目标不能为空",
},
'sort_number': {
required: "排序不能为空",
},
}
});
function getTargetList(id) {
var html ='';
var $jump_target = $('#jump_target');
id = parseInt(id);
if (id !== 3) {
$.post('{:url("pub/getSlideTargetData")}', {type_id: id}, function (result) {
$.each(result.data,function (index, item) {
html+='<option value="'+item.id+'">'+item.name+'</option>';
});
$jump_target.html(html);
$jump_target.select2();
});
}else{
$jump_target.html(html);
$jump_target.select2({
tags:true,
placeholder:'请输入需要跳转的网址',
});
}
}
</script>
{/block}

View File

@ -0,0 +1,137 @@
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<!--数据列表页面-->
<section class="content">
<!--顶部搜索筛选-->
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-body">
<form class="form-inline searchForm" id="searchForm" action="{:url('index')}" method="GET">
<div class="form-group">
<input value="{$_keywords ? $_keywords : '' ;}"
name="_keywords" id="_keywords" class="form-control input-sm" placeholder="名称">
</div>
<div class="form-group">
<button class="btn btn-sm btn-primary" type="submit"><i class="fa fa-search"></i> 查询
</button>
</div>
<div class="form-group">
<button onclick="clearSearchForm()" class="btn btn-sm btn-default" type="button"><i
class="fa fa-eraser"></i> 清空查询
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<!--数据列表顶部-->
<div class="box-header">
<div>
<a title="添加" data-toggle="tooltip" class="btn btn-primary btn-sm " href="{:url('add')}">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-danger btn-sm AjaxButton" data-toggle="tooltip" title="删除选中数据"
data-confirm-title="删除确认" data-confirm-content="您确定要删除选中的数据吗?" data-id="checked"
data-url="{:url('del')}">
<i class="fa fa-trash"></i> 删除
</a>
<a class="btn btn-success btn-sm ReloadButton" data-toggle="tooltip" title="刷新">
<i class="fa fa-refresh"></i> 刷新
</a>
</div>
</div>
<div class="box-body table-responsive">
<table class="table table-hover table-bordered datatable" width="100%">
<thead>
<tr>
<th>
<input id="dataCheckAll" type="checkbox" onclick="checkAll(this)" class="checkbox"
placeholder="全选/取消">
</th>
<th>ID</th>
<th>名称</th>
<th>图片</th>
<th>跳转类型</th>
<th>跳转目标</th>
<th>排序</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{foreach name="data" item="item"}
<tr>
<td>
<input type="checkbox" onclick="checkThis(this)" name="data-checkbox"
data-id="{$item.id}" class="checkbox data-list-check" value="{$item.id}"
placeholder="选择/取消">
</td>
<td>{$item.id}</td>
<td>{$item.name}</td>
<td><img class="dataListImg" src="{$item.img}"></td>
<td>{$item.jump_type_text}</td>
<td>{$item.jump_target_text}</td>
<td>{$item.sort_number}</td>
<td>{$item.create_time}</td>
<td class="td-do">
<a href="{:url('edit',['id'=>$item.id])}"
class="btn btn-primary btn-xs" title="修改" data-toggle="tooltip">
<i class="fa fa-pencil"></i>
</a>
<a class="btn btn-danger btn-xs AjaxButton" data-toggle="tooltip" title="删除"
data-id="{$item.id}" data-confirm-title="删除确认"
data-confirm-content='您确定要删除ID为 <span class="text-red">{$item.id}</span> 的数据吗'
data-url="{:url('del')}">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
<!-- 数据列表底部 -->
<div class="box-footer">
{$page|raw}
<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>共{$total}条记录</small>&nbsp;
<small>每页显示</small>
&nbsp;
<select class="input-sm" onchange="changePerPage(this)">
<option value="10" {if $admin.per_page==10}selected{/if}>10</option>
<option value="20" {if $admin.per_page==20}selected{/if}>20</option>
<option value="30" {if $admin.per_page==30}selected{/if}>30</option>
<option value="50" {if $admin.per_page==50}selected{/if}>50</option>
<option value="100" {if $admin.per_page==100}selected{/if}>100</option>
</select>
&nbsp;
<small>条记录</small>
</label>
</div>
</div>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,17 @@
<!--找不到页面-->
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="error-page">
<h2 class="headline text-yellow"> 404</h2>
<div class="error-content">
<h3><i class="fa fa-warning text-yellow"></i> 哎呀!找不到页面。</h3>
<p>
我们找不到您要查找的页面。
同时,您可以<br/> <br/> <a class="btn btn-success BackButton">返回上一页</a> 或者 <a class="btn btn-primary" href="{:url('index/index')}">去首页</a>
</p>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,17 @@
<!--500错误-->
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<div class="error-page">
<h2 class="headline text-yellow"> 404</h2>
<div class="error-content">
<h3><i class="fa fa-warning text-yellow"></i> 哎呀!页面出问题了。</h3>
<p>
当前页面出现了一点点问题。
同时,您可以<br/> <br/> <a class="btn btn-success BackButton">返回上一页</a> 或者 <a class="btn btn-primary" href="{:url('index/index')}">去首页</a>
</p>
</div>
</div>
</section>
{/block}

View File

@ -0,0 +1,11 @@
<!--空白页面参考模版-->
{extend name="public/base" /}
{block name='content'}
{include file='public/content_header' /}
<section class="content">
<!-- 这里写内容即可 -->
</section>
{/block}

View File

@ -0,0 +1,227 @@
{extend name='public/base' /}
{block name='content'}
{include file='public/content_header' /}
<style type="text/css">
/* 图片展示
----------------------------------------------- */
ul.albums {
display: block;
min-height: 1px;
height: auto;
overflow: hidden;
padding: 5px 0;
margin: 0 15px;
}
ul.albums li {
position: relative;
display: inline-block;
padding: 5px;
border: 1px solid #e5e5e5;
margin: 5px 0 0 20px;
cursor: pointer;
}
ul.albums li a.btn-close {
display: block;
position: absolute;
z-index: 2;
top: -8px;
right: -10px;
width: 20px;
height: 20px;
}
ul.albums li a.btn-fm{width: 100px;
display:none;
height: 100px;
border: 0px;
opacity: 0.5;
background-color: #000;
line-height: 100px;
text-align: center;
color: #fff;
position: absolute;}
ul.albums li:hover a.btn-fm{ display: block; }
ul.albums li a.btn-fm_z{
display:none;
color: #ccc;
border: 0px;
background-color: #000;
position: absolute;
bottom: 5px;
left: 5px;
opacity: 0.6;
width: 40px;
text-align: center;
}
</style>
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<!-- 表单头部 -->
<div class="box-header with-border">
<div class="btn-group">
<a class="btn flat btn-sm btn-default BackButton">
<i class="fa fa-arrow-left"></i>
返回
</a>
</div>
</div>
<!-- 表单 -->
<form id="dataForm" class="form-horizontal dataForm" action="" method="post"
enctype="multipart/form-data">
<!-- 表单字段区域 -->
<div class="box-body">
<div class="form-group">
<label for="img" class="col-sm-2 control-label">头像</label>
<ul class="albums" id="albums">
<li id="nophoto" ><img src="{if isset($data.avatar)}{$data.avatar}{else}/static/admin/images/nophoto_100x100.png{/if}" style="width: 100px;height: 100px;"></li>
<input type="hidden" name="avatar" id="avatar" value="{$data.avatar|default=''}">
</ul>
</div>
<script type="text/javascript">
layui.use(['upload','laydate','form'], function(){
var form = layui.form;
var upload = layui.upload;
//执行实例
upload.render({
elem: '#nophoto' //绑定元素
,url: "{:url('file/icon')}" //接口url
,data:{type:1,width:200,heigh:200}
,field:'image'
,multiple: true
,done: function(res){
$(".albums img").attr('src',res.data.avatar_logo_thum);
$("#avatar").val(res.data.avatar_logo_thum);
}
,error: function(){
layer.tips('图片错误', '#btn');
return false;
}
});
});
</script>
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10 col-md-4">
<input id="username" name="username" value="{$data.username|default=''}"
placeholder="请输入用户名" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group layui-form">
<label for="user_level_id" class="col-sm-2 control-label">会员等级</label>
<div class="col-sm-10 col-md-10">
<input type="radio" name="user_level_id" lay-filter="filter" value="1" title="体验会员" {if(!isset($data)
||$data.user_level_id==1)}checked{/if}>
<input type="radio" name="user_level_id" lay-filter="filter" value="2" title="正式会员" {if(!isset($data)
||$data.user_level_id==2)}checked{/if}>
</div>
</div>
<script>
layui.use(['upload','laydate','form'], function(){
var form = layui.form;
form.render();
});
</script>
<div class="form-group">
<label for="mobile" class="col-sm-2 control-label">手机号</label>
<div class="col-sm-10 col-md-4">
<input id="mobile" name="mobile" value="{$data.mobile|default=''}" placeholder="请输入手机号"
type="tel" maxlength="11" class="form-control field-mobile">
</div>
</div>
<div class="form-group">
<label for="nickname" class="col-sm-2 control-label">昵称</label>
<div class="col-sm-10 col-md-4">
<input id="nickname" name="nickname" value="{$data.nickname|default=''}"
placeholder="请输入昵称" type="text" class="form-control field-text">
</div>
</div>
<div class="form-group">
<label for="status" class="col-sm-2 control-label">是否启用</label>
<div class="col-sm-10 col-md-4">
<input class="input-switch" id="status" value="1" {if(!isset($data)
||$data.status==1)}checked{/if} type="checkbox"/>
<input class="switch field-switch" placeholder="是否启用" name="status"
value="{$data.status|default='1'}" hidden/>
</div>
</div>
<script>
$('#status').bootstrapSwitch({
onText: "是",
offText: "否",
onColor: "success",
offColor: "danger",
onSwitchChange: function (event, state) {
$(event.target).closest('.bootstrap-switch').next().val(state ? '1' : '0').change();
}
});
</script>
</div>
<!-- 表单底部 -->
<div class="box-footer">
{:token()}
<div class="col-sm-2">
</div>
<div class="col-sm-10 col-md-4">
{if !isset($data)}
<div class="btn-group pull-right">
<label class="createContinue">
<input type="checkbox" value="1" id="_create" name="_create"
title="继续添加数据">继续添加</label>
</div>
{/if}
<div class="btn-group">
<button type="submit" class="btn flat btn-info dataFormSubmit">
保存
</button>
</div>
<div class="btn-group">
<button type="reset" class="btn flat btn-default dataFormReset">
重置
</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
/** 表单验证 **/
$('#dataForm').validate({
rules: {
'username': {
required: true,
},
'mobile': {
required: true,
},
'nickname': {
required: true,
},
'status': {
required: true,
},
},
messages: {
'username': {
required: "用户名不能为空",
},
'mobile': {
required: "手机号不能为空",
},
'nickname': {
required: "昵称不能为空",
},
'status': {
required: "是否启用不能为空",
},
}
});
</script>
{/block}

Some files were not shown because too many files have changed in this diff Show More