ADMIN UI
@ -1,4 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* @Program: TaoLer 2023/3/11
|
||||
* @FilePath: app\admin\controller\index.php
|
||||
* @Description: Index.php 管理后台首页
|
||||
* @LastEditTime: 2023-03-11 10:15:35
|
||||
* @Author: Taoker <317927823@qq.com>
|
||||
* @Copyright (c) 2020~2023 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
@ -14,15 +23,17 @@ use app\admin\model\Cunsult;
|
||||
use think\facade\Config;
|
||||
use taoler\com\Api;
|
||||
use taoser\SetArr;
|
||||
use app\common\lib\facade\HttpHelper;
|
||||
|
||||
class Index extends AdminController
|
||||
{
|
||||
/*
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
}
|
||||
*/
|
||||
|
||||
protected $sys_version;
|
||||
protected $pn;
|
||||
protected $sys;
|
||||
protected $domain;
|
||||
protected $api;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
//控制器初始化显示左侧导航菜单
|
||||
@ -40,12 +51,30 @@ class Index extends AdminController
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch('index');
|
||||
}
|
||||
|
||||
public function console1()
|
||||
{
|
||||
return View::fetch('console1');
|
||||
}
|
||||
|
||||
public function console2()
|
||||
{
|
||||
// 评论、帖子状态
|
||||
$comm = Db::name('comment')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
$forum = Db::name('article')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
$user = Db::name('user')->field('id')->where(['delete_time'=>0,'status'=>0])->select();
|
||||
|
||||
View::assign([
|
||||
'pendComms' => count($comm),
|
||||
'pendForums' => count($forum),
|
||||
'pendUser' => count($user),
|
||||
]);
|
||||
return View::fetch('console2');
|
||||
}
|
||||
|
||||
public function set()
|
||||
{
|
||||
@ -94,7 +123,8 @@ class Index extends AdminController
|
||||
}
|
||||
|
||||
//版本检测
|
||||
public function getVersion(){
|
||||
public function getVersion()
|
||||
{
|
||||
$verCheck = Api::urlPost($this->sys['upcheck_url'],['pn'=>$this->pn,'ver'=>$this->sys_version]);
|
||||
if($verCheck->code !== -1){
|
||||
return $verCheck->code ? "<span style='color:red'>有{$verCheck->up_num}个版本需更新,当前可更新至{$verCheck->version}</span>" : $verCheck->msg;
|
||||
@ -102,6 +132,34 @@ class Index extends AdminController
|
||||
return lang('No new messages');
|
||||
}
|
||||
}
|
||||
|
||||
public function checkVersion()
|
||||
{
|
||||
$verCheck = Api::urlPost($this->sys['upcheck_url'],['pn'=>$this->pn,'ver'=>$this->sys_version]);
|
||||
if($verCheck->code !== -1){
|
||||
return $verCheck->code ? "<span style='color:red'>有{$verCheck->up_num}个版本需更新,当前可更新至{$verCheck->version}</span>" : $verCheck->msg;
|
||||
} else {
|
||||
return lang('No new messages');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测
|
||||
* @return mixed|string
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
if(empty($this->sys['key'])) return json(['code' => -1, 'msg' => '请配置网站KEY']);
|
||||
$data = ['u'=>$this->sys['domain'],'key'=>$this->sys['key']];
|
||||
$response = HttpHelper::withHost()->get('/v1/cy', $data)->toJson();
|
||||
|
||||
if($response->code == 0){
|
||||
Db::name('system')->save(['id' => 1, 'clevel' => $response->data->level]);
|
||||
return json(['code' => 0, 'msg' => $response->data->info, 'data' => $response->data]);
|
||||
} else {
|
||||
return json(['code' => -1, 'msg' => $response->msg]);
|
||||
}
|
||||
}
|
||||
|
||||
//本周发帖
|
||||
public function forums()
|
||||
|
586
app/admin/controller/addon/Addons.php
Normal file
@ -0,0 +1,586 @@
|
||||
<?php
|
||||
namespace app\admin\controller\addon;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\common\lib\SqlFile;
|
||||
use app\common\lib\Zip;
|
||||
use think\Exception;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Config;
|
||||
use app\admin\model\AuthRule;
|
||||
use app\admin\model\Addons as AddonsModel;
|
||||
use think\response\Json;
|
||||
use Symfony\Component\VarExporter\VarExporter;
|
||||
use taoler\com\Files;
|
||||
use app\common\lib\facade\HttpHelper;
|
||||
use app\common\lib\FileHelper;
|
||||
|
||||
class Addons extends AdminController
|
||||
{
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::param();
|
||||
if(!isset($data['type'])) $data['type'] = 'onlineAddons';
|
||||
if(!isset($data['selector'])) $data['selector'] = 'all';
|
||||
return $this->getList($data);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 插件动态列表
|
||||
* @param $data
|
||||
* @return Json
|
||||
*/
|
||||
public function getList($data)
|
||||
{
|
||||
$res = [];
|
||||
//本地插件列表
|
||||
$addonsList = Files::getDirName('../addons/');
|
||||
$response = HttpHelper::withHost()->get('/v1/addons');
|
||||
$addons = $response->toJson();
|
||||
switch($data['type']){
|
||||
//已安装
|
||||
case 'installed':
|
||||
if($addonsList){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>5];
|
||||
$res['col'] = [
|
||||
['type' => 'numbers'],
|
||||
['field' => 'name','title'=> '插件', 'width'=> 120],
|
||||
['field'=> 'title','title'=> '标题', 'width'=> 100],
|
||||
['field'=> 'version','title'=> '版本', 'templet' => '<div>{{d.version}}</div>', 'width'=> 60],
|
||||
['field' => 'author','title'=> '作者', 'width'=> 80],
|
||||
['field' => 'description','title'=> '简介', 'minWidth'=> 200],
|
||||
['field' => 'install','title'=> '安装', 'width'=> 100],
|
||||
['field' => 'ctime','title'=> '到期时间', 'width'=> 100],
|
||||
['field' => 'status','title'=> '状态', 'width'=> 95, 'templet' => '#buttonStatus'],
|
||||
['title' => '操作', 'width'=> 150, 'align'=>'center', 'toolbar'=> '#addons-installed-tool']
|
||||
];
|
||||
|
||||
// $data数据
|
||||
foreach($addonsList as $v){
|
||||
$info_file = '../addons/'.$v.'/info.ini';
|
||||
$info = parse_ini_file($info_file);
|
||||
$info['show'] = $info['status'] ? '启用' : '禁用';
|
||||
$info['install'] = $info['status'] ? '是' : '否';
|
||||
$res['data'][] = $info;
|
||||
}
|
||||
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有安装任何插件'];
|
||||
}
|
||||
break;
|
||||
//在线全部
|
||||
case 'onlineAddons':
|
||||
if($response->ok()) {
|
||||
|
||||
$res['code'] = 0;
|
||||
$res['msg'] = '';
|
||||
$res['count'] = count($addons->data);
|
||||
$res['col'] = [
|
||||
['type' => 'numbers'],
|
||||
['field' => 'title','title'=> '插件', 'width'=> 200],
|
||||
['field' => 'description','title'=> '简介', 'minWidth'=> 200],
|
||||
['field' => 'author','title'=> '作者', 'width'=> 100],
|
||||
['field' => 'price','title'=> '价格(元)','width'=> 85],
|
||||
['field' => 'downloads','title'=> '下载', 'width'=> 70],
|
||||
['field' => 'version','title'=> '版本', 'templet' => '<div>{{d.version}} {{# if(d.have_newversion == 1){ }}<span class="layui-badge-dot"></span>{{# } }}</div>','width'=> 75],
|
||||
['field' => 'status','title'=> '在线', 'width'=> 70],
|
||||
['title' => '操作', 'width'=> 150, 'align'=>'center', 'toolbar'=> '#addons-tool']
|
||||
];
|
||||
|
||||
// $data数据 与本地文件对比
|
||||
foreach($addons->data as $v){
|
||||
switch ($data['selector']) {
|
||||
case 'free':
|
||||
if($v->price == 0) {
|
||||
if(in_array($v->name,$addonsList)) {
|
||||
$info = get_addons_info($v->name);
|
||||
//已安装
|
||||
$v->isInstall = 1;
|
||||
//判断是否有新版本
|
||||
if($v->version > $info['version']) $v->have_newversion = 1;
|
||||
$v->price = $v->price ? $v->price : '免费';
|
||||
}
|
||||
$res['data'][] = $v;
|
||||
}
|
||||
break;
|
||||
case 'pay':
|
||||
if($v->price > 0) {
|
||||
if(in_array($v->name,$addonsList)) {
|
||||
$info = get_addons_info($v->name);
|
||||
//已安装
|
||||
$v->isInstall = 1;
|
||||
//判断是否有新版本
|
||||
if($v->version > $info['version']) $v->have_newversion = 1;
|
||||
$v->price = $v->price ? $v->price : '免费';
|
||||
}
|
||||
$res['data'][] = $v;
|
||||
}
|
||||
break;
|
||||
case 'all':
|
||||
if(in_array($v->name,$addonsList)) {
|
||||
$info = get_addons_info($v->name);
|
||||
//已安装
|
||||
$v->isInstall = 1;
|
||||
//判断是否有新版本
|
||||
if($v->version > $info['version']) $v->have_newversion = 1;
|
||||
$v->price = $v->price ? $v->price : '免费';
|
||||
}
|
||||
$res['data'][] = $v;
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
} else {
|
||||
$res = ['code' => -1, 'msg' => '未获取到服务器信息'];
|
||||
}
|
||||
break;
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* 安装&升级,
|
||||
* @param array $data
|
||||
* @param bool $type true执行sql,false升级不执行sql
|
||||
* @return Json
|
||||
*/
|
||||
public function install(array $data = [], bool $type = true)
|
||||
{
|
||||
$data = Request::only(['name','version','uid','token']) ?? $data;
|
||||
// 接口
|
||||
$response = HttpHelper::withHost()->post('/v1/getaddons',$data)->toJson();
|
||||
if($response->code < 0) return json($response);
|
||||
|
||||
//版本判断,是否能够安装?
|
||||
$addInstalledVersion = get_addons_info($data['name']);
|
||||
if(!empty($addInstalledVersion)){
|
||||
$verRes = version_compare($data['version'],$addInstalledVersion['version'],'>');
|
||||
if(!$verRes){
|
||||
return json(['code'=>-1,'msg'=>'不能降级,请选择正确版本']);
|
||||
}
|
||||
//$tpl_ver_res = version_compare($addInstalledVersion['template_version'], config('taoler.template_version'),'<');
|
||||
}
|
||||
|
||||
$file_url = $response->addons_src;
|
||||
//判断远程文件是否可用存在
|
||||
$header = get_headers($file_url, true);
|
||||
if(!isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'))){
|
||||
return json(['code'=>-1,'msg'=>'获取远程文件失败']);
|
||||
}
|
||||
//把远程文件放入本地
|
||||
|
||||
//拼接路径
|
||||
$addons_dir = FileHelper::getDirPath(root_path() . 'runtime' . DS . 'addons');
|
||||
if(!is_dir($addons_dir)) Files::mkdirs($addons_dir);
|
||||
|
||||
$package_file = $addons_dir . $data['name'] . '.zip'; //升级的压缩包文件路径
|
||||
$cpfile = copy($file_url, $package_file);
|
||||
if(!$cpfile) return json(['code'=>-1,'msg'=>'下载升级文件失败']);
|
||||
|
||||
$uzip = new Zip();
|
||||
$zipDir = strstr($package_file, '.zip',true); //返回文件名后缀前的字符串
|
||||
$zipPath = FileHelper::getDirPath($zipDir); //转换为带/的路径 压缩文件解压到的路径
|
||||
$unzip_res = $uzip->unzip($package_file, $zipPath, true);
|
||||
if(!$unzip_res) return json(['code'=>-1,'msg'=>'解压失败']);
|
||||
unlink($package_file);
|
||||
//升级插件
|
||||
|
||||
//升级前的写入文件权限检查
|
||||
$allUpdateFiles = Files::getAllFile($zipPath);
|
||||
|
||||
if (empty($allUpdateFiles)) return json(['code' => -1, 'msg' => '无可更新文件。']);
|
||||
$checkString = '';
|
||||
foreach ($allUpdateFiles as $updateFile) {
|
||||
$coverFile = ltrim(str_replace($zipPath, '', $updateFile), DIRECTORY_SEPARATOR);
|
||||
$dirPath = dirname('../'.$coverFile);
|
||||
if (file_exists('../'.$coverFile)) {
|
||||
if (!is_writable('../'.$coverFile)) $checkString .= $coverFile . ' [<span class="text-red">' . '无写入权限' . '</span>]<br>';
|
||||
} else {
|
||||
if (!is_dir($dirPath)) @mkdir($dirPath, 0777, true);
|
||||
if (!is_writable($dirPath)) $checkString .= $dirPath . ' [<span class="text-red">' . '无写入权限' . '</span>]<br>';
|
||||
}
|
||||
}
|
||||
if (!empty($checkString)) return json(['code' => -1, 'msg' => $checkString]);
|
||||
|
||||
try {
|
||||
// 拷贝文件
|
||||
FileHelper::copyDir(root_path() . 'runtime' . DS . 'addons' . DS . $data['name'] . DS, root_path());
|
||||
// $type判断是安装还是升级
|
||||
if($type) {
|
||||
// 执行数据库
|
||||
$sqlInstallFile = root_path(). 'addons' . DS . $data['name'] . DS . 'install.sql';
|
||||
if(file_exists($sqlInstallFile)) {
|
||||
SqlFile::dbExecute($sqlInstallFile);
|
||||
}
|
||||
|
||||
}
|
||||
//安装菜单
|
||||
//$menu = get_addons_menu($data['name']);
|
||||
$menuFile = app()->getRootPath() . 'addons' . DS . $data['name'] . DS . 'menu.php';
|
||||
if(file_exists($menuFile)){
|
||||
$menu = include $menuFile;
|
||||
} else {
|
||||
$menu = [];
|
||||
}
|
||||
if(!empty($menu)){
|
||||
if(isset($menu['is_nav']) && $menu['is_nav'] == 1){
|
||||
$pid = 0;
|
||||
}else{
|
||||
$pid = AuthRule::where('name','addons')->value('id');
|
||||
}
|
||||
$menu_arr[] = $menu['menu'];
|
||||
$this->addAddonMenu($menu_arr, (int)$pid,1);
|
||||
}
|
||||
$class = get_addons_instance($data['name']);
|
||||
//执行插件安装
|
||||
$class->install();
|
||||
set_addons_info($data['name'],['status' => 1,'install' => 1]);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code'=>-1,'msg'=> $e->getMessage()]);
|
||||
}
|
||||
|
||||
Files::delDirAndFile('../runtime/addons/'.$data['name'] . DS);
|
||||
$msg = $type ? '插件安装成功!' : '插件升级成功!';
|
||||
return json(['code' => 0, 'msg' => $msg]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 卸载插件
|
||||
* @param string $name
|
||||
* @return Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function uninstall(string $name = '')
|
||||
{
|
||||
$name = input('name') ?? $name;
|
||||
// 执行插件卸载
|
||||
$class = get_addons_instance($name);
|
||||
$class->uninstall();
|
||||
// 卸载菜单
|
||||
$menu = get_addons_menu($name);
|
||||
if(!empty($menu)){
|
||||
$menu_arr[] = $menu['menu'];
|
||||
$this->delAddonMenu($menu_arr);
|
||||
}
|
||||
|
||||
try {
|
||||
//卸载插件数据库
|
||||
$sqlUninstallFile = root_path().'addons/'.$name.'/uninstall.sql';
|
||||
if(file_exists($sqlUninstallFile)) {
|
||||
SqlFile::dbExecute($sqlUninstallFile);
|
||||
}
|
||||
|
||||
// 插件addons下目录
|
||||
$addonsDir = root_path() . 'addons' . DS . $name . DS;
|
||||
// 插件管理后台目录
|
||||
$admin_controller = app_path() . 'controller' . DS . $name . DS;
|
||||
$admin_model = app_path() . 'model' . DS . $name . DS;
|
||||
$admin_view = app_path() . 'view' . DS . $name . DS;
|
||||
$admin_validate = app_path() . 'validate' . DS . $name . DS;
|
||||
// 插件静态资源目录
|
||||
$addon_public = public_path() . 'addons' . DS . $name . DS;
|
||||
|
||||
if(file_exists($addonsDir)) Files::delDir($addonsDir);
|
||||
if(file_exists($admin_controller)) Files::delDir($admin_controller);
|
||||
if(file_exists($admin_model)) Files::delDir($admin_model);
|
||||
if(file_exists($admin_view)) Files::delDir($admin_view);
|
||||
if(file_exists($admin_validate)) Files::delDir($admin_validate);
|
||||
if(file_exists($addon_public)) Files::delDir($addon_public);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return json(['code' => -1, 'msg' => $e->getMessage()]);
|
||||
}
|
||||
|
||||
return json(['code' => 0, 'msg' => '插件卸载成功']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 升级插件
|
||||
* @return Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function upgrade()
|
||||
{
|
||||
$data = Request::only(['name','version','uid','token']);
|
||||
// 获取配置信息
|
||||
$config = get_addons_config($data['name']);
|
||||
// 卸载插件
|
||||
$class = get_addons_instance($data['name']);
|
||||
$class->uninstall();
|
||||
//$this->uninstall($data['name']);
|
||||
|
||||
// 卸载菜单
|
||||
$menu = get_addons_menu($data['name']);
|
||||
if(!empty($menu)){
|
||||
$menu_arr[] = $menu['menu'];
|
||||
$this->delAddonMenu($menu_arr);
|
||||
}
|
||||
|
||||
try {
|
||||
// 升级安装,第二个type参数false为升级,true安装
|
||||
$res = $this->install($data,false);
|
||||
// 升级sql
|
||||
$sqlUpdateFile = root_path().'addons/'.$data['name'].'/update.sql';
|
||||
if(file_exists($sqlUpdateFile)) {
|
||||
SqlFile::dbExecute($sqlUpdateFile);
|
||||
}
|
||||
// 恢复配置
|
||||
if(!empty($config)) {
|
||||
set_addons_config($data['name'], $config);
|
||||
}
|
||||
// 写入版本号
|
||||
set_addons_info($data['name'],['version' =>$data['version']]);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code' => -1, 'msg' => $e->getMessage()]);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用禁用插件
|
||||
* @return Json
|
||||
* @throws Exception
|
||||
*/
|
||||
public function check(){
|
||||
$name = input('name');
|
||||
$info = get_addons_info($name);
|
||||
try{
|
||||
$arr = ['status' => $info['status'] ? 0 :1];
|
||||
set_addons_info($name,$arr);
|
||||
$class = get_addons_instance($name);
|
||||
if($arr['status']) {
|
||||
$res = ['code'=>0,'msg'=>'启用成功'];
|
||||
} else {
|
||||
$res = ['code'=>0,'msg'=>'已被禁用'];
|
||||
}
|
||||
$info['status']==1 ?$class->enabled():$class->disabled();
|
||||
} catch (\Exception $e) {
|
||||
throw new Exception($e->getMessage());
|
||||
}
|
||||
|
||||
return json($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置插件
|
||||
* @param $name
|
||||
* @return string|Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function config($name)
|
||||
{
|
||||
$name = input('name');
|
||||
$config = get_addons_config($name);
|
||||
if(empty($config)) return json(['code'=>-1,'msg'=>'无配置项!无需操作']);
|
||||
if(Request::isAjax()){
|
||||
$params = Request::param('params/a',[],'trim');
|
||||
if ($params) {
|
||||
foreach ($config as $k => &$v) {
|
||||
if (isset($params[$k])) {
|
||||
if ($v['type'] == 'array') {
|
||||
$arr = [];
|
||||
$params[$k] = is_array($params[$k]) ? $params[$k] :[];
|
||||
foreach ($params[$k]['key'] as $kk=>$vv){
|
||||
$arr[$vv] = $params[$k]['value'][$kk];
|
||||
}
|
||||
$params[$k] = $arr;
|
||||
$value = $params[$k];
|
||||
$v['content'] = $value;
|
||||
$v['value'] = $value;
|
||||
} else {
|
||||
$value = $params[$k];
|
||||
}
|
||||
$v['value'] = $value;
|
||||
}
|
||||
}
|
||||
unset($v);
|
||||
set_addons_config($name,$config);
|
||||
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'配置成功!']);
|
||||
}
|
||||
|
||||
//模板引擎初始化
|
||||
$view = ['formData'=>$config,'title'=>'title'];
|
||||
View::assign($view);
|
||||
$configFile = root_path() . 'addons' . DS . $name . DS . 'config.html';
|
||||
$viewFile = is_file($configFile) ? $configFile : '';
|
||||
|
||||
return View::fetch($viewFile);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加菜单
|
||||
* @param array $menu
|
||||
* @param int $pid
|
||||
* @param int $type
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function addAddonMenu(array $menu,int $pid = 0, int $type = 1)
|
||||
{
|
||||
foreach ($menu as $v){
|
||||
$hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
|
||||
try {
|
||||
$v['pid'] = $pid;
|
||||
$v['name'] = trim($v['name'],'/');
|
||||
$v['type'] = $type;
|
||||
$menu = AuthRule::withTrashed()->where('name',$v['name'])->find();
|
||||
if($menu){
|
||||
$menu->restore();
|
||||
} else {
|
||||
$menu = AuthRule::create($v);
|
||||
}
|
||||
|
||||
if ($hasChild) {
|
||||
$this->addAddonMenu($v['sublist'], $menu->id,$type);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
throw new \Exception($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 循环删除菜单
|
||||
* @param array $menu
|
||||
* @param string $module
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function delAddonMenu(array $menu,string $module = 'addon')
|
||||
{
|
||||
foreach ($menu as $k=>$v){
|
||||
$hasChild = isset($v['sublist']) && $v['sublist'] ? true : false;
|
||||
try {
|
||||
$v['name'] = trim($v['name'],'/');
|
||||
$menu_rule = AuthRule::withTrashed()->where('name',$v['name'])->find();
|
||||
if(!is_null($menu_rule)){
|
||||
$menu_rule->delete(true);
|
||||
if ($hasChild) {
|
||||
$this->delAddonMenu($v['sublist']);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
throw new \Exception($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户登录
|
||||
* @return mixed|Json
|
||||
*/
|
||||
public function userLogin()
|
||||
{
|
||||
$response = HttpHelper::withHost()->post('/v1/user/login', Request::param())->toJson();
|
||||
return json($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单
|
||||
* @return string|Json
|
||||
*/
|
||||
public function pay()
|
||||
{
|
||||
$data = Request::only(['id','name','version','uid','price']);
|
||||
// $url = $this->getSystem()['api_url'].'/v1/createOrder';
|
||||
// $order = Api::urlPost($url,$data);
|
||||
$response = HttpHelper::withHost()->post('/v1/createOrder', $data);
|
||||
if ($response->ok()) {
|
||||
// $orderData = json_decode(json_encode($response->toJson()->data),TRUE);
|
||||
View::assign('orderData',$response->toArray()['data']);
|
||||
return View::fetch();
|
||||
} else {
|
||||
return json($response->toJson());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 支付查询
|
||||
* @return Json
|
||||
*/
|
||||
public function isPay()
|
||||
{
|
||||
$param = Request::only(['name','userinfo']);
|
||||
$data = [
|
||||
'name'=>$param['name'],
|
||||
'uid'=> $param['userinfo']['uid'],
|
||||
];
|
||||
$response = HttpHelper::withHost()->post('/v1/ispay', $data)->toJson();
|
||||
return json($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示创建资源表单页.
|
||||
*
|
||||
* @return \think\Response
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
//添加版本
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = AddonsModel::create($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'添加失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传插件文件zip
|
||||
* @return Json
|
||||
*/
|
||||
public function uploadZip()
|
||||
{
|
||||
$id = Request::param();
|
||||
$file = request()->file('file');
|
||||
try {
|
||||
validate(['file'=>'filesize:2048|fileExt:zip,rar,7z'])
|
||||
->check(array($file));
|
||||
$saveName = \think\facade\Filesystem::disk('public')->putFile('addons',$file);
|
||||
} catch (\think\exception\ValidateException $e) {
|
||||
return json(['code' => -1,'msg' => $e->getMessage()]);
|
||||
}
|
||||
$upload = Config::get('filesystem.disks.public.url');
|
||||
|
||||
if($saveName){
|
||||
$name_path =str_replace('\\',"/",$upload.'/'.$saveName);
|
||||
$res = ['code'=>0,'msg'=>'插件上传成功','src'=>$name_path];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'上传错误'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传接口
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function uploads()
|
||||
{
|
||||
$type = Request::param('type');
|
||||
return $this->uploadFiles($type);
|
||||
}
|
||||
|
||||
|
||||
}
|
15
app/admin/controller/addon/Template.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
namespace app\admin\controller\addon;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
|
||||
class Template extends AdminController
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
//
|
||||
return View::fetch();
|
||||
}
|
||||
}
|
194
app/admin/controller/content/Cate.php
Normal file
@ -0,0 +1,194 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller\content;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\common\model\Cate as CateModel;
|
||||
use app\common\model\Article;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Cache;
|
||||
use taoler\com\Files;
|
||||
use app\common\lib\Msgres;
|
||||
|
||||
class Cate extends AdminController
|
||||
{
|
||||
/**
|
||||
* 浏览
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//详情模板
|
||||
$sys = $this->getSystem();
|
||||
$template = Files::getDirName('../view/'.$sys['template'].'/index/article/');
|
||||
View::assign(['template'=>$template]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//帖子分类
|
||||
public function list()
|
||||
{
|
||||
$cate = new CateModel();
|
||||
if(Request::isAjax()){
|
||||
return $cate->getList();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 应用下article/view模板
|
||||
public function getAppNameView()
|
||||
{
|
||||
$appName = input('appname') ?: 'index';
|
||||
$sys = $this->getSystem();
|
||||
if(is_dir(root_path() . 'app' . DS . $appName . DS . 'view' . DS)){
|
||||
$viewPath = root_path() . 'app' . DS . $appName . DS . 'view' . DS . 'article' . DS;
|
||||
} elseif(is_dir(root_path() . 'view' . DS . $sys['template'] . DS)) {
|
||||
$viewPath = root_path() . 'view' . DS . $sys['template'] . DS . 'index' . DS . 'article' . DS;
|
||||
} else {
|
||||
$viewPath = '';
|
||||
}
|
||||
$template = Files::getDirName($viewPath);
|
||||
return json(['data' => $template]);
|
||||
}
|
||||
|
||||
//添加和编辑帖子分类
|
||||
public function addEdit()
|
||||
{
|
||||
$addOrEdit = !is_null(input('id'));//true是编辑false新增
|
||||
$msg = $addOrEdit ? lang('edit') : lang('add');
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::param();
|
||||
if(isset($data['id']) && $data['pid'] == $data['id']) return json(['code'=>-1,'msg'=> $msg.'不能作为自己的子类']);
|
||||
$list = Db::name('cate')->cache('catename')->save($data);
|
||||
|
||||
if($list){
|
||||
return json(['code'=>0,'msg'=> $msg.'分类成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=> $msg.'分类失败']);
|
||||
}
|
||||
}
|
||||
//详情模板
|
||||
$sys = $this->getSystem();
|
||||
$template = Files::getDirName('../view/'.$sys['template'].'/index/article/');
|
||||
// 如果是新增,pid=0,detpl默认第一个子模块,如果是编辑,查询出cate
|
||||
$cate = $addOrEdit ? Db::name('cate')->field('detpl,pid,appname')->where(['delete_time' =>0])->find((int) input('id')) : ['pid'=>0,'detpl'=>$template[0],'appname'=>'index'];
|
||||
// app下前台带模板的应用
|
||||
$appArr = [];
|
||||
if(is_dir(root_path() . 'app' . DS . 'home')) {
|
||||
$appArr = ['index','home'];
|
||||
} else {
|
||||
$appArr = ['index'];
|
||||
}
|
||||
View::assign(['template'=>$template,'cate'=>$cate, 'appname' => $appArr]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//添加分类
|
||||
public function add()
|
||||
{
|
||||
$addOrEdit = !is_null(input('id'));//true是编辑false新增
|
||||
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::param();
|
||||
if(isset($data['id']) && $data['pid'] == $data['id']) return json(['code'=>-1,'msg'=> '不能作为自己的子类']);
|
||||
$list = Db::name('cate')->cache('catename')->save($data);
|
||||
|
||||
if($list){
|
||||
return json(['code'=>0,'msg'=> '添加成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=> '添加失败']);
|
||||
}
|
||||
}
|
||||
//详情模板
|
||||
$sys = $this->getSystem();
|
||||
$template = Files::getDirName('../view/'.$sys['template'].'/index/article/');
|
||||
// 如果是新增,pid=0,detpl默认第一个子模块,如果是编辑,查询出cate
|
||||
$cate = ['pid'=>0,'detpl'=>$template[0],'appname'=>'index'];
|
||||
// app下前台带模板的应用
|
||||
$appArr = [];
|
||||
if(is_dir(root_path() . 'app' . DS . 'home')) {
|
||||
$appArr = ['index','home'];
|
||||
} else {
|
||||
$appArr = ['index'];
|
||||
}
|
||||
View::assign(['template'=>$template,'cate'=>$cate, 'appname' => $appArr]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//编辑分类
|
||||
public function edit()
|
||||
{
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::param();
|
||||
|
||||
if(isset($data['id']) && $data['pid'] == $data['id']) return json(['code'=>-1,'msg'=> '不能作为自己的子类']);
|
||||
$list = Db::name('cate')->where('id', input('id'))->save($data);
|
||||
|
||||
if($list){
|
||||
return json(['code'=>0,'msg'=> '编辑成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=> '编辑失败']);
|
||||
}
|
||||
}
|
||||
//详情模板
|
||||
$sys = $this->getSystem();
|
||||
$template = Files::getDirName('../view/'.$sys['template'].'/index/article/');
|
||||
// 如果是新增,pid=0,detpl默认第一个子模块,如果是编辑,查询出cate
|
||||
$cate = Db::name('cate')->field('id,catename,ename,detpl,pid,appname,icon,sort,desc')->where(['delete_time' =>0])->find((int) input('id'));
|
||||
// app下前台带模板的应用
|
||||
$appArr = [];
|
||||
if(is_dir(root_path() . 'app' . DS . 'home')) {
|
||||
$appArr = ['index','home'];
|
||||
} else {
|
||||
$appArr = ['index'];
|
||||
}
|
||||
View::assign(['template'=>$template,'cate'=>$cate, 'appname' => $appArr]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//删除帖子分类
|
||||
public function delete()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$id = Request::param('id');
|
||||
$cate = new CateModel;
|
||||
$result = $cate->del($id);
|
||||
if($result == 1){
|
||||
return json(['code'=>0,'msg'=>'删除分类成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>$result]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//帖子分类开启热点
|
||||
//评论审核
|
||||
public function hot()
|
||||
{
|
||||
$data = Request::only(['id','is_hot']);
|
||||
$cate = Db::name('cate')->save($data);
|
||||
if($cate){
|
||||
if($data['is_hot'] == 1){
|
||||
return json(['code'=>0,'msg'=>'设置热点成功','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'取消热点显示','icon'=>5]);
|
||||
}
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'热点设置失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//array_filter过滤函数
|
||||
public function filtr($arr){
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
133
app/admin/controller/content/Comment.php
Normal file
@ -0,0 +1,133 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller\content;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\common\model\Cate;
|
||||
use app\common\model\Comment as CommentModel;
|
||||
use app\common\model\Article;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Cache;
|
||||
use taoler\com\Files;
|
||||
use app\common\lib\Msgres;
|
||||
use think\response\Json;
|
||||
|
||||
class Comment extends AdminController
|
||||
{
|
||||
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//帖子评论
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['name','content','status']);
|
||||
$map = array_filter($data);
|
||||
$where = array();
|
||||
if(!empty($map['content'])){
|
||||
$where[] = ['a.content','like','%'.$map['content'].'%'];
|
||||
unset($map['content']);
|
||||
}
|
||||
if(isset($data['status']) && $data['status'] !== '' ){
|
||||
$where[] = ['a.status','=',(int)$data['status']];
|
||||
unset($map['status']);
|
||||
}
|
||||
|
||||
/*
|
||||
$replys = Comment::field('id,article_id,user_id,content,create_time')->with([
|
||||
'user' => function($query){
|
||||
$query->field('id,name,user_img');
|
||||
},
|
||||
'article' => function($query){
|
||||
$query->field('id,title');
|
||||
}
|
||||
])->paginate(15);
|
||||
*/
|
||||
$replys = Db::name('comment')
|
||||
->alias('a')
|
||||
->join('user u','a.user_id = u.id')
|
||||
->join('article c','a.article_id = c.id')
|
||||
->join('cate ca','c.cate_id = ca.id')
|
||||
->field('a.id as aid,name,ename,appname,title,user_img,a.content as content,a.create_time as create_time,a.status as astatus,c.id as cid')
|
||||
->where('a.delete_time',0)
|
||||
->where($map)
|
||||
->where($where)
|
||||
->order('a.create_time', 'desc')
|
||||
->paginate(15);
|
||||
|
||||
$count = $replys->total();
|
||||
$res = [];
|
||||
if ($count) {
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($replys as $k => $v){
|
||||
$url = $this->getRouteUrl($v['cid'],$v['ename'], $v['appname']);
|
||||
//$res['data'][] = ['id'=>$v['id'],'replyer'=>$v->user->name,'cardid'=>$v->article->title,'avatar'=>$v->user->user_img,'content'=>$v['content'],'replytime'=>$v['create_time']];
|
||||
$res['data'][] = ['id'=>$v['aid'],'replyer'=>$v['name'],'title'=>htmlspecialchars($v['title']),'avatar'=>$v['user_img'],'content'=>htmlspecialchars($v['content']),'replytime'=>date("Y-m-d",$v['create_time']),'check'=>$v['astatus'],'url'=>$url];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//评论编辑
|
||||
public function edit()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//评论删除
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$arr = explode(",",$id);
|
||||
foreach($arr as $v){
|
||||
$comm = CommentModel::find($v);
|
||||
$result = $comm->delete();
|
||||
}
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//评论审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::param();
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('comment')->where('id',$data['id'])->save(['status' => $data['status']]);
|
||||
if($res){
|
||||
if($data['status'] == 1){
|
||||
return json(['code'=>0,'msg'=>'评论审核通过','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'评论被禁止','icon'=>5]);
|
||||
}
|
||||
|
||||
}else {
|
||||
return json(['code'=>-1,'msg'=>'审核出错']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//array_filter过滤函数
|
||||
public function filtr($arr){
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
383
app/admin/controller/content/Forum.php
Normal file
@ -0,0 +1,383 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller\content;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\common\model\Cate;
|
||||
use app\common\model\Comment;
|
||||
use app\common\model\Article;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Cache;
|
||||
use taoler\com\Files;
|
||||
use app\common\lib\Msgres;
|
||||
use think\response\Json;
|
||||
|
||||
class Forum extends AdminController
|
||||
{
|
||||
/**
|
||||
* 浏览
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//帖子列表
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','name','title','sec']);
|
||||
$where =array();
|
||||
if (!empty($data['sec'])) {
|
||||
switch ($data['sec']) {
|
||||
case '1':
|
||||
$data['a.status'] = 1;
|
||||
break;
|
||||
case '2':
|
||||
$data['is_top'] = 1;
|
||||
break;
|
||||
case '3':
|
||||
$data['is_hot'] = 1;
|
||||
break;
|
||||
case '4':
|
||||
$data['is_reply'] = 0;
|
||||
break;
|
||||
case '5':
|
||||
$data['a.status'] = -1;
|
||||
break;
|
||||
case '6':
|
||||
$data['a.status'] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
unset($data['sec']);
|
||||
unset($data['status']);
|
||||
|
||||
if(!empty($data['id'])){
|
||||
$data['a.id'] = $data['id'];
|
||||
unset($data['id']);
|
||||
}
|
||||
|
||||
if(!empty($data['title'])){
|
||||
$where[] = ['title', 'like', '%'.$data['title'].'%'];
|
||||
unset($data['title']);
|
||||
}
|
||||
|
||||
$map = array_filter($data,[$this,"filtr"]);
|
||||
|
||||
$forumList = Db::name('article')
|
||||
->alias('a')
|
||||
->join('user u','a.user_id = u.id')
|
||||
->join('cate c','a.cate_id = c.id')
|
||||
->field('a.id as aid,ename,appname,name,user_img,title,content,a.update_time as update_time,is_top,a.is_hot as is_hot,is_reply,a.status as status')
|
||||
->where('a.delete_time',0)
|
||||
->where($map)
|
||||
->where($where)
|
||||
->order('a.create_time', 'desc')
|
||||
->paginate(15);
|
||||
$res = [];
|
||||
$count = $forumList->total();
|
||||
if($count){
|
||||
$res['code'] = 0;
|
||||
$res['msg'] = '';
|
||||
$res['count'] = $count;
|
||||
foreach($forumList as $k=>$v){
|
||||
$url = $this->getRouteUrl($v['aid'],$v['ename'],$v['appname']);
|
||||
$res['data'][]= ['id'=>$v['aid'],'poster'=>$v['name'],'avatar'=>$v['user_img'],'title'=>htmlspecialchars($v['title']),'url'=>$url,'content'=>htmlspecialchars($v['content']),'posttime'=>date("Y-m-d",$v['update_time']),'top'=>$v['is_top'],'hot'=>$v['is_hot'],'reply'=>$v['is_reply'],'check'=>$v['status']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加帖子文章
|
||||
* @return string|\think\Response|\think\response\Json|void
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if (Request::isAjax()) {
|
||||
|
||||
$data = Request::only(['cate_id', 'title', 'title_color', 'tiny_content', 'content', 'upzip', 'keywords', 'description', 'captcha']);
|
||||
$tagId = input('tagid');
|
||||
$data['user_id'] = 1; //管理员ID
|
||||
halt($data);
|
||||
// 调用验证器
|
||||
$validate = new \app\common\validate\Article;
|
||||
$result = $validate->scene('Artadd')->check($data);
|
||||
if (true !== $result) {
|
||||
return Msgres::error($validate->getError());
|
||||
}
|
||||
|
||||
// 获取内容图片音视频标识
|
||||
$iva= $this->hasIva($data['content']);
|
||||
$data = array_merge($data,$iva);
|
||||
|
||||
// 处理内容
|
||||
$data['content'] = $this->downUrlPicsReaplace($data['content']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
|
||||
// 获取分类ename,appname
|
||||
$cateName = Db::name('cate')->field('ename,appname')->find($data['cate_id']);
|
||||
|
||||
$article = new Article();
|
||||
$result = $article->add($data);
|
||||
if ($result['code'] == 1) {
|
||||
// 获取到的最新ID
|
||||
$aid = $result['data']['id'];
|
||||
//写入taglist表
|
||||
$tagArr = [];
|
||||
if(isset($tagId)) {
|
||||
$tagIdArr = explode(',',$tagId);
|
||||
foreach($tagIdArr as $tid) {
|
||||
$tagArr[] = ['article_id'=>$aid,'tag_id'=>$tid,'create_time'=>time()];
|
||||
}
|
||||
}
|
||||
Db::name('taglist')->insertAll($tagArr);
|
||||
|
||||
// 清除文章tag缓存
|
||||
Cache::tag('tagArtDetail')->clear();
|
||||
|
||||
$link = $this->getRouteUrl((int)$aid, $cateName['ename'],$cateName['appname']);
|
||||
// 推送给百度收录接口
|
||||
$this->baiduPushUrl($link);
|
||||
|
||||
$url = $result['data']['status'] ? $link : (string)url('index/');
|
||||
$res = Msgres::success($result['msg'], $url);
|
||||
} else {
|
||||
$res = Msgres::error('add_error');
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
//1.查询分类表获取所有分类
|
||||
$cateList = Db::name('cate')->where(['status'=>1,'delete_time'=>0])->order('sort','asc')->cache('catename',3600)->select();
|
||||
|
||||
//2.将catelist变量赋给模板 公共模板nav.html
|
||||
View::assign('cateList',$cateList);
|
||||
|
||||
return View::fetch('add');
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑文章
|
||||
* @param $id
|
||||
* @return string|\think\Response|\think\response\Json|void
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$article = Article::find($id);
|
||||
if(Request::isAjax()){
|
||||
|
||||
$data = Request::only(['id','cate_id','title','title_color','content','upzip','keywords','description','captcha']);
|
||||
$tagId = input('tagid');
|
||||
|
||||
//调用验证器
|
||||
$validate = new \app\common\validate\Article();
|
||||
$res = $validate->scene('Artadd')->check($data);
|
||||
|
||||
if(true !== $res){
|
||||
return Msgres::error($validate->getError());
|
||||
} else {
|
||||
//获取内容图片音视频标识
|
||||
$iva= $this->hasIva($data['content']);
|
||||
$data = array_merge($data,$iva);
|
||||
|
||||
// 处理内容
|
||||
$data['content'] = $this->downUrlPicsReaplace($data['content']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
|
||||
$result = $article->edit($data);
|
||||
if($result == 1) {
|
||||
//处理标签
|
||||
$artTags = Db::name('taglist')->where('article_id',$id)->column('tag_id','id');
|
||||
if(isset($tagId)) {
|
||||
$tagIdArr = explode(',',$tagId);
|
||||
foreach($artTags as $aid => $tid) {
|
||||
if(!in_array($tid,$tagIdArr)){
|
||||
//删除被取消的tag
|
||||
Db::name('taglist')->delete($aid);
|
||||
}
|
||||
}
|
||||
//查询保留的标签
|
||||
$artTags = Db::name('taglist')->where('article_id',$id)->column('tag_id');
|
||||
$tagArr = [];
|
||||
foreach($tagIdArr as $tid) {
|
||||
if(!in_array($tid, $artTags)){
|
||||
//新标签
|
||||
$tagArr[] = ['article_id'=>$data['id'],'tag_id'=>$tid,'create_time'=>time()];
|
||||
}
|
||||
}
|
||||
//更新新标签
|
||||
Db::name('taglist')->insertAll($tagArr);
|
||||
}
|
||||
//删除原有缓存显示编辑后内容
|
||||
Cache::delete('article_'.$id);
|
||||
$link = $this->getRouteUrl((int) $id, $article->cate->ename, $article->cate->appname);
|
||||
// 推送给百度收录接口
|
||||
$this->baiduPushUrl($link);
|
||||
$editRes = Msgres::success('edit_success',$link);
|
||||
} else {
|
||||
$editRes = Msgres::error($result);
|
||||
}
|
||||
return $editRes;
|
||||
}
|
||||
}
|
||||
|
||||
View::assign(['article'=>$article]);
|
||||
//1.查询分类表获取所有分类
|
||||
$cateList = Db::name('cate')->where(['status'=>1,'delete_time'=>0])->order('sort','asc')->cache('catename',3600)->select();
|
||||
|
||||
//2.将catelist变量赋给模板 公共模板nav.html
|
||||
View::assign('cateList',$cateList);
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
//删除帖子
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$arr = explode(",",$id);
|
||||
foreach($arr as $v){
|
||||
$article = Article::find($v);
|
||||
$result = $article->together(['comments'])->delete();
|
||||
}
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 置顶、加精、评论开关,审核等状态管理
|
||||
*
|
||||
* @return Json
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
$param = Request::only(['id','name','value']);
|
||||
$data = ['id'=>$param['id'],$param['name']=>$param['value']];
|
||||
//获取状态
|
||||
$res = Db::name('article')->save($data);
|
||||
Cache::delete('article_'.$data['id']);
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'设置成功','icon'=>6]);
|
||||
}else {
|
||||
return json(['code'=>-1,'msg'=>'失败啦','icon'=>6]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传接口
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function uploads()
|
||||
{
|
||||
$type = Request::param('type');
|
||||
return $this->uploadFiles($type);
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用百度关键词
|
||||
*
|
||||
* @return json
|
||||
*/
|
||||
public function getKeywords()
|
||||
{
|
||||
$data = Request::only(['flag','keywords','content']);
|
||||
$keywords = $this->setKeywords($data);
|
||||
return json(['code'=>0, 'msg' => 'ok', 'data'=> $keywords]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 标题调用百度关键词词条
|
||||
* @return Json
|
||||
*/
|
||||
public function getWordList()
|
||||
{
|
||||
$title = input('title');
|
||||
return $this->getBdiduSearchWordList($title);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 内容中是否有图片视频音频插入
|
||||
*
|
||||
* @param [type] $content
|
||||
* @return array
|
||||
*
|
||||
*/
|
||||
public function hasIva($content)
|
||||
{
|
||||
//判断是否插入图片
|
||||
$isHasImg = strpos($content,'img[');
|
||||
$data['has_img'] = is_int($isHasImg) ? 1 : 0;
|
||||
//判断是否插入视频
|
||||
$isHasVideo = strpos($content,'video(');
|
||||
$data['has_video'] = is_int($isHasVideo) ? 1 : 0;
|
||||
//判断是否插入音频
|
||||
$isHasAudio = strpos($content,'audio[');
|
||||
$data['has_audio'] = is_int($isHasAudio) ? 1 : 0;
|
||||
|
||||
return $data;
|
||||
}
|
||||
/**
|
||||
* 获取描述,过滤html
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
$data = Request::only(['content']);
|
||||
$description = getArtContent($data['content']);
|
||||
return json(['code'=>0,'data'=>$description]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 分类
|
||||
* @return Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function getCateTree()
|
||||
{
|
||||
//
|
||||
$cate = Db::name('cate')->field('id,pid,catename,ename,sort')->order(['id' => 'ASC','sort' => 'ASC'])->where(['delete_time'=>0])->select()->toArray();
|
||||
$data = getTree($cate);
|
||||
$count = count($cate);
|
||||
$tree = [];
|
||||
if($count){
|
||||
$tree = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
|
||||
//构造一个顶级菜单pid=0的数组。把权限放入顶级菜单下子权限中
|
||||
$tree['data'][] = ['id'=>0,'catename'=>'顶级','pid'=>0,'children'=>$data];
|
||||
}
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
//array_filter过滤函数
|
||||
protected function filtr($arr){
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
130
app/admin/controller/content/Tag.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
/*
|
||||
* @Author: TaoLer <317927823@qq.com>
|
||||
* @Date: 2022-08-14 09:39:01
|
||||
* @LastEditTime: 2022-08-15 16:12:13
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: 优化版
|
||||
* @FilePath: \TaoLer\app\admin\controller\Tag.php
|
||||
* Copyright (c) 2020~2022 https://www.aieok.com All rights reserved.
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\Tag as TagModel;
|
||||
|
||||
class Tag extends AdminController
|
||||
{
|
||||
|
||||
|
||||
// public function __construct(TagModel $tagModel)
|
||||
// {
|
||||
|
||||
// $this->tagModel = new TagModel;
|
||||
// }
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch('index');
|
||||
}
|
||||
|
||||
public function list()
|
||||
{
|
||||
$arr = [];
|
||||
$tag = new TagModel;
|
||||
$tags = $tag->getTagList();
|
||||
// dump($tags);
|
||||
if(count($tags)) {
|
||||
$arr = ['code'=>0, 'msg'=>'', 'count' => count($tags)];
|
||||
foreach($tags as $k=>$v) {
|
||||
$arr['data'][] = ['id'=>$v['id'],'name'=>$v['name'], 'ename'=>$v['ename'], 'keywords'=>$v['keywords'], 'description'=>$v['description'], 'title'=>$v['title'],'time'=>$v['create_time']];
|
||||
}
|
||||
} else {
|
||||
$arr = ['code'=>-1, 'msg'=>'没有数据'];
|
||||
}
|
||||
return json($arr);
|
||||
}
|
||||
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['name','ename','keywords','description','title']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
|
||||
$tagModel = new TagModel;
|
||||
$res = $tagModel->saveTag($data);
|
||||
if($res == true){
|
||||
return json(['code'=>0,'msg'=>'设置成功']);
|
||||
}
|
||||
}
|
||||
return view();
|
||||
}
|
||||
|
||||
public function edit()
|
||||
{
|
||||
$tagModel = new TagModel;
|
||||
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['name','ename','id','keywords','description','title']);
|
||||
// 把,转换为,并去空格->转为数组->去掉空数组->再转化为带,号的字符串
|
||||
$data['keywords'] = implode(',',array_filter(explode(',',trim(str_replace(',',',',$data['keywords'])))));
|
||||
|
||||
$res =$tagModel::update($data);
|
||||
if($res == true){
|
||||
return json(['code'=>0,'msg'=>'设置成功']);
|
||||
}
|
||||
}
|
||||
$tag = $tagModel->getTag(input('id'));
|
||||
|
||||
View::assign('tag',$tag);
|
||||
return view();
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
if(Request::isPost()) {
|
||||
$tagModel = new TagModel;
|
||||
$res = $tagModel->delTag(input('id'));
|
||||
if($res == true){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 所有tag标签
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getAllTag()
|
||||
{
|
||||
$data = [];
|
||||
$tagModel = new TagModel;
|
||||
$tags = $tagModel->getTagList();
|
||||
foreach($tags as $tag) {
|
||||
$data[] = ['name'=> $tag['name'], 'value'=> $tag['id']];
|
||||
}
|
||||
return json(['code'=>0,'data'=>$data]);
|
||||
}
|
||||
|
||||
public function getArticleTag($id)
|
||||
{
|
||||
//
|
||||
$data = [];
|
||||
$artTags = Db::name('taglist')->where('article_id',$id)->select();
|
||||
// halt($artTags);
|
||||
foreach($artTags as $v) {
|
||||
$tag = Db::name('tag')->find($v['tag_id']);
|
||||
if(!is_null($tag))
|
||||
$data[] = ['name'=>$tag['name'],'value'=>$tag['id']];
|
||||
}
|
||||
|
||||
return json(['code'=>0,'data'=>$data]);
|
||||
}
|
||||
|
||||
}
|
265
app/admin/controller/system/Admin.php
Normal file
@ -0,0 +1,265 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Administrator
|
||||
* Date: 2019-10-15
|
||||
* Time: 15:40
|
||||
*/
|
||||
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\validate\Admin as AdminValidate;
|
||||
use app\admin\model\Admin as AdminModel;
|
||||
use think\App;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
use think\facade\Cookie;
|
||||
|
||||
|
||||
class Admin extends AdminController
|
||||
{
|
||||
protected $model = null;
|
||||
|
||||
public function __construct(App $app)
|
||||
{
|
||||
parent::__construct($app);
|
||||
$this->model = new AdminModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览管理员
|
||||
* @return string
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理员列表
|
||||
* @return \think\response\Json|void
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','username','mobile','email']);
|
||||
$map = array_filter($data);
|
||||
$admins = Db::name('admin')
|
||||
->field('id,avatar,username,mobile,email,last_login_ip,status,last_login_time')
|
||||
->where('delete_time',0)
|
||||
->where($map)
|
||||
->select();
|
||||
|
||||
$count = $admins->count();
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($admins as $k => $v){
|
||||
$data = [
|
||||
'id' => $v['id'],
|
||||
'avatar' => $v['avatar'],
|
||||
'username' => $v['username'],
|
||||
'phone' => $v['mobile'],
|
||||
'email' => $v['email'],
|
||||
'ip' => $v['last_login_ip'],
|
||||
'check' => $v['status'],
|
||||
'logintime' => date("Y-m-d", $v['last_login_time'])
|
||||
];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//管理员审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id', 'status']);
|
||||
if($data['id'] == 1 && $data['status'] == -1) {
|
||||
return json(['code'=>-1,'msg'=>'无法禁用超级管理员']);
|
||||
}
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('admin')->where('id', $data['id'])->save(['status' => $data['status']]);
|
||||
if($res){
|
||||
if($data['status'] == 1){
|
||||
return json(['code'=>0,'msg'=>'设置管理员通过','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'管理员已取消','icon'=>5]);
|
||||
}
|
||||
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'审核出错']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//添加管理员
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['username','email','password','mobile','sex']);
|
||||
$roleId = request()->get('roleId');
|
||||
$data['create_time'] = time();
|
||||
$salt = substr(md5($data['create_time']),-6);
|
||||
$data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6));
|
||||
$data['status'] = 1;
|
||||
//$adminId = Db::name('admin')->insertGetId($data);
|
||||
$admin = Db::name('admin')->save($data);
|
||||
//Db::name('auth_group_access')->insert(['uid'=>$adminId,'group_id'=>$data['auth_group_id']]);
|
||||
if($admin){
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'添加失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
//$auth_group = Db::name('auth_group')->select();
|
||||
//View::assign(['auth_group'=>$auth_group]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//管理员编辑
|
||||
public function edit($id)
|
||||
{
|
||||
$admin = AdminModel::find($id);
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id','username','email','password','mobile','sex','roleId']);
|
||||
if(empty($data['password'])){
|
||||
unset($data['password']);
|
||||
} else {
|
||||
$t = $admin->create_time;
|
||||
$salt = substr(md5($t),-6);
|
||||
$data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6));
|
||||
}
|
||||
$data['update_time'] = time();
|
||||
|
||||
$result = Db::name('admin')->update($data);
|
||||
//Db::name('auth_group_access')->where('uid',$data['id'])->update(['group_id'=>$data['auth_group_id']]);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
//$auth_group = Db::name('auth_group')->select();,'auth_group'=>$auth_group
|
||||
View::assign(['admin'=>$admin]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//删除管理员
|
||||
public function delete($id)
|
||||
{
|
||||
$ids = explode(',',$id);
|
||||
if(Request::isAjax()){
|
||||
$user = $this->model->select($ids);
|
||||
$result = $user->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//基本资料浏览
|
||||
public function info()
|
||||
{
|
||||
$admin = $this->model->find($this->aid);
|
||||
$auths = $admin->adminGroup;
|
||||
$authName = [];
|
||||
foreach($auths as $v){
|
||||
$authName[] = $v->title;
|
||||
}
|
||||
$authGroupTitle = implode('|', $authName);
|
||||
|
||||
View::assign(['admin'=>$admin,'authGroupTitle'=>$authGroupTitle]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//修改基本资料显示
|
||||
public function infoEdit()
|
||||
{
|
||||
$admin = AdminModel::find($this->aid);
|
||||
$auths = $admin->adminGroup;
|
||||
$authName = [];
|
||||
foreach($auths as $v){
|
||||
$authName[] = $v->title;
|
||||
}
|
||||
$authGroupTitle = implode('|', $authName);
|
||||
|
||||
View::assign(['admin'=>$admin,'authGroupTitle'=>$authGroupTitle]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//管理员资料更新
|
||||
public function infoSet()
|
||||
{
|
||||
$admin = AdminModel::find($this->aid);
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['nickname','sex','mobile','email','remarks']);
|
||||
$result = $admin->save($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'更新成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'更新失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
//浏览改密码页面
|
||||
public function repass()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//修改密码
|
||||
public function repassSet()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['oldPassword','password','repassword']);
|
||||
$data['admin_id'] = $this->aid;
|
||||
|
||||
$admin = new AdminModel;
|
||||
return $admin->setpass($data);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存Cache
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function clearCache()
|
||||
{
|
||||
$res = $this->clearSysCache();
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'清除缓存成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'清除缓存失败']);
|
||||
}
|
||||
}
|
||||
|
||||
//退出登陆
|
||||
public function logout()
|
||||
{
|
||||
//清空缓存
|
||||
Cookie::delete('adminAuth');
|
||||
Session::clear();
|
||||
|
||||
return json(['code'=>0,'msg'=>'退出成功' ]);
|
||||
}
|
||||
}
|
200
app/admin/controller/system/AuthGroup.php
Normal file
@ -0,0 +1,200 @@
|
||||
<?php
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\model\Admin as adminModel;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\exception\ValidateException;
|
||||
use app\admin\model\AuthGroup as AuthGroupModel;
|
||||
use app\admin\model\AuthGroupAccess;
|
||||
use app\admin\model\AuthRule as AuthRuleModel;
|
||||
use LDAP\Result;
|
||||
use think\Response;
|
||||
|
||||
class AuthGroup extends AdminController
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @var [type]
|
||||
*/
|
||||
protected $model = null;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new AuthGroupModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$roles = Db::name('auth_group')->field('id,title')->where('status',1)->select();
|
||||
View::assign('roles',$roles);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色
|
||||
public function list()
|
||||
{
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['id']);
|
||||
$map = array_filter($data);
|
||||
$role = Db::name('auth_group')->field('id,title,limits,descr,status')->where($map)->select();
|
||||
$count = $role->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($role as $k => $v){
|
||||
$data = ['id'=>$v['id'],'rolename'=>$v['title'],'limits'=>$v['limits'],'descr'=>$v['descr'],'check'=>$v['status']];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$roles = Db::name('auth_group')->field('id,title')->where('status',1)->select();
|
||||
View::assign('roles',$roles);
|
||||
return View::fetch('index');
|
||||
}
|
||||
|
||||
//角色添加
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = AuthGroupModel::create($data);
|
||||
if($result) {
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'添加失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
$menus = $this->getRoleMenu(1);
|
||||
View::assign('menus',$menus);
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色编辑
|
||||
public function edit()
|
||||
{
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
|
||||
/*
|
||||
if(!strpos($data['rules'],'1,2,3,4,5'))
|
||||
{
|
||||
$data['rules'] = substr_replace($data['rules'],"1,2,3,4,5,",0,0);
|
||||
}
|
||||
*/
|
||||
$rule = AuthGroupModel::update($data);
|
||||
if($rule){
|
||||
$res = ['code'=>0,'msg'=>'保存成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'保存失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$menus = $this->getRoleMenu(1);
|
||||
$role = AuthGroupModel::find(input('id'));
|
||||
$rus = explode(',',$role->rules);
|
||||
|
||||
View::assign(['role'=>$role,'rus'=>$rus,'menus'=>$menus]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//角色删除
|
||||
public function delete($id)
|
||||
{
|
||||
$ids = explode(',',$id);
|
||||
if(Request::isAjax()){
|
||||
$role =AuthGroupModel::select($ids);
|
||||
$result = $role->delete();
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'删除成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'删除失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
//角色审核
|
||||
public function check()
|
||||
{
|
||||
$data = Request::param();
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('auth_group')->where('id',$data['id'])->save(['status' => $data['status']]);
|
||||
if($res){
|
||||
if($data['status'] == 1){
|
||||
return json(['code'=>0,'msg'=>'角色审核通过','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'禁用此角色','icon'=>5]);
|
||||
}
|
||||
|
||||
}else {
|
||||
return json(['code'=>-1,'msg'=>'审核出错']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 授权
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function auth()
|
||||
{
|
||||
$roleId = request()->get('id');
|
||||
//
|
||||
if(Request::isAjax()) {
|
||||
$data = Request::only(['group_id', 'uid']);
|
||||
$uidArray = Db::name('auth_group_access')->where('group_id', (int) $data['group_id'])->column('uid');
|
||||
|
||||
$newUids = explode(',', $data['uid']);
|
||||
try {
|
||||
// 1.循环原有的UID跟现在提交过来的UID比较,没有在新uid的,被删除
|
||||
foreach($uidArray as $oldUid) {
|
||||
if(!in_array($oldUid, $newUids)){
|
||||
Db::name('auth_group_access')->where('uid', $oldUid)->delete();
|
||||
}
|
||||
}
|
||||
|
||||
// 2.循环现有的UID再次跟已存在的UID比较,没有的,新增加
|
||||
$uids = Db::name('auth_group_access')->where('group_id', (int) $data['group_id'])->column('uid');
|
||||
foreach($newUids as $newUid){
|
||||
if(!in_array($newUid, $uids)) {
|
||||
Db::name('auth_group_access')->save(['uid' => $newUid, 'group_id' => (int) $data['group_id']]);
|
||||
}
|
||||
}
|
||||
|
||||
return json(['code' => 0, 'msg' => 'ok']);
|
||||
} catch (\Exception $e) {
|
||||
return json(['code' => -1, 'msg' => $e->getMessage()]);
|
||||
}
|
||||
|
||||
// $groupAccess = new AuthGroupAccess();
|
||||
// $groupAccess->saveAll($array);
|
||||
}
|
||||
|
||||
$admin = Db::name('admin')->field('id, username')->select();
|
||||
$role = Db::name('auth_group')->field('id,title')->where('id', (int) $roleId)->find();
|
||||
$uidAccess = Db::name('auth_group_access')->where('group_id', (int) $roleId)->column('uid');
|
||||
|
||||
View::assign(['role'=>$role, 'admin' => $admin, 'uidAccess' => $uidAccess]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
}
|
176
app/admin/controller/system/AuthRule.php
Normal file
@ -0,0 +1,176 @@
|
||||
<?php
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\App;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
use app\admin\model\AuthRule as AuthRuleModel;
|
||||
|
||||
class AuthRule extends AdminController
|
||||
{
|
||||
|
||||
protected $model = '';
|
||||
|
||||
//
|
||||
public function __construct()
|
||||
{
|
||||
$this->model = new AuthRuleModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 浏览菜单列表
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
|
||||
return View::fetch();
|
||||
|
||||
}
|
||||
|
||||
public function list()
|
||||
{
|
||||
return $this->model->getAuthRuleArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 无限极权限树
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function ruleTree()
|
||||
{
|
||||
$data = $this->getRoleMenu(1);
|
||||
|
||||
$count = count($data);
|
||||
$tree = [];
|
||||
if($count){
|
||||
$tree = ['code'=>0, 'msg'=>'ok','count'=>$count];
|
||||
|
||||
//构造一个顶级菜单pid=0的数组。把权限放入顶级菜单下子权限中
|
||||
$tree['data'][] = ['id'=>0, 'title'=>'顶级', 'pid'=>0, 'children'=>$data];
|
||||
}
|
||||
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
//添加权限
|
||||
public function add()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
//层级level
|
||||
$plevel = Db::name('auth_rule')->field('level')->find($data['pid']);
|
||||
if($plevel){
|
||||
$data['level'] = $plevel['level']+1;
|
||||
} else {
|
||||
$data['level'] = 0;
|
||||
}
|
||||
|
||||
return $this->model->saveRule($data);
|
||||
}
|
||||
|
||||
$auth_rules = $this->model->getAuthRuleArray();
|
||||
View::assign('AuthRule',$auth_rules);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//权限编辑
|
||||
public function edit()
|
||||
{
|
||||
$rule = new AuthRuleModel();
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param(['id','pid','title','name','icon','sort','ismenu']);
|
||||
//层级level
|
||||
$ruId = $rule->find($data['pid']); //查询出上级ID
|
||||
if($ruId){
|
||||
$plevel = $ruId->level; //上级level等级
|
||||
$data['level'] = $plevel+1;
|
||||
} else {
|
||||
$data['level'] = 0;
|
||||
}
|
||||
$zi = $this->model->where('pid',$data['id'])->select();//查询出下级
|
||||
if(!empty($zi)){
|
||||
$zi->update(['level'=>$data['level']+1]);
|
||||
}
|
||||
|
||||
$rule = $this->model->find($data['id']);
|
||||
return $rule->saveRule($data);
|
||||
}
|
||||
|
||||
$auth_rules = $this->model->getAuthRuleArray();
|
||||
$rules = $this->model->find(input('id'));
|
||||
|
||||
View::assign(['AuthRule'=>$auth_rules,'rules'=>$rules]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除权限
|
||||
*
|
||||
* @param [type] $id
|
||||
* @return void
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
$pids = AuthRuleModel::where('pid',$id)->select();
|
||||
if($pids)
|
||||
{
|
||||
$result = $pids->delete();
|
||||
}
|
||||
|
||||
$rule = AuthRuleModel::find($id);
|
||||
$result = $rule->delete();
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'删除成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'删除失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 权限开关
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id','status']);
|
||||
if($data['id'] == 1 || $data['id'] == 31) {
|
||||
return json(['code' => -1, 'msg' => '不能关闭重要权限!']);
|
||||
}
|
||||
|
||||
//获取状态
|
||||
$res = Db::name('auth_rule')->save($data);
|
||||
if($res){
|
||||
if($data['status'] == 1){
|
||||
return json(['code'=>0,'msg'=>'权限开启','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'权限禁用','icon'=>5]);
|
||||
}
|
||||
|
||||
}else {
|
||||
return json(['code'=>-1,'msg'=>'审核出错']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
$data = Request::param();
|
||||
$rules = Db::name('auth_rule')->save($data);
|
||||
if($rules){
|
||||
$res = ['code'=>0,'msg'=>'排序成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'排序失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
|
||||
}
|
181
app/admin/controller/system/Menu.php
Normal file
@ -0,0 +1,181 @@
|
||||
<?php
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\Db;
|
||||
use taoser\think\Auth;
|
||||
use think\facade\Lang;
|
||||
use think\facade\Session;
|
||||
|
||||
class Menu extends AdminController
|
||||
{
|
||||
/**
|
||||
* pearadmin动态菜单栏
|
||||
* @return \think\response\Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function getnav()
|
||||
{
|
||||
$auth = new Auth();
|
||||
$menu = [];
|
||||
$rule = Session::has('ruleTable') ? Session::get('ruleTable') : 'auth_rule';
|
||||
$auth_rule_list = Db::name($rule)->field('id,pid,title,icon,name,sort,ismenu')->where(['status'=> 1, 'ismenu'=>1, 'delete_time'=> 0])->select();
|
||||
foreach ($auth_rule_list as $v) {
|
||||
if ($auth->check($v['name'], $this->aid) || $this->aid == 1) {
|
||||
$menu[] = [
|
||||
'id' => $v['id'],
|
||||
'title' => Lang::get($v['title']),
|
||||
'icon' => 'layui-icon ' . $v['icon'],
|
||||
'href' => (string) url($v['name']),
|
||||
'pid' => $v['pid'],
|
||||
'sort' => $v['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$nav = $this->getTrees($menu);
|
||||
// 初始化控制台
|
||||
$nav[] = [
|
||||
'id' => 500,
|
||||
'title' => '主页',
|
||||
'icon' => 'layui-icon layui-icon-console',
|
||||
'href' => '',
|
||||
'sort' => 1,
|
||||
'type' => 0,
|
||||
'children' => [
|
||||
[
|
||||
'id' => 501,
|
||||
"title" => "控制后台",
|
||||
"icon" => "layui-icon layui-icon-console",
|
||||
"type" => 1,
|
||||
"openType" =>"_iframe",
|
||||
"href" => (string) url("index/console1"),
|
||||
'sort' => 1,
|
||||
],[
|
||||
'id' => 502,
|
||||
"title" => "数据分析",
|
||||
"icon" => "layui-icon layui-icon-console",
|
||||
"type" => 1,
|
||||
"openType" => "_iframe",
|
||||
"href" => (string) url("index/console2"),
|
||||
'sort' => 2,
|
||||
]
|
||||
]
|
||||
|
||||
];
|
||||
$nav[] = [
|
||||
'id' => 1000,
|
||||
'title' => '官网',
|
||||
'icon' => 'layui-icon layui-icon-console',
|
||||
'href' => 'https://www.aieok.com',
|
||||
'sort' => 1000,
|
||||
'type' => 1,
|
||||
"openType" => "_blank",
|
||||
];
|
||||
|
||||
//SORT排序
|
||||
$cmf_arr = array_column($nav, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $nav);
|
||||
|
||||
return json($nav);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 菜单无限极分类
|
||||
*
|
||||
* @param array $data 包含有pid的rule权限数组
|
||||
* @param integer $pId 父ID
|
||||
* @return array
|
||||
*/
|
||||
public function getTrees(array $data, int $pId = 0): array
|
||||
{
|
||||
// 递归
|
||||
$tree = [];
|
||||
foreach ($data as $k => $v) {
|
||||
//第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
|
||||
if ($v['pid'] == $pId) {
|
||||
$child = $this->getTrees($data, $v['id']);
|
||||
// 有子类
|
||||
if(!empty($child)) {
|
||||
// foreach($child as $m => $n) {
|
||||
// $v['children'][$m] = $n;
|
||||
// //$v['children'][$m]['type'] = 1;
|
||||
// //$v['children'][$m]['openType'] = '_iframe';
|
||||
// }
|
||||
$v['type'] = $v['pid'] == 0 ? 0 : $v['ismenu'];
|
||||
$v['children'] = $child;
|
||||
} else {
|
||||
// 没有子菜单type=1
|
||||
$v['type'] = 1;
|
||||
$v['openType'] = '_iframe';
|
||||
}
|
||||
|
||||
//把数组放到$tree中
|
||||
$tree[] = $v;
|
||||
//把这个节点从数组中移除,减少后续递归消耗
|
||||
unset($data[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
return $tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态菜单并排序
|
||||
* @return \think\response\Json
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function getMenuNavbar()
|
||||
{
|
||||
// 用户菜单权限
|
||||
$auth = new Auth();
|
||||
|
||||
$pid = empty(input('id')) ? 0 : input('id');
|
||||
$data = Db::name('auth_rule')->field('id,title,icon,name,sort')->where(['pid'=>$pid,'status'=> 1, 'ismenu'=>1, 'delete_time'=> 0])->select();
|
||||
$tree = [];
|
||||
foreach ($data as $k => $v) {
|
||||
$hasChild = $this->hasChildren($v['id']);
|
||||
if($hasChild) {
|
||||
$v['hasChildren'] = 1;
|
||||
} else {
|
||||
$v['hasChildren'] = 0;
|
||||
}
|
||||
if ($auth->check($v['name'], session('admin_id')) || session('admin_id') == 1) {
|
||||
$tree[] = ['id'=>$v['id'],'text'=>$v['title'],'icon'=>$v['icon'],'hasChildren'=>$v['hasChildren'],'href'=>(string) url($v['name']),'sort'=>$v['sort']];
|
||||
}
|
||||
|
||||
}
|
||||
// 排序
|
||||
$cmf_arr = array_column($tree, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $tree);
|
||||
|
||||
return json($tree);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否有子菜单
|
||||
* @param $pid
|
||||
* @return bool
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function hasChildren($pid)
|
||||
{
|
||||
$data = Db::name('auth_rule')->field('pid')->where(['delete_time'=> 0,'status'=> 1,'ismenu'=>1,'pid'=>$pid])->select()->toArray();
|
||||
if(count($data)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
320
app/admin/controller/system/Set.php
Normal file
@ -0,0 +1,320 @@
|
||||
<?php
|
||||
/*
|
||||
* @Author: TaoLer <alipey_tao@qq.com>
|
||||
* @Date: 2021-12-06 16:04:50
|
||||
* @LastEditTime: 2022-07-24 11:06:14
|
||||
* @LastEditors: TaoLer
|
||||
* @Description: 搜索引擎SEO优化设置
|
||||
* @FilePath: \TaoLer\app\admin\controller\Set.php
|
||||
* Copyright (c) 2020~2022 http://www.aieok.com All rights reserved.
|
||||
*/
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use think\facade\Cache;
|
||||
use think\facade\Config;
|
||||
use app\admin\model\System;
|
||||
use app\admin\model\MailServer;
|
||||
use taoler\com\Files;
|
||||
use think\facade\Session;
|
||||
use think\facade\Cookie;
|
||||
use taoser\SetArr;
|
||||
use app\common\lib\SetArr as SetArrConf;
|
||||
use think\response\Json;
|
||||
|
||||
class Set extends AdminController
|
||||
{
|
||||
|
||||
protected $sysInfo = '';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::initialize();
|
||||
$this->sysInfo = $this->getSystem();
|
||||
}
|
||||
|
||||
//网站设置显示
|
||||
public function index()
|
||||
{
|
||||
$template = Files::getDirName('../view');
|
||||
$email = Db::name('admin')->where('id',1)->value('email');
|
||||
|
||||
// 应用映射
|
||||
$index_map = array_search('index',config('app.app_map'));
|
||||
$admin_map = array_search('admin',config('app.app_map'));
|
||||
$index_map = $index_map ? $index_map : '';
|
||||
$admin_map = $admin_map ? $admin_map : '';
|
||||
View::assign(['sysInfo'=>$this->sysInfo,'template'=>$template,'email'=>$email,'index_map'=>$index_map,'admin_map'=>$admin_map]);
|
||||
|
||||
// 域名绑定
|
||||
if(!empty(config('app.domain_bind'))){
|
||||
$data = array_flip(config('app.domain_bind'));
|
||||
$domain_bind = [
|
||||
'index' => isset($data['index']) ? $data['index'] : '',
|
||||
'admin' => isset($data['admin']) ? $data['admin'] : '',
|
||||
];
|
||||
} else {
|
||||
$domain_bind = [
|
||||
'index' => '',
|
||||
'admin' => '',
|
||||
];
|
||||
}
|
||||
View::assign($domain_bind);
|
||||
|
||||
// url美化
|
||||
$urlArr = config('taoler.url_rewrite');
|
||||
$urlRe = [];
|
||||
foreach($urlArr as $k => $v) {
|
||||
if(!empty($v)) {
|
||||
$urlRe[$k] = substr($v, 0, strrpos($v, '/'));
|
||||
} else {
|
||||
$urlRe[$k] = '';
|
||||
}
|
||||
}
|
||||
|
||||
View::assign('url_re',$urlRe);
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//网站设置
|
||||
public function website()
|
||||
{
|
||||
if(Request::isPost()){
|
||||
$data = Request::only(['webname','domain','template','cache','upsize','uptype','blackname','webtitle','keywords','descript','state','icp','showlist','copyright']);
|
||||
$system = new System();
|
||||
$result = $system->sets($data,$this->sysInfo['clevel']);
|
||||
if($result == 1){
|
||||
return json(['code'=>0,'msg'=>'更新成功']);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>$result]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//综合设置
|
||||
public function server()
|
||||
{
|
||||
return View::fetch('set/system/server');
|
||||
}
|
||||
|
||||
/**基础服务配置
|
||||
* parem $id
|
||||
*/
|
||||
public function config()
|
||||
{
|
||||
$conf = Config::get('taoler.config');
|
||||
if(Request::isPost()){
|
||||
$data = Request::param();
|
||||
if(!isset($data['regist_check'])) $data['regist_check'] =1;
|
||||
if(!isset($data['posts_check'])) $data['posts_check'] =1;
|
||||
if(!isset($data['commnets_check'])) $data['commnets_check'] =1;
|
||||
foreach($conf as $c=>$f){
|
||||
if(array_key_exists($c,$data)){
|
||||
$conf[$c] = (int) $data[$c];
|
||||
}else{
|
||||
$conf[$c] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$value = [
|
||||
'config'=>$conf
|
||||
];
|
||||
|
||||
$result = SetArr::name('taoler')->edit($value);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'配置成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'配置出错!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
}
|
||||
|
||||
// 域名绑定
|
||||
public function setDomain()
|
||||
{
|
||||
$str = file_get_contents(str_replace('\\', '/', app()->getConfigPath() . 'app.php'));
|
||||
if(Request::isPost()){
|
||||
$data = Request::only(['index','admin','domain_check']);
|
||||
//$data = Request::param();
|
||||
//dump($data);
|
||||
if($data['domain_check'] == 'on') {
|
||||
|
||||
// 过滤空项目
|
||||
$domain_bind = [];
|
||||
if(!empty($data['index'])){
|
||||
$domain_bind[$data['index']] ='index';
|
||||
if(config('app.default_app') == $domain_bind[$data['index']]) {
|
||||
if(empty($data['admin'])) {
|
||||
return json(['code'=>-1, 'msg'=>'默认应用和Index一致时必须绑定Admin域名,否则无法进入后台']);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!empty($data['admin'])){
|
||||
$domain_bind[$data['admin']] ='admin';
|
||||
}
|
||||
|
||||
|
||||
// 匹配整个domain_map数组
|
||||
$pats_domain_bind = '/\'(domain_bind)\'[^\]]*\],/';
|
||||
// 空数组
|
||||
$rep_domain_null = "'domain_bind'\t=> [\n\t],";
|
||||
$str = preg_replace($pats_domain_bind, $rep_domain_null, $str);
|
||||
|
||||
// 匹配'domain_bind' => [
|
||||
$pats = '/\'(domain_bind)\'\s*=>\s*\[\r?\n/';
|
||||
preg_match($pats,$str,$arr);
|
||||
|
||||
// 拼接数组内字符串
|
||||
$domainArr = '';
|
||||
foreach($domain_bind as $k => $v){
|
||||
$domainArr .= "\t\t'". $k. "' => '" . $v . "',\n";
|
||||
}
|
||||
|
||||
// 追加组成新数组写入文件
|
||||
$reps = $arr[0].$domainArr;
|
||||
$str = preg_replace($pats, $reps, $str);
|
||||
|
||||
$res = file_put_contents(app()->getConfigPath() . 'app.php', $str);
|
||||
|
||||
// 如果编辑了后台 ,需要清理退出缓存
|
||||
if(!empty($domain_bind[$data['admin']])) {
|
||||
//清空缓存
|
||||
Cookie::delete('adminAuth');
|
||||
Session::clear();
|
||||
}
|
||||
} else {
|
||||
$res = SetArr::name('app')->delete([
|
||||
'domain_bind'=> config('app.domain_bind'),
|
||||
]);
|
||||
}
|
||||
|
||||
if($res == true){
|
||||
return json(['code'=>0,'msg'=>'成功']);
|
||||
} else{
|
||||
return json(['code'=>-1,'msg'=>'失败']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定应用映射
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function bindMap()
|
||||
{
|
||||
$data = Request::only(['index_map','admin_map']);
|
||||
$str = file_get_contents(str_replace('\\', '/', app()->getConfigPath() . 'app.php'));
|
||||
|
||||
// 过滤空项目
|
||||
$app_map = [];
|
||||
if(!empty($data['index_map'])){
|
||||
$app_map[$data['index_map']]='index';
|
||||
}
|
||||
if(!empty($data['admin_map'])){
|
||||
$app_map[$data['admin_map']] ='admin';
|
||||
}
|
||||
|
||||
//halt($app_map);
|
||||
// $set = new SetArrConf('app');
|
||||
// $res = $set->delete(['app_map' => config('app.app_map')])->add([
|
||||
// 'app_map' => $app_map,
|
||||
// ])->put();
|
||||
|
||||
// halt($res);
|
||||
|
||||
// 匹配整个app_map数组
|
||||
$pats_app_map = '/\'(app_map)\'[^\]]*\],/';
|
||||
preg_match($pats_app_map,$str,$arr_map);
|
||||
|
||||
// 空数组
|
||||
$rep_map_null = "'app_map'\t=> [\n\t],";
|
||||
$str = preg_replace($pats_app_map, $rep_map_null, $str);
|
||||
|
||||
// 匹配'app_map' => [
|
||||
$pats = '/\'(app_map)\'\s*=>\s*\[\r?\n/';
|
||||
preg_match($pats,$str,$arr);
|
||||
|
||||
// 拼接数组内字符串
|
||||
$appArr = '';
|
||||
foreach($app_map as $k => $v){
|
||||
$appArr .= "\t\t'". $k. "' => '" . $v . "',\n";
|
||||
}
|
||||
|
||||
// 追加组成新数组写入文件
|
||||
$reps = $arr[0].$appArr;
|
||||
$str = preg_replace($pats, $reps, $str);
|
||||
|
||||
$res = file_put_contents(app()->getConfigPath() . 'app.php', $str);
|
||||
|
||||
if(!$res) {
|
||||
return json(['code'=>-1,'msg'=>'绑定失败']);
|
||||
}
|
||||
return json(['code'=>0,'msg'=>'绑定成功']);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* URL美化,设置访问链接
|
||||
* @return Json
|
||||
*/
|
||||
public function setUrl()
|
||||
{
|
||||
$data = Request::only(['article_as','cate_as']);
|
||||
$arr = [];
|
||||
foreach($data as $k => $v) {
|
||||
if(!empty($v)) {
|
||||
$arr['url_rewrite'][$k] = $v . '/';
|
||||
} else {
|
||||
$arr['url_rewrite'][$k] = '';
|
||||
}
|
||||
}
|
||||
// if(empty($arr['url_rewrite']['cate_as'])) return json(['code'=>-1,'msg'=>'分类不能为空']);
|
||||
|
||||
if(!array_key_exists('url_rewrite',config('taoler'))){
|
||||
$result = SetArr::name('taoler')->add($arr);
|
||||
} else {
|
||||
$result = SetArr::name('taoler')->edit($arr);
|
||||
}
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'配置成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'配置出错!'];
|
||||
}
|
||||
return json($res);
|
||||
|
||||
}
|
||||
|
||||
//上传logo
|
||||
public function upload()
|
||||
{
|
||||
$param = Request::param('field');
|
||||
$uploads = new \app\common\lib\Uploads();
|
||||
$upRes = $uploads->put('file','SYS_logo',2000,'image');
|
||||
$logoJson = $upRes->getData();
|
||||
if($logoJson['status'] == 0){
|
||||
if($param == 'logo'){
|
||||
$result = Db::name('system')->where('id', 1)->cache('system')->update(['logo'=>$logoJson['url']]);
|
||||
} else {
|
||||
//移动端logo
|
||||
$result = Db::name('system')->where('id', 1)->cache('system')->update(['m_logo'=>$logoJson['url']]);
|
||||
}
|
||||
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'更新logo成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'上传成功,数据无须更新'];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1, 'msg'=>$logoJson['msg']];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
}
|
366
app/admin/controller/system/Upgrade.php
Normal file
@ -0,0 +1,366 @@
|
||||
<?php
|
||||
/**
|
||||
* 升级包规定的目录结构
|
||||
* xxx_版本号.zip(如:xxx_1.0.0.zip)
|
||||
* |
|
||||
* |————runtime
|
||||
* | |
|
||||
* | |___update.sql(更新脚本) //create table test(id init(11)); create table test2(id init(11));
|
||||
* | |___rockback.sql(回滚脚本) //drop table test; //drop table test2;
|
||||
* | |___remove.txt // clear清除目录和文件
|
||||
* |
|
||||
* |____php
|
||||
*
|
||||
*/
|
||||
namespace app\admin\controller\system;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use taoler\com\Api;
|
||||
use taoler\com\Str;
|
||||
use taoler\com\Files;
|
||||
use think\facade\Config;
|
||||
use think\facade\Log;
|
||||
use app\common\lib\SqlFile;
|
||||
use app\common\lib\Zip;
|
||||
use taoser\SetArr;
|
||||
|
||||
class Upgrade extends AdminController
|
||||
{
|
||||
protected $root_dir = "../"; //站点代码的根目录
|
||||
protected $backup_dir = "../runtime/update/backup_dir/"; //备份目录
|
||||
protected $upload_dir = "../runtime/update/upload_dir/"; //升级包目录
|
||||
protected $sys_version_num; //当前系统的版本
|
||||
protected $sys_version = '';
|
||||
protected $pn = '';
|
||||
protected $sys = '';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::initialize();
|
||||
$this->sys_version = Config::get('taoler.version');
|
||||
$this->pn = Config::get('taoler.appname');
|
||||
$this->sys = $this->getSystem();
|
||||
}
|
||||
|
||||
|
||||
/** 升级界面 */
|
||||
public function index()
|
||||
{ //字符隐藏
|
||||
$key = Str::func_substr_replace($this->sys['key']);
|
||||
$sys_base = [
|
||||
'key' => $key,
|
||||
'upcheck_url' => $this->sys['upcheck_url'],
|
||||
'upgrade_url' => $this->sys['upgrade_url'],
|
||||
];
|
||||
View::assign('ver_num',$sys_base);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//设置key
|
||||
public function key()
|
||||
{
|
||||
$data = Request::only(['key']);
|
||||
if(empty($data['key'])){
|
||||
return json(['code'=>0,'msg'=>'请填写正确的key']);
|
||||
}
|
||||
$res = Db::name('system')->cache('system')->update(['key'=>$data['key'],'id'=>1]);
|
||||
if($res){
|
||||
$res = ['code'=>0,'msg'=>'保存成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'保存失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//修改key
|
||||
public function keyedit()
|
||||
{
|
||||
$key = Db::name('system')->field('key,upcheck_url,upgrade_url')->find(1);
|
||||
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['key','upcheck_url','upgrade_url']);
|
||||
if(empty($data['key'])){
|
||||
return json(['code'=>-1,'msg'=>'请正确填写申请到的key']);
|
||||
}
|
||||
$res = Db::name('system')->cache('system')->update(['key'=>$data['key'],'upcheck_url'=>$data['upcheck_url'],'upgrade_url'=>$data['upgrade_url'],'id'=>1]);
|
||||
if($res){
|
||||
$res = ['code'=>0,'msg'=>'修改成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'修改失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
View::assign('key',$key);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//升级前的版本检测
|
||||
public function check()
|
||||
{
|
||||
$cy = Api::urlPost($this->sys['base_url'],['u'=>$this->sys['domain']]);
|
||||
if($cy->code == 0 && $cy->level !== $this->sys['clevel']){
|
||||
Db::name('system')->cache('system')->update(['clevel'=>$cy->level,'id'=>1]);
|
||||
}
|
||||
$versions = Api::urlPost($this->sys['upcheck_url'],['pn'=>$this->pn,'ver'=>$this->sys_version]);
|
||||
// 判断服务器状态
|
||||
$version_code = $versions->code;
|
||||
if($version_code == -1){
|
||||
$res = json(['code'=>$version_code,'msg'=>$versions->msg]);
|
||||
}
|
||||
if($version_code == 1){
|
||||
$res = json(['code'=>$version_code,'msg'=>$versions->msg,'data'=>['version'=>$versions->version,'upnum'=>$versions->up_num,'info'=>$versions->info]]);
|
||||
}
|
||||
if($version_code == 0){
|
||||
$res = json(['code'=>$version_code,'msg'=>$versions->msg]);
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 在线更新
|
||||
* 1.提交接口2.下载数据包3.备份4升级
|
||||
*/
|
||||
public function upload()
|
||||
{
|
||||
$versions = Api::urlPost($this->sys['upgrade_url'],['url'=>$this->sys['domain'],'key'=>$this->sys['key'],'pn'=>$this->pn,'ver'=>$this->sys_version]);
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'check','progress'=>'0%','msg'=>'===>升级检测开始===>']);
|
||||
|
||||
//判断服务器状态
|
||||
$version_code = $versions->code;
|
||||
if($version_code == -1){
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'check eroor','progress'=>'5%','msg'=>'===>服务器链接失败===>']);
|
||||
return json(['code'=>$version_code,'msg'=>$versions->msg]);
|
||||
}
|
||||
|
||||
$version_num = $versions->version;
|
||||
$file_url = $versions->src;
|
||||
|
||||
//判断远程文件是否可用存在
|
||||
$header = get_headers($file_url, true);
|
||||
if(!isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'))){
|
||||
return json(['code'=>-1,'msg'=>'获取远程文件失败']);
|
||||
}
|
||||
$upload_dir = Files::getDirPath($this->upload_dir); //拼接升级文件暂存路径
|
||||
Files::mkdirs($upload_dir);
|
||||
|
||||
$package_file = $upload_dir.'taoler_'.$version_num.'.zip'; //本地zip文件
|
||||
$cpfile = copy($file_url,$package_file); //把远程文件放入本地
|
||||
if(!$cpfile) {
|
||||
return json(['code'=>-1,'msg'=>'下载升级文件失败']);
|
||||
}
|
||||
|
||||
//记录下日志
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'20%','msg'=>'上传升级包'.$version_num.'成功!']);
|
||||
|
||||
//升级前备份代码
|
||||
$ex = array('.git','.idea','runtime','data','addons','config','extend','mysql','public','vendor','view'); // 排除备份目录
|
||||
$this->backFile($this->root_dir,$this->backup_dir,$ex);
|
||||
|
||||
//执行升级
|
||||
$updateRes = $this->execute_update($package_file);
|
||||
$upDate = $updateRes->getData();
|
||||
if($upDate['code'] == -1){
|
||||
return json(['code'=>-1,'msg'=>$upDate['msg']]);
|
||||
}
|
||||
|
||||
//清除
|
||||
Files::delDirAndFile($this->upload_dir);
|
||||
Files::delDirAndFile($this->backup_dir);
|
||||
|
||||
//清除废弃目录和文件
|
||||
$delFiles = '../runtime/remove.txt';
|
||||
if(file_exists($delFiles)){
|
||||
$str = file_get_contents($delFiles); //将整个文件内容读入到一个字符串中
|
||||
$str = str_replace("\r\n",",",$str);
|
||||
$delArr = explode(',',$str);
|
||||
foreach($delArr as $v){
|
||||
if(is_dir($v)){
|
||||
//删除文件夹
|
||||
Files::delDirAndFile($v.'/',true);
|
||||
} else {
|
||||
//删除文件
|
||||
if(file_exists($v)){
|
||||
unlink($v);
|
||||
}
|
||||
}
|
||||
}
|
||||
unlink($delFiles);
|
||||
}
|
||||
|
||||
//更新系统的版本号了
|
||||
//更新php的版本号了(应该跟svn/git的版本号一致)
|
||||
//更新数据库的版本号了(应该跟svn/git的版本号一致)
|
||||
$value = [
|
||||
'version' => $version_num
|
||||
];
|
||||
$res = SetArr::name('taoler')->edit($value);
|
||||
if(!$res){
|
||||
return json(['code'=>-1,'msg'=>'代码更新成功,但版本写入失败']);
|
||||
}
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'100%','msg'=>'升级成功!']);
|
||||
//清理缓存
|
||||
$this->clearSysCache();
|
||||
return json(['code'=>0,'msg'=>'升级成功']);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 升级执行
|
||||
* @param string $package_file
|
||||
* @return \think\response\Json
|
||||
* @throws \Exception
|
||||
*/
|
||||
private function execute_update(string $package_file)
|
||||
{
|
||||
// 1.解压 zip文件有密码的话需要解密
|
||||
$zip = new Zip;
|
||||
$zipDir = strstr($package_file, '.zip',true); //返回文件名后缀前的字符串
|
||||
$zipPath = Files::getDirPath($zipDir); //转换为带/的路径 压缩文件解压到的路径
|
||||
$unzip_res = $zip->unzip($package_file,$zipPath);
|
||||
|
||||
if(!$unzip_res) {
|
||||
return json(['code'=>-1,'msg'=>'解压失败']);
|
||||
}
|
||||
//解压成功,得到文件夹
|
||||
//$package_name = str_replace('.zip','',$package_file);
|
||||
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'50%','msg'=>'升级文件解压成功!']);
|
||||
|
||||
// 2.升级sql操作
|
||||
$upSql = $zipPath.'runtime/update.sql';
|
||||
if(file_exists($upSql)) {
|
||||
try{
|
||||
SqlFile::dbExecute($upSql);
|
||||
} catch (\Exception $e){
|
||||
return json(['code'=>-1,'msg'=>$e->getMessage()]);
|
||||
}
|
||||
|
||||
//删除sql语句
|
||||
unlink($upSql);
|
||||
}
|
||||
|
||||
|
||||
// 3.升级PHP
|
||||
if(is_dir($zipPath)) {
|
||||
//升级前的写入文件权限检查
|
||||
$allUpdateFiles = Files::getAllFile($zipPath);
|
||||
|
||||
if (empty($allUpdateFiles)) return json(['code' => -1, 'msg' => '无可更新文件。']);
|
||||
$checkString = '';
|
||||
foreach ($allUpdateFiles as $updateFile) {
|
||||
$coverFile = ltrim(str_replace($zipPath, '', $updateFile), DIRECTORY_SEPARATOR);
|
||||
$dirPath = dirname('../'.$coverFile);
|
||||
if (file_exists('../'.$coverFile)) {
|
||||
if (!is_writable('../'.$coverFile)) $checkString .= $coverFile . ' [<span class="text-red">' . '无写入权限' . '</span>]<br>';
|
||||
} else {
|
||||
if (!is_dir($dirPath)) @mkdir($dirPath, 0777, true);
|
||||
if (!is_writable($dirPath)) $checkString .= $dirPath . ' [<span class="text-red">' . '无写入权限' . '</span>]<br>';
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($checkString)) return json(['code' => -1, 'msg' => $checkString]);
|
||||
|
||||
$cpRes = Files::copyDirs($zipPath,$this->root_dir);
|
||||
$cpData = $cpRes->getData();
|
||||
//更新失败
|
||||
if($cpData['code'] == -1) {
|
||||
//数据库回滚
|
||||
/*
|
||||
if(file_exists($this->upload_dir.'/'.$package_file.'/mysql/mysql_rockback.sql'))
|
||||
{
|
||||
$this->database_operation($this->upload_dir.'/'.$package_file.'/mysql/mysql_rockback.sql');
|
||||
}
|
||||
*/
|
||||
//php代码回滚 升级前备份的代码
|
||||
Files::copydirs($this->backup_dir, $this->root_dir);
|
||||
|
||||
return json(['code'=>-1,'msg'=>$cpData['msg']]);
|
||||
}
|
||||
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'70%','msg'=>'升级文件执行成功!']);
|
||||
|
||||
}
|
||||
|
||||
return json(['code'=>0,'msg'=>'升级文件执行成功']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 手动处理升级包上传
|
||||
*/
|
||||
public function uploadZip()
|
||||
{
|
||||
$files = request()->file('file');
|
||||
$mime = $files->getMime();
|
||||
if($mime !== 'application/zip'){
|
||||
return json(['code'=>-1,'msg'=>'文件类型不对']);
|
||||
}
|
||||
$name = $files->getOriginalName();
|
||||
|
||||
//校验后缀
|
||||
$ext = pathinfo($name,PATHINFO_EXTENSION); //文件后缀
|
||||
if($ext != 'zip')
|
||||
{
|
||||
return json(['code'=>-1,'msg'=>'上传文件格式不对']);
|
||||
}
|
||||
//对比版本号
|
||||
$fname = pathinfo($name,PATHINFO_FILENAME); //无后缀文件名
|
||||
$version_num = array_pop(explode('_',$fname));
|
||||
|
||||
$verRes = version_compare($version_num,$this->sys_version,'>');
|
||||
if(!$verRes){
|
||||
return json(['code'=>-1,'msg'=>'不能降级,请选择正确版本']);
|
||||
}
|
||||
|
||||
$upDir = $this->upload_dir.$fname;
|
||||
//$mv = $files->move('/../tmp/web/upload_dir',$version_num);
|
||||
$mfile = move_uploaded_file($files,$upDir);
|
||||
if(!$mfile)
|
||||
{
|
||||
return json(['code'=>0,'msg'=>'上传文件失败']);
|
||||
}
|
||||
|
||||
//升级前备份代码
|
||||
$ex = array('.git','.idea','runtime','data','addons','config','extend'); // 排除备份文件夹
|
||||
$this->backFile($this->root_dir,$this->backup_dir,$ex);
|
||||
|
||||
//执行升级
|
||||
$upres = $this->execute_update($mfile);
|
||||
|
||||
//更新版本
|
||||
//Db::name('system')->update(['sys_version_num'=>$version_num,'id'=>1]);
|
||||
|
||||
$value = [
|
||||
'version' => $version_num
|
||||
];
|
||||
$res = SetArr::name('taoler')->edit($value);
|
||||
if($res == false){
|
||||
return json(['code'=>-1,'msg'=>'代码更新成功,但版本写入失败']);
|
||||
}
|
||||
|
||||
return json(['code'=>0,'msg'=>'升级成功']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 备份
|
||||
* @param string $dir
|
||||
* @param string $backDir
|
||||
* @param array $ex
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function backFile(string $dir,string $backDir,array $ex)
|
||||
{
|
||||
$backRes = Files::copydirs($dir, $backDir, $ex);
|
||||
$backData = $backRes->getData();
|
||||
if($backData['code'] == -1){
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'error','progress'=>'25%','msg'=>'备份失败!']);
|
||||
return json(['code'=>-1,'msg'=>$backRes['msg']]);
|
||||
}
|
||||
Log::channel('update')->info('update:{type} {progress} {msg}',['type'=>'success','progress'=>'30%','msg'=>'执行文件备份成功!']);
|
||||
}
|
||||
|
||||
|
||||
}
|
185
app/admin/controller/user/User.php
Normal file
@ -0,0 +1,185 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller\user;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use app\admin\validate\Admin;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\User as UserModel;
|
||||
use app\common\lib\Uploads;
|
||||
|
||||
class User extends AdminController
|
||||
{
|
||||
|
||||
/**
|
||||
* 浏览
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
//用户表
|
||||
|
||||
public function list()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$datas = Request::only(['id','name','email','sex','status']);
|
||||
$map = array_filter($datas,[$this,'filtrArr']);
|
||||
$user = Db::name('user')->where(['delete_time'=>0])->where($map)->order('id desc')->paginate(30);
|
||||
$count = $user->total();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'ok','count'=>$count];
|
||||
foreach($user as $k => $v){
|
||||
$data = [
|
||||
'id' => $v['id'],
|
||||
'username' => $v['name'],
|
||||
'nick' => $v['nickname'],
|
||||
'avatar' => $v['user_img'],
|
||||
'phone' => $v['phone'],
|
||||
'email' => $v['email'],
|
||||
'sex' => $v['sex'],
|
||||
'ip' => $v['last_login_ip'],
|
||||
'city' => $v['city'],
|
||||
'logintime' => date("Y-m-d H:i",$v['last_login_time']),
|
||||
'jointime' => date("Y-m-d",$v['create_time']),
|
||||
'check' => $v['status'],
|
||||
'auth' => $v['auth']
|
||||
];
|
||||
$res['data'][] = $data;
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'没有查询结果!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
|
||||
//添加用户
|
||||
public function add()
|
||||
{
|
||||
//
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['name','email','user_img','password','phone','sex']);
|
||||
$data['create_time'] = time();
|
||||
$salt = substr(md5($data['create_time']),-6);
|
||||
// 密码
|
||||
$data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6));
|
||||
try {
|
||||
Db::name('user')->save($data);
|
||||
$res = ['code'=>0,'msg'=>'添加成功'];
|
||||
} catch (\Exception $e) {
|
||||
$res = ['code'=>-1, 'msg'=>$e->getMessage()];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//编辑用户
|
||||
public function edit()
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::only(['name','email','user_img','password','phone','sex']);
|
||||
$user = Db::name('user')->field('create_time')->find($data['id']);
|
||||
$salt = substr(md5($user['create_time']),-6);
|
||||
// 密码
|
||||
$data['password'] = md5(substr_replace(md5($data['password']),$salt,0,6));
|
||||
|
||||
$result = Db::name('user')->update($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$user = Db::name('user')->find(input('id'));
|
||||
View::assign('user',$user);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//删除用户
|
||||
public function delete($id)
|
||||
{
|
||||
$ids = explode(',',$id);
|
||||
if(Request::isAjax()){
|
||||
$user =UserModel::select($ids);
|
||||
$result = $user->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//上传头像
|
||||
public function uploadImg()
|
||||
{
|
||||
$uploads = new Uploads();
|
||||
$upRes = $uploads->put('file','head_pic',2000,'image');
|
||||
$userJson = $upRes->getData();
|
||||
if($userJson['status'] == 0){
|
||||
$res = ['code'=>0,'msg'=>'上传头像成功','src'=>$userJson['url']];
|
||||
} else {
|
||||
$res = ['code'=>1,'msg'=>'上传错误'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
|
||||
//审核用户
|
||||
public function check()
|
||||
{
|
||||
$data = Request::only(['id','status']);
|
||||
//获取状态
|
||||
$res = Db::name('user')->where('id',$data['id'])->save(['status' => $data['status']]);
|
||||
if($res){
|
||||
if($data['status'] == 1){
|
||||
return json(['code'=>0,'msg'=>'用户审核通过','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'禁用用户','icon'=>5]);
|
||||
}
|
||||
|
||||
}else {
|
||||
return json(['code'=>-1,'msg'=>'审核出错']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//超级管理员
|
||||
public function auth()
|
||||
{
|
||||
$data = Request::param();
|
||||
$user = Db::name('user')->save($data);
|
||||
if($user){
|
||||
if($data['auth'] == 1){
|
||||
return json(['code'=>0,'msg'=>'设置为超级管理员','icon'=>6]);
|
||||
} else {
|
||||
return json(['code'=>0,'msg'=>'取消超级管理员','icon'=>5]);
|
||||
}
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'前台管理员设置失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//过滤数组中为空和null的值
|
||||
public function filtrArr($arr)
|
||||
{
|
||||
if($arr === '' || $arr === null){
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
87
app/admin/controller/user/Vip.php
Normal file
@ -0,0 +1,87 @@
|
||||
<?php
|
||||
namespace app\admin\controller\user;
|
||||
|
||||
use app\common\controller\AdminController;
|
||||
use think\facade\View;
|
||||
use think\facade\Request;
|
||||
use think\facade\Db;
|
||||
use app\common\model\UserViprule;
|
||||
|
||||
class Vip extends AdminController
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//显示VIP规则
|
||||
public function list()
|
||||
{
|
||||
$keys = UserViprule::select();
|
||||
$count = $keys->count();
|
||||
$res = [];
|
||||
if($count){
|
||||
$res = ['code'=>0,'msg'=>'','count'=>$count];
|
||||
foreach($keys as $k=>$v){
|
||||
$res['data'][] = ['id'=>$v['id'],'score'=>$v['score'],'nick'=>$v['nick'],'vip'=>$v['vip'],'ctime'=>$v['create_time']];
|
||||
}
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'还没有任何vip等级设置!'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//添加VIP积分规则
|
||||
public function add()
|
||||
{
|
||||
$data = Request::only(['score','vip','nick']);
|
||||
$vip = UserViprule::where('vip',$data['vip'])->find();
|
||||
if($vip){
|
||||
$res = ['code'=>-1,'msg'=>'vip等级不能重复设置'];
|
||||
} else {
|
||||
$result = UserViprule::create($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'设置vip等级成功'];
|
||||
} else {
|
||||
$res = ['code'=>-1,'msg'=>'vip保存失败'];
|
||||
}
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
|
||||
//编辑VIP积分规则
|
||||
public function edit($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$data = Request::param();
|
||||
$result = UserViprule::update($data);
|
||||
if($result){
|
||||
$res = ['code'=>0,'msg'=>'编辑成功'];
|
||||
}else{
|
||||
$res = ['code'=>-1,'msg'=>'编辑失败'];
|
||||
}
|
||||
return json($res);
|
||||
}
|
||||
$vip = Db::name('user_viprule')->find($id);
|
||||
$level = UserViprule::column('vip');
|
||||
View::assign(['vip'=>$vip,'level'=>$level]);
|
||||
return View::fetch();
|
||||
}
|
||||
|
||||
//删除VIP积分规则
|
||||
public function delete($id)
|
||||
{
|
||||
if(Request::isAjax()){
|
||||
$user =UserViprule::find($id);
|
||||
$result = $user->delete();
|
||||
|
||||
if($result){
|
||||
return json(['code'=>0,'msg'=>'删除成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'删除失败']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -6,6 +6,67 @@ return [
|
||||
'chinese' => '中文简体',
|
||||
'english' => 'english',
|
||||
|
||||
//菜单
|
||||
'System' => '系统',
|
||||
'Account' => '账户',
|
||||
'Apps' => '应用',
|
||||
'Addon' => '插件',
|
||||
'Set' => '设置',
|
||||
'Server' => '服务',
|
||||
'Content' => '内容',
|
||||
'Account management' => '账户管理',
|
||||
'Account list' => '账户列表',
|
||||
'Add account' => '添加账户',
|
||||
'Edit account' => '编辑账户',
|
||||
'Delete account' => '删除账户',
|
||||
'Check account' => '审核账户',
|
||||
'Account info' => '账户信息',
|
||||
'Edit account info' => '修改账户信息',
|
||||
'Set account info' => '保存账户信息',
|
||||
'View admin password' => '改密码页',
|
||||
'Reset admin password' => '重设密码',
|
||||
'Clear cache' => '清理缓存',
|
||||
'Logout' => '退出登录',
|
||||
'Role management' => '角色管理',
|
||||
'Add role' => '添加角色',
|
||||
'Edit role' => '编辑角色',
|
||||
'Delete role' => '删除角色',
|
||||
'Check role' => '审核角色',
|
||||
'Rule management' => '权限管理',
|
||||
'Rule list' => '权限列表',
|
||||
'Add rule' => '添加权限',
|
||||
'Edit rule' => '编辑权限',
|
||||
'Delete rule' => '删除权限',
|
||||
'Check rule' => '审核权限',
|
||||
'Rule tree' => '权限树',
|
||||
'Rule sort' => '权限排序',
|
||||
'Upgrade' => '系统升级',
|
||||
'Upgrade key' => '升级密钥',
|
||||
'Upgrade check' => '升级检查',
|
||||
'Edit key' => '改更密钥',
|
||||
'Upgrade system' => '更新系统',
|
||||
'Upload zip' => '上传zip',
|
||||
'Back file' => '备份文件',
|
||||
'Web' => '网站设置',
|
||||
'Website' => '提交设置',
|
||||
'Web config' => '配置项目',
|
||||
'Set domain' => '设置域名',
|
||||
'Bind map' => '绑定Map',
|
||||
'Set url' => 'URL美化',
|
||||
'web upload' => '上传图片',
|
||||
'User management' => '用户管理',
|
||||
'User list' => '用户列表',
|
||||
'Add user' => '添加用户',
|
||||
'Edit user' => '编辑用户',
|
||||
'Delete user' => '删除用户',
|
||||
'Check user' => '审核用户',
|
||||
'Superuser' => '超级用户',
|
||||
'Upload avatar' => '上传头像',
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//弹窗提示消息
|
||||
'add' => '添加',
|
||||
'delete' => '删除',
|
||||
|
@ -4,6 +4,7 @@ namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
use think\model\concern\SoftDelete;
|
||||
use think\facade\Lang;
|
||||
|
||||
class AuthRule extends Model
|
||||
{
|
||||
@ -42,9 +43,45 @@ class AuthRule extends Model
|
||||
{
|
||||
$res = $this->save($data);
|
||||
if($res){
|
||||
return json(['code'=>0,'msg'=>'添加权限成功']);
|
||||
return json(['code'=>0,'msg'=>'权限成功']);
|
||||
}else{
|
||||
return json(['code'=>-1,'msg'=>'添加权限失败']);
|
||||
return json(['code'=>-1,'msg'=>'权限失败']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限菜单数组
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getAuthRuleArray()
|
||||
{
|
||||
$authRules = $this->field('id,pid,title,name,icon,status,ismenu,sort,create_time')->select()->toArray();
|
||||
$ruls = [];
|
||||
foreach($authRules as $v) {
|
||||
$ruls[] = [
|
||||
'powerId' => $v['id'],
|
||||
'powerName' => Lang::get($v['title']),
|
||||
'powerType' => $v['ismenu'],
|
||||
'powerCode' => '',
|
||||
"powerUrl" => $v['name'],
|
||||
"openType" => null,
|
||||
"parentId" => $v['pid'],
|
||||
"icon" => $v['icon'],
|
||||
"sort" => $v['sort'],
|
||||
"enable" => $v['status'],
|
||||
"checkArr" => "0"
|
||||
|
||||
];
|
||||
}
|
||||
//数组排序
|
||||
$cmf_arr = array_column($ruls, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $ruls);
|
||||
|
||||
if(count($ruls)) {
|
||||
return json(['code' => 0, 'msg' => 'ok', 'count' => count($ruls), 'data'=>$ruls]);
|
||||
} else {
|
||||
return json(['code' => 0, 'msg' => 'no data','count' => null,'data'=>'']);
|
||||
}
|
||||
}
|
||||
|
||||
|
107
app/admin/view/addon/addons/add.html
Normal file
@ -0,0 +1,107 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">压缩包</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_src" lay-verify="required" placeholder="请上传zip包" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<button style="float: left;" type="button" class="layui-btn " id="layuiadmin-upload-addons">上传插件</button>
|
||||
</div>
|
||||
</div></div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="addon-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'upload'], function() {
|
||||
var $ = layui.$, form = layui.form, upload = layui.upload;
|
||||
|
||||
let ADDON_ADD = "{:url('addon.addons/add')}";
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-addons'
|
||||
, url: 'uploadZip'
|
||||
, accept: 'file'
|
||||
, field: 'file'
|
||||
, method: 'get'
|
||||
, exts: 'zip|rar|7z'
|
||||
, done: function (res) {
|
||||
$(this.item).prev("div").children("input").val(res.src)
|
||||
|
||||
if (res.code == 0) {
|
||||
layer.msg(res.msg, {
|
||||
icon: 6,
|
||||
tiye: 2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title: "上传失败",
|
||||
content: res.msg,
|
||||
icon: 5,
|
||||
anim: 6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
form.on('submit(addon-save)', function (data) {
|
||||
$.ajax({
|
||||
url: ADDON_ADD,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function (result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function () {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
//parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
85
app/admin/view/addon/addons/config.html
Normal file
@ -0,0 +1,85 @@
|
||||
{extend name="public/base" /}
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-addons" id="layuiadmin-form-addons" style="padding: 20px 30px 0 0;">
|
||||
{foreach name="formData" item="vo" key="k"}
|
||||
{php}$name = "params[".$k."]";{/php}
|
||||
{switch name="$vo.type"}
|
||||
{case value="text"}
|
||||
{:form_input($name,'text',['label'=>$vo.title,'verify'=>$vo.rule,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="textarea"}
|
||||
{:form_textarea($name,['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="password"}
|
||||
{:form_input($name,'password',['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="radio"}
|
||||
{:form_radio($name,$vo.content,['label'=>$vo.title,'tips'=>$vo.tips],$vo.value)}
|
||||
{/case}
|
||||
{case value="checkbox"}
|
||||
{:form_checkbox($name, $vo.content,['label'=>$vo.title, 'verify' =>$vo.rule,'tips'=>$vo.tips,], $vo['value'])};
|
||||
{/case}
|
||||
{case value="switch"}
|
||||
{:form_switch($name, $vo.content,['label'=>$vo.title, 'verify' =>$vo.rule,'tips'=>$vo.tips,], $vo['value'])};
|
||||
{/case}
|
||||
{case value="select"}
|
||||
{:form_select($name,$vo.content,['label'=>$vo.title,'verify'=>$vo.rule,'tips'=>$vo.tips,'search'=>1] ,[],$vo.value)}
|
||||
{/case}
|
||||
{case value="selects"}
|
||||
{:form_select($name,$vo.content,['label'=>$vo.title,'multipsle'=>1.,'verify'=>$vo.rule,'tips'=>$vo.tips,'search'=>1] ,[],$vo.value)}
|
||||
{/case}
|
||||
{case value="image"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'radio','num'=>'1','mime'=>'images'])}
|
||||
{/case}
|
||||
{case value="images"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'checkbox','num'=>$vo.num,'mime'=>'images'])}
|
||||
{/case}
|
||||
{case value="file"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'radio','num'=>$vo.num,'mime'=>'*'])}
|
||||
{/case}
|
||||
{case value="files"}
|
||||
{:form_upload($name,$vo.value,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule,'type'=>'checkbox','num'=>$vo.num,'mime'=>'*'])}
|
||||
{/case}
|
||||
{case value="editor"}
|
||||
{:form_editor($name,2,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule])}
|
||||
{/case}
|
||||
{case value="array"}
|
||||
{:form_arrays($name,$vo.value?$vo.value:$vo.content,['label'=>$vo.title,'tips'=>$vo.tips,'verify'=>$vo.rule])}
|
||||
{/case}
|
||||
{/switch}
|
||||
{/foreach}
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="hidden" name="name" value="{:input('name')}">
|
||||
<input type="button" lay-submit lay-filter="LAY-addons-config-submit" id="LAY-addons-config-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'upload','notify'], function(){
|
||||
var $ = layui.$,upload = layui.upload,form = layui.form,notify=layui.notify;
|
||||
//上传头像
|
||||
upload.render({
|
||||
elem: '.upload-select'
|
||||
,url: "{:url('Addons/uploads')}"
|
||||
,data: {type:'image'}
|
||||
,accept: 'images'
|
||||
,method: 'get'
|
||||
,acceptMime: 'image/*'
|
||||
,done: function(res){
|
||||
$(this.item).prevAll("input").val(res.url);
|
||||
if(res.status == 0){
|
||||
notify.success(res.msg);
|
||||
} else {
|
||||
notify.error(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
93
app/admin/view/addon/addons/edit.html
Normal file
@ -0,0 +1,93 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-addons" id="layuiadmin-form-addons" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" value="{$addons.id}">
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input" value="{$addons.addons_name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_version" lay-verify="required" placeholder="请输入版本" autocomplete="off" class="layui-input" value="{$addons.addons_version}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">作者</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_auther" lay-verify="required" placeholder="请输入作者名" autocomplete="off" class="layui-input" value="{$addons.addons_auther}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">简介</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea name="addons_resume" placeholder="请输入简介" lay-verify="required" class="layui-textarea">{$addons.addons_resume}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">价格</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_price" lay-verify="required" placeholder="请输入价格" autocomplete="off" class="layui-input" value="{$addons.addons_price}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">压缩包</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="addons_src" lay-verify="required" placeholder="请上传zip包" autocomplete="off" class="layui-input" value="{$addons.addons_src}">
|
||||
</div>
|
||||
<button style="float: left;" type="button" class="layui-btn " id="layuiadmin-upload-addons">上传插件</button>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-addons-submit" id="LAY-addons-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'upload'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,upload = layui.upload ;
|
||||
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-addons'
|
||||
,url: 'uploadZip'
|
||||
,accept: 'file'
|
||||
,field: 'file'
|
||||
,method: 'get'
|
||||
,exts: 'zip|rar|7z'
|
||||
,done: function(res){
|
||||
$(this.item).prev("div").children("input").val(res.src);
|
||||
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
tiye:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:"上传失败",
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
108
app/admin/view/addon/addons/index.html
Normal file
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>用户管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
|
||||
<table id="addons-list" lay-filter="addons-list"></table>
|
||||
|
||||
<script type="text/html" id="toolbar">
|
||||
<div class="layui-btn-group" style="padding-bottom: 10px;">
|
||||
<a type="button" class="layui-btn layui-btn-sm" lay-event="allAddons" data-url="{:url('addon.addons/index',['type'=>'onlineAddons','selector'=>'all'])}">全部</a>
|
||||
<a type="button" class="layui-btn layui-btn-sm" lay-event="freeAddons" data-url="{:url('addon.addons/index',['type'=>'onlineAddons','selector'=>'free'])}">免费</a>
|
||||
<a type="button" class="layui-btn layui-btn-sm" lay-event="payAddons" data-url="{:url('addon.addons/index',['type'=>'onlineAddons','selector'=>'pay'])}">付费</a>
|
||||
<a type="button" class="layui-btn layui-btn-normal layui-btn-sm" lay-event="installed" data-url="{:url('addon.addons/index',['type'=>'installed','selector'=>''])}">已安装</a>
|
||||
</div>
|
||||
<div class="layui-btn-group" style="padding-bottom: 10px;">
|
||||
<button class="layui-btn layui-btn-danger layui-btn-sm layuiadmin-btn-admin" data-type="add">离线安装</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="addons-tool">
|
||||
{{# if(d.have_newversion === 1){ }}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="install" data-url="{:url('addon.addons/upgrade')}" data-userlogin="{:url('addon.addons/userLogin')}" data-ispay="{:url('addon.addons/isPay')}"><i class="layui-icon layui-icon-edit"></i>升级</a>
|
||||
{{# } else { }}
|
||||
{{# if(d.isInstall === 1) { }}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config" data-url="{:url('addon.addons/config')}"><i class="layui-icon layui-icon-set"></i>设置</a>
|
||||
{{# } else { }}
|
||||
<a class="layui-btn layui-btn-xs" lay-event="install" data-url="{:url('Addons/install')}" data-userlogin="{:url('addon.addons/userLogin')}" data-ispay="{:url('addon.addons/isPay')}"><i class="layui-icon layui-icon-edit"></i>安装</a>
|
||||
<select id="vers{{d.name}}" name="sss" class="layui-border" lay-ignore lay-filter="versSelect">
|
||||
{{# d.vers.forEach(function(item, index){ }}
|
||||
<option value="{{ item }}">{{ item }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</script>
|
||||
<script type="text/html" id="buttonStatus">
|
||||
<input type="checkbox" name="{{d.name}}" lay-skin="switch" lay-filter="addonsStatus" lay-text="启动|禁用" {{# if(d.status == 1){ }} checked {{# } }} data-url="{:url('addon.addons/check')}">
|
||||
</script>
|
||||
<script type="text/html" id="addons-installed-tool">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="config" data-url="{:url('addon.addons/config')}"><i class="layui-icon layui-icon-set"></i>设置</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="uninstall" data-url="{:url('addon.addons/uninstall')}"><i class="layui-icon layui-icon-delete"></i>卸载</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{include file="public/user_login" /}
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
var addonList = "{:url('addon.Addons/index')}";
|
||||
layui.use(['addons','table','form','upload',"notify",'toast'], function(){
|
||||
var $ = layui.jquery
|
||||
,table = layui.table
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
var notify = layui.notify;
|
||||
var toast = layui.toast;
|
||||
|
||||
form.render('select'); // 渲染所在容器内的 select 元素
|
||||
//监听版本选择
|
||||
form.on('select(versSelect)', function(obj){
|
||||
layer.tips(this.value + ' ' + this.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
|
||||
//事件
|
||||
var active = {
|
||||
add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加插件'
|
||||
,content: 'add.html'
|
||||
,area: ['400px', '300px']
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 启动禁用
|
||||
form.on('switch(addonsStatus)', function(data){
|
||||
var data = data.elem;
|
||||
var url = $(this).data('url');
|
||||
//执行帖子审核
|
||||
$.post(url,{ name: data.name },function(res){
|
||||
if(res.code === 0){
|
||||
toast.success({title:"成功消息",message:res.msg,position: 'topRight'});
|
||||
} else {
|
||||
toast.error({title:"失败消息",message:res.msg,position: 'topRight'});
|
||||
}
|
||||
table.reloadData("addons-list",{},'deep');
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-admin').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
69
app/admin/view/addon/addons/pay.html
Normal file
@ -0,0 +1,69 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
<style>
|
||||
.layui-container{background-color: #F9F9F9}
|
||||
.auth-type{margin: 10px 0px;}
|
||||
.order-info{margin:10px 0px; line-height: 30px;}
|
||||
.pay-type{line-height: 50px;}
|
||||
.soft-info{margin: 10px;}
|
||||
.pay-tips{line-height:20px;text-align: center;margin-bottom: 20px;}
|
||||
</style>
|
||||
|
||||
<div class="layui-container">
|
||||
|
||||
<div class="layui-row">
|
||||
<div class="auth-type">
|
||||
授权
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row">
|
||||
<div class="order-info">
|
||||
<p>订单标题:<em>{$orderData.subject}</em></p>
|
||||
<p>订单编号:<em>{$orderData.out_trade_no}</em></p>
|
||||
<p>订单价格:<em class="scanpay-price">¥{$orderData.total_amount}</em> 元</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-sm6">
|
||||
<div class="pay-type">
|
||||
<div style="padding: 5px; text-align: center;"><img src="/static/res/images/alipay.jpg" style="height:80px;"></div>
|
||||
</div>
|
||||
<div class="soft-info">
|
||||
<div>不支持退款</div>
|
||||
<br />
|
||||
<div>软件协议:本软件为原作者拥有版权权限,购买软件可以商用,禁止第三方出售行为。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-sm6">
|
||||
<div class="qrcode" data-text="支付宝当面付" style="padding: 5px; text-align: center;">
|
||||
<img src="{$orderData.qr_code_img}">
|
||||
</div>
|
||||
<div class="pay-tips">
|
||||
<p>请使用支付宝扫一扫<br>扫描二维码进行支付</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script type="text/javascript">
|
||||
var $ = layui.jquery;
|
||||
var out_trade_no = "{$orderData.out_trade_no}";
|
||||
var interval = setInterval(function(){
|
||||
var url = 'https://www.aieok.com/pay/checkstatus.html?out_trade_no=' + out_trade_no;
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: url,
|
||||
data: {out_trade_no:out_trade_no},
|
||||
dataType:"json",
|
||||
success: function (res) {
|
||||
// 等等支付时,一直轮询
|
||||
if(res.code !== 0) {
|
||||
clearInterval(interval);
|
||||
}
|
||||
}
|
||||
})
|
||||
},2500);
|
||||
</script>
|
||||
{/block}
|
78
app/admin/view/addon/template/index.html
Normal file
@ -0,0 +1,78 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>数据卡片</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form layui-form-pane">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡片标题</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="realName" id="realName" placeholder="" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">卡片名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="username" id="username" placeholder="" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i>
|
||||
搜 索</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-btn"><i class="layui-icon"></i>
|
||||
获取数据</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-checked-btn"><i class="layui-icon"></i>
|
||||
获取选中数据</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="currentTableId"></div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['table', 'layer', 'form', 'jquery', 'card'], function() {
|
||||
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let layer = layui.layer;
|
||||
let card = layui.card;
|
||||
|
||||
card.render({
|
||||
elem: '#currentTableId',
|
||||
url: '/static/admin/data/card.json', // 接口数据
|
||||
data: [], // 静态数据
|
||||
page: true, // 是否分页
|
||||
limit: 8, // 每页数量
|
||||
linenum: 4, // 每行数量
|
||||
clickItem: function(data){ // 单击事件
|
||||
console.log(data)
|
||||
}
|
||||
})
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function(data) {
|
||||
queryJson = data.field;
|
||||
card.reload("currentTableId", {
|
||||
where: queryJson,
|
||||
});
|
||||
return false;
|
||||
});
|
||||
form.on('submit(data-checked-btn)', function() {
|
||||
var data = card.getChecked("currentTableId");
|
||||
layer.msg(JSON.stringify(data));
|
||||
return false;
|
||||
});
|
||||
form.on('submit(data-btn)', function() {
|
||||
var data = card.getAllData("currentTableId");
|
||||
layer.msg(JSON.stringify(data));
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
227
app/admin/view/content/cate/add.html
Normal file
@ -0,0 +1,227 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级分类</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<label class="layui-form-label">所属应用</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="appname" lay-filter="appname" lay-verify="required">
|
||||
{volist name="appname" id="vo"}
|
||||
<option value="{$vo}" {if($vo == $cate.appname)} selected {/if}>{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="catename" lay-verify="required" placeholder="分类名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">EN别名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="ename" lay-verify="required" placeholder="英文名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="icon" placeholder="图标*" id="iconPicker" lay-filter="iconPicker" style="display:none;" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">详情页模板</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="detpl" id="tpl" lay-verify="required">
|
||||
{volist name="template" id="vo"}
|
||||
<option value="{$vo}" {if($vo == $cate.detpl)} selected {/if} >{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<label class="layui-form-label">描述</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="desc" lay-verify="required" placeholder="描述*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="sort" lay-verify="number|required" placeholder="请填数字" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="cate-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'iconPicker', 'xmSelect',], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form ;
|
||||
var iconPicker = layui.iconPicker;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var initPid = "{$cate.pid}";
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(cate-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('content.cate/add')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("cate-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
// 根据应用名动态选择应用下模板
|
||||
form.on('select(appname)', function(data){
|
||||
var appName = data.value;
|
||||
$("#tpl").children('option').remove();
|
||||
$.post("{:url('content.cate/getAppNameView')}", {appname:appName},function (res){
|
||||
var str = '<option value="" >请选择</option>';
|
||||
for(var i=0; i < res.data.length; i++ ) {
|
||||
str += '<option value="'+ res.data[i] +'" >' + res.data[i] + '</option>';
|
||||
// $("select[name='detpl']").append('<option value="'+ arr[i] +'" >' + arr[i] + '</option>');
|
||||
}
|
||||
$("#tpl").append(str);
|
||||
// 动态select重新渲染
|
||||
form.render('select');
|
||||
})
|
||||
|
||||
});
|
||||
(function (){
|
||||
//分类菜单结构
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: "{:url('content.forum/getCateTree')}",
|
||||
success: function(res){
|
||||
var data = res.data;
|
||||
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [initPid],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'catename',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
|
||||
|
||||
// var demo4 = xmSelect.render({
|
||||
// el: '#menuSelectBox',
|
||||
// model: { label: { type: 'text' } },
|
||||
// tree: {
|
||||
// show: true,
|
||||
// strict: false,
|
||||
// expandedKeys: [ -1 ],
|
||||
// },
|
||||
// on: function(data){
|
||||
// if(data.isAdd){
|
||||
// return data.change.slice(0, 1)
|
||||
// }
|
||||
// },
|
||||
// height: 'auto',
|
||||
// })
|
||||
|
||||
// //这里模拟ajax
|
||||
// setTimeout(function(){
|
||||
// demo4.update({
|
||||
// data: [
|
||||
// {name: '销售员', value: -1, children: [
|
||||
// {name: '张三', value: 100, children: []},
|
||||
// {name: '李四1', value: 2},
|
||||
// {name: '王五1', value: 3, disabled: true},
|
||||
// ]},
|
||||
// {name: '奖品', value: -2, children: [
|
||||
// {name: '奖品3', value: -3, children: [
|
||||
// {name: '苹果3', value: 14},
|
||||
// {name: '香蕉3', value: 15},
|
||||
// {name: '葡萄3', value: 16},
|
||||
// ]},
|
||||
// {name: '苹果2', value: 4, disabled: true},
|
||||
// {name: '香蕉2', value: 5},
|
||||
// {name: '葡萄2', value: 6},
|
||||
// ]},
|
||||
// ]
|
||||
// })
|
||||
|
||||
// //设置默认值
|
||||
// demo4.setValue([
|
||||
// {name: '李四1', value: 2},
|
||||
// {name: '苹果3', value: 14},
|
||||
// ], null, true)
|
||||
|
||||
// }, 300)
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
})()
|
||||
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
183
app/admin/view/content/cate/edit.html
Normal file
@ -0,0 +1,183 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级分类</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<label class="layui-form-label">所属应用</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="appname" lay-filter="appname" lay-verify="required">
|
||||
{volist name="appname" id="vo"}
|
||||
<option value="{$vo}" {if($vo == $cate.appname)} selected {/if}>{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="catename" lay-verify="required" value="{$cate.catename}" placeholder="分类名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">EN别名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="ename" lay-verify="required" value="{$cate.ename}" placeholder="英文名*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="icon" placeholder="图标*" value="{$cate.icon}" id="iconPicker" lay-filter="iconPicker" style="display:none;" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">详情页模板</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="detpl" id="tpl" lay-verify="required">
|
||||
{volist name="template" id="vo"}
|
||||
<option value="{$vo}" {if($vo == $cate.detpl)} selected {/if} >{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<label class="layui-form-label">描述</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="desc" lay-verify="required" value="{$cate.desc}" placeholder="描述*" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="sort" lay-verify="number|required" value="{$cate.sort}" placeholder="请填数字" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-block layui-hide">
|
||||
<input type="text" name="id" lay-verify="number|required" value="{$cate.id}" placeholder="请填数字" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="cate-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'iconPicker', 'xmSelect',], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form ;
|
||||
var iconPicker = layui.iconPicker;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var initPid = "{$cate.pid}";
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(cate-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('content.cate/edit')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("cate-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
// 根据应用名动态选择应用下模板
|
||||
form.on('select(appname)', function(data){
|
||||
var appName = data.value;
|
||||
$("#tpl").children('option').remove();
|
||||
$.post("{:url('content.cate/getAppNameView')}", {appname:appName},function (res){
|
||||
var str = '<option value="" >请选择</option>';
|
||||
for(var i=0; i < res.data.length; i++ ) {
|
||||
str += '<option value="'+ res.data[i] +'" >' + res.data[i] + '</option>';
|
||||
// $("select[name='detpl']").append('<option value="'+ arr[i] +'" >' + arr[i] + '</option>');
|
||||
}
|
||||
$("#tpl").append(str);
|
||||
// 动态select重新渲染
|
||||
form.render('select');
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
(function (){
|
||||
//分类菜单结构
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: "{:url('content.forum/getCateTree')}",
|
||||
success: function(res){
|
||||
var data = res.data;
|
||||
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [initPid],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'catename',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
})()
|
||||
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
237
app/admin/view/content/cate/index.html
Normal file
@ -0,0 +1,237 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>分类管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="cate-table" lay-filter="cate-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="cate-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-success pear-btn-md" lay-event="expandAll">
|
||||
<i class="layui-icon layui-icon-spread-left"></i>
|
||||
展开
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-success pear-btn-md" lay-event="foldAll">
|
||||
<i class="layui-icon layui-icon-shrink-right"></i>
|
||||
折叠
|
||||
</button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="cate-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit" data-href="{:url('cate/edit')}"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="cate-enable">
|
||||
<input type="checkbox" name="is_hot" value="{{d.id}}" lay-skin="primary" lay-filter="cate-enable" {{ d.is_hot == 1 ? 'checked' : '' }} />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="icon">
|
||||
<i class="layui-icon {{d.icon}}"></i>
|
||||
</script>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
const CATE = "{:url('content.cate/list')}";
|
||||
const DELETE = "{:url('content.cate/delete')}";
|
||||
const ENABLE = "{:url('content.cate/hot')}";
|
||||
|
||||
layui.use(['table','form','jquery','treetable'],function () {
|
||||
let $ = layui.jquery;
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let treetable = layui.treetable;
|
||||
|
||||
|
||||
let MODULE_PATH = "operate/";
|
||||
|
||||
let cols = [
|
||||
[
|
||||
{type: 'checkbox'}
|
||||
,{field: 'catename', title: '分类名', width: 150}
|
||||
,{field: 'appname', title: '所属应用', width: 90}
|
||||
,{field: 'ename', title: 'EN别名', width: 100}
|
||||
,{field: 'detpl',title: '模板', align: 'center',width: 100}
|
||||
,{field: 'icon', title: '图标', align: 'center',width: 50, templet: '<p><i class="layui-icon {{d.icon}}"></i></p>'}
|
||||
,{field: 'is_hot', title: '热门', align: 'center',width: 50, templet: '#cate-enable'}
|
||||
,{field: 'desc', title: '描述', minWidth: 200}
|
||||
,{field: 'id', title: 'ID',width: 60}
|
||||
,{field: 'sort', title: '排序', width: 80, sort: true}
|
||||
,{title: '操作', width: 120, align: 'center', toolbar: '#cate-bar'}
|
||||
]
|
||||
];
|
||||
|
||||
window.render = function(){
|
||||
treetable.render({
|
||||
treeColIndex: 1,
|
||||
treeSpid: 0,
|
||||
treeIdName: 'id',
|
||||
treePidName: 'pid',
|
||||
skin:'line',
|
||||
treeDefaultClose: true,
|
||||
toolbar:'#cate-toolbar',
|
||||
elem: '#cate-table',
|
||||
url: CATE,
|
||||
page: false,
|
||||
cols: cols
|
||||
});
|
||||
}
|
||||
|
||||
render();
|
||||
|
||||
table.on('tool(cate-table)',function(obj){
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
table.on('toolbar(cate-table)', function(obj){
|
||||
if(obj.event === 'add'){
|
||||
window.add();
|
||||
} else if(obj.event === 'refresh'){
|
||||
window.refresh();
|
||||
} else if(obj.event === 'batchRemove'){
|
||||
window.batchRemove(obj);
|
||||
} else if(obj.event === 'expandAll'){
|
||||
treetable.expandAll("#cate-table");
|
||||
} else if(obj.event === 'foldAll'){
|
||||
treetable.foldAll("#cate-table");
|
||||
}
|
||||
});
|
||||
|
||||
form.on('checkbox(cate-enable)', function(obj) {
|
||||
layer.tips(this.value + ' ' + this.name + ':' + obj.elem.checked, obj.othis);
|
||||
var status = obj.elem.checked ? 1 : 0;
|
||||
//执行用户审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url: ENABLE,
|
||||
data:{"id":this.value,"is_hot":status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
window.add = function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: ['450px', '500px'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['450px', '500px'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
window.remove = function(obj){
|
||||
layer.confirm('确定要删除该权限', {icon: 3, title:'提示'}, function(index){
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: DELETE+"?id="+obj.data['id'],
|
||||
dataType:'json',
|
||||
type:'delete',
|
||||
success:function(result){
|
||||
layer.close(loading);
|
||||
if(result.code === 0){
|
||||
layer.msg(result.msg,{icon:1,time:1000},function(){
|
||||
obj.del();
|
||||
});
|
||||
}else{
|
||||
layer.msg(result.msg,{icon:2,time:1000});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
let data = table.checkStatus(obj.config.id).data;
|
||||
if (data.length === 0) {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
let ids = "";
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
ids += data[i].id + ",";
|
||||
}
|
||||
ids = ids.substr(0, ids.length - 1);
|
||||
layer.confirm('确定要删除这些权限', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: DELETE + "?id=" + ids,
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('user-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
257
app/admin/view/content/cate/index1.html
Normal file
@ -0,0 +1,257 @@
|
||||
{extend name="public:base" /}
|
||||
{block name="css"}<link rel="stylesheet" href="/static/admin/tree/css/treeTable.css">{/block}
|
||||
{block name="css"}
|
||||
<style type="text/css">
|
||||
.layui-table-body, .layui-table-box, .layui-table-cell{
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* 设置下拉框的高度与表格单元相同 */
|
||||
td .layui-table-cell .layui-form-select {
|
||||
margin-top: -10px;
|
||||
margin-left: -15px;
|
||||
margin-right: -15px;
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header layuiadmin-card-header-auto">
|
||||
{if condition="checkRuleButton('forum/addtags')"}
|
||||
<button class="layui-btn layuiadmin-btn-tags" data-type="add">添加</button>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="page-wrapper">
|
||||
<div class="demo-side">
|
||||
<table id="Article-cate-list"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<script type="text/html" id="buttonHot">
|
||||
{if condition="checkRuleButton('Forum/tagshot')"}<input type="checkbox" name="is_hot" lay-skin="primary" lay-filter="menu-show" {{# if(d.is_hot ==1){ }} checked value="0"{{# } else { }}value="1"{{# } }} id="{{d.id}}" >
|
||||
{else /}<input type="checkbox" title="禁用" disabled> {/if}
|
||||
</script>
|
||||
<script type="text/html" id="layuiadmin-app-cont-tagsbar">
|
||||
{if condition="checkRuleButton('forum/tagsform')"}
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></a>
|
||||
{else /}<a class="layui-btn layui-btn-disabled layui-btn-normal layui-btn-xs"><i class="layui-icon layui-icon-edit"></i></a>{/if}
|
||||
{if condition="checkRuleButton('forum/tagsdelete')"}
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i></a>
|
||||
{else /}<a class="layui-btn layui-btn-disabled layui-btn-danger layui-btn-xs"><i class="layui-icon layui-icon-delete"></i></a>{/if}
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
var forumList = "{:url('Forum/list')}",
|
||||
forumListdel = "{:url('Forum/listdel')}",
|
||||
forumListform = "{:url('Forum/listform')}",
|
||||
forumReplys = "{:url('Forum/replys')}",
|
||||
forumRedel = "{:url('Forum/redel')}",
|
||||
forumReplysform = "{:url('Forum/replysform')}",
|
||||
forumTags = "{:url('Forum/tags')}",
|
||||
forumTagsDelete = "{:url('Forum/tagsdelete')}",
|
||||
forumTagsForm = "{:url('Forum/tagsform')}";
|
||||
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index','treeTable'], function(){
|
||||
|
||||
var table = layui.table, form = layui.form;
|
||||
var $ = layui.$,treeTable = layui.treeTable;
|
||||
|
||||
// 渲染分类表格
|
||||
var insTb = treeTable.render({
|
||||
elem: '#Article-cate-list',
|
||||
url: forumTags,
|
||||
//toolbar: 'default',
|
||||
//height: 'full-200',
|
||||
tree: {
|
||||
iconIndex: 2,
|
||||
isPidData: true,
|
||||
idName: 'id',
|
||||
pidName: 'pid'
|
||||
},
|
||||
defaultToolbar: ['filter', 'print', 'exports'],
|
||||
cols: [
|
||||
[
|
||||
{type: 'numbers'},
|
||||
{type: 'checkbox'}
|
||||
,{field: 'catename', title: '分类名', width: 150}
|
||||
,{field: 'appname', title: '所属应用', width: 90}
|
||||
,{field: 'ename', title: 'EN别名', width: 100}
|
||||
,{field: 'detpl',title: '模板', align: 'center',width: 100}
|
||||
,{title: '图标', align: 'center',width: 50,templet: '<p><i class="layui-icon {{d.icon}}"></i></p>'}
|
||||
,{field: 'is_hot', title: '热门', align: 'center',width: 50, templet: '#buttonHot'}
|
||||
,{field: 'desc', title: '描述', minWidth: 200}
|
||||
,{field: 'id', title: 'ID',width: 60}
|
||||
,{field: 'sort', title: '排序', width: 80, sort: true}
|
||||
,{title: '操作', width: 120, align: 'center', toolbar: '#layuiadmin-app-cont-tagsbar'}
|
||||
]
|
||||
],
|
||||
style: 'margin-top:0;'
|
||||
});
|
||||
|
||||
//监听工具条
|
||||
treeTable.on('tool(Article-cate-list)', function(obj){
|
||||
var data = obj.data;
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('是否删除此分类及分类下内容?', function(index){
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:forumTagsDelete,
|
||||
data:{id:data.id},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){layer.msg(data.msg,{icon:6,time:2000},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({title:'删除失败',content:data.msg,icon:5,adim:6})
|
||||
}
|
||||
}
|
||||
});
|
||||
layer.close(index);
|
||||
});
|
||||
} else if(obj.event === 'edit'){
|
||||
var tr = $(obj.tr);
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '编辑分类'
|
||||
,content: forumTagsForm + '?id='+ data.id
|
||||
,area: ['400px', '500px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
//获取iframe元素的值
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-tags")
|
||||
,pid = othis.find('input[name="pid"]').val()
|
||||
,sort = othis.find('input[name="sort"]').val()
|
||||
,appname = othis.find('select[name="appname"]').val()
|
||||
,catename = othis.find('input[name="catename"]').val()
|
||||
,ename = othis.find('input[name="ename"]').val()
|
||||
,detpl = othis.find('select[name="detpl"]').val()
|
||||
,icon = othis.find('input[name="icon"]').val()
|
||||
,desc = othis.find('input[name="desc"]').val();
|
||||
|
||||
if(!catename.replace(/\s/g, '')) return;
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:forumTagsForm,
|
||||
data:{"id":data.id,"pid":pid,"sort":sort,"appname":appname,"catename":catename,"ename":ename,"detpl":detpl,"icon":icon,"desc":desc},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if(data.code == 0){layer.msg(data.msg,{icon:6,time:2000},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({title:'修改失败',content:data.msg,icon:5,adim:6})
|
||||
}
|
||||
}
|
||||
});
|
||||
/*
|
||||
obj.update({
|
||||
tags: tags
|
||||
,ename: ename
|
||||
,sort: sort
|
||||
});
|
||||
*/
|
||||
treeTable.reload('Article-cate-list'); //数据刷新
|
||||
layer.close(index);
|
||||
}
|
||||
,success: function(layero, index){
|
||||
//给iframe元素赋值
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-tags").click();
|
||||
othis.find('input[name="pid"]').val(data.pid)
|
||||
,othis.find('input[name="sort"]').val(data.sort)
|
||||
,othis.find('select[name="appname"]').val(data.appname)
|
||||
,othis.find('input[name="catename"]').val(data.catename)
|
||||
,othis.find('input[name="ename"]').val(data.ename)
|
||||
,othis.find('input[name="icon"]').val(data.icon)
|
||||
,othis.find('input[name="desc"]').val(data.desc);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var active = {
|
||||
add: function(){
|
||||
layer.open({
|
||||
type: 2
|
||||
,title: '添加分类'
|
||||
,content: 'tagsform.html'
|
||||
,area: ['450px', '550px']
|
||||
,btn: ['确定', '取消']
|
||||
,yes: function(index, layero){
|
||||
var othis = layero.find('iframe').contents().find("#layuiadmin-app-form-tags")
|
||||
,pid = othis.find('input[name="pid"]').val()
|
||||
,sort = othis.find('input[name="sort"]').val()
|
||||
,appname = othis.find('select[name="appname"]').val()
|
||||
,catename = othis.find('input[name="catename"]').val()
|
||||
,ename = othis.find('input[name="ename"]').val()
|
||||
,detpl = othis.find('select[name="detpl"]').val()
|
||||
,icon = othis.find('input[name="icon"]').val()
|
||||
,desc = othis.find('input[name="desc"]').val();
|
||||
|
||||
if(!catename.replace(/\s/g, '')) return;
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('Forum/tagsform')}",
|
||||
data:{pid:pid,"sort":sort,"appname":appname,"catename":catename,"ename":ename,"detpl":detpl,"icon":icon,"desc":desc},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{icon:6,time:2000});
|
||||
} else {
|
||||
layer.open({title:'添加失败',content:data.msg,icon:5,anim:6});
|
||||
}
|
||||
}
|
||||
});
|
||||
table.reload('LAY-app-content-tags');
|
||||
layer.close(index);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//分类热点控制
|
||||
form.on('checkbox(menu-show)', function(data){
|
||||
var data = data.elem;
|
||||
data.value = data.checked ? 1 : 0;
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('Forum/tagshot')}",
|
||||
data:{"id":data.id,"is_hot":data.value,},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){
|
||||
layer.msg(data.msg,{icon:6,time:2000});
|
||||
} else {
|
||||
layer.open({title:'修改失败',content:data.msg,icon:5,adim:6});
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
$('.layui-btn.layuiadmin-btn-tags').on('click', function(){
|
||||
var type = $(this).data('type');
|
||||
active[type] ? active[type].call(this) : '';
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
{/block}
|
255
app/admin/view/content/comment/index.html
Normal file
@ -0,0 +1,255 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>管理员管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" action="">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline layuiadmin-input-useradmin">
|
||||
<label class="layui-form-label">回帖人</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">内容</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="content" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="status" lay-filter="fourm-check">
|
||||
<option value="">全部</option>
|
||||
<option value="0">待审</option>
|
||||
<option value="-1">禁止</option>
|
||||
<option value="1">通过</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="comment-query">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
查询
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-md">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="comment-table" lay-filter="comment-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="comment-toolbar">
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
|
||||
|
||||
<script type="text/html" id="imgTpl">
|
||||
<img style="width: 25px; height: 25px;" src= {{ d.avatar }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
<input type="checkbox" name="check" lay-skin="switch" lay-filter="check" lay-text="通过|{{ d.check == 0 ? '待审' : '禁止' }}" {{ d.check == 1 ? 'checked' : '' }} id="{{d.id}}" >
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="comment-bar">
|
||||
<!--<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>-->
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
const COMMENT_DELETE = "{:url('content.comment/delete')}";
|
||||
|
||||
layui.use(['jquery','table','form','common'], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
let common = layui.common;
|
||||
|
||||
//评论管理
|
||||
table.render({
|
||||
elem: '#comment-table'
|
||||
,url: "{:url('content.comment/list')}"
|
||||
,toolbar: '#comment-toolbar'
|
||||
,cols: [[
|
||||
{type: 'checkbox'}
|
||||
,{field: 'id', width: 80, title: 'ID', sort: true}
|
||||
,{field: 'title', title: '标题',minWidth: 150, templet: '<div><a href="{{d.url}}" target="_blank">{{d.title}}</a></div>'}
|
||||
,{field: 'replyer', title: '账号', width: 80}
|
||||
,{field: 'avatar', title: '头像', width: 60, templet: '#imgTpl'}
|
||||
,{field: 'content', title: '评论', minWidth: 200}
|
||||
,{field: 'replytime', title: '回复时间', width: 120, sort: true}
|
||||
,{field: 'check', title: '审核', templet: '#buttonCheck', width: 100}
|
||||
,{title: '操作', width: 60, align: 'center', toolbar: '#comment-bar'}
|
||||
]]
|
||||
,page: true
|
||||
,limit: 15
|
||||
,limits: [10, 15, 20, 25, 30]
|
||||
,text: '对不起,加载出现异常!'
|
||||
});
|
||||
|
||||
table.on('tool(comment-table)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(comment-table)', function(obj) {
|
||||
if (obj.event === 'add') {
|
||||
window.add();
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh();
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(comment-query)', function(data) {
|
||||
table.reload('comment-table', {
|
||||
where: data.field
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
//监听回贴审核
|
||||
form.on('switch(check)', function(data){
|
||||
var data= data.elem;
|
||||
var status = data.checked ? 1 : -1;
|
||||
//执行回帖审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('content.comment/check')}",
|
||||
data:{id:data.id,status:status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
table.reload('comment-table');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除该评论吗', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: COMMENT_DELETE + "?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
|
||||
var checkIds = common.checkField(obj,'id');
|
||||
|
||||
if (checkIds === "") {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
layer.confirm('确定要删除这些评论', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: COMMENT_DELETE,
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
data:{"id":checkIds},
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('comment-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(param) {
|
||||
table.reload('user-table');
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
39
app/admin/view/content/comment/replysform.html
Normal file
@ -0,0 +1,39 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-replys" id="layuiadmin-form-replys" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">回帖内容</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="content" lay-verify="required" autocomplete="off" class="layui-textarea" style="height: 200px;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'upload'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-replys'
|
||||
,url: layui.setter.base + 'json/upload/demo.js'
|
||||
,accept: 'images'
|
||||
,method: 'get'
|
||||
,acceptMime: 'image/*'
|
||||
,done: function(res){
|
||||
$(this.item).prev("div").children("input").val(res.data.src)
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
293
app/admin/view/content/forum/add.html
Normal file
@ -0,0 +1,293 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-row layui-col-space15 layui-form-item">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">{:lang('special column')}</label>
|
||||
<div class="layui-input-block">
|
||||
<select lay-verify="required" name="cate_id" lay-filter="column">
|
||||
<option></option>
|
||||
{volist name="cateList" id="cate"}
|
||||
<option value="{$cate.id}" {if($Request.param.cate == $cate.ename)} selected {/if}>{:cookie('think_lang') == 'en-us' ? $cate.ename : $cate.catename}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md8">
|
||||
<label for="L_title" class="layui-form-label">{:lang('title')}</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" style="position:relative;" value=""/>
|
||||
<input type="hidden" id="L_title_color" name="title_color" autocomplete="off" class="layui-input" />
|
||||
<div class="layui-input bdsug layui-hide">
|
||||
<ul class="wordlist">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md1">
|
||||
<div id="color"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="required" placeholder="{:lang('please input the content')}" class="layui-textarea fly-editor" style="height: 260px"> </textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">{:lang('enclosure')}</label>
|
||||
<div class="layui-input-inline" style="width: 190px">
|
||||
<input type="text" class="layui-input" name="upzip" value="" placeholder="zip,image文件" title="上传附件" />
|
||||
</div>
|
||||
<button type="button" class="layui-btn" id="zip-button"><i class="layui-icon"></i>{:lang('uploads')}</button>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('描述')}</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="description" class="layui-textarea" placeholder="SEO描述"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
{//关键词}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('添加关键词')}</label>
|
||||
<div class="layui-input-block">
|
||||
<!-- <input type="text" class="layui-input" name="" id="inputTags" value="" placeholder="多个回车添加" title="添加关键词" /> -->
|
||||
<input type="text" class="layui-input" name="keywords" value="" placeholder="多个用逗号隔开" title="添加关键词" />
|
||||
</div>
|
||||
</div>
|
||||
{//tag}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('add tags')}</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="tag"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="forum-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script src="/static/jquery-3.6.0.min.js"></script>
|
||||
<script src="/addons/taonyeditor/tinymce/tinymce.min.js"></script>
|
||||
<script src="/addons/taonyeditor/tinymce/tinymce-jquery.min.js"></script>
|
||||
<script>
|
||||
//定义选择器
|
||||
var mytextareaid = 'textarea#L_content';
|
||||
var imagePrependUrl = "{$domain}";
|
||||
//定义文件上传接口接口
|
||||
var taonyUploadUrl = "{:url('content.forum/uploads')}",
|
||||
taonyUploadImgage = "{:url('content.forum/uploads')}?type=image",
|
||||
taonyUploadVideo = "{:url('content.forum/uploads')}?type=video";
|
||||
taonyUploadZip = "{:url('content.forum/uploads')}?type=zip";
|
||||
taonyUploadAudio = "{:url('content.forum/uploads')}?type=audio";
|
||||
$(mytextareaid).removeClass();
|
||||
</script>
|
||||
|
||||
<script src="/static/xm-select.js"></script>
|
||||
<script>
|
||||
layui.extend({
|
||||
editor: '{/}/static/admin/modules/taonyeditor/js/taonyeditor'
|
||||
}).use(["form", "colorpicker", "upload",'tinymce','editor','xmSelect'], function () {
|
||||
var $ = layui.jquery, form = layui.form, colorpicker = layui.colorpicker, upload = layui.upload;
|
||||
var editor = layui.editor;
|
||||
var xmSelect = layui.xmSelect;
|
||||
|
||||
var tinymce = layui.tinymce
|
||||
// var edit = tinymce.render({
|
||||
// elem: "#L_content",
|
||||
// height: 400
|
||||
// });
|
||||
|
||||
|
||||
form.on('submit(forum-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('content.forum/add')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
//获取百度标签标志,tag或者word;
|
||||
var flag = 'word';
|
||||
|
||||
//如果你是采用模版自带的编辑器,你需要开启以下语句来解析。
|
||||
var taonystatus = "{:hook('taonystatus')}";
|
||||
// 编辑器插件启用状态
|
||||
var isShow = taonystatus ? false : true;
|
||||
if(isShow) {
|
||||
$('.layui-textarea').each(function(){
|
||||
var othis = $(this), html = othis.html();
|
||||
othis.attr(fly.content(html));
|
||||
})
|
||||
}
|
||||
|
||||
// 从详情页自动调用端口过滤,获取描述信息
|
||||
tinymce.get('L_content').on('mouseleave', function() {
|
||||
var content = tinymce.get('L_content').getContent({format: 'text'});
|
||||
content = content.replace(/[\r\n]/g,"").replace(/\n/g, '').replace(/\s/g, '').replace(/\t/g, '');
|
||||
if(content.length >200) {
|
||||
content = content.substring(0,200);
|
||||
}
|
||||
// var test = tinymce.activeEditor.getContent({format: 'text'});
|
||||
$('[name="description"]').val(content);
|
||||
});
|
||||
|
||||
// tag标签
|
||||
$(function(){
|
||||
//1.渲染标签
|
||||
var addTags = xmSelect.render({
|
||||
el: '#tag',
|
||||
name: 'tagid',
|
||||
layVerify: 'required',
|
||||
layVerType: 'msg',
|
||||
paging: true,
|
||||
pageSize: 5,
|
||||
data: []
|
||||
});
|
||||
//2.动态标签赋值
|
||||
$.get("{:url('tag/getAllTag')}",function(res){
|
||||
if(res.code == 0){
|
||||
addTags.update({
|
||||
data: res.data,
|
||||
autoRow: true,
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
// 通过接口自动获取tag的内容
|
||||
var conf = "{:empty(config('taoler.baidu.client_id'))}";
|
||||
if (conf !== "1") {
|
||||
$("#L_title").on("blur", function () {
|
||||
var title = $(this).val();
|
||||
var content = $("#L_content").val();
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "{:url('Forum/getKeywords')}",
|
||||
data: { keywords: title, content:content, flag: flag },
|
||||
daType: "json",
|
||||
success: function (data) {
|
||||
if (data.code == 0) {
|
||||
$("input[name='keywords']").val(data.data.join(','));
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 百度词条
|
||||
var baidu_title_switch = "{:config('taoler.config.baidu_title_switch')}";
|
||||
if(baidu_title_switch == 1) {
|
||||
$("#L_title").bind('input propertychange',function () {
|
||||
var title = $(this).val();
|
||||
var str = '';
|
||||
if(title.length > 0 ) {
|
||||
$.post("{:url('forum/getWordList')}",{title:title},function(res){
|
||||
// 动态生成ur>li内容
|
||||
if (res.code == 0) {
|
||||
// 显示动态框
|
||||
$(".bdsug").removeClass('layui-hide');
|
||||
for (var i = 0; i < res.data.length; i++) {
|
||||
//str += '<li data-key=' + res.data[i].q + '><b>' + res.data[i].q.replace(title,'') + '</b></li>';
|
||||
str += '<li data-key=' + res.data[i].q + '><b>' + res.data[i].q + '</b></li>';
|
||||
}
|
||||
// 清空ul并追加li
|
||||
$('.wordlist').empty().append(str);
|
||||
// 点击李获取li值并复制给#L_title input的value
|
||||
$(".bdsug li").on('click',function(){
|
||||
var word = $(this).attr('data-key');
|
||||
var words = title + '(' + word + ')';
|
||||
$("#L_title").val(words);
|
||||
// 关闭动态框
|
||||
$(".bdsug").addClass('layui-hide');
|
||||
});
|
||||
} else {
|
||||
$(".bdsug").addClass('layui-hide');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$(".bdsug").addClass('layui-hide');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//上传附件
|
||||
upload.render({
|
||||
elem: "#zip-button",
|
||||
url: "{:url('forum/uploads')}", //改成您自己的上传接口
|
||||
data: { type: "zip" },
|
||||
accept: "file", //普通文件
|
||||
done: function (res) {
|
||||
if (res.status == 0) {
|
||||
$('input[name="upzip"]').val(res.url);
|
||||
layer.msg("上传成功");
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
// 改变标题颜色
|
||||
colorpicker.render({
|
||||
elem: "#color",
|
||||
color: "#393d49",
|
||||
predefine: true, // 开启预定义颜色
|
||||
done: function (color) {
|
||||
//譬如你可以在回调中把得到的 color 赋值给表单
|
||||
$("#L_title_color").val(color);
|
||||
$("#L_title").css("color", color);
|
||||
},
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
241
app/admin/view/content/forum/edit.html
Normal file
@ -0,0 +1,241 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<input type="hidden" name="id" value="{$article.id}">
|
||||
<div class="layui-row layui-col-space15 layui-form-item">
|
||||
<div class="layui-col-md3">
|
||||
<label class="layui-form-label">{:lang('special column')}</label>
|
||||
<div class="layui-input-block">
|
||||
<select lay-verify="required" name="cate_id" lay-filter="column">
|
||||
<option></option>
|
||||
{volist name="cateList" id="cate"}
|
||||
<option value="{$cate.id}" {if $article.cate_id == $cate.id}selected{/if}>{:cookie('think_lang') == 'en-us' ? $cate.ename : $cate.catename}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md8">
|
||||
<label for="L_title" class="layui-form-label">{:lang('title')}</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" value="{$article.title}">
|
||||
<input type="hidden" id="L_title_color" name="title_color" autocomplete="off" class="layui-input" value="{$article.title_color ?? '#333'}">
|
||||
<input type="hidden" name="user_id" value="{$article.user_id}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md1">
|
||||
<div id="color"></div>
|
||||
<div id="test9" style="margin-left: 30px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="required" placeholder="详细内容" class="layui-textarea fly-editor" style="height: 260px;">{$article.content}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">{:lang('enclosure')}</label>
|
||||
<div class="layui-input-inline" style="width: 190px;">
|
||||
<input type="text" class="layui-input" name="upzip" value="{$article.upzip ?? ''}" placeholder="zip,jpg格式" title="上传附件"/>
|
||||
</div>
|
||||
<button type="button" class="layui-btn" id="zip-button"><i class="layui-icon"></i>上传文件</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('描述')}</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="description" class="layui-textarea" placeholder="SEO描述">{$article.description}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
{//关键词}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('添加关键词')}</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="keywords" value="{$article.keywords}" placeholder="多个英文逗号隔开" title="添加关键词" />
|
||||
</div>
|
||||
</div>
|
||||
{//tag}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{:lang('add tags')}</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="tag"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<button type="submit" class="layui-btn" lay-filter="article-edit" lay-submit id="article-edit">{:lang('post now')}</button>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script src="/static/jquery-3.6.0.min.js"></script>
|
||||
<script src="/addons/taonyeditor/tinymce/tinymce.min.js"></script>
|
||||
<script src="/addons/taonyeditor/tinymce/tinymce-jquery.min.js"></script>
|
||||
<script>
|
||||
//定义选择器
|
||||
var mytextareaid = 'textarea#L_content';
|
||||
var imagePrependUrl = "{$domain}";
|
||||
//定义文件上传接口接口
|
||||
var taonyUploadUrl = "{:url('forum/uploads')}",
|
||||
taonyUploadImgage = "{:url('forum/uploads')}?type=image",
|
||||
taonyUploadVideo = "{:url('forum/uploads')}?type=video";
|
||||
taonyUploadZip = "{:url('forum/uploads')}?type=zip";
|
||||
taonyUploadAudio = "{:url('forum/uploads')}?type=audio";
|
||||
$(mytextareaid).removeClass();
|
||||
</script>
|
||||
<script src="/static/xm-select.js"></script>
|
||||
<script>
|
||||
layui.extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
,editor: '{/}/static/admin/modules/taonyeditor/js/taonyeditor'
|
||||
}).use(['colorpicker','form','upload', 'editor'], function(){
|
||||
var $ = layui.jquery
|
||||
,colorpicker = layui.colorpicker
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
var artId = "{$article.id}";
|
||||
var editor = layui.editor;
|
||||
|
||||
$(function(){
|
||||
//1.渲染标签
|
||||
var addTags = xmSelect.render({
|
||||
el: '#tag',
|
||||
name: 'tagid',
|
||||
layVerify: '',
|
||||
layVerType: 'msg',
|
||||
paging: true,
|
||||
pageSize: 5,
|
||||
data: []
|
||||
});
|
||||
//2.动态赋值
|
||||
$.get("{:url('tag/getArticleTag')}",{id:artId},function(res){
|
||||
if(res.code == 0){
|
||||
addTags.setValue(
|
||||
res.data
|
||||
)
|
||||
}
|
||||
});
|
||||
//3.动态标签赋值
|
||||
$.get("{:url('tag/getAllTag')}",function(res){
|
||||
if(res.code == 0){
|
||||
addTags.update({
|
||||
data: res.data,
|
||||
autoRow: true,
|
||||
})
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
// 从详情页自动调用端口过滤,获取描述信息
|
||||
tinymce.get('L_content').on('mouseleave', function() {
|
||||
var content = tinymce.get('L_content').getContent({format: 'text'});
|
||||
content = content.replace(/[\r\n]/g,"").replace(/\n/g, '').replace(/\s/g, '').replace(/\t/g, '');
|
||||
if(content.length >200) {
|
||||
content = content.substring(0,200);
|
||||
}
|
||||
// var test = tinymce.activeEditor.getContent({format: 'text'});
|
||||
$('[name="description"]').val(content);
|
||||
});
|
||||
|
||||
// 获取描述的内容
|
||||
$("#L_content").bind('input propertychange', function(){
|
||||
var content = $(this).val()
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('Forum/getDescription')}",
|
||||
data:{"content":content},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
$('[name="description"]').val(data.data);
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
})
|
||||
|
||||
// 获取tag的内容
|
||||
var conf = "{:empty(config('taoler.baidu.client_id'))}";
|
||||
if(conf !== '1'){
|
||||
$("#L_title").on('blur', function(){
|
||||
var title = $(this).val();
|
||||
var flag = 'on';
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('Forum/getKeywords')}",
|
||||
data:{"keywords":keywords,"flag":flag},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
$("input[name='keywords']").val("");
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
})
|
||||
}
|
||||
|
||||
//预定义颜色项
|
||||
colorpicker.render({
|
||||
elem: '#color'
|
||||
,color: "{$article.title_color ?? '#333'}"
|
||||
,predefine: true // 开启预定义颜色
|
||||
,done: function(color){
|
||||
//譬如你可以在回调中把得到的 color 赋值给表单
|
||||
$('#L_title_color').val(color);
|
||||
//改变标题颜色
|
||||
$('#L_title').css("color", color);
|
||||
}
|
||||
});
|
||||
|
||||
//指定允许上传的文件类型
|
||||
upload.render({
|
||||
elem: '#zip-button'
|
||||
,url: "{:url('forum/uploads')}" //改成您自己的上传接口
|
||||
,data: {type:'zip'}
|
||||
,accept: 'file' //普通文件
|
||||
,done: function(res){
|
||||
if(res.status == 0){
|
||||
$('input[name="upzip"]').val(res.url);
|
||||
layer.msg('上传成功');
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
317
app/admin/view/content/forum/index.html
Normal file
@ -0,0 +1,317 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>用户管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" action="">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">帖子ID</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">发帖人</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="sec">
|
||||
<option value="">选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="5">禁止</option>
|
||||
<option value="6">待审</option>
|
||||
<option value="2">置顶</option>
|
||||
<option value="3">加精</option>
|
||||
<option value="4">禁评</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="forum-query">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
查询
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-md">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="forum-table" lay-filter="forum-table" ></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="forum-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
|
||||
|
||||
<script type="text/html" id="avatarTpl">
|
||||
<div><img style="width: 25px; height: 25px;" src= "{{ d.avatar }}"></div>
|
||||
</script>
|
||||
<script type="text/html" id="forum-istop">
|
||||
<input type="checkbox" name="is_top" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="isTop" {{ d.top == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonHot">
|
||||
<input type="checkbox" name="is_hot" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="isHot" {{ d.hot == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonReply">
|
||||
<input type="checkbox" name="is_reply" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="isReply" {{ d.reply == 0 ? 'checked' : '' }}>
|
||||
</script>
|
||||
<script type="text/html" id="buttonCheck">
|
||||
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-filter="artStatus" lay-text="通过|{{ d.check == 0 ? '待审' : '禁止' }}" {{ d.check == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="forum-table-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
const FORUM_List = "{:url('content.forum/list')}";
|
||||
var forumReplys = "{:url('Forum/replys')}",
|
||||
forumRedel = "{:url('Forum/redel')}",
|
||||
forumReplysform = "{:url('Forum/replysform')}",
|
||||
forumTags = "{:url('Forum/tags')}",
|
||||
forumTagsDelete = "{:url('Forum/tagsdelete')}",
|
||||
forumTagsForm = "{:url('Forum/tagsform')}";
|
||||
var forumList = "{:url('content.forum/list')}";
|
||||
layui.use(['jquery','form', 'table','common'], function(){
|
||||
var $ = layui.jquery
|
||||
,form = layui.form
|
||||
,table = layui.table;
|
||||
let common = layui.common;
|
||||
|
||||
let cols = [
|
||||
[
|
||||
{type: 'checkbox'}
|
||||
,{field: 'id', width: 60, title: 'ID', sort: true}
|
||||
,{field: 'poster', title: '账号',width: 80}
|
||||
,{field: 'avatar', title: '头像', width: 60, templet: '#avatarTpl'}
|
||||
,{field: 'title', title: '标题', minWidth: 180,templet: '<div><a href="{{- d.url }}" target="_blank">{{- d.title }}</a></div>'}
|
||||
,{field: 'content', title: '内容', 'escape':false, minWidth: 200}
|
||||
,{field: 'posttime', title: '时间',width: 120, sort: true}
|
||||
,{field: 'top', title: '置顶', templet: '#forum-istop', width: 80, align: 'center'}
|
||||
,{field: 'hot', title: '加精', templet: '#buttonHot', width: 80, align: 'center'}
|
||||
,{field: 'reply', title: '禁评', templet: '#buttonReply', width: 80, align: 'center'}
|
||||
,{field: 'check', title: '审帖', templet: '#buttonCheck', width: 95, align: 'center'}
|
||||
,{title: '操作', width: 110, align: 'center', toolbar: '#forum-table-bar'}
|
||||
]
|
||||
];
|
||||
|
||||
table.render({
|
||||
elem: '#forum-table',
|
||||
url: FORUM_List,
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line',
|
||||
toolbar: '#forum-toolbar',
|
||||
defaultToolbar: [{
|
||||
title: '刷新',
|
||||
layEvent: 'refresh',
|
||||
icon: 'layui-icon-refresh',
|
||||
}, 'filter', 'print', 'exports']
|
||||
});
|
||||
|
||||
table.on('tool(forum-table)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(forum-table)', function(obj) {
|
||||
if (obj.event === 'add') {
|
||||
window.add();
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh();
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(forum-query)', function(data) {
|
||||
table.reload('forum-table', {
|
||||
where: data.field
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听置顶
|
||||
form.on('switch(isTop)', function(obj){
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value:obj.elem.checked ? 1 : 0},function(res){
|
||||
layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
});
|
||||
|
||||
// 监听加精
|
||||
form.on('switch(isHot)', function(obj){
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value: obj.elem.checked ? 1 : 0},function(res){
|
||||
layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
});
|
||||
|
||||
// 监听回复
|
||||
form.on('switch(isReply)', function(obj){
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value: obj.elem.checked ? 0 : 1},function(res){
|
||||
layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
});
|
||||
});
|
||||
|
||||
// 监听审贴
|
||||
form.on('switch(artStatus)', function(obj){
|
||||
//layer.tips(obj.value + ' ' + obj.elem.name + ':'+ obj.elem.checked, obj.othis);
|
||||
$.post("{:url('content.forum/check')}",{id:obj.value, name:obj.elem.name,value: obj.elem.checked ? 1 : -1},function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{icon:res.icon,time:2000})
|
||||
} else {
|
||||
layer.open({title:'审核失败',content:res.msg,icon:5,adim:6})
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
window.add = function() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: [common.isModile()?'100%':'100%', common.isModile()?'100%':'100%'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['100%', '100%'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
// $(document).on('focusin', function(e) {
|
||||
// if ($(e.target).closest(".tox-tinymce, .tox-tinymce-aux, .moxman-window, .tam-assetmanager-root").length) {
|
||||
// e.stopImmediatePropagation();
|
||||
// }
|
||||
// });
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除该用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('content.forum/delete')}?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
|
||||
var checkIds = common.checkField(obj,'id');
|
||||
|
||||
if (checkIds === "") {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
layer.confirm('确定要删除这些用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('system.admin/delete')}",
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
data:{"id":checkIds},
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('user-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(param) {
|
||||
table.reload('user-table');
|
||||
}
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
61
app/admin/view/content/forum/listform.html
Normal file
@ -0,0 +1,61 @@
|
||||
{extend name="public:base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-list" id="layuiadmin-form-list" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">用户名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="poster" lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">发帖内容</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="content" lay-verify="required" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">置顶</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" lay-filter="switch" lay-verify="required" name="switch" lay-skin="switch" lay-text="ON|OFF">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">头像</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="avatar" placeholder="请上传图片" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
<button style="float: left;" type="button" class="layui-btn" id="layuiadmin-upload-list">上传图片</button>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-app-forum-submit" id="LAY-app-forum-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'upload'], function(){
|
||||
var $ = layui.$
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-list'
|
||||
,url: layui.setter.base + 'json/upload/demo.js'
|
||||
,accept: 'images'
|
||||
,method: 'get'
|
||||
,acceptMime: 'image/*'
|
||||
,done: function(res){
|
||||
$(this.item).prev("div").children("input").val(res.data.src)
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
606
app/admin/view/index/console1.html
Normal file
@ -0,0 +1,606 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>控制后台</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/console1.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div>
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">今日访问</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value1">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 1024 1024" width="200" height="200" t="1591462258798"
|
||||
p-id="942" version="1.1">
|
||||
<path fill="#fcc66f" d="M 262.7 835 c -15.3 0 -28.1 -11.4 -29.8 -26.6 L 174.1 291 c -0.6 -5.1 1 -10.2 4.5 -14 s 8.3 -6 13.4 -6 h 640 c 5.1 0 10 2.2 13.4 6 s 5 8.9 4.5 14 l -58.8 517.4 c -1.7 15.2 -14.5 26.6 -29.8 26.6 H 262.7 Z"
|
||||
p-id="943" />
|
||||
<path fill="#ffd79c" d="M 802 289 l -58.8 517.4 c -0.7 6.1 -5.8 10.6 -11.9 10.6 h 30 c 6.1 0 11.2 -4.6 11.9 -10.6 L 832 289 h -30 Z"
|
||||
p-id="944" />
|
||||
<path fill="#f56e73" d="M 164 307 c -16.5 0 -30 -13.5 -30 -30 v -58 c 0 -16.5 13.5 -30 30 -30 h 696 c 16.5 0 30 13.5 30 30 v 58 c 0 16.5 -13.5 30 -30 30 H 164 Z"
|
||||
p-id="945" />
|
||||
<path fill="#ffa1a8" d="M 860 207 h -30 c 6.6 0 12 5.4 12 12 v 58 c 0 6.6 -5.4 12 -12 12 h 30 c 6.6 0 12 -5.4 12 -12 v -58 c 0 -6.6 -5.4 -12 -12 -12 Z"
|
||||
p-id="946" />
|
||||
<path fill="#65c8ff" d="M 190.9 651.5 c -31.4 0 -56.9 -25.5 -56.9 -56.9 V 219 c 0 -16.5 13.5 -30 30 -30 h 466.2 c 9.9 0 18 8.1 18 18 v 301.1 c 0 34.7 -28.2 62.9 -62.9 62.9 s -62.9 -28.2 -62.9 -62.9 V 393.5 c 0 -23.2 -18.8 -42 -42 -42 s -42 18.8 -42 42 v 68.1 c 0 29.4 -23.9 53.4 -53.4 53.4 s -53.4 -23.9 -53.4 -53.4 v -68.1 c 0 -23.2 -18.8 -42 -42 -42 s -42 18.8 -42 42 v 201.1 c 0.1 31.4 -25.4 56.9 -56.7 56.9 Z"
|
||||
p-id="947" />
|
||||
<path fill="#b3eaff" d="M 277.8 321.5 c -33.1 0 -60 26.9 -60 60 v 201.1 c 0 21.5 -17.4 38.9 -38.9 38.9 c -7.7 0 -14.8 -2.2 -20.8 -6.1 c 6.9 10.9 19 18.1 32.8 18.1 c 21.5 0 38.9 -17.4 38.9 -38.9 V 393.5 c 0 -33.1 26.9 -60 60 -60 c 13.5 0 25.9 4.5 36 12 c -11 -14.5 -28.4 -24 -48 -24 Z M 618.3 207 v 289.1 c 0 24.8 -20.1 44.9 -44.9 44.9 c -9.3 0 -18 -2.8 -25.2 -7.7 c 8.1 11.9 21.7 19.7 37.2 19.7 c 24.8 0 44.9 -20.1 44.9 -44.9 V 207 h -12 Z M 468.5 321.5 c -33.1 0 -60 26.9 -60 60 v 68.1 c 0 19.5 -15.8 35.4 -35.4 35.4 c -6.7 0 -12.9 -1.9 -18.3 -5.1 c 6.2 10.2 17.4 17.1 30.3 17.1 c 19.5 0 35.4 -15.8 35.4 -35.4 v -68.1 c 0 -33.1 26.9 -60 60 -60 c 13.5 0 25.9 4.5 36 12 c -11 -14.5 -28.4 -24 -48 -24 Z"
|
||||
p-id="948" />
|
||||
<path fill="#453b56" d="M 698 729.4 m -18 0 a 18 18 0 1 0 36 0 a 18 18 0 1 0 -36 0 Z" p-id="949" />
|
||||
<path fill="#453b56" d="M 860 171 H 632.5 v 0.1 c -0.7 0 -1.5 -0.1 -2.2 -0.1 H 164 c -26.5 0 -48 21.5 -48 48 v 375.6 c 0 41.3 33.6 74.9 74.9 74.9 c 2.7 0 5.4 -0.2 8.1 -0.5 l 16 141.4 c 2.8 24.3 23.3 42.6 47.7 42.6 h 498.6 c 24.4 0 44.9 -18.3 47.7 -42.6 l 55.2 -485.6 c 24.5 -2.1 43.8 -22.7 43.8 -47.8 v -58 c 0 -26.5 -21.5 -48 -48 -48 Z M 190.9 633.5 c -21.5 0 -38.9 -17.4 -38.9 -38.9 V 219 c 0 -6.6 5.4 -12 12 -12 h 466.3 v 301.1 c 0 24.8 -20.1 44.9 -44.9 44.9 c -24.8 0 -44.9 -20.1 -44.9 -44.9 V 393.5 c 0 -33.1 -26.9 -60 -60 -60 s -60 26.9 -60 60 v 68.1 c 0 19.5 -15.8 35.4 -35.4 35.4 c -19.5 0 -35.4 -15.8 -35.4 -35.4 v -68.1 c 0 -33.1 -26.9 -60 -60 -60 s -60 26.9 -60 60 v 201.1 c 0.1 21.5 -17.4 38.9 -38.8 38.9 Z m 582.3 172.9 c -0.7 6.1 -5.8 10.6 -11.9 10.6 H 262.7 c -6.1 0 -11.2 -4.6 -11.9 -10.6 l -6.7 -59 h 396.6 c 9.9 0 18 -8.1 18 -18 s -8.1 -18 -18 -18 H 240 l -6.3 -55.4 c 19.3 -13.6 32.1 -36 32.1 -61.3 V 393.5 c 0 -13.2 10.8 -24 24 -24 s 24 10.8 24 24 v 68.1 c 0 39.4 32 71.4 71.4 71.4 s 71.4 -32 71.4 -71.4 v -68.1 c 0 -13.2 10.8 -24 24 -24 s 24 10.8 24 24 v 114.6 c 0 44.6 36.3 80.9 80.9 80.9 c 44.6 0 80.9 -36.3 80.9 -80.9 V 325 h 161.7 l -54.9 481.4 Z M 872 277 c 0 6.6 -5.4 12 -12 12 H 666.3 v -82 H 860 c 6.6 0 12 5.4 12 12 v 58 Z"
|
||||
p-id="950" /></svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">提交次数</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value2">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg t="1591462430908" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="3170" width="200" height="200">
|
||||
<path d="M532 784.2c0 24.4-19.8 44.3-44.3 44.3s-44.3-19.8-44.3-44.3c0-24.4 44.3-80.3 44.3-80.3s44.3 55.8 44.3 80.3zM766 784.2c0 24.4 19.8 44.3 44.3 44.3 24.4 0 44.3-19.8 44.3-44.3 0-24.4-44.3-80.3-44.3-80.3S766 759.7 766 784.2z"
|
||||
fill="#97DCFF" p-id="3171"></path>
|
||||
<path d="M123.5 471.3c-9.9 0-18-8.1-18-18v-302c0-9.9 8.1-18 18-18h58c9.9 0 18 8.1 18 18v302c0 9.9-8.1 18-18 18h-58z"
|
||||
fill="#FCC66F" p-id="3172"></path>
|
||||
<path d="M181.5 151.3v302h-58v-302h58m0-36h-58c-19.9 0-36 16.1-36 36v302c0 19.9 16.1 36 36 36h58c19.9 0 36-16.1 36-36v-302c0-19.8-16.1-36-36-36z"
|
||||
fill="#453B56" p-id="3173"></path>
|
||||
<path d="M266.4 210.7m-18 0a18 18 0 1 0 36 0 18 18 0 1 0-36 0Z" fill="#453B56" p-id="3174"></path>
|
||||
<path d="M430.8 641.1c-9.9 0-18-8.1-18-18v-21.6c0-130.3 106-236.3 236.3-236.3s236.3 106 236.3 236.3v21.6c0 9.9-8.1 18-18 18H430.8z"
|
||||
fill="#FCC66F" p-id="3175"></path>
|
||||
<path d="M649 383.2c-5 0-10 0.2-15 0.6 113.5 7.7 203.3 102.2 203.3 217.7v21.6h30v-21.6c0-120.6-97.7-218.3-218.3-218.3z"
|
||||
fill="#FFD79C" p-id="3176"></path>
|
||||
<path d="M419.6 694.4c-22.1 0-40.1-18-40.1-40.1s18-40.1 40.1-40.1h458.8c22.1 0 40.1 18 40.1 40.1s-18 40.1-40.1 40.1H419.6z"
|
||||
fill="#F56E73" p-id="3177"></path>
|
||||
<path d="M878.4 632.3h-30c12.2 0 22.1 9.9 22.1 22.1s-9.9 22.1-22.1 22.1h30c12.2 0 22.1-9.9 22.1-22.1s-9.9-22.1-22.1-22.1z"
|
||||
fill="#FFA1A8" p-id="3178"></path>
|
||||
<path d="M693.3 846.4c0 24.4-19.8 44.3-44.3 44.3-24.4 0-44.3-19.8-44.3-44.3s44.3-80.3 44.3-80.3 44.3 55.9 44.3 80.3z"
|
||||
fill="#97DCFF" p-id="3179"></path>
|
||||
<path d="M649 908.7c-34.3 0-62.3-27.9-62.3-62.3 0-28.5 36.9-77.2 48.1-91.4 3.4-4.3 8.6-6.8 14.1-6.8s10.7 2.5 14.1 6.8c11.3 14.2 48.1 62.9 48.1 91.4 0.2 34.3-27.8 62.3-62.1 62.3z m0-112.3c-14.1 20.4-26.3 41.9-26.3 50 0 14.5 11.8 26.3 26.3 26.3s26.3-11.8 26.3-26.3c0-8.1-12.1-29.6-26.3-50z"
|
||||
fill="#453B56" p-id="3180"></path>
|
||||
<path d="M903.3 601.9v-0.5c0-134.1-104.4-244.3-236.3-253.6v-30.7c0-68.7-55.9-124.6-124.6-124.6H326.5c-9.9 0-18 8.1-18 18s8.1 18 18 18h215.9c48.8 0 88.6 39.7 88.6 88.6v30.7c-131.8 9.3-236.3 119.4-236.3 253.6v0.5c-19.6 9.3-33.2 29.3-33.2 52.4 0 32 26 58.1 58.1 58.1H459c-14.8 21-33.5 51.5-33.5 71.8 0 34.3 27.9 62.3 62.3 62.3 34.3 0 62.2-27.9 62.2-62.3 0-20.3-18.6-50.7-33.5-71.8h264.9c-14.8 21-33.5 51.5-33.5 71.8 0 34.3 27.9 62.3 62.3 62.3 34.3 0 62.3-27.9 62.3-62.3 0-20.3-18.6-50.7-33.5-71.8h39.4c32 0 58.1-26 58.1-58.1 0-23.1-13.6-43-33.2-52.4zM487.8 810.4c-14.5 0-26.3-11.8-26.3-26.3 0-8.1 12.1-29.6 26.3-50 14.1 20.4 26.2 41.9 26.2 50 0 14.5-11.8 26.3-26.2 26.3z m322.5 0c-14.5 0-26.3-11.8-26.3-26.3 0-8.1 12.1-29.6 26.3-50 14.1 20.4 26.3 41.9 26.3 50-0.1 14.5-11.9 26.3-26.3 26.3zM649 383.2c118.8 0 215.4 94.9 218.1 213.1H430.9c2.8-118.1 99.3-213.1 218.1-213.1z m251.5 271.1c0 12.2-9.9 22.1-22.1 22.1H419.6c-12.2 0-22.1-9.9-22.1-22.1 0-12.2 9.9-22.1 22.1-22.1h458.8c12.2 0.1 22.1 10 22.1 22.1z"
|
||||
fill="#453B56" p-id="3181"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">下载数量</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value3">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg t="1591462464512" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="3311" width="200" height="200">
|
||||
<path d="M750.4 216.5h-130v-15.3c0-32.9-26.8-59.7-59.7-59.7h-97.3c-32.9 0-59.7 26.8-59.7 59.7v15.3h-130c-30.7 0-55.6 25-55.6 55.6v72.4c0 9.9 8.1 18 18 18h31.5v478c0 23.2 18.8 42 42 42h405c23.2 0 42-18.8 42-42v-478H788c9.9 0 18-8.1 18-18v-72.4c0-30.6-25-55.6-55.6-55.6z"
|
||||
fill="#FCC66F" p-id="3312"></path>
|
||||
<path d="M708.5 344.5v496c0 13.3-10.7 24-24 24h30c13.3 0 24-10.7 24-24v-496h-30z" fill="#FFD79C" p-id="3313"></path>
|
||||
<path d="M309.5 882.5c-23.2 0-42-18.8-42-42V596c0-9.9 8.1-18 18-18h36.8c30.2 0 54.8 24.6 54.8 54.8v231.7c0 9.9-8.1 18-18 18h-49.6zM664.9 882.5c-9.9 0-18-8.1-18-18V632.8c0-30.2 24.6-54.8 54.8-54.8h36.8c9.9 0 18 8.1 18 18v244.5c0 23.2-18.8 42-42 42h-49.6z"
|
||||
fill="#F56E73" p-id="3314"></path>
|
||||
<path d="M708.5 596v244.5c0 13.3-10.7 24-24 24h30c13.3 0 24-10.7 24-24V596h-30z" fill="#FFA1A8" p-id="3315"></path>
|
||||
<path d="M475.2 882.5c-9.9 0-18-8.1-18-18V632.8c0-30.2 24.6-54.8 54.8-54.8 30.2 0 54.8 24.6 54.8 54.8v231.7c0 9.9-8.1 18-18 18h-73.6z"
|
||||
fill="#F56E73" p-id="3316"></path>
|
||||
<path d="M560.7 159.5h-18c23 0 41.7 18.7 41.7 41.7V221h18v-19.8c-0.1-23-18.7-41.7-41.7-41.7zM750.4 234.5h-30c20.8 0 37.6 16.8 37.6 37.6v72.4h30v-72.4c0-20.8-16.8-37.6-37.6-37.6z"
|
||||
fill="#FFD79C" p-id="3317"></path>
|
||||
<path d="M750.4 198.5H638.2c-1.4-41.6-35.6-75-77.5-75h-97.3c-41.9 0-76.1 33.4-77.5 75H273.6c-40.6 0-73.6 33-73.6 73.6v72.4c0 19.9 16.1 36 36 36h13.5v460c0 33.1 26.9 60 60 60H714.7c33.1 0 60-26.9 60-60v-460H788c19.9 0 36-16.1 36-36v-72.4c0-40.6-33-73.6-73.6-73.6z m-287.1-39h97.3c22.1 0 40.2 17.2 41.5 39H421.8c1.4-21.8 19.4-39 41.5-39z m-104.2 705h-49.6c-13.3 0-24-10.7-24-24V596h36.8c20.3 0 36.8 16.5 36.8 36.8v231.7z m189.7 0h-73.6V632.8c0-20.3 16.5-36.8 36.8-36.8 20.3 0 36.8 16.5 36.8 36.8v231.7z m189.7-24c0 13.3-10.7 24-24 24h-49.6V632.8c0-20.3 16.5-36.8 36.8-36.8h36.8v244.5z m0-280.5h-36.8c-40.1 0-72.8 32.6-72.8 72.8v231.7h-44.2V632.8c0-40.1-32.6-72.8-72.8-72.8-40.1 0-72.8 32.6-72.8 72.8v231.7h-44.2V632.8c0-40.1-32.6-72.8-72.8-72.8h-36.8v-74.5h279c9.9 0 18-8.1 18-18s-8.1-18-18-18h-279v-69h453V560zM788 344.5H236v-72.4c0-20.8 16.8-37.6 37.6-37.6h476.8c20.8 0 37.6 16.8 37.6 37.6v72.4z"
|
||||
fill="#453B56" p-id="3318"></path>
|
||||
<path d="M621.8 467.5m-18 0a18 18 0 1 0 36 0 18 18 0 1 0-36 0Z" fill="#453B56" p-id="3319"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs6 layui-col-md3">
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header">流量统计</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5">
|
||||
<div class="layui-col-xs8 layui-col-md8 top-panel-number" style="color: #28333E;" id="value4">
|
||||
0
|
||||
</div>
|
||||
<div class="layui-col-xs4 layui-col-md4 top-panel-tips">
|
||||
<svg t="1591462491887" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="3449" width="200" height="200">
|
||||
<path d="M363.2 807c-9.9 0-18-8.1-18-18v-75.5c0-9.9 8.1-18 18-18h108.5c9.9 0 18 8.1 18 18V789c0 9.9-8.1 18-18 18H363.2z"
|
||||
fill="#F56E73" p-id="3450"></path>
|
||||
<path d="M441.7 713.5h30V789h-30z" fill="#FFA1A8" p-id="3451"></path>
|
||||
<path d="M259.6 398c-9.9 0-18-8.1-18-18V178.6c0-23.8 19.3-43.1 43.1-43.1s43.1 19.3 43.1 43.1V380c0 9.9-8.1 18-18 18h-50.2zM525.1 398c-9.9 0-18-8.1-18-18V178.6c0-23.8 19.3-43.1 43.1-43.1s43.1 19.3 43.1 43.1V380c0 9.9-8.1 18-18 18h-50.2z"
|
||||
fill="#65C8FF" p-id="3452"></path>
|
||||
<path d="M550.2 153.5c-3.2 0-6.2 0.7-9 1.7 9.4 3.6 16.1 12.7 16.1 23.4V380h18V178.6c0.1-13.9-11.2-25.1-25.1-25.1z"
|
||||
fill="#97DCFF" p-id="3453"></path>
|
||||
<path d="M686 330.5H149c-9.9 0-18 8.1-18 18v63c0 9.9 8.1 18 18 18h33.2l45 225c8.7 43.4 47.1 75 91.4 75h197.6c44.3 0 82.7-31.5 91.4-75l45-225H686c9.9 0 18-8.1 18-18v-63c0-9.9-8.1-18-18-18z"
|
||||
fill="#FCC66F" p-id="3454"></path>
|
||||
<path d="M608 411.5L560.1 651c-7 35.2-37.9 60.5-73.8 60.5h30c35.9 0 66.7-25.3 73.8-60.5L638 411.5h-30zM656 348.5h30v63h-30z"
|
||||
fill="#FFD79C" p-id="3455"></path>
|
||||
<path d="M474.2 543.5m-18 0a18 18 0 1 0 36 0 18 18 0 1 0-36 0Z" fill="#453B56" p-id="3456"></path>
|
||||
<path d="M416.9 525.5h-125c-9.9 0-18 8.1-18 18s8.1 18 18 18h125c9.9 0 18-8.1 18-18s-8.1-18-18-18zM893 543.5h-33.4c-65.2 0-118.2 53-118.2 118.2v19.6c0 9.9 8.1 18 18 18s18-8.1 18-18v-19.6c0-45.3 36.9-82.2 82.2-82.2H893c9.9 0 18-8.1 18-18s-8-18-18-18zM772.2 744.2c7-7 7-18.4 0-25.5-7-7-18.4-7-25.5 0s-7 18.4 0 25.5 18.4 7.1 25.5 0z"
|
||||
fill="#453B56" p-id="3457"></path>
|
||||
<path d="M759.5 761.6c-9.9 0-18 8.1-18 18v11.6c0 43.7-35.6 79.3-79.3 79.3H487.3c-26.4 0-48.3-19.9-51.4-45.5h35.8c19.9 0 36-16.1 36-36v-41.5h8.6c52.8 0 98.7-37.6 109.1-89.4l42.1-210.6H686c19.9 0 36-16.1 36-36v-63c0-19.9-16.1-36-36-36h-74.6V178.6c0-33.7-27.4-61.1-61.1-61.1s-61.1 27.4-61.1 61.1v133.9H345.9V178.6c0-33.7-27.4-61.1-61.1-61.1s-61.1 27.4-61.1 61.1v133.9H149c-19.9 0-36 16.1-36 36v63c0 19.9 16.1 36 36 36h18.5l42.1 210.6c10.4 51.8 56.2 89.4 109.1 89.4h8.6V789c0 19.9 16.1 36 36 36h36.6c3.3 45.5 41.2 81.5 87.5 81.5h174.8c63.6 0 115.3-51.7 115.3-115.3v-11.6c0-10-8.1-18-18-18z m-234.4-583c0-13.9 11.2-25.1 25.1-25.1s25.1 11.2 25.1 25.1v133.9H525V178.6z m-265.5 0c0-13.9 11.2-25.1 25.1-25.1s25.1 11.2 25.1 25.1v133.9h-50.3V178.6zM149 411.5v-63h537v63H149z m169.7 300c-35.9 0-66.7-25.3-73.8-60.5l-40.7-203.5h426.6L590.1 651c-7 35.2-37.9 60.5-73.8 60.5H318.7z m44.5 77.5v-41.5h108.5V789H363.2z"
|
||||
fill="#453B56" p-id="3458"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md9">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-tab custom-tab layui-tab-brief" lay-filter="docDemoTabBrief">
|
||||
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;padding: 10px"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
|
||||
<div class="layui-tab layui-tab-brief layadmin-latestData">
|
||||
<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">
|
||||
<table id="console-news" lay-filter="console-news"></table>
|
||||
</div>
|
||||
<div class="layui-tab-item layui-form-text">
|
||||
<div class="layui-form layui-form-pane">
|
||||
<div class="layui-row layui-col-space12 layui-form-item" >
|
||||
<div class="layui-col-md5">
|
||||
<label class="layui-form-label">发送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="type" lay-verify="required" lay-filter="type">
|
||||
<option value="1">问题资讯</option>
|
||||
<option value="2">提交BUG</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md7">
|
||||
<label for="L_title" class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" id="L_title" name="title" required lay-verify="required" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<div class="layui-input-block">
|
||||
<textarea id="L_content" name="content" required lay-verify="content" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="post" lay-verify="required" autocomplete="off" class="layui-input layui-hide" value="{$insurl}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button type="submit" class="layui-btn " lay-filter="cunsult-add" lay-submit id="cunsult-add">立即发布</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<table id="LAY-index-topreply" lay-filter="LAY-index-topreply"></table>
|
||||
<script type="text/html" id="tao-reply">
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table id="console-topSearch"></table>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table id="console-topCard"></table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">版本信息</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<div class="layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">系统调试:</label>
|
||||
<div class="layui-input-inline" style="width: 60px;">
|
||||
<input type="checkbox" name="sys-sys" lay-skin="switch" lay-text="开启|关闭" lay-filter="sys-sys" {if env('APP_DEBUG') == true} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="layui-table">
|
||||
<colgroup>
|
||||
<col style="width:70px;">
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>系统</td>
|
||||
<td>
|
||||
<?php echo php_uname('s'); ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>版本</td>
|
||||
<td>
|
||||
TaoLer_{:config('taoler.version')}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>日志</td>
|
||||
<td>
|
||||
<a href="https://www.aieok.com/article/doc/timeline.html" target="_blank">更新日志</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>框架</td>
|
||||
<td>
|
||||
Thinkphp_{:think\\App::VERSION}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PHP</td>
|
||||
<td>
|
||||
PHP_{$Think.PHP_VERSION}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>UI</td>
|
||||
<td> Layui 2.8.5
|
||||
<script type="text/html" template>
|
||||
Layui-v {{ layui.v }}
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>运行</td>
|
||||
<td>
|
||||
{$runTime}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>授权</td>
|
||||
<td>
|
||||
<span id="cy">{$syscy}</span>
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" id="check">
|
||||
<i class="layui-icon layui-icon-refresh-1"></i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
链接
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<a target="_blank" href="https://www.aieok.com" class="pear-btn pear-btn-primary layui-btn-fluid" style="margin-top: 8px;height: 50px;line-height: 50px;">官 网</a>
|
||||
<br />
|
||||
<a target="_blank" href="https://gitee.com/toogee/TaoLer" class="pear-btn pear-btn-warming layui-btn-fluid"
|
||||
style="margin-top: 8px;height: 50px;line-height: 50px;">下 载</a>
|
||||
<br />
|
||||
<a target="_blank" href="https://www.aieok.com/article" class="pear-btn pear-btn-danger layui-btn-fluid"
|
||||
style="margin-top: 8px;height: 50px;line-height: 50px;">交 流</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
寄语
|
||||
</div>
|
||||
<div class="layui-card-body" style="line-height:40px;">
|
||||
不是最好,只会越来越好!高效迅速、专注其道,简洁简单,功能专一,又具有更多的应用功能。
|
||||
<br>不管是自用、商用,还是学习,都可让您轻松愉快的使用。
|
||||
<br>作者尽最大热情,持续迭代更新维护,做到项目长期可用,不放弃不遗忘。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--</div>-->
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
const indexForums = "{:url('Index/forums')}"; //帖子
|
||||
const indexReplys = "{:url('Index/replys')}"; //回复
|
||||
const NEWS = "{:url('index/news')}"; //动态
|
||||
const indexReply = "{:url('Index/reply')}"; //反馈
|
||||
|
||||
layui.use(['form','layer', 'echarts', 'element', 'count','toast'], function() {
|
||||
let $ = layui.jquery, form = layui.form,
|
||||
layer = layui.layer,
|
||||
element = layui.element,
|
||||
count = layui.count,
|
||||
echarts = layui.echarts;
|
||||
let toast = layui.toast;
|
||||
let table = layui.table;
|
||||
|
||||
count.up("value1", {
|
||||
time: 4000,
|
||||
num: 440.34,
|
||||
bit: 2,
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
count.up("value2", {
|
||||
time: 4000,
|
||||
num: 236.30,
|
||||
bit: 2,
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
count.up("value3", {
|
||||
time: 4000,
|
||||
num: 634.43,
|
||||
bit: 2,
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
count.up("value4", {
|
||||
time: 4000,
|
||||
bit: 2,
|
||||
num: 373.23,
|
||||
regulator: 50
|
||||
})
|
||||
|
||||
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
|
||||
|
||||
const colorList = ["#9E87FF", '#73DDFF', '#fe9a8b', '#F56948', '#9E87FF']
|
||||
var option = {
|
||||
backgroundColor: '#fff',
|
||||
tooltip: {
|
||||
show: false
|
||||
},
|
||||
grid: {
|
||||
top: '10%',
|
||||
bottom: '6%',
|
||||
left: '6%',
|
||||
right: '6%',
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: [{
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
margin: 10,
|
||||
//textStyle: {
|
||||
fontSize: 14,
|
||||
color: 'rgba(#999)'
|
||||
//}
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#939ab6',
|
||||
opacity: .15
|
||||
}
|
||||
},
|
||||
data: ['10:00', '10:10', '10:10', '10:30', '10:40', '10:50']
|
||||
}, ],
|
||||
yAxis: [{
|
||||
type: 'value',
|
||||
offset: 15,
|
||||
max: 100,
|
||||
min: 0,
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
margin: 10,
|
||||
//textStyle: {
|
||||
fontSize: 14,
|
||||
color: '#999'
|
||||
//}
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
}
|
||||
|
||||
}],
|
||||
series: [{
|
||||
name: '2',
|
||||
type: 'line',
|
||||
z: 3,
|
||||
showSymbol: false,
|
||||
smoothMonotone: 'x',
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [{
|
||||
offset: 0,
|
||||
color: 'rgba(59,102,246)' // 0% 处的颜色
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(118,237,252)' // 100% 处的颜色
|
||||
}]
|
||||
},
|
||||
shadowBlur: 4,
|
||||
shadowColor: 'rgba(69,126,247,.2)',
|
||||
shadowOffsetY: 4
|
||||
},
|
||||
areaStyle: {
|
||||
//normal: {
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [{
|
||||
offset: 0,
|
||||
color: 'rgba(227,233,250,.9)' // 0% 处的颜色
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(248,251,252,.3)' // 100% 处的颜色
|
||||
}]
|
||||
}
|
||||
//}
|
||||
},
|
||||
smooth: true,
|
||||
data: [20, 56, 17, 40, 68, 42]
|
||||
}, {
|
||||
name: '1',
|
||||
type: 'line',
|
||||
showSymbol: false,
|
||||
smoothMonotone: 'x',
|
||||
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||||
offset: 0,
|
||||
color: 'rgba(255,84,108)'
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(252,140,118)'
|
||||
}], false),
|
||||
shadowBlur: 4,
|
||||
shadowColor: 'rgba(253,121,128,.2)',
|
||||
shadowOffsetY: 4
|
||||
},
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||||
offset: 0,
|
||||
color: 'rgba(255,84,108,.15)'
|
||||
}, {
|
||||
offset: 1,
|
||||
color: 'rgba(252,140,118,0)'
|
||||
}], false),
|
||||
},
|
||||
smooth: true,
|
||||
data: [20, 71, 8, 50, 57, 32]
|
||||
}, ]
|
||||
|
||||
};
|
||||
echartsRecords.setOption(option);
|
||||
|
||||
window.onresize = function() {
|
||||
echartsRecords.resize();
|
||||
}
|
||||
|
||||
//动态news
|
||||
table.render({
|
||||
elem: '#console-news'
|
||||
,url: NEWS //接口
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'name', title: '发帖者', width: 100,}
|
||||
,{field: 'title', title: '标题', minWidth: 300, templet: '<div><a href="{{d.id}}" target="_blank" class="layui-table-link">{{ d.title }}</div>'}
|
||||
,{field: 'time', title: '时间', sort: true}
|
||||
,{field: 'catename', title: '类别'}
|
||||
]]
|
||||
,page: true
|
||||
,limit: 10
|
||||
,limits: [10, 15, 20, 25, 30]
|
||||
,text: '对不起,加载出现异常!'
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
//反馈
|
||||
table.render({
|
||||
elem: '#console-topreply'
|
||||
,url: indexReply //评论接口
|
||||
,page: true
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'time', title: '时间', width: 120}
|
||||
,{field: 'content', title: '内容', minWidth: 300}
|
||||
,{field: '操作', width: 80, align: 'center', fixed: 'right', toolbar: '#tao-reply'}
|
||||
|
||||
]]
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
//本周发贴
|
||||
table.render({
|
||||
elem: '#console-topSearch'
|
||||
,url: indexForums //发贴接口
|
||||
,page: true
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'title', title: '标题', minWidth: 300, templet: '<div><a href="{{d.id}}" target="_blank" class="layui-table-link">{{ d.title }}</div>'}
|
||||
,{field: 'name', title: '发帖者'}
|
||||
,{field: 'catename', title: '类别'}
|
||||
,{field: 'pv', title: '点击率', sort: true}
|
||||
]]
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
//本周评论
|
||||
table.render({
|
||||
elem: '#console-topCard'
|
||||
,url: indexReplys //评论接口
|
||||
,page: true
|
||||
,cellMinWidth: 120
|
||||
,cols: [[
|
||||
{type: 'numbers', fixed: 'left'}
|
||||
,{field: 'content', title: '评论', minWidth: 300}
|
||||
,{field: 'title', title: '帖子', minWidth: 200, templet: '<div><a href="{{d.cid}}" target="_blank" class="layui-table-link">{{ d.title }}</div>'}
|
||||
,{field: 'name', title: '评论者'}
|
||||
|
||||
]]
|
||||
,skin: 'line'
|
||||
});
|
||||
|
||||
// 系统调试
|
||||
form.on('switch(sys-sys)',function(data){
|
||||
var status = data.elem.checked;
|
||||
$.post("{:url('index/sysSys')}",{status:status},function(res){
|
||||
if (res.code == 0) { toast.info({title:"通知消息",message:res.msg})} else {
|
||||
toast.error({title:"错误消息",message:res.msg});
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
//系统检测
|
||||
$("#check").click(function (){
|
||||
$.get("{:url('index/check')}", function (res){
|
||||
if(res.code === 0) {
|
||||
toast.info({title:"提示消息",message:res.msg});
|
||||
$("#cy").html(res.data.info);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
530
app/admin/view/index/console2.html
Normal file
@ -0,0 +1,530 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>数据分析</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/console2.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md8">
|
||||
<div class="layui-row layui-col-space10">
|
||||
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-voice"></i><a id="up_version" lay-href="{:url('system.upgrade/index')}"></a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
快捷菜单
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home1" data-title="主页"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-home"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">主页</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home2" data-title="弹层"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-camera"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">弹层</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home2" data-title="聊天"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-star"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">聊天</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home3" data-title="相机"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-camera"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">相机</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home4" data-title="表单"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-console"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">表单</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home5" data-title="安全"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-auz"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">安全</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home6" data-title="公告"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-cart"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">公告</span>
|
||||
</div>
|
||||
<div class="layui-col-md3 layui-col-sm3 layui-col-xs3">
|
||||
<div class="pear-card" data-id="home7" data-title="更多"
|
||||
data-url="http://www.baidu.com">
|
||||
<i class="layui-icon layui-icon-app"></i>
|
||||
</div>
|
||||
<span class="pear-card-title">更多</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
代办任务
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审评论</div>
|
||||
<div class="count pear-text">{$pendComms}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审帖子</div>
|
||||
<div class="count pear-text">{$pendForums}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审文章</div>
|
||||
<div class="count pear-text">14</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
|
||||
<div class="pear-card2">
|
||||
<div class="title">待审用户</div>
|
||||
<div class="count pear-text">{$pendUser}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-tab custom-tab layui-tab-brief" lay-filter="docDemoTabBrief">
|
||||
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
使用记录
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<table id="role-table" lay-filter="role-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md4">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">留言板</div>
|
||||
<div class="layui-card-body">
|
||||
<ul class="pear-card-status">
|
||||
<li>
|
||||
<p>要不要作为我的家人,搬来我家。</p>
|
||||
<span>12月25日 19:92</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>快乐的时候不敢尽兴,频繁警戒自己保持清醒。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>夏天真的来了,尽管它还有些犹豫。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>看似不可达到的高度,只要坚持不懈就可能到达。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>当浑浊变成了一种常态,那么清白就成了一种罪过。</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>那是一种内在的东西,他们到达不了,也无法触及!</p>
|
||||
<span>5月12日 01:25</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
</li>
|
||||
<li>
|
||||
<p>希望是一个好东西,也许是最好的,好东西是不会消亡的!</p>
|
||||
<span>6月11日 15:33</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>一切都在不可避免的走向庸俗。</p>
|
||||
<span>2月09日 13:40</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>路上没有灯火的时候,就点亮自己的头颅。</p>
|
||||
<span>3月11日 12:30</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<p>我们应该不虚度一生,应该能够说:"我已经做了我能做的事。"</p>
|
||||
<span>4月30日 22:43</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
</li>
|
||||
<li>
|
||||
<p>接近,是我对一切的态度,是我对一切态度的距离</p>
|
||||
<span>6月11日 15:33</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
<li>
|
||||
<p>没有锚的船当然也可以航行,只是紧张充满你的一生。</p>
|
||||
<span>2月09日 13:40</span>
|
||||
<a href="javascript:;" data-id="1"
|
||||
class="pear-btn pear-btn-primary pear-btn-xs pear-reply">回复</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--</div>-->
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['layer', 'echarts', 'carousel', 'element', 'table'], function() {
|
||||
var $ = layui.jquery,
|
||||
layer = layui.layer,
|
||||
element = layui.element,
|
||||
echarts = layui.echarts,
|
||||
table = layui.table,
|
||||
carousel = layui.carousel;
|
||||
|
||||
let cols = [
|
||||
[{
|
||||
type: 'checkbox'
|
||||
},
|
||||
{
|
||||
title: '角色名',
|
||||
field: 'roleName',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
title: 'Key值',
|
||||
field: 'roleCode',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '描述',
|
||||
field: 'details',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '是否可用',
|
||||
field: 'enable',
|
||||
align: 'center',
|
||||
templet: '#role-enable'
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
table.render({
|
||||
elem: '#role-table',
|
||||
url: '/static/admin/data/role.json',
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line'
|
||||
});
|
||||
|
||||
|
||||
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
|
||||
|
||||
$("body").on("click", "[data-url]", function() {
|
||||
parent.layui.tab.addTabOnlyByElem("content", {
|
||||
id: $(this).attr("data-id"),
|
||||
title: $(this).attr("data-title"),
|
||||
url: $(this).attr("data-url"),
|
||||
close: true
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
let bgColor = "#fff";
|
||||
let color = [
|
||||
"#0090FF",
|
||||
"#36CE9E",
|
||||
"#FFC005",
|
||||
"#FF515A",
|
||||
"#8B5CFF",
|
||||
"#00CA69"
|
||||
];
|
||||
let echartData = [{
|
||||
name: "1",
|
||||
value1: 100,
|
||||
value2: 233
|
||||
},
|
||||
{
|
||||
name: "2",
|
||||
value1: 138,
|
||||
value2: 233
|
||||
},
|
||||
{
|
||||
name: "3",
|
||||
value1: 350,
|
||||
value2: 200
|
||||
},
|
||||
{
|
||||
name: "4",
|
||||
value1: 173,
|
||||
value2: 180
|
||||
},
|
||||
{
|
||||
name: "5",
|
||||
value1: 180,
|
||||
value2: 199
|
||||
},
|
||||
{
|
||||
name: "6",
|
||||
value1: 150,
|
||||
value2: 233
|
||||
},
|
||||
{
|
||||
name: "7",
|
||||
value1: 180,
|
||||
value2: 210
|
||||
},
|
||||
{
|
||||
name: "8",
|
||||
value1: 230,
|
||||
value2: 180
|
||||
}
|
||||
];
|
||||
|
||||
let xAxisData = echartData.map(v => v.name);
|
||||
// ["1", "2", "3", "4", "5", "6", "7", "8"]
|
||||
let yAxisData1 = echartData.map(v => v.value1);
|
||||
// [100, 138, 350, 173, 180, 150, 180, 230]
|
||||
let yAxisData2 = echartData.map(v => v.value2);
|
||||
// [233, 233, 200, 180, 199, 233, 210, 180]
|
||||
const hexToRgba = (hex, opacity) => {
|
||||
let rgbaColor = "";
|
||||
let reg = /^#[\da-f]{6}$/i;
|
||||
if (reg.test(hex)) {
|
||||
rgbaColor =
|
||||
`rgba(${parseInt("0x" + hex.slice(1, 3))},${parseInt(
|
||||
"0x" + hex.slice(3, 5)
|
||||
)},${parseInt("0x" + hex.slice(5, 7))},${opacity})`;
|
||||
}
|
||||
return rgbaColor;
|
||||
}
|
||||
|
||||
option = {
|
||||
backgroundColor: bgColor,
|
||||
color: color,
|
||||
legend: {
|
||||
right: 10,
|
||||
top: 10
|
||||
},
|
||||
tooltip: {
|
||||
trigger: "axis",
|
||||
formatter: function(params) {
|
||||
let html = '';
|
||||
params.forEach(v => {
|
||||
html +=
|
||||
`<div style="color: #666;font-size: 14px;line-height: 24px">
|
||||
<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${color[v.componentIndex]};"></span>
|
||||
${v.seriesName}.${v.name}
|
||||
<span style="color:${color[v.componentIndex]};font-weight:700;font-size: 18px">${v.value}</span>
|
||||
万元`;
|
||||
})
|
||||
return html
|
||||
},
|
||||
extraCssText: 'background: #fff; border-radius: 0;box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);color: #333;',
|
||||
axisPointer: {
|
||||
type: 'shadow',
|
||||
shadowStyle: {
|
||||
color: '#ffffff',
|
||||
shadowColor: 'rgba(225,225,225,1)',
|
||||
shadowBlur: 5
|
||||
}
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
top: 100,
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: [{
|
||||
type: "category",
|
||||
boundaryGap: false,
|
||||
axisLabel: {
|
||||
formatter: '{value}月',
|
||||
textStyle: {
|
||||
color: "#333"
|
||||
}
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#D9D9D9"
|
||||
}
|
||||
},
|
||||
data: xAxisData
|
||||
}],
|
||||
yAxis: [{
|
||||
type: "value",
|
||||
name: '单位:万千瓦时',
|
||||
axisLabel: {
|
||||
textStyle: {
|
||||
color: "#666"
|
||||
}
|
||||
},
|
||||
nameTextStyle: {
|
||||
color: "#666",
|
||||
fontSize: 12,
|
||||
lineHeight: 40
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
type: "dashed",
|
||||
color: "#E9E9E9"
|
||||
}
|
||||
},
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
}],
|
||||
series: [{
|
||||
name: "2018",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbolSize: 8,
|
||||
zlevel: 3,
|
||||
lineStyle: {
|
||||
normal: {
|
||||
color: color[0],
|
||||
shadowBlur: 3,
|
||||
shadowColor: hexToRgba(color[0], 0.5),
|
||||
shadowOffsetY: 8
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
[{
|
||||
offset: 0,
|
||||
color: hexToRgba(color[0], 0.3)
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: hexToRgba(color[0], 0.1)
|
||||
}
|
||||
],
|
||||
false
|
||||
),
|
||||
shadowColor: hexToRgba(color[0], 0.1),
|
||||
shadowBlur: 10
|
||||
}
|
||||
},
|
||||
data: yAxisData1
|
||||
}, {
|
||||
name: "2019",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbolSize: 8,
|
||||
zlevel: 3,
|
||||
lineStyle: {
|
||||
normal: {
|
||||
color: color[1],
|
||||
shadowBlur: 3,
|
||||
shadowColor: hexToRgba(color[1], 0.5),
|
||||
shadowOffsetY: 8
|
||||
}
|
||||
},
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
[{
|
||||
offset: 0,
|
||||
color: hexToRgba(color[1], 0.3)
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: hexToRgba(color[1], 0.1)
|
||||
}
|
||||
],
|
||||
false
|
||||
),
|
||||
shadowColor: hexToRgba(color[1], 0.1),
|
||||
shadowBlur: 10
|
||||
}
|
||||
},
|
||||
data: yAxisData2
|
||||
}]
|
||||
};
|
||||
|
||||
echartsRecords.setOption(option);
|
||||
|
||||
window.onresize = function() {
|
||||
echartsRecords.resize();
|
||||
};
|
||||
|
||||
//加载版本检测
|
||||
(function(){
|
||||
$.get("{:url('Index/checkVersion')}",function(data){
|
||||
$('#up_version').html(data);
|
||||
})
|
||||
})();
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -1,50 +1,150 @@
|
||||
{extend name="public:base" /}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>TaoLer Admin管理系统</title>
|
||||
<!-- 依 赖 样 式 -->
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<!-- 加 载 样 式 -->
|
||||
<link rel="stylesheet" href="/static/admin/css/loader.css" />
|
||||
<!-- 布 局 样 式 -->
|
||||
<link rel="stylesheet" href="/static/admin/css/admin.css" />
|
||||
</head>
|
||||
<!-- 结 构 代 码 -->
|
||||
<body class="layui-layout-body pear-admin">
|
||||
<!-- 布 局 框 架 -->
|
||||
<div class="layui-layout layui-layout-admin">
|
||||
<!-- 顶 部 样 式 -->
|
||||
<div class="layui-header">
|
||||
<!-- 菜 单 顶 部 -->
|
||||
<div class="layui-logo">
|
||||
<!-- 图 标 -->
|
||||
<img class="logo">
|
||||
<!-- 标 题 -->
|
||||
<span class="title"></span>
|
||||
</div>
|
||||
<!-- 顶 部 左 侧 功 能 -->
|
||||
<ul class="layui-nav layui-layout-left">
|
||||
<li class="collapse layui-nav-item"><a href="#" class="layui-icon layui-icon-shrink-right"></a></li>
|
||||
<li class="refresh layui-nav-item"><a href="#" class="layui-icon layui-icon-refresh-1" loading = 600></a></li>
|
||||
</ul>
|
||||
<!-- 多 系 统 菜 单 -->
|
||||
<div id="control" class="layui-layout-control"></div>
|
||||
<!-- 顶 部 右 侧 菜 单 -->
|
||||
<ul class="layui-nav layui-layout-right">
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="#" class="menuSearch layui-icon layui-icon-search"></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="#" class="fullScreen layui-icon layui-icon-screen-full"></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="{$domain}" class="layui-icon layui-icon-website" target="_blank"></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs"><a href="javascript:void(0);" layadmin-event="clearcache" id="clearcache"><i class="layui-icon layui-icon-fonts-clear"></i></a></li>
|
||||
<li class="layui-nav-item layui-hide-xs message"></li>
|
||||
<li class="layui-nav-item user">
|
||||
<!-- 头 像 -->
|
||||
<a class="layui-icon layui-icon-username" href="javascript:;"></a>
|
||||
<!-- 功 能 菜 单 -->
|
||||
<dl class="layui-nav-child">
|
||||
<dd><a user-menu-url="{:url('system.admin/info')}" user-menu-id="5555" user-menu-title="基本资料">基本资料</a></dd>
|
||||
<dd><a href="javascript:void(0);" id="resetPassword">修改密码</a></dd>
|
||||
<dd><a href="javascript:void(0);" class="logout">注销登录</a></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- 主 题 配 置 -->
|
||||
<li class="layui-nav-item setting"><a href="#" class="layui-icon layui-icon-more-vertical"></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- 侧 边 区 域 -->
|
||||
<div class="layui-side layui-bg-black">
|
||||
<!-- 菜 单 顶 部 -->
|
||||
<div class="layui-logo">
|
||||
<!-- 图 标 -->
|
||||
<img class="logo">
|
||||
<!-- 标 题 -->
|
||||
<span class="title"></span>
|
||||
</div>
|
||||
<!-- 菜 单 内 容 -->
|
||||
<div class="layui-side-scroll">
|
||||
<div id="sideMenu"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 视 图 页 面 -->
|
||||
<div class="layui-body">
|
||||
<!-- 内 容 页 面 -->
|
||||
<div id="content"></div>
|
||||
</div>
|
||||
<!-- 页脚 -->
|
||||
<div class="layui-footer layui-text">
|
||||
<span class="left">
|
||||
作者qq: 317927823 官方qq群:863422399
|
||||
</span>
|
||||
<span class="center"></span>
|
||||
<span class="right">
|
||||
Copyright © 2020-2023 aieok.com
|
||||
</span>
|
||||
</div>
|
||||
<!-- 遮 盖 层 -->
|
||||
<div class="pear-cover"></div>
|
||||
<!-- 加 载 动 画 -->
|
||||
<div class="loader-main">
|
||||
<!-- 动 画 对 象 -->
|
||||
<div class="loader"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 移 动 端 便 捷 操 作 -->
|
||||
<div class="pear-collapsed-pe collapse">
|
||||
<a href="#" class="layui-icon layui-icon-shrink-right"></a>
|
||||
</div>
|
||||
<!-- 依 赖 脚 本 -->
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<!-- 框 架 初 始 化 -->
|
||||
<script>
|
||||
layui.use(['admin','jquery','popup','drawer'], function() {
|
||||
var $ = layui.jquery;
|
||||
var admin = layui.admin;
|
||||
var popup = layui.popup;
|
||||
|
||||
admin.setConfigType("yml");
|
||||
admin.setConfigPath("/static/config/pear.config.yml");
|
||||
|
||||
admin.render();
|
||||
|
||||
// 登出逻辑
|
||||
admin.logout(function(){
|
||||
$.get("{:url('system.admin/logout')}",function(res){
|
||||
if(res.code === 0) {
|
||||
popup.success("注销成功",function(){
|
||||
location.href = "{:url('system.login/index')}";
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
// 注销逻辑 返回 true / false
|
||||
return true;
|
||||
})
|
||||
|
||||
// 消息点击回调
|
||||
admin.message(function(id, title, context, form) {});
|
||||
|
||||
{block name="body"}
|
||||
<div id="LAY_app">
|
||||
<div class="layui-layout layui-layout-admin">
|
||||
{include file="public/header" /}
|
||||
<!-- 侧边菜单 -->
|
||||
<div id="hxNavbar" data-url="{:url('menu/getMenuNavbar')}"></div>
|
||||
{include file="public/page_tabs" /}
|
||||
|
||||
<!-- 主体内容 -->
|
||||
<div class="layui-body" id="LAY_app_body">
|
||||
<div class="layadmin-tabsbody-item layui-show">
|
||||
<iframe src="{:url('index/home')}" frameborder="0" class="layadmin-iframe"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
{include file="public/footer" /}
|
||||
<!-- 辅助元素,一般用于移动设备下遮罩 -->
|
||||
<div class="layadmin-body-shade" layadmin-event="shade"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
$("#clearcache").click(function(){
|
||||
$.get("{:url('system.admin/clearCache')}",function(res){
|
||||
if(res.code === 0) {
|
||||
popup.success("清理成功");
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index','hxNav'],function (){
|
||||
|
||||
// 动态菜单
|
||||
layui.hxNav({
|
||||
element: '#hxNavbar', // 必须,指定ID
|
||||
url: "{:url('menu/getMenuNavbar')}", // 请求后台数据的接口
|
||||
type: 'post',
|
||||
shrink: false,
|
||||
onSelect: function(v) {
|
||||
//console.log(v);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
{/block}
|
||||
|
||||
|
||||
// 修改密码
|
||||
$("#resetPassword").click(function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改密码',
|
||||
shade: 0.1,
|
||||
area: ["350px", "300px"],
|
||||
content: "{:url('system.admin/repass')}",
|
||||
})
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,139 +1,117 @@
|
||||
{extend name="public/base" /}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>登录</title>
|
||||
<!-- 样 式 文 件 -->
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/login.css" />
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
</head>
|
||||
<!-- 代 码 结 构 -->
|
||||
<body background="/static/admin/images/background.svg" style="background-size: cover;">
|
||||
<form class="layui-form" action="javascript:void(0);">
|
||||
<div class="layui-form-item">
|
||||
<img class="logo" src="/static/admin/images/logo.png" />
|
||||
<div class="title">TaoLer Admin</div>
|
||||
<div class="desc">
|
||||
明 湖 区 最 具 影 响 力 的 设 计 规 范 之 一
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input name="username" placeholder="账 户 : admin " lay-verify="required" hover class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="password" name="password" placeholder="密 码 : admin " lay-verify="required" hover class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="text" name="captcha" placeholder="验证码 : " hover lay-verify="required" class="code layui-input layui-input-inline" />
|
||||
<img src="{:captcha_src()}" class="codeImage" style="width:120px;" id="captcha"/>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="checkbox" name="remember" title="记住密码" lay-skin="primary" checked>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<button type="button" class="pear-btn pear-btn-success login" lay-submit lay-filter="login" id="login-submit">
|
||||
登 入
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- 资 源 引 入 -->
|
||||
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'button', 'popup'], function() {
|
||||
let $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
var button = layui.button;
|
||||
var popup = layui.popup;
|
||||
var $body = $('body');
|
||||
|
||||
{block name="title"}登入 - TaolerCMS管理系统{/block}
|
||||
{block name="css"}<link rel="stylesheet" href="/static/admin/style/login.css" media="all">{/block}
|
||||
{block name="body"}
|
||||
<div class="layadmin-user-login layadmin-user-display-show" id="LAY-user-login" style="display: none;">
|
||||
//回车登陆
|
||||
$(document).keydown(function(e){
|
||||
if(e.keyCode == 13){
|
||||
$("#login-submit").click()
|
||||
}
|
||||
})
|
||||
|
||||
// 登 录 提 交
|
||||
form.on('submit(login)', function(data) {
|
||||
//请求登入接口
|
||||
$.ajax({
|
||||
type: "post"
|
||||
,url: "{:url('login/index')}" //实际使用请改成服务端真实接口
|
||||
,data: data.field
|
||||
,success: function(res){
|
||||
if(res.code == 0){
|
||||
/*
|
||||
//请求成功后,写入 access_token
|
||||
layui.data(setter.tableName, {
|
||||
key: setter.request.tokenName
|
||||
,value: res.data.access_token
|
||||
});
|
||||
*/
|
||||
//登入成功的提示与跳转
|
||||
popup.success("登录成功", function() {
|
||||
location.href = "{:url('index/index')}"
|
||||
})
|
||||
|
||||
<div class="layadmin-user-login-main">
|
||||
<div class="layadmin-user-login-box layadmin-user-login-header">
|
||||
<h2>TaoLerAdmin</h2>
|
||||
</div>
|
||||
<div class="layadmin-user-login-box layadmin-user-login-body layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-user-login-username"></label>
|
||||
<input type="text" name="username" id="LAY-user-login-username" lay-verify="required" placeholder="用户名" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-user-login-password"></label>
|
||||
<input type="password" name="password" id="LAY-user-login-password" lay-verify="required" placeholder="密码" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-xs7">
|
||||
<label class="layadmin-user-login-icon layui-icon layui-icon-vercode" for="LAY-user-login-vercode"></label>
|
||||
<input type="text" name="captcha" autocomplete="off" id="LAY-user-login-vercode" lay-verify="required" placeholder="图形验证码" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-col-xs5">
|
||||
<div style="margin-left: 10px;">
|
||||
<img src="{:captcha_src()}" class="layadmin-user-login-codeimg" id="LAY-user-get-vercode" alt="captcha">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="margin-bottom: 20px;">
|
||||
<input type="checkbox" name="remember" lay-skin="primary" title="记住密码">
|
||||
<a href="{:url('login/forget')}" class="layadmin-user-jump-change layadmin-link" style="margin-top: 7px;">忘记密码?</a>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<input type="hidden" class="layui-hide" name="__token__" value="{:token()}" />
|
||||
<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-user-login-submit" id="LAY-user-login-submit">登 入</button>
|
||||
</div>
|
||||
<!--div class="layui-trans layui-form-item layadmin-user-login-other">
|
||||
<label>社交账号登入</label>
|
||||
<a href="javascript:;"><i class="layui-icon layui-icon-login-qq"></i></a>
|
||||
<a href="javascript:;"><i class="layui-icon layui-icon-login-wechat"></i></a>
|
||||
<a href="javascript:;"><i class="layui-icon layui-icon-login-weibo"></i></a>
|
||||
<a href="{:url('login/reg')}" class="layadmin-user-jump-change layadmin-link">注册帐号</a>
|
||||
</div-->
|
||||
{:hook('socialhook')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-trans layadmin-user-login-footer">
|
||||
|
||||
<p>© 2020 <a href="http://www.aieok.com/" target="_blank">aieok.com</a></p>
|
||||
<!--p>
|
||||
<span><a href="http://www.layui.com/admin/#get" target="_blank">获取授权</a></span>
|
||||
<span><a href="http://www.layui.com/admin/pro/" target="_blank">在线演示</a></span>
|
||||
<span><a href="http://www.layui.com/admin/" target="_blank">前往官网</a></span>
|
||||
</p-->
|
||||
</div>
|
||||
|
||||
<!--<div class="ladmin-user-login-theme">
|
||||
<script type="text/html" template>
|
||||
<ul>
|
||||
<li data-theme=""><img src="{{ layui.setter.base }}style/res/bg-none.jpg"></li>
|
||||
<li data-theme="#03152A" style="background-color: #03152A;"></li>
|
||||
<li data-theme="#2E241B" style="background-color: #2E241B;"></li>
|
||||
<li data-theme="#50314F" style="background-color: #50314F;"></li>
|
||||
<li data-theme="#344058" style="background-color: #344058;"></li>
|
||||
<li data-theme="#20222A" style="background-color: #20222A;"></li>
|
||||
</ul>
|
||||
</script>
|
||||
</div>-->
|
||||
|
||||
</div>
|
||||
{/block}
|
||||
} else {
|
||||
layer.open({title:'登陆失败', content:res.msg, icon:5, anim:6});
|
||||
layui.jquery('#captcha').attr('src', '{:captcha_src()}?' + Math.random());
|
||||
}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'user'], function(){
|
||||
setter = layui.setter
|
||||
,admin = layui.admin
|
||||
,form = layui.form
|
||||
,router = layui.router()
|
||||
,search = router.search;
|
||||
|
||||
form.render();
|
||||
|
||||
//回车登陆
|
||||
$(document).keydown(function(e){
|
||||
if(e.keyCode == 13){
|
||||
$("#LAY-user-login-submit").click()
|
||||
}
|
||||
})
|
||||
|
||||
//提交
|
||||
form.on('submit(LAY-user-login-submit)', function(obj){
|
||||
|
||||
//请求登入接口
|
||||
admin.req({
|
||||
type: "post"
|
||||
,url: "{:url('login/index')}" //实际使用请改成服务端真实接口
|
||||
,data: obj.field
|
||||
,success: function(res){
|
||||
if(res.code == 0){
|
||||
/*
|
||||
//请求成功后,写入 access_token
|
||||
layui.data(setter.tableName, {
|
||||
key: setter.request.tokenName
|
||||
,value: res.data.access_token
|
||||
});
|
||||
*/
|
||||
//登入成功的提示与跳转
|
||||
layer.msg('登入成功', {
|
||||
offset: '15px'
|
||||
,icon: 1
|
||||
,time: 1000
|
||||
}, function(){
|
||||
location.href = "{:url('index/index')}"; //后台主页
|
||||
});
|
||||
} else {
|
||||
layer.open({title:'登陆失败', content:res.msg, icon:5, anim:6});
|
||||
layui.jquery('#LAY-user-get-vercode').attr('src', '{:captcha_src()}?'+Math.random());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/// 验证
|
||||
|
||||
/// 登录
|
||||
|
||||
/// 动画
|
||||
// button.load({
|
||||
// elem: '.login',
|
||||
// time: 1500,
|
||||
// done: function() {
|
||||
// popup.success("登录成功", function() {
|
||||
// location.href = "index.html"
|
||||
// });
|
||||
// }
|
||||
// })
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{:hook('bacimghook')}
|
||||
|
||||
{/block}
|
||||
//更换图形验证码
|
||||
$body.on('click', '#captcha', function(){
|
||||
var othis = $(this);
|
||||
this.src = '/captcha.html?t='+ new Date().getTime()
|
||||
});
|
||||
|
||||
|
||||
})
|
||||
</script>
|
||||
{:hook('bacimghook')}
|
||||
</body>
|
||||
</html>
|
||||
|
129
app/admin/view/system/admin/add.html
Normal file
@ -0,0 +1,129 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="username" lay-verify="title" autocomplete="off" placeholder="请输入标题"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="email" lay-verify="email" autocomplete="off" placeholder="请输入邮箱"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="password" lay-verify="password" autocomplete="off" placeholder="请输入密码"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">电话</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="mobile" lay-verify="title" autocomplete="off" placeholder="请输入标题"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="0" title="男">
|
||||
<input type="radio" name="sex" value="1" title="女" checked>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="roleId" xm-select="demo3" xm-select-skin="normal">
|
||||
<option value="1">北京</option>
|
||||
<option value="2" selected="selected">上海</option>
|
||||
<option value="3">广州</option>
|
||||
<option value="4" selected="selected">深圳</option>
|
||||
<option value="5">天津</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
// 数据接口
|
||||
const ADMIN_ADD = "{:url('system.admin/add')}";
|
||||
|
||||
layui.use(['form', 'jquery', 'upload','select'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let upload = layui.upload;
|
||||
let select = layui.select;
|
||||
|
||||
//1.渲染标签
|
||||
var addTags = select.render({
|
||||
el: '#demo3',
|
||||
name: 'demo3',
|
||||
layVerify: '',
|
||||
layVerType: 'msg',
|
||||
paging: true,
|
||||
pageSize: 5,
|
||||
data: []
|
||||
});
|
||||
|
||||
form.on('submit(user-save)', function(data) {
|
||||
$.ajax({
|
||||
url: ADMIN_ADD,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
105
app/admin/view/system/admin/edit.html
Normal file
@ -0,0 +1,105 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$admin.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" value="{$admin.username}" lay-verify="title" autocomplete="off"
|
||||
placeholder="请输入标题" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="email" value="{$admin.email}" lay-verify="title"
|
||||
autocomplete="off" placeholder="请输入标题" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="password" value="" lay-verify="title" autocomplete="off"
|
||||
placeholder="请输入标题" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">电话</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="mobile" value="{$admin.mobile}" lay-verify="title" autocomplete="off"
|
||||
placeholder="请输入电话" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="0" title="男" {if condition="$admin['sex'] eq 0"} checked {/if}>
|
||||
<input type="radio" name="sex" value="1" title="女" {if condition="$admin['sex'] eq 1"} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('submit(user-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('system.admin/edit')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
<script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
345
app/admin/view/system/admin/index.html
Normal file
@ -0,0 +1,345 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>管理员管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" action="">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">用户名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" placeholder="" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="email" placeholder="" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">手机号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="phone" placeholder="" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="user-query">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
查询
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-md">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="user-table" lay-filter="user-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="user-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
<script type="text/html" id="imgTpl">
|
||||
<img src= "/{{d.avatar}}" style="width: 30px; height: 30px;" />
|
||||
</script>
|
||||
<script type="text/html" id="user-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="user-enable">
|
||||
<input type="checkbox" name="enable" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="user-enable" {{ d.check == 1 ? 'checked' : '' }} />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="buttonAuth">
|
||||
{{# if(d.id == '1'){ }}
|
||||
<input type="checkbox" name="auth" lay-skin="primary" checked disabled >
|
||||
{{# } else { }}
|
||||
{if condition="checkRuleButton('admin/auth')"}<input type="checkbox" name="auth" lay-skin="primary" lay-filter="auth" {{# if(d.auth ==1){ }} checked value="0"{{# } else { }}value="1"{{# } }} id="{{d.id}}" >{else}<button class="layui-btn layui-btn-xs layui-btn-disabled">无权限</button>{/if}
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="user-login">
|
||||
{{#if (d.login == 0) { }}
|
||||
<span>在线</span>
|
||||
{{# }else if(d.sex == 1){ }}
|
||||
<span>离线</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="user-createTime">
|
||||
{{layui.util.toDateString(d.createTime, 'yyyy-MM-dd')}}
|
||||
</script>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['table', 'form', 'jquery','common'], function() {
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let common = layui.common;
|
||||
|
||||
let MODULE_PATH = "operate/";
|
||||
|
||||
let cols = [
|
||||
[{
|
||||
type: 'checkbox'
|
||||
},
|
||||
{
|
||||
title: 'id',
|
||||
field: 'id',
|
||||
align: 'center',
|
||||
width: 60
|
||||
},
|
||||
{
|
||||
title: '头像',
|
||||
field: 'avatar',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: '#imgTpl'
|
||||
},
|
||||
{
|
||||
title: '账号',
|
||||
field: 'username',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
title: '电话',
|
||||
field: 'phone',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '邮箱',
|
||||
field: 'email',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: 'IP',
|
||||
field: 'ip',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '登录时间',
|
||||
field: 'logintime',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '启用',
|
||||
field: 'check',
|
||||
align: 'center',
|
||||
width: 95,
|
||||
templet: '#user-enable'
|
||||
},
|
||||
{
|
||||
title: '登录',
|
||||
field: 'login',
|
||||
align: 'center',
|
||||
templet: '#user-login'
|
||||
},
|
||||
{
|
||||
title: '注册',
|
||||
field: 'jointime',
|
||||
align: 'center',
|
||||
templet: '#user-createTime'
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
toolbar: '#user-bar',
|
||||
align: 'center',
|
||||
width: 130
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
table.render({
|
||||
elem: '#user-table',
|
||||
url: "{:url('system.admin/list')}",
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line',
|
||||
toolbar: '#user-toolbar',
|
||||
defaultToolbar: [{
|
||||
title: '刷新',
|
||||
layEvent: 'refresh',
|
||||
icon: 'layui-icon-refresh',
|
||||
}, 'filter', 'print', 'exports']
|
||||
});
|
||||
|
||||
table.on('tool(user-table)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(user-table)', function(obj) {
|
||||
if (obj.event === 'add') {
|
||||
window.add();
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh();
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(user-query)', function(data) {
|
||||
table.reload('user-table', {
|
||||
where: data.field
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
form.on('switch(user-enable)', function(obj) {
|
||||
layer.tips(this.value + ' ' + this.name + ':' + obj.elem.checked, obj.othis);
|
||||
var status = obj.elem.checked ? 1 : -1;
|
||||
//执行用户审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('system.admin/check')}",
|
||||
data:{"id":this.value,"status":status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
window.add = function() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: [common.isModile()?'100%':'500px', common.isModile()?'100%':'450px'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['500px', '450px'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除该用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('system.admin/delete')}?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
|
||||
var checkIds = common.checkField(obj,'id');
|
||||
|
||||
if (checkIds === "") {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
layer.confirm('确定要删除这些用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('system.admin/delete')}",
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
data:{"id":checkIds},
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('user-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(param) {
|
||||
table.reload('user-table');
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
202
app/admin/view/system/admin/info.html
Normal file
@ -0,0 +1,202 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>个人资料</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/person.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-row layui-col-space10">
|
||||
<div class="layui-col-md3">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body" style="padding: 25px;">
|
||||
<div class="text-center layui-text">
|
||||
<div class="user-info-head" id="userInfoHead">
|
||||
<img src="/static/admin/images/avatar.jpg" id="userAvatar" width="115px" height="115px" alt="">
|
||||
</div>
|
||||
<h2 style="padding-top: 20px;font-size: 20px;">{$admin.username} ({$authGroupTitle})</h2> <span><a href="javascript:void(0);" id="info-edit">资料修改</a></span>
|
||||
<p style="padding-top: 8px;margin-top: 10px;font-size: 13.5px;">China , 中国</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="height: 45px;border-top: 1px whitesmoke solid;text-align: center;line-height: 45px;font-size: 13.5px;">
|
||||
<span>今日事 ,今日毕</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
归档
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<ul class="list">
|
||||
<li class="list-item"><span class="title">优化代码格式</span><span class="footer">2020-06-04 11:28</span></li>
|
||||
<li class="list-item"><span class="title">新增消息组件</span><span class="footer">2020-06-01 04:23</span></li>
|
||||
<li class="list-item"><span class="title">移动端兼容</span><span class="footer">2020-05-22 21:38</span></li>
|
||||
<li class="list-item"><span class="title">系统布局优化</span><span class="footer">2020-05-15 14:26</span></li>
|
||||
<li class="list-item"><span class="title">兼容多系统菜单模式</span><span class="footer">2020-05-13 16:32</span></li>
|
||||
<li class="list-item"><span class="title">兼容多标签页切换</span><span class="footer">2019-12-9 14:58</span></li>
|
||||
<li class="list-item"><span class="title">扩展下拉组件</span><span class="footer">2019-12-7 9:06</span></li>
|
||||
<li class="list-item"><span class="title">扩展卡片样式</span><span class="footer">2019-12-1 10:26</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md9">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
我的文章
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="layui-row layui-col-space10" style="margin: 15px;">
|
||||
<div class="layui-col-md1">
|
||||
<img src="/static/admin/images/act.jpg" style="width: 100%;height: 100%;border-radius: 5px;" />
|
||||
</div>
|
||||
<div class="layui-col-md11" style="height: 80px;">
|
||||
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
|
||||
<div class="content">
|
||||
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
|
||||
</div>
|
||||
<div class="comment">2020-06-12 评论 5 点赞 12 转发 4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10" style="margin: 15px;">
|
||||
<div class="layui-col-md1">
|
||||
<img src="/static/admin/images/act.jpg" style="width: 100%;height: 100%;border-radius: 5px;" />
|
||||
</div>
|
||||
<div class="layui-col-md11" style="height: 80px;">
|
||||
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
|
||||
<div class="content">
|
||||
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
|
||||
</div>
|
||||
<div class="comment">2020-06-12 评论 5 点赞 12 转发 4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10" style="margin: 15px;">
|
||||
<div class="layui-col-md1">
|
||||
<img src="/static/admin/images/act.jpg" style="width: 100%;height: 100%;border-radius: 5px;" />
|
||||
</div>
|
||||
<div class="layui-col-md11" style="height: 80px;">
|
||||
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
|
||||
<div class="content">
|
||||
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
|
||||
</div>
|
||||
<div class="comment">2020-06-12 评论 5 点赞 12 转发 4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10" style="margin: 15px;">
|
||||
<div class="layui-col-md1">
|
||||
<img src="/static/admin/images/act.jpg" style="width: 100%;height: 100%;border-radius: 5px;" />
|
||||
</div>
|
||||
<div class="layui-col-md11" style="height: 80px;">
|
||||
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
|
||||
<div class="content">
|
||||
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
|
||||
</div>
|
||||
<div class="comment">2020-06-12 评论 5 点赞 12 转发 4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10" style="margin: 15px;">
|
||||
<div class="layui-col-md1">
|
||||
<img src="/static/admin/images/act.jpg" style="width: 100%;height: 100%;border-radius: 5px;" />
|
||||
</div>
|
||||
<div class="layui-col-md11" style="height: 80px;">
|
||||
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
|
||||
<div class="content">
|
||||
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
|
||||
</div>
|
||||
<div class="comment">2020-06-12 评论 5 点赞 12 转发 4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10" style="margin: 15px;">
|
||||
<div class="layui-col-md1">
|
||||
<img src="/static/admin/images/act.jpg" style="width: 100%;height: 100%;border-radius: 5px;" />
|
||||
</div>
|
||||
<div class="layui-col-md11" style="height: 80px;">
|
||||
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
|
||||
<div class="content">
|
||||
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
|
||||
</div>
|
||||
<div class="comment">2020-06-12 评论 5 点赞 12 转发 4</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row layui-col-space10" style="margin: 15px;">
|
||||
<div class="layui-col-md1">
|
||||
<img src="/static/admin/images/act.jpg" style="width: 100%;height: 100%;border-radius: 5px;" />
|
||||
</div>
|
||||
<div class="layui-col-md11" style="height: 80px;">
|
||||
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
|
||||
<div class="content">
|
||||
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
|
||||
</div>
|
||||
<div class="comment">2020-06-12 评论 5 点赞 12 转发 4</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['jquery', 'element', 'layer', 'convert'], function () {
|
||||
var element = layui.element,
|
||||
layer = layui.layer,
|
||||
$ = layui.jquery,
|
||||
convert = layui.convert;
|
||||
|
||||
let MODULE_PATH = "operate/";
|
||||
|
||||
var image = new Image();
|
||||
image.src = "/static/admin/images/avatar.jpg";
|
||||
image.onload = function() {
|
||||
$("#userAvatar").attr("src", convert.imageToBase64(image));
|
||||
}
|
||||
|
||||
window.callback = function (data) {
|
||||
layer.close(data.index);
|
||||
$("#userAvatar").attr("src", data.newAvatar);
|
||||
}
|
||||
|
||||
// 头像
|
||||
$("#userAvatar").click(function () {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '更换图片',
|
||||
shade: 0.1,
|
||||
area: ["900px", "500px"],
|
||||
content: MODULE_PATH + 'profile.html',
|
||||
btn: ['确定', '取消'],
|
||||
yes: function (index, layero) {
|
||||
window['layui-layer-iframe' + index].submitForm();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// 资料
|
||||
$("#info-edit").click(function () {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改资料',
|
||||
shade: 0.1,
|
||||
area: ["450px", "600px"],
|
||||
content: 'infoEdit.html',
|
||||
// btn: ['确定', '取消'],
|
||||
// yes: function (index, layero) {
|
||||
// window['layui-layer-iframe' + index].submitForm();
|
||||
// }
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
126
app/admin/view/system/admin/info_edit.html
Normal file
@ -0,0 +1,126 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>个人资料</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<link rel="stylesheet" href="/static/admin/css/other/person.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$admin.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">我的角色</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="auth_group_id" value="{$authGroupTitle}" readonly class="layui-input layui-disabled" disabled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">用户名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="username" value="{$admin.username}" readonly class="layui-input layui-disabled">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">昵称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="nickname" value="{$admin.nickname}" lay-verify="nickname" autocomplete="off" placeholder="请输入昵称" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="0" {if condition="$admin['sex'] eq 0"} checked {/if} title="男">
|
||||
<input type="radio" name="sex" value="1" {if condition="$admin['sex'] eq 1"} checked {/if} title="女">
|
||||
</div>
|
||||
</div>
|
||||
<!--div class="layui-form-item">
|
||||
<label class="layui-form-label">头像</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="avatar" lay-verify="required" id="LAY_avatarSrc" placeholder="图片地址" value="http://cdn.layui.com/avatar/168.jpg" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline layui-btn-container" style="width: auto;">
|
||||
<button type="button" class="layui-btn layui-btn-primary" id="LAY_avatarUpload">
|
||||
<i class="layui-icon"></i>上传图片
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-primary" layadmin-event="avartatPreview">查看图片</button >
|
||||
</div>
|
||||
</div-->
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手机</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="mobile" value="{$admin.mobile}" lay-verify="phone" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="email" value="{$admin.email}" lay-verify="email" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">备注</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="remarks" placeholder="请输入内容" class="layui-textarea">{$admin.remarks}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="userinfo-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('submit(userinfo-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('system.admin/infoSet')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
//parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
<script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
83
app/admin/view/system/admin/repass.html
Normal file
@ -0,0 +1,83 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">原密码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="password" name="oldPassword" lay-verify="required" lay-verType="tips" placeholder="请输入原密码" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">新密码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="password" name="password" lay-verify="pass" lay-verType="tips" autocomplete="off" placeholder="新密码6-16位字符" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">确认密码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="password" name="repassword" lay-verify="repass" lay-verType="tips" autocomplete="off" placeholder="再次确认密码" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="userpass-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('submit(userpass-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('system.Admin/repassSet')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name)); //关闭当前页
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
197
app/admin/view/system/auth_group/add.html
Normal file
@ -0,0 +1,197 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="请输入角色名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="test">
|
||||
<label class="layui-form-label">权限范围</label>
|
||||
{volist name="menus" id="vo1"}
|
||||
<ul class="layui-input-block" style="margin-top: 10px ;">
|
||||
<li>
|
||||
<input type="checkbox" name="rules" class="parent" lay-skin="primary" data-level="{$vo1.level}" value="{$vo1.id}" title="【{$vo1.title}】">
|
||||
<ul>
|
||||
{if condition="isset($vo1['children'])"}
|
||||
{volist name="vo1['children']" id="vo2"}
|
||||
<li>
|
||||
{if condition="isset($vo2['children'])"}
|
||||
<input type="checkbox" name="rules" class="parent" lay-skin="primary" data-level="{$vo2.level}" value="{$vo2.id}" title="{$vo2.title}:">
|
||||
|
||||
{volist name="vo2['children']" id="vo3"}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo3.id}" data-level="{$vo3.level}" value="{$vo3.id}" title="{$vo3.title}">
|
||||
{/volist}
|
||||
|
||||
{else /}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo2.id}" data-level="{$vo2.level}" value="{$vo2.id}" title="{$vo2.title}:">
|
||||
{/if}
|
||||
</li>
|
||||
{/volist}
|
||||
{/if}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{/volist}
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">具体描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="descr" lay-verify="required" autocomplete="off" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
// 数据接口
|
||||
const AUTHGROUP_ADD = "{:url('system.AuthGroup/add')}";
|
||||
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('checkbox()', function(data){
|
||||
//var pc = data.elem.classList; //获取选中的checkbox的class属性
|
||||
var othis = $(data.elem);
|
||||
var level = $(data.elem).attr('data-level');
|
||||
|
||||
//选择
|
||||
if(data.elem.checked==true){
|
||||
|
||||
//主菜单
|
||||
if(level === '0'){
|
||||
var c =$(data.elem).siblings().find("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().addClass("layui-form-checked");
|
||||
});
|
||||
|
||||
}
|
||||
//子菜单及子项
|
||||
if(level === '1'){
|
||||
var c = $(data.elem).siblings("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().addClass("layui-form-checked");
|
||||
});
|
||||
|
||||
$(data.elem).parent().parent().prev().addClass("layui-form-checked");
|
||||
|
||||
}
|
||||
|
||||
//子项
|
||||
if(level === '2'){
|
||||
|
||||
$(data.elem).siblings('div:first').addClass("layui-form-checked");
|
||||
$(data.elem).parent().parent().prev().addClass("layui-form-checked");
|
||||
}
|
||||
|
||||
} else {
|
||||
//取消
|
||||
|
||||
if(level === '0'){
|
||||
var c =$(data.elem).siblings().find("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().removeClass("layui-form-checked");
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if(level === '1'){
|
||||
var c = $(data.elem).siblings("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().removeClass("layui-form-checked");
|
||||
});
|
||||
//子项为0,菜单取消选择
|
||||
var s = $(data.elem).parent().parent().children('li').children('div:first-of-type .layui-form-checked');
|
||||
if(s.length === 0){
|
||||
$(data.elem).parent().parent().prev().removeClass("layui-form-checked");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//子项
|
||||
if(level === '2'){
|
||||
var t = othis.siblings('div .layui-form-checked');
|
||||
if(t.length == 1){
|
||||
$(data.elem).siblings('div:first').removeClass("layui-form-checked");
|
||||
}
|
||||
//子项为0,菜单取消选择
|
||||
var s = $(data.elem).parent().parent().children('li').children('div:first-of-type .layui-form-checked');
|
||||
if(s.length === 0){
|
||||
$(data.elem).parent().parent().prev().removeClass("layui-form-checked");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(user-save)', function(data) {
|
||||
//checkbox 父子级级联或取id
|
||||
var mId = "";
|
||||
var e = $(":checkbox");
|
||||
e.each(function () {
|
||||
if($(this).next().hasClass("layui-form-checked")){
|
||||
mId+=$(this).val()+",";
|
||||
};
|
||||
})
|
||||
data.field.rules = mId.substring(0,mId.length-1);
|
||||
|
||||
$.ajax({
|
||||
url: AUTHGROUP_ADD,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("role-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
96
app/admin/view/system/auth_group/auth.html
Normal file
@ -0,0 +1,96 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item" id="test">
|
||||
<label class="layui-form-label">{$role.title}</label>
|
||||
{volist name="admin" id="vo"}
|
||||
<ul class="layui-input-block" style="margin-top: 10px ;">
|
||||
<li>
|
||||
<input type="checkbox" name="uid" class="parent" lay-skin="primary" value="{$vo.id}" title="{$vo.username}" {if (in_array($vo.id, $uidAccess))} checked {/if}>
|
||||
</li>
|
||||
</ul>
|
||||
{/volist}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="auth-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
// 数据接口
|
||||
const AUTHGROUP_EDIT = "{:url('system.AuthGroup/auth')}";
|
||||
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
// 编辑
|
||||
form.on('submit(auth-save)', function(data) {
|
||||
|
||||
//checkbox 父子级级联或取id
|
||||
var mId = "";
|
||||
var e = $(":checkbox");
|
||||
e.each(function () {
|
||||
if($(this).next().hasClass("layui-form-checked")){
|
||||
mId+=$(this).val()+",";
|
||||
};
|
||||
})
|
||||
data.field.uid = mId.substring(0,mId.length-1);
|
||||
data.field.group_id = "{$role.id}";
|
||||
|
||||
$.ajax({
|
||||
url: AUTHGROUP_EDIT,
|
||||
data: JSON.stringify(data.field),
|
||||
// data:{"rules":rules,"title":field.title,"descr":field.descr},
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("role-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
208
app/admin/view/system/auth_group/edit.html
Normal file
@ -0,0 +1,208 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">{$role.title}</label>
|
||||
<div class="layui-input-block layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$role.id}" title="{$role.title}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" id="test">
|
||||
<label class="layui-form-label">权限范围</label>
|
||||
{volist name="menus" id="vo1"}
|
||||
<ul class="layui-input-block" style="margin-top: 10px ;">
|
||||
<li>
|
||||
<input type="checkbox" name="rules" class="parent" lay-skin="primary" data-level="{$vo1.level}" value="{$vo1.id}" title="【{$vo1.title}】" {if (in_array($vo1.id,$rus))} checked {/if}>
|
||||
<ul>
|
||||
{if condition="isset($vo1['children'])"}
|
||||
{volist name="vo1['children']" id="vo2"}
|
||||
<li>
|
||||
{if condition="isset($vo2['children'])"}
|
||||
<input type="checkbox" name="rules" class="parent" lay-skin="primary" data-level="{$vo2.level}" value="{$vo2.id}" title="{$vo2.title}:" {if (in_array($vo2.id,$rus))} checked {/if}>
|
||||
|
||||
{volist name="vo2['children']" id="vo3"}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo3.id}" data-level="{$vo3.level}" value="{$vo3.id}" title="{$vo3.title}" {if (in_array($vo3.id,$rus))} checked {/if}>
|
||||
{/volist}
|
||||
|
||||
{else /}
|
||||
<input type="checkbox" name="rules" lay-skin="primary" id="{$vo2.id}" data-level="{$vo2.level}" value="{$vo2.id}" title="{$vo2.title}:" {if (in_array($vo2.id,$rus))} checked {/if}>
|
||||
{/if}
|
||||
</li>
|
||||
{/volist}
|
||||
{/if}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{/volist}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">具体描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea type="text" name="descr" lay-verify="required" autocomplete="off" class="layui-textarea" value="{$role.descr}">{$role.descr}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
// 数据接口
|
||||
const AUTHGROUP_EDIT = "{:url('system.AuthGroup/edit')}";
|
||||
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
// 选择
|
||||
form.on('checkbox()', function(data){
|
||||
//var pc = data.elem.classList; //获取选中的checkbox的class属性
|
||||
var othis = $(data.elem);
|
||||
var level = $(data.elem).attr('data-level');
|
||||
|
||||
//选择
|
||||
if(data.elem.checked==true){
|
||||
|
||||
//主菜单
|
||||
if(level === '0'){
|
||||
var c =$(data.elem).siblings().find("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().addClass("layui-form-checked");
|
||||
});
|
||||
|
||||
}
|
||||
//子菜单及子项
|
||||
if(level === '1'){
|
||||
var c = $(data.elem).siblings("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().addClass("layui-form-checked");
|
||||
});
|
||||
|
||||
$(data.elem).parent().parent().prev().addClass("layui-form-checked");
|
||||
|
||||
}
|
||||
|
||||
//子项
|
||||
if(level === '2'){
|
||||
|
||||
$(data.elem).siblings('div:first').addClass("layui-form-checked");
|
||||
$(data.elem).parent().parent().prev().addClass("layui-form-checked");
|
||||
}
|
||||
|
||||
} else {
|
||||
//取消
|
||||
|
||||
if(level === '0'){
|
||||
var c =$(data.elem).siblings().find("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().removeClass("layui-form-checked");
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if(level === '1'){
|
||||
var c = $(data.elem).siblings("input[type='checkbox']");
|
||||
c.each(function(){
|
||||
var e = $(this);
|
||||
e.next().removeClass("layui-form-checked");
|
||||
});
|
||||
//子项为0,菜单取消选择
|
||||
var s = $(data.elem).parent().parent().children('li').children('div:first-of-type .layui-form-checked');
|
||||
if(s.length === 0){
|
||||
$(data.elem).parent().parent().prev().removeClass("layui-form-checked");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//子项
|
||||
if(level === '2'){
|
||||
var t = othis.siblings('div .layui-form-checked');
|
||||
if(t.length == 1){
|
||||
$(data.elem).siblings('div:first').removeClass("layui-form-checked");
|
||||
}
|
||||
//子项为0,菜单取消选择
|
||||
var s = $(data.elem).parent().parent().children('li').children('div:first-of-type .layui-form-checked');
|
||||
if(s.length === 0){
|
||||
$(data.elem).parent().parent().prev().removeClass("layui-form-checked");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 编辑
|
||||
form.on('submit(user-save)', function(data) {
|
||||
|
||||
//checkbox 父子级级联或取id
|
||||
var mId = "";
|
||||
var e = $(":checkbox");
|
||||
e.each(function () {
|
||||
if($(this).next().hasClass("layui-form-checked")){
|
||||
mId+=$(this).val()+",";
|
||||
};
|
||||
})
|
||||
data.field.rules = mId.substring(0,mId.length-1);
|
||||
|
||||
$.ajax({
|
||||
url: AUTHGROUP_EDIT,
|
||||
data: JSON.stringify(data.field),
|
||||
// data:{"rules":rules,"title":field.title,"descr":field.descr},
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("role-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
254
app/admin/view/system/auth_group/index.html
Normal file
@ -0,0 +1,254 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>角色管理</title>
|
||||
<link href="/static/component/pear/css/pear.css" rel="stylesheet" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" action="">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">角色筛选</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="id" lay-filter="LAY-user-adminrole-type">
|
||||
<option value="">全部角色</option>
|
||||
{volist name="roles" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="role-query">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
查询
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-md">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="role-table" lay-filter="role-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="role-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="role-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-warming pear-btn-sm" lay-event="power"><i class="layui-icon layui-icon-vercode"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="role-enable">
|
||||
<input type="checkbox" name="enable" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="role-enable" {{ d.check== 1 ? 'checked' : '' }} />
|
||||
</script>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
// 数据接口
|
||||
const ROLE_LIST = "{:url('system.AuthGroup/list')}";
|
||||
const ROLE_DELETE = "{:url('system.AuthGroup/delete')}";
|
||||
|
||||
layui.use(['table','form','jquery','common'],function () {
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let common = layui.common;
|
||||
|
||||
let MODULE_PATH = "operate/";
|
||||
|
||||
let cols = [
|
||||
[
|
||||
{type:'checkbox'},
|
||||
{title: '角色名', field: 'rolename', align:'center', width:100},
|
||||
{title: 'Key值', field: 'roleCode', align:'center'},
|
||||
{title: '描述', field: 'descr', align:'center'},
|
||||
{title: '是否可用', field: 'check', align:'center', templet:'#role-enable'},
|
||||
{title: '操作', toolbar: '#role-bar', align:'center', width:195}
|
||||
]
|
||||
]
|
||||
|
||||
table.render({
|
||||
elem: '#role-table',
|
||||
url: ROLE_LIST,
|
||||
page: true ,
|
||||
cols: cols ,
|
||||
skin: 'line',
|
||||
toolbar: '#role-toolbar',
|
||||
defaultToolbar: [{
|
||||
title: '刷新',
|
||||
layEvent: 'refresh',
|
||||
icon: 'layui-icon-refresh',
|
||||
}, 'filter', 'print', 'exports']
|
||||
});
|
||||
|
||||
table.on('tool(role-table)', function(obj){
|
||||
if(obj.event === 'remove'){
|
||||
window.remove(obj);
|
||||
} else if(obj.event === 'edit'){
|
||||
window.edit(obj);
|
||||
} else if(obj.event === 'power'){
|
||||
window.power(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(role-table)', function(obj){
|
||||
if(obj.event === 'add'){
|
||||
window.add();
|
||||
} else if(obj.event === 'refresh'){
|
||||
window.refresh();
|
||||
} else if(obj.event === 'batchRemove'){
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(role-query)', function(data){
|
||||
table.reload('role-table',{where:data.field})
|
||||
return false;
|
||||
});
|
||||
|
||||
form.on('switch(role-enable)', function(obj){
|
||||
layer.tips(this.value + ' ' + this.name + ':'+ obj.elem.checked, obj.othis);
|
||||
var status = obj.elem.checked ? 1 : -1;
|
||||
//执行用户审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('system.AuthGroup/check')}",
|
||||
data:{"id":this.value,"status":status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
window.add = function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: ['600px', '800px'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.power = function(obj){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '授权',
|
||||
shade: 0.1,
|
||||
area: ['320px', '400px'],
|
||||
content: 'auth.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['600px', '800px'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
window.remove = function(obj){
|
||||
layer.confirm('确定要删除该角色', {icon: 3, title:'提示'}, function(index){
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: ROLE_DELETE + "?id=" + obj.data['id'],
|
||||
dataType:'json',
|
||||
type:'delete',
|
||||
success:function(result){
|
||||
layer.close(loading);
|
||||
if(result.code === 0){
|
||||
layer.msg(result.msg,{icon:1,time:1000},function(){
|
||||
obj.del();
|
||||
});
|
||||
}else{
|
||||
layer.msg(result.msg,{icon:2,time:1000});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj){
|
||||
let data = table.checkStatus(obj.config.id).data;
|
||||
//var checkIds = common.checkField(obj,'id'); // 选择id
|
||||
if(data.length === 0){
|
||||
layer.msg("未选中数据",{icon:3,time:1000});
|
||||
return false;
|
||||
}
|
||||
let ids = "";
|
||||
for(let i = 0;i<data.length;i++){
|
||||
ids += data[i].id+",";
|
||||
}
|
||||
ids = ids.substr(0,ids.length-1);
|
||||
|
||||
layer.confirm('确定要删除这些用户', {icon: 3, title:'提示'}, function(index){
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: ROLE_DELETE,
|
||||
dataType:'json',
|
||||
data:{"id":ids},
|
||||
type:'delete',
|
||||
success:function(result){
|
||||
layer.close(loading);
|
||||
if(result.code === 0){
|
||||
layer.msg(result.msg,{icon:1,time:1000},function(){
|
||||
table.reload('role-table');
|
||||
});
|
||||
}else{
|
||||
layer.msg(result.msg,{icon:2,time:1000});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(){
|
||||
table.reload('role-table');
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
165
app/admin/view/system/auth_rule/add.html
Normal file
@ -0,0 +1,165 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级菜单</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">菜单名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="请输入菜单名" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权限地址</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" lay-verify="required" placeholder="请输入权限地址" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="icon" id="iconPicker" lay-filter="iconPicker" style="display:none;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sort" lay-verify="" placeholder="排序序号" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="ismenu" lay-skin="primary" title="目录" value="0">
|
||||
<input type="radio" name="ismenu" lay-skin="primary" title="菜单" value="1" checked>
|
||||
<input type="radio" name="ismenu" lay-skin="primary" title="按钮" value="2">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="rule-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
const RULE_ADD = "{:url('system.AuthRule/add')}";
|
||||
|
||||
layui.use(['form','jquery', 'xmSelect', 'iconPicker'], function(){
|
||||
let $ = layui.jquery;
|
||||
let form = layui.form;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var iconPicker = layui.iconPicker;
|
||||
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
(function(){
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: "{:url('system.AuthRule/ruleTree')}",
|
||||
success: function(res){
|
||||
var data = res.data;
|
||||
console.log(data);
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'title',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
}
|
||||
|
||||
})
|
||||
return false;
|
||||
})();
|
||||
|
||||
|
||||
form.on('submit(rule-save)', function(data) {
|
||||
$.ajax({
|
||||
url: RULE_ADD,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("power-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
166
app/admin/view/system/auth_rule/edit.html
Normal file
@ -0,0 +1,166 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增管理员</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$rules.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上级菜单</label>
|
||||
<div class="layui-input-block">
|
||||
<div id="menuSelectBox" class="ew-xmselect-tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">菜单名称</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" lay-verify="required" placeholder="请输入权限名" autocomplete="off" class="layui-input" value="{$rules.title}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权限地址</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" lay-verify="required" placeholder="请输入权限地址" autocomplete="off" class="layui-input" value="{$rules.name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">图标</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="icon" id="iconPicker" lay-filter="iconPicker" value="{$rules.icon}" style="display:none;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sort" lay-verify="required" placeholder="排序序号" autocomplete="off" class="layui-input" value="{$rules.sort}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="ismenu" lay-skin="primary" title="目录" value="0" {if condition="$rules.ismenu == 0"} checked {/if}>
|
||||
<input type="radio" name="ismenu" lay-skin="primary" title="菜单" value="1" {if condition="$rules.ismenu == 1"} checked {/if}>
|
||||
<input type="radio" name="ismenu" lay-skin="primary" title="按钮" value="2" {if condition="$rules.ismenu == 2"} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="rule-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
const RULE_EDIT = "{:url('system.AuthRule/edit')}";
|
||||
const RULE_TREE = "{:url('system.AuthRule/ruleTree')}";
|
||||
|
||||
layui.use(['form','jquery', 'xmSelect', 'iconPicker'], function(){
|
||||
let $ = layui.jquery;
|
||||
let form = layui.form ;
|
||||
var xmSelect = layui.xmSelect;
|
||||
var iconPicker = layui.iconPicker;
|
||||
var initPid = "{$rules['pid']}";
|
||||
|
||||
//初始化图标选择
|
||||
iconPicker.render({
|
||||
elem: '#iconPicker',
|
||||
type: 'fontClass',
|
||||
search: false,
|
||||
page: true,
|
||||
limit: 12,
|
||||
click: function (data) {
|
||||
//console.log(data);
|
||||
}
|
||||
});
|
||||
|
||||
//权限菜单结构
|
||||
(function(){
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: RULE_TREE,
|
||||
success: function(res){
|
||||
var data = res.data;
|
||||
|
||||
// 渲染下拉树
|
||||
xmSelect.render({
|
||||
el: '#menuSelectBox',
|
||||
name: 'pid',
|
||||
height: '250px',
|
||||
layVerify: 'required',
|
||||
layVerType: 'tips',
|
||||
data: data,
|
||||
initValue: [initPid],
|
||||
model: {label: {type: 'text'}},
|
||||
prop: {
|
||||
name: 'title',
|
||||
value: 'id'
|
||||
},
|
||||
radio: true,
|
||||
clickClose: true,
|
||||
tree: {
|
||||
show: true,
|
||||
indent: 15,
|
||||
strict: false,
|
||||
expandedKeys: true
|
||||
},
|
||||
tips: '请选择上级菜单'
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})()
|
||||
|
||||
form.on('submit(rule-save)', function(data) {
|
||||
$.ajax({
|
||||
url: RULE_EDIT,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("power-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
245
app/admin/view/system/auth_rule/index.html
Normal file
@ -0,0 +1,245 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>权限管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="power-table" lay-filter="power-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="power-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-success pear-btn-md" lay-event="expandAll">
|
||||
<i class="layui-icon layui-icon-spread-left"></i>
|
||||
展开
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-success pear-btn-md" lay-event="foldAll">
|
||||
<i class="layui-icon layui-icon-shrink-right"></i>
|
||||
折叠
|
||||
</button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="power-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="power-type">
|
||||
{{#if (d.powerType == '0') { }}
|
||||
<span>目录</span>
|
||||
{{# }else if(d.powerType == '1'){ }}
|
||||
<span>菜单</span>
|
||||
{{# }else if(d.powerType == '2'){ }}
|
||||
<span>按钮</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="power-enable">
|
||||
<input type="checkbox" name="enable" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="rule-enable" {{ d.enable== 1 ? 'checked' : '' }} />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="icon">
|
||||
<i class="layui-icon {{d.icon}}"></i>
|
||||
</script>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
const RULES = "{:url('system.AuthRule/list')}";
|
||||
const RULES_DELETE = "{:url('system.AuthRule/delete')}";
|
||||
const RULES_ENABLE = "{:url('system.AuthRule/check')}";
|
||||
|
||||
layui.use(['table','form','jquery','treetable'],function () {
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let treetable = layui.treetable;
|
||||
|
||||
let MODULE_PATH = "operate/";
|
||||
|
||||
let cols = [
|
||||
[
|
||||
{type: 'checkbox'},
|
||||
{field: 'powerId', width: 100, title: '权限ID'},
|
||||
{field: 'powerName', minWidth: 200, title: '权限名称'},
|
||||
{field: 'icon', title: '图标',templet:'#icon'},
|
||||
{field: 'powerType', title: '权限类型',templet:'#power-type'},
|
||||
{field: 'powerUrl', title: '权限地址', minWidth: 150},
|
||||
{field: 'enable', title: '是否可用',templet:'#power-enable'},
|
||||
{field: 'sort', title: '排序'},
|
||||
{title: '操作',templet: '#power-bar', width: 150, align: 'center'}
|
||||
]
|
||||
];
|
||||
|
||||
window.render = function(){
|
||||
treetable.render({
|
||||
treeColIndex: 1,
|
||||
treeSpid: 0,
|
||||
treeIdName: 'powerId',
|
||||
treePidName: 'parentId',
|
||||
skin:'line',
|
||||
treeDefaultClose: true,
|
||||
toolbar:'#power-toolbar',
|
||||
elem: '#power-table',
|
||||
url: RULES,
|
||||
page: false,
|
||||
cols: cols
|
||||
});
|
||||
}
|
||||
|
||||
render();
|
||||
|
||||
table.on('tool(power-table)',function(obj){
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
table.on('toolbar(power-table)', function(obj){
|
||||
if(obj.event === 'add'){
|
||||
window.add();
|
||||
} else if(obj.event === 'refresh'){
|
||||
window.refresh();
|
||||
} else if(obj.event === 'batchRemove'){
|
||||
window.batchRemove(obj);
|
||||
} else if(obj.event === 'expandAll'){
|
||||
treetable.expandAll("#power-table");
|
||||
} else if(obj.event === 'foldAll'){
|
||||
treetable.foldAll("#power-table");
|
||||
}
|
||||
});
|
||||
|
||||
form.on('switch(rule-enable)', function(obj) {
|
||||
layer.tips(this.value + ' ' + this.name + ':' + obj.elem.checked, obj.othis);
|
||||
var status = obj.elem.checked ? 1 : -1;
|
||||
//执行用户审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url: RULES_ENABLE,
|
||||
data:{"id":this.value,"status":status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
window.add = function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: ['450px', '500px'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj){
|
||||
console.log(obj.data.powerId)
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['450px', '500px'],
|
||||
content: 'edit.html?id=' + obj.data.powerId
|
||||
});
|
||||
}
|
||||
window.remove = function(obj){
|
||||
layer.confirm('确定要删除该权限', {icon: 3, title:'提示'}, function(index){
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: RULES_DELETE+"?id="+obj.data['powerId'],
|
||||
dataType:'json',
|
||||
type:'delete',
|
||||
success:function(result){
|
||||
layer.close(loading);
|
||||
if(result.code === 0){
|
||||
layer.msg(result.msg,{icon:1,time:1000},function(){
|
||||
obj.del();
|
||||
});
|
||||
}else{
|
||||
layer.msg(result.msg,{icon:2,time:1000});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
let data = table.checkStatus(obj.config.id).data;
|
||||
if (data.length === 0) {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
let ids = "";
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
ids += data[i].powerId + ",";
|
||||
}
|
||||
ids = ids.substr(0, ids.length - 1);
|
||||
layer.confirm('确定要删除这些权限', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: MODULE_PATH + "batchRemove/" + ids,
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('user-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
442
app/admin/view/system/set/index.html
Normal file
@ -0,0 +1,442 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>权限管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-fluid" id="component-tabs">
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="website-tabs-brief">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this" lay-id="website">网站设置</li>{if hook('mailstatushook') ==1 }<li lay-id="email">邮箱服务</li>{/if}
|
||||
<li lay-id="config">服务配置</li>
|
||||
<li lay-id="domain">域名绑定</li>
|
||||
<li lay-id="bind_map">应用映射</li>
|
||||
<li lay-id="url_rewrite">URL美化</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="layui-form" wid100 lay-filter="website">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">网站名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="webname" value="{$sysInfo.webname}" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">网站域名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="domain" value="{$sysInfo.domain}" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">模板切换</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="template" lay-verify="required">
|
||||
<option value=""></option>
|
||||
{volist name="template" id="vo"}
|
||||
<option {if condition="$sysInfo.template eq $vo"} selected {/if} value="{$vo}">{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">Logo</label>
|
||||
<div class="layui-input-block">
|
||||
<span><img src="{$sysInfo.logo}" hight="40" width="50" ></span>
|
||||
{if condition="checkRuleButton('set/upload')"}
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="logo-img">选择文件</button>
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="logo-upload-button">开始上传</button>
|
||||
{else /}<button type="button" class="layui-btn layui-btn-sm layui-btn-disabled">选择文件</button>{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">M-logo</label>
|
||||
<div class="layui-input-block">
|
||||
<span><img src="{$sysInfo.m_logo}" hight="40" width="50" ></span>
|
||||
{if condition="checkRuleButton('set/upload')"}
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="m-logo-img">选择文件</button>
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="m-logo-upload-button">开始上传</button>
|
||||
{else /}<button type="button" class="layui-btn layui-btn-sm layui-btn-disabled">选择文件</button>{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">缓存时间</label>
|
||||
<div class="layui-input-inline" style="width: 80px;">
|
||||
<input type="text" name="cache" lay-verify="number" value="{$sysInfo.cache}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline layui-input-company">分钟</div>
|
||||
<div class="layui-form-mid layui-word-aux">本地开发一般推荐设置为 0,线上环境建议设置为 10。</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">最大文件上传</label>
|
||||
<div class="layui-input-inline" style="width: 80px;">
|
||||
<input type="text" name="upsize" lay-verify="number" value="{$sysInfo.upsize}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline layui-input-company">KB</div>
|
||||
<div class="layui-form-mid layui-word-aux">提示:1 M = 1024 KB</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上传文件类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="uptype" value="{$sysInfo.uptype}" placeholder="请依照格式image:jgp|png,多个组合用,分开" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">禁止注册名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="blackname" value="{$sysInfo.blackname}" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">首页标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="webtitle" value="{$sysInfo.webtitle}" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">META关键词</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="keywords" class="layui-textarea" placeholder="多个关键词在英文状态下用,分开">{$sysInfo.keywords}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">META描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="descript" class="layui-textarea">{$sysInfo.descript}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">网站声明</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="state" class="layui-textarea">{$sysInfo.state}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">备案号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="icp" value="{$sysInfo.icp}" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">访问统计</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="showlist" value="{$sysInfo.showlist}" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版权信息</label>
|
||||
<div class="layui-input-inline" style="width: 400px;">
|
||||
<input type="text" name="copyright" value="{$sysInfo.copyright}" data-level="{$clevel}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline layui-input-company">提示</div>
|
||||
<div class="layui-form-mid layui-word-aux">未授权版本,不限制功能,但严禁私自改写此处版权脚本,一旦发现,永久关闭升级服务!!</div>
|
||||
<div class="layui-form-mid layui-word-aux"></div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="pear-btn pear-btn-primary" lay-submit lay-filter="set_website" data-url="{:url('system.set/website')}">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:hook('mailsethook')}
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form" wid100 lay-filter="config">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">注册开关:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="is_regist" lay-skin="primary" value=1 {if config('taoler.config.is_regist') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选可注册</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">登录开关:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="is_login" lay-skin="primary" value=1 {if config('taoler.config.is_login') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选可登录</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">发帖开关:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="is_post" lay-skin="primary" value=1 {if config('taoler.config.is_post') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选可发贴</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">评论开关:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="is_reply" lay-skin="primary" value=1 {if config('taoler.config.is_reply') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选可评论</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">注册审核:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="regist_check" lay-skin="primary" value=0 {if config('taoler.config.regist_check') == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选需审核</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">发帖审核:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="posts_check" lay-skin="primary" value=0 {if config('taoler.config.posts_check') == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选需审核</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">评论审核:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="commnets_check" lay-skin="primary" value=0 {if config('taoler.config.commnets_check') == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选需审核</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">注册验证:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="regist_type" value=1 title="验证码" {if config('taoler.config.regist_type') == 1} checked {/if}>
|
||||
<input type="radio" name="regist_type" value=2 title="邮箱验证" {if config('taoler.config.regist_type') == 2} checked {/if}>
|
||||
<input type="radio" name="regist_type" value=3 title="手机短信" {if config('taoler.config.regist_type') == 3} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">登录验证码:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="login_captcha" lay-skin="primary" value=1 {if config('taoler.config.login_captcha') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选需验证</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">发帖验证码:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="post_captcha" lay-skin="primary" value=1 {if config('taoler.config.post_captcha') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选需验证</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类显示:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="cate_show" lay-skin="primary" value=1 {if config('taoler.config.cate_show') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选显示文章所属类别</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">区域简称:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="area_show" lay-skin="primary" value=1 {if config('taoler.config.area_show') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">勾选显示归属地简称</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">百度词条:</label>
|
||||
<div class="layui-input-inline" style="width: 60px;">
|
||||
<input type="checkbox" name="baidu_title_switch" lay-skin="switch" lay-text="开启|关闭" value=1 {if config('taoler.config.baidu_title_switch') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">发文章标题引用百度词条</div>
|
||||
</div>
|
||||
<hr>
|
||||
{if hook('mailserveractivehook')}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮件通知:</label>
|
||||
<div class="layui-input-inline" style="width: 30px;">
|
||||
<input type="checkbox" name="email_notice" lay-skin="primary" value=1 {if config('taoler.config.email_notice') == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">发帖及评论等邮件提醒(邮箱服务未激活无法设置)</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="pear-btn pear-btn-primary" lay-submit lay-filter="set_system_config" data-url="{:url('system.set/config')}">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form" wid100 lay-filter="domain">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">多域名开关</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="checkbox" name="domain_check" lay-skin="switch" lay-filter="domain_check" lay-text="开启|关闭" data-rul="{:url('system.set/setDomain')}" {if empty(config('app.domain_bind')) == false} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div id="set_domain" class="{if empty(config('app.domain_bind')) == true} layui-hide {/if}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">Index前端</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="index" required lay-verify="required" placeholder="只需填写子域如www" value="{$index}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">访问则为www.aieok.com</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">Admin后端</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="admin" required lay-verify="required" placeholder="只需填写子域如admin" value="{$admin}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">访问则为admin.aieok.com</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="pear-btn pear-btn-primary" lay-submit lay-filter="set_system_domain" data-url="{:url('system.set/setDomain')}">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form" wid100 lay-filter="bind_map">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">Index应用</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="index_map" required value="{$index_map}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">改变后原路径访问无效</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">Admin应用</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="admin_map" required value="{$admin_map}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">设置后需要使用新路径</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="pear-btn pear-btn-primary" lay-submit lay-filter="set_bind_map" data-url="{:url('system.set/bindMap')}">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form" wid100 lay-filter="url_rewrite">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">帖子url字段</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="article_as" required value="{$url_re['article_as']}" class="layui-input">
|
||||
</div>
|
||||
<div id="artdesc" class="layui-form-mid layui-word-aux">如:www.aieok.com/article/1.html</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类url字段</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="cate_as" required value="{$url_re['cate_as']}" class="layui-input">
|
||||
</div>
|
||||
<div id="catedesc" class="layui-form-mid layui-word-aux">如:www.aieok.com/cate/ask.html</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="pear-btn pear-btn-primary" lay-submit lay-filter="set_url_rewrite" data-url="{:url('system.set/setUrl')}">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
var setEmail ="{:url('system.set/email')}";
|
||||
|
||||
layui.use(['jquery', 'upload','set'], function(){
|
||||
var $ = layui.jquery;
|
||||
var form = layui.form;
|
||||
var upload = layui.upload;
|
||||
var element =layui.element ;
|
||||
|
||||
//LOGO选完文件后不自动上传
|
||||
upload.render({
|
||||
elem: '#logo-img'
|
||||
,url: "{:url('system.set/upload')}"
|
||||
,data: {type:'image',field:'logo'}
|
||||
,auto: false
|
||||
,exts: 'jpg|png|gif|bmp|jpeg'
|
||||
,size: 1000
|
||||
//,multiple: true
|
||||
,bindAction: '#logo-upload-button'
|
||||
,done: function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{icon:6,tiye:2000},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({title:"上传失败",content:res.msg,icon:5,anim:6});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//移动端logo
|
||||
upload.render({
|
||||
elem: '#m-logo-img'
|
||||
,url: "{:url('system.set/upload')}"
|
||||
,data: {type:'image',field:'mlogo'}
|
||||
,auto: false
|
||||
,exts: 'jpg|png|gif|bmp|jpeg'
|
||||
,size: 1000
|
||||
//,multiple: true
|
||||
,bindAction: '#m-logo-upload-button'
|
||||
,done: function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{icon:6,tiye:2000},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({title:"上传失败",content:res.msg,icon:5,anim:6});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
// 获取描述的内容
|
||||
$("input[name='article_as']").bind('input propertychange', function(){
|
||||
var content = $(this).val()
|
||||
$('#artdesc').html('如:www.aieok.com/'+ content +'/1.html');
|
||||
})
|
||||
$("input[name='cate_as']").bind('input propertychange', function(){
|
||||
var content = $(this).val()
|
||||
$('#catedesc').html('如:www.aieok.com/'+ content +'/ask.html');
|
||||
})
|
||||
|
||||
|
||||
//显示当前tab
|
||||
if(location.hash){
|
||||
element.tabChange('website-tabs-brief', location.hash.replace(/^#/, ''));
|
||||
}
|
||||
element.on('tab(website-tabs-brief)', function(){
|
||||
var othis = $(this), layid = othis.attr('lay-id');
|
||||
if(layid){
|
||||
location.hash = layid;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
228
app/admin/view/system/upgrade/index.html
Normal file
@ -0,0 +1,228 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>管理员管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-card-header">升级服务</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form" wid100 lay-filter="">
|
||||
{if ($ver_num.key == '')}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">配置Key</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="key" value="{$ver_num.key}" required class="layui-input" placeholder="填写申请得到在Key">
|
||||
</div>
|
||||
<div class="layui-input-inline layui-input-company"><button style="float: left;" type="button" class="layui-btn layui-btn-sm" id="upgrade-key">保存</button></div>
|
||||
<div class="layui-form-mid layui-word-aux" >无Key不能升级</div>
|
||||
<div class="layui-form-mid layui-word-aux " ><a href="https://www.aieok.com/article/user/key.html" target="_blank">去官网申请Key</a></div>
|
||||
</div>
|
||||
{else /}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">升级Key</label>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="key" value="{$ver_num.key}" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux " ><span style="color:red">{$ver_num.key}</span></div>
|
||||
<div class="layui-input-inline layui-input-company">
|
||||
{if condition="checkRuleButton('Upgrade/keyedit')"}
|
||||
<a class="pear-btn pear-btn-primary pear-btn-xs" lay-event="edit" id-data="{:url('upgrade/keyedit')}" ><i class="layui-icon layui-icon-edit"></i>修改?</a>
|
||||
{else /}<a class="pear-btn pear-btn-primary pear-btn-xm layui-btn-disabled" ><i class="layui-icon layui-icon-edit"></i>修改?</a>{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">在线升级</label>
|
||||
<div class="layui-input-inline layui-input-company" id="ver_nums" >当前版本:Taoler v_{:config('taoler.version')}</div>
|
||||
<div class="layui-upload">
|
||||
{if condition="checkRuleButton('Upgrade/check')"}
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" data-url="{$ver_num.upcheck_url}" id="upload-check">检查更新</button>
|
||||
{else /}<button type="button" class="pear-btn pear-btn-primary pear-btn-sm layui-btn-disabled">检查更新</button>{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手动更新</label>
|
||||
<div class="layui-upload">
|
||||
{if condition="checkRuleButton('Upgrade/uploadzip')"}
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="select-file">选择文件</button>
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="upgrade-sys-button">开始升级</button>
|
||||
{else /}<button type="button" class="layui-btn layui-btn-sm layui-btn-disabled">无权限</button>{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/if}
|
||||
|
||||
<div style="margin-top: 10px;">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-card-header">升级说明</div>
|
||||
<div style="padding-left: 20px;">1.升级服务需要去官网申请key配置文件</div>
|
||||
<div style="padding-left: 20px;">2.多个版本需要升级时,会自行判断依次序升级</div>
|
||||
<div style="padding-left: 20px;">3.升级过程尽管会自动备份文件,但为了安全起见可以自行备份文件</div>
|
||||
<div style="padding-left: 20px;">4.在某些特殊场合,可能需要手动升级</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['toast','notify','layer','form','upload'], function(){
|
||||
var $ = layui.jquery
|
||||
,layer = layui.layer
|
||||
,form = layui.form
|
||||
,upload = layui.upload;
|
||||
var notify = layui.notify;
|
||||
var toast = layui.toast;
|
||||
|
||||
//检测并更新系统
|
||||
$('#upload-check').on('click',function(){
|
||||
var loading = layer.load(2, {
|
||||
shade: [0.2, '#000'],
|
||||
//time: 2000,
|
||||
});
|
||||
|
||||
$.get("{:url('system.upgrade/check')}",function (data){
|
||||
if (data.code == 0) {
|
||||
//已件最新版本
|
||||
layer.close(loading);
|
||||
toast.info({title:"通知消息", message: data.msg ,position: 'topRight'})
|
||||
} else if (data.code == 1) {
|
||||
//可升级
|
||||
layer.close(loading);
|
||||
$('div#ver_nums').after('<div class="layui-input-inline layui-input-company">发现<span style="color:red">'+data.data.upnum+'</span>个新版本:<span style="color:red">可更新至v' + data.data.version + ' [!重要:' + data.data.info + ']</span></div>');
|
||||
$('button#upload-check').hide();
|
||||
//更新系统
|
||||
layer.confirm('更新v' + data.data.version + ',升级说明:<span style="color:red">[!重要:' + data.data.info + ']</span><br>确定升级?',{icon: 3, title:'升级系统'}, function(index){
|
||||
uploads(); //更新
|
||||
layer.close(index); //关闭load加载层
|
||||
});
|
||||
} else {
|
||||
//服务器错误
|
||||
layer.close(loading);
|
||||
toast.error({title:"服务器错误",message:data.msg});
|
||||
//notify.error(data.msg);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
//更新
|
||||
function uploads(){
|
||||
var load = layer.load();
|
||||
$.get("{:url('system.upgrade/upload')}",function (data){
|
||||
if (data.code == 0) {
|
||||
layer.close(load);
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.close(load);
|
||||
toast.error({title:"服务器错误", message:data.msg})
|
||||
//notify.error(data.msg);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
//手动更新,选完文件后不自动上传
|
||||
upload.render({
|
||||
elem: '#select-file'
|
||||
,url: "{:url('system.upgrade/uploadzip')}"
|
||||
,data: {type:'zip'}
|
||||
,accept: 'file'
|
||||
,acceptMime: 'application/zip'
|
||||
,field: 'file'
|
||||
,auto: false
|
||||
,exts: 'zip|rar|7z'
|
||||
,size: 10000
|
||||
//,multiple: true
|
||||
,bindAction: '#upgrade-sys-button'
|
||||
,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
|
||||
layer.load(); //上传loading
|
||||
}
|
||||
,done: function(res){
|
||||
layer.closeAll('loading'); //关闭loading
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
tiye:2000
|
||||
},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:"上传失败",
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//确定升级操作
|
||||
$(document).on('click','#update_system',function(){
|
||||
//var url = $(this).attr('data-url'),
|
||||
// key = $('input[name=key]').attr("value"),
|
||||
uploads();
|
||||
return false;
|
||||
});
|
||||
|
||||
//设置key
|
||||
$('#upgrade-key').on('click',function(){
|
||||
var key = $('input[name=key]').val();
|
||||
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('system.upgrade/key')}",
|
||||
data:{"key":key},
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
},function(){
|
||||
location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'保存失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
//修改key
|
||||
$('a[lay-event=edit]').on('click', function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改key',
|
||||
shade: 0.1,
|
||||
area: ['500px', '400px'],
|
||||
content: 'keyedit.html'
|
||||
});
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
94
app/admin/view/system/upgrade/keyedit.html
Normal file
@ -0,0 +1,94 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">配置Key</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="key" value="{$key.key}" required class="layui-input" autocomplete="off" placeholder="填写申请得到在Key">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">检测api</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="upcheck_url" value="{$key.upcheck_url}" required class="layui-input" autocomplete="off" placeholder="没换官网服务器情况下不要改">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">升级api</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="upgrade_url" value="{$key.upgrade_url}" required class="layui-input" autocomplete="off" placeholder="没换官网服务器情况下不要改">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">申请key?</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-form-mid layui-word-aux " ><a href="https://www.aieok.com/article/user/key.html" target="_blank">更换网址,请去官网重新申请key</a></div>
|
||||
<div class="layui-form-mid layui-word-aux " ><span>未通知api接口变更,请不要私自更改api,否则无法升级</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="key-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('submit(key-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('system.upgrade/keyedit')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
<script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
136
app/admin/view/user/user/add.html
Normal file
@ -0,0 +1,136 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>新增页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" lay-verify="title" autocomplete="off" placeholder="请输入标题"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="email" lay-verify="email" autocomplete="off" placeholder="请输入邮箱"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">头像</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="user_img" lay-verify="required" placeholder="请上传图片" autocomplete="off" class="layui-input" >
|
||||
</div>
|
||||
<button style="float: left;" type="button" class="layui-btn" id="layuiadmin-upload-useradmin">上传图片</button>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="password" lay-verify="password" autocomplete="off" placeholder="请输入密码"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">电话</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="phone" lay-verify="title" autocomplete="off" placeholder="请输入标题"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="0" title="男">
|
||||
<input type="radio" name="sex" value="1" title="女" checked>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'jquery', 'upload'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let upload = layui.upload;
|
||||
|
||||
form.on('submit(user-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('user.user/add')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
//上传头像
|
||||
upload.render({
|
||||
elem: '#layuiadmin-upload-useradmin'
|
||||
,url: "{:url('user.user/uploadImg')}"
|
||||
,data: {type:'image'}
|
||||
,accept: 'images'
|
||||
,method: 'get'
|
||||
,acceptMime: 'image/*'
|
||||
,done: function(res){
|
||||
$(this.item).prev("div").children("input").val(res.src);
|
||||
if(res.code === 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:6,
|
||||
tiye:2000
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:"上传失败",
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
<script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
112
app/admin/view/user/user/edit.html
Normal file
@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$user.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" value="{$user.name}" lay-verify="title" autocomplete="off"
|
||||
placeholder="请输入标题" class="layui-input" disabled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="email" value="{$user.email}" lay-verify="title"
|
||||
autocomplete="off" placeholder="请输入标题" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="password" value="" lay-verify="title" autocomplete="off"
|
||||
placeholder="请输入标题" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">电话</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="phone" value="{$user.phone}" lay-verify="title" autocomplete="off"
|
||||
placeholder="请输入标题" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">头像</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="user_img" lay-verify="required" placeholder="请上传图片" autocomplete="off" class="layui-input" value="{$user.user_img}">
|
||||
</div>
|
||||
<button style="float: left;" type="button" class="layui-btn" dataid="{$user.id}" id="layuiadmin-upload-useradmin">上传图片</button>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="0" title="男" {if condition="$user['sex'] eq 0"} checked {/if}>
|
||||
<input type="radio" name="sex" value="1" title="女" {if condition="$user['sex'] eq 1"} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('submit(user-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('user.user/edit')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("user-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
<script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
428
app/admin/view/user/user/index.html
Normal file
@ -0,0 +1,428 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>用户管理</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" action="">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">ID</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请输入" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">用户名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="name" placeholder="" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="sex">
|
||||
<option value="">不限</option>
|
||||
<option value="0">男</option>
|
||||
<option value="1">女</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">邮箱</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="email" placeholder="" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="status">
|
||||
<option value="">选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="-1">禁止</option>
|
||||
<option value="0">待审</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="user-query">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
查询
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-md">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="user-table" lay-filter="user-table"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="user-toolbar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
|
||||
<i class="layui-icon layui-icon-add-1"></i>
|
||||
新增
|
||||
</button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-md" lay-event="batchRemove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
删除
|
||||
</button>
|
||||
</script>
|
||||
<script type="text/html" id="imgTpl">
|
||||
<img src= {{=d.avatar}} style="width: 30px; height: 30px;" />
|
||||
</script>
|
||||
<script type="text/html" id="user-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="user-enable">
|
||||
<input type="checkbox" name="enable" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="user-enable" {{ d.check== 1 ? 'checked' : '' }} />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="buttonAuth">
|
||||
{{# if(d.id == '1'){ }}
|
||||
<input type="checkbox" name="auth" lay-skin="primary" checked disabled >
|
||||
{{# } else { }}
|
||||
{if condition="checkRuleButton('user.user/auth')"}<input type="checkbox" name="auth" lay-skin="primary" lay-filter="auth" {{# if(d.auth ==1){ }}checked value="0"{{# } else { }}value="1"{{# } }} id="{{d.id}}" >{else}<button class="layui-btn layui-btn-xs layui-btn-disabled">无权限</button>{/if}
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="user-sex">
|
||||
{{#if (d.sex == 1) { }}
|
||||
<span>男</span>
|
||||
{{# }else if(d.sex == 2){ }}
|
||||
<span>女</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="user-login">
|
||||
{{#if (d.login == 0) { }}
|
||||
<span>在线</span>
|
||||
{{# }else if(d.sex == 1){ }}
|
||||
<span>离线</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="user-createTime">
|
||||
{{layui.util.toDateString(d.createTime, 'yyyy-MM-dd')}}
|
||||
</script>
|
||||
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['table', 'form', 'jquery','common'], function() {
|
||||
let table = layui.table;
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let common = layui.common;
|
||||
|
||||
let MODULE_PATH = "operate/";
|
||||
|
||||
let cols = [
|
||||
[{
|
||||
type: 'checkbox'
|
||||
},
|
||||
{
|
||||
title: 'id',
|
||||
field: 'id',
|
||||
align: 'center',
|
||||
width: 60
|
||||
},
|
||||
{
|
||||
title: '头像',
|
||||
field: 'avatar',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: '#imgTpl'
|
||||
},
|
||||
{
|
||||
title: '账号',
|
||||
field: 'username',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
title: '昵称',
|
||||
field: 'nick',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '性别',
|
||||
field: 'sex',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: '#user-sex'
|
||||
},
|
||||
{
|
||||
title: '电话',
|
||||
field: 'phone',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '邮箱',
|
||||
field: 'email',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: 'IP',
|
||||
field: 'ip',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '城市',
|
||||
field: 'city',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '登录时间',
|
||||
field: 'logintime',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
title: '启用',
|
||||
field: 'check',
|
||||
align: 'center',
|
||||
width: 95,
|
||||
templet: '#user-enable'
|
||||
},
|
||||
{
|
||||
title: '登录',
|
||||
field: 'login',
|
||||
align: 'center',
|
||||
templet: '#user-login'
|
||||
},
|
||||
{
|
||||
title: '超级管理',
|
||||
field: 'auth',
|
||||
align: 'center',
|
||||
templet: '#buttonAuth'
|
||||
},
|
||||
{
|
||||
title: '注册',
|
||||
field: 'jointime',
|
||||
align: 'center',
|
||||
templet: '#user-createTime'
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
toolbar: '#user-bar',
|
||||
align: 'center',
|
||||
width: 130
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
table.render({
|
||||
elem: '#user-table',
|
||||
url: "{:url('user.user/list')}",
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line',
|
||||
toolbar: '#user-toolbar',
|
||||
defaultToolbar: [{
|
||||
title: '刷新',
|
||||
layEvent: 'refresh',
|
||||
icon: 'layui-icon-refresh',
|
||||
}, 'filter', 'print', 'exports']
|
||||
});
|
||||
|
||||
table.on('tool(user-table)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
table.on('toolbar(user-table)', function(obj) {
|
||||
if (obj.event === 'add') {
|
||||
window.add();
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh();
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
window.batchRemove(obj);
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(user-query)', function(data) {
|
||||
table.reload('user-table', {
|
||||
where: data.field
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
form.on('switch(user-enable)', function(obj) {
|
||||
layer.tips(this.value + ' ' + this.name + ':' + obj.elem.checked, obj.othis);
|
||||
var status = obj.elem.checked ? 1 : -1;
|
||||
//执行用户审核
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('user.user/check')}",
|
||||
data:{"id":this.value,"status":status},
|
||||
dataType:'json',
|
||||
success:function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg,{
|
||||
icon:res.icon,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'审核失败',
|
||||
content:res.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
//超级管理auth控制
|
||||
form.on('checkbox(auth)', function(data){
|
||||
var data = data.elem;
|
||||
var auth = data.checked ? 1 : 0;
|
||||
$.ajax({
|
||||
type:'post',
|
||||
url:"{:url('user.user/auth')}",
|
||||
data:{"id":data.id,"auth":auth},
|
||||
dataType:'json',
|
||||
success:function(data){
|
||||
if(data.code == 0){
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
}
|
||||
//,function(){location.reload();}
|
||||
);
|
||||
} else {
|
||||
layer.open({
|
||||
title:'修改失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
adim:6
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
|
||||
});
|
||||
|
||||
window.add = function() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '新增',
|
||||
shade: 0.1,
|
||||
area: [common.isModile()?'100%':'500px', common.isModile()?'100%':'450px'],
|
||||
content: 'add.html'
|
||||
});
|
||||
}
|
||||
|
||||
window.edit = function(obj) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['500px', '450px'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除该用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('user.user/delete')}?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.batchRemove = function(obj) {
|
||||
|
||||
var checkIds = common.checkField(obj,'id');
|
||||
console.log(checkIds)
|
||||
if (checkIds === "") {
|
||||
layer.msg("未选中数据", {
|
||||
icon: 3,
|
||||
time: 1000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
layer.confirm('确定要删除这些用户', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('user.user/delete')}",
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
data:{"id":checkIds},
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.success) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
table.reload('user-table');
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
window.refresh = function(param) {
|
||||
table.reload('user-table');
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
108
app/admin/view/user/user/profile.html
Normal file
@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>头像上传</title>
|
||||
<link rel="stylesheet" href="../../../component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-xs9">
|
||||
<div style="height:325px;background-color: rgb(247, 247, 247);">
|
||||
<img id="sourceImage" src="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs3" style="padding-left:0px;">
|
||||
<div id="previewImage" style="width:210px;height:210px;border: 1px solid rgb(200, 200, 200);border-radius: 50%;overflow:hidden;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-row">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-inline layui-btn-container" style="width: auto;vertical-align:top;">
|
||||
<button class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-left" cropper-event="rotate" data-option="-15" title="左旋15°"></button>
|
||||
<button class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-right" cropper-event="rotate" data-option="15" title="右旋15°"></button>
|
||||
<button class="pear-btn pear-btn-sm pear-btn-danger layui-icon layui-icon-refresh" cropper-event="reset" title="重置"></button>
|
||||
<label for="uploadPicture" class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-upload" title="选择图片"></label>
|
||||
<input class="layui-upload-file" id="uploadPicture" type="file" value="选择图片">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">建议:图片的尺寸宽高比为1:1,大小在5m以内。</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="../../../component/layui/layui.js"></script>
|
||||
<script src="../../../component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['jquery','layer','cropper'], function () {
|
||||
let $ = layui.jquery;
|
||||
let layer = layui.layer;
|
||||
let cropper = layui.cropper;
|
||||
|
||||
var options = {
|
||||
aspectRatio: 1 / 1, // 裁剪框比例
|
||||
preview: '#previewImage', // 预览div
|
||||
viewmode: 1
|
||||
};
|
||||
|
||||
$("#sourceImage").attr("src", parent.layui.$("#userAvatar").attr("src"));
|
||||
$("#sourceImage").cropper(options);
|
||||
|
||||
window.submitForm = function () {
|
||||
$("#sourceImage").crossOrigin = 'anonymous';//解决跨域图片问题
|
||||
$("#sourceImage").cropper("getCroppedCanvas", {
|
||||
width: 280,
|
||||
height: 140
|
||||
}).toBlob(function (blob) {
|
||||
var timeStamp = Date.parse(new Date());
|
||||
var fileName = timeStamp + '.jpg';
|
||||
var formData = new FormData();
|
||||
formData.append('file', blob, fileName);
|
||||
formData.append('fileName', fileName);
|
||||
formData.append('fileToken', timeStamp);
|
||||
|
||||
var reader = new FileReader();
|
||||
reader.readAsDataURL(blob);
|
||||
reader.onload = function (e) {
|
||||
var data={
|
||||
index:parent.layer.getFrameIndex(window.name),
|
||||
newAvatar : e.target.result
|
||||
};
|
||||
console.log(data);
|
||||
parent.window.callback(data);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
$(".pear-btn").on('click', function () {
|
||||
var event = $(this).attr("cropper-event");
|
||||
|
||||
if (event === 'rotate') {
|
||||
var option = $(this).attr('data-option');
|
||||
$("#sourceImage").cropper('rotate', option);
|
||||
} else if (event === 'reset') {
|
||||
$("#sourceImage").cropper('reset');
|
||||
}
|
||||
|
||||
$("#uploadPicture").change(function () {
|
||||
var r = new FileReader();
|
||||
var f = this.files[0];
|
||||
|
||||
var uploadFileSize = f.size / 1024;
|
||||
if (uploadFileSize > 5120) {
|
||||
parent.layer.msg("上传文件不得超过5m", { icon: 5 });
|
||||
return false;
|
||||
}
|
||||
|
||||
r.readAsDataURL(f);
|
||||
r.onload = function (e) {
|
||||
$("#sourceImage")
|
||||
.cropper('destroy')
|
||||
.attr('src', this.result)
|
||||
.cropper(options);
|
||||
};
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
97
app/admin/view/user/vip/edit.html
Normal file
@ -0,0 +1,97 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>修改页面</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" action="">
|
||||
<div class="mainBox">
|
||||
<div class="main-container">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$vip.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">Vip级别</label>
|
||||
<div class="layui-input-inline" >
|
||||
<select name="vip">
|
||||
{volist name="level" id="vo"}
|
||||
<option {if condition="$vip.vip eq $vo"} selected {/if} value="{$vo}">{if condition="$vo eq 0"}普通{else /}VIP{$vo}{/if}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">积分区间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="score" lay-verify="required" placeholder="积分区间:0-99" autocomplete="off" class="layui-input" value="{$vip.score}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">认证</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="nick" lay-verify="required" placeholder="等级昵称" autocomplete="off" class="layui-input" value="{$vip.nick}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权限</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="rules" lay-verify="" placeholder="请选择" autocomplete="off" class="layui-input" value="{$vip.rules}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-save">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
<button type="reset" class="pear-btn pear-btn-sm">
|
||||
<i class="layui-icon layui-icon-refresh"></i>
|
||||
重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['form', 'jquery'], function() {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
|
||||
form.on('submit(user-save)', function(data) {
|
||||
$.ajax({
|
||||
url: "{:url('user.vip/edit')}",
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'post',
|
||||
success: function(result) {
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window
|
||||
.name)); //关闭当前页
|
||||
parent.layui.table.reload("vip-table");
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
return false;
|
||||
});
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
182
app/admin/view/user/vip/index.html
Normal file
@ -0,0 +1,182 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>用户VIP</title>
|
||||
<link rel="stylesheet" href="/static/component/pear/css/pear.css" />
|
||||
<script src="/static/component/layui/layui.js"></script>
|
||||
</head>
|
||||
<body class="pear-container">
|
||||
<div class="layui-fluid" id="component-tabs">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="server-tabs-brief">
|
||||
<ul class="layui-tab-title">
|
||||
{if hook('signstatushook') == 1}
|
||||
<li class="layui-this" lay-id="score">签到规则</li>
|
||||
{/if}
|
||||
<li lay-id="vip" class="{if hook('signstatushook') == 0} layui-this {/if}">用户等级</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
|
||||
{:hook('signadminhook')}
|
||||
|
||||
<div class="layui-tab-item {if hook('signstatushook') == 0}layui-show{/if}">
|
||||
<div class="layui-tab-content" style="padding: 20px 0;">
|
||||
<div class="layui-form">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">用户积分</label>
|
||||
<div class="layui-input-inline" style="width: 120px;">
|
||||
<select name="vip">
|
||||
<option value="0">普通</option>
|
||||
<option value="1">VIP1</option>
|
||||
<option value="2">VIP2</option>
|
||||
<option value="3">VIP3</option>
|
||||
<option value="4">VIP4</option>
|
||||
<option value="5">VIP5</option>
|
||||
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="tel" name="score" lay-verify="required" placeholder="积分区间:0-99" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="tel" name="nick" lay-verify="required" placeholder="认证名称" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="submit" class="pear-btn pear-btn-primary" lay-submit lay-filter="vip-rule-submit" id="vip-rule-submit" value="立即提交">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<table id="vip-rule" lay-filter="vip-rule"></table>
|
||||
<script type="text/html" id="vip-rule-bar">
|
||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i></button>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/static/component/pear/pear.js"></script>
|
||||
<script>
|
||||
layui.use(['element','jquery','table','form'], function(){
|
||||
var $ = layui.jquery
|
||||
,element = layui.element
|
||||
,table = layui.table
|
||||
,form = layui.form;
|
||||
|
||||
let VIP_RULE = "{:url('user.vip/list')}";
|
||||
|
||||
//Vip规则
|
||||
table.render({
|
||||
elem: '#vip-rule',
|
||||
url: VIP_RULE,
|
||||
cols:[[
|
||||
{type: 'numbers', fixed: 'left'},
|
||||
{field: 'vip',title: '等级'},
|
||||
{field: 'score',title: '积分'},
|
||||
{field: 'nick',title: '认证'},
|
||||
{field: 'rules',title: '权限'},
|
||||
{field: 'ctime',title: '时间'},
|
||||
{title: '操作', width: 150, align:'center', toolbar: '#vip-rule-bar'}
|
||||
|
||||
]]
|
||||
,page: true
|
||||
,limit: 10
|
||||
,height: 'full-220'
|
||||
,text: '对不起,加载出现异常!'
|
||||
});
|
||||
|
||||
table.on('tool(vip-rule)', function(obj) {
|
||||
if (obj.event === 'remove') {
|
||||
window.remove(obj);
|
||||
} else if (obj.event === 'edit') {
|
||||
window.edit(obj);
|
||||
}
|
||||
});
|
||||
|
||||
//添加VIP规则
|
||||
form.on('submit(vip-rule-submit)',function(data){
|
||||
var field = data.field;
|
||||
$.ajax({
|
||||
type:"post",
|
||||
url:"{:url('user.vip/add')}",
|
||||
data:field,
|
||||
daType:"json",
|
||||
success:function (data){
|
||||
if (data.code == 0) {
|
||||
layer.msg(data.msg,{
|
||||
icon:6,
|
||||
time:2000
|
||||
}, function(){
|
||||
table.reload('vip-rule'); //数据刷新
|
||||
});
|
||||
} else {
|
||||
layer.open({
|
||||
title:'添加失败',
|
||||
content:data.msg,
|
||||
icon:5,
|
||||
anim:6
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
window.edit = function(obj) {
|
||||
console.log(obj)
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['450px', '400px'],
|
||||
content: 'edit.html?id=' + obj.data.id
|
||||
});
|
||||
}
|
||||
|
||||
window.remove = function(obj) {
|
||||
|
||||
layer.confirm('确定要删除?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
layer.close(index);
|
||||
let loading = layer.load();
|
||||
$.ajax({
|
||||
url: "{:url('user.vip/delete')}?id=" + obj.data['id'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function(result) {
|
||||
layer.close(loading);
|
||||
if (result.code === 0) {
|
||||
layer.msg(result.msg, {
|
||||
icon: 1,
|
||||
time: 1000
|
||||
}, function() {
|
||||
obj.del();
|
||||
});
|
||||
} else {
|
||||
layer.msg(result.msg, {
|
||||
icon: 2,
|
||||
time: 1000
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
37
app/admin/view/user/vip/signedit1.html
Normal file
@ -0,0 +1,37 @@
|
||||
{extend name="public/base" /}
|
||||
|
||||
{block name="body"}
|
||||
|
||||
<div class="layui-form" lay-filter="layuiadmin-form-useradmin" id="layuiadmin-form-useradmin" style="padding: 20px 30px 0 0;">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="text" name="id" class="layui-input" value="{$sign.id}">
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">签到天数</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="days" disabled lay-verify="required" placeholder="请输入天数" autocomplete="off" class="layui-input layui-disabled" value="{$sign.days}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">获得积分</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="score" lay-verify="required" placeholder="请输入号码" autocomplete="off" class="layui-input" value="{$sign.score}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-hide">
|
||||
<input type="button" lay-submit lay-filter="LAY-user-sign-submit" id="LAY-user-sign-submit" value="确认">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
layui.config({
|
||||
base: '/static/admin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index'], function(){
|
||||
var $ = layui.$;
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -215,22 +215,24 @@ function array_child_append($parent, $pid, $child, $child_key_name)
|
||||
}
|
||||
|
||||
//菜单无限极分类
|
||||
function getTree($data, $pId='0')
|
||||
function getTree($data, $pId = 0)
|
||||
{
|
||||
// 递归
|
||||
$tree = [];
|
||||
foreach ($data as $k => $v) {
|
||||
if ($v['pid'] == $pId) {
|
||||
if ((int) $v['pid'] == $pId) {
|
||||
$child = getTree($data, $v['id']);
|
||||
if(!empty($child)) {
|
||||
$v['children'] = $child;
|
||||
}
|
||||
$tree[] = $v;
|
||||
//把这个节点从数组中移除,减少后续递归消耗
|
||||
unset($data[$k]);
|
||||
}
|
||||
}
|
||||
// 排序
|
||||
$cmf_arr = array_column($tree, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $tree);
|
||||
// 包含sort字段才能排序
|
||||
// $cmf_arr = array_column($tree, 'sort');
|
||||
// array_multisort($cmf_arr, SORT_ASC, $tree);
|
||||
return $tree;
|
||||
}
|
||||
|
||||
|
@ -17,12 +17,16 @@ use think\facade\View;
|
||||
use think\facade\Db;
|
||||
use taoser\think\Auth;
|
||||
use taoler\com\Files;
|
||||
use think\facade\Lang;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
*/
|
||||
class AdminController extends \app\BaseController
|
||||
{
|
||||
|
||||
protected $aid = '';
|
||||
|
||||
/**
|
||||
* 初始化菜单
|
||||
*/
|
||||
@ -34,6 +38,46 @@ class AdminController extends \app\BaseController
|
||||
$this->getIndexUrl();
|
||||
}
|
||||
|
||||
/**
|
||||
* 菜单无限极分类
|
||||
*
|
||||
* @param array $data 包含有pid的rule权限数组
|
||||
* @param integer $pId 父ID
|
||||
* @return array
|
||||
*/
|
||||
public function getRuleTree(array $data, int $pId = 0): array
|
||||
{
|
||||
// 递归
|
||||
$tree = [];
|
||||
foreach ($data as $k => $v) {
|
||||
//第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
|
||||
if ($v['pid'] == $pId) {
|
||||
$child = $this->getRuleTree($data, $v['id']);
|
||||
// 有子类
|
||||
if(!empty($child)) {
|
||||
// foreach($child as $m => $n) {
|
||||
// $v['children'][$m] = $n;
|
||||
// //$v['children'][$m]['type'] = 1;
|
||||
// //$v['children'][$m]['openType'] = '_iframe';
|
||||
// }
|
||||
$v['type'] = $v['pid'] == 0 ? 0 : $v['ismenu'];
|
||||
$v['children'] = $child;
|
||||
} else {
|
||||
// 没有子菜单type=1
|
||||
$v['type'] = 1;
|
||||
$v['openType'] = '_iframe';
|
||||
}
|
||||
|
||||
//把数组放到$tree中
|
||||
$tree[] = $v;
|
||||
//把这个节点从数组中移除,减少后续递归消耗
|
||||
unset($data[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
return $tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取侧边栏菜单
|
||||
*/
|
||||
@ -67,14 +111,20 @@ class AdminController extends \app\BaseController
|
||||
* 获取角色菜单
|
||||
* $type 1 admin后端权限,2 index前端权限
|
||||
*/
|
||||
protected function getMenus($type)
|
||||
protected function getRoleMenu($type)
|
||||
{
|
||||
$menu = [];
|
||||
$auth_rule_list = Db::name('auth_rule')->where(['delete_time'=> 0, 'status'=> 1,'type'=> $type])->select();
|
||||
//var_export($auth_rule_list);
|
||||
|
||||
$auth_rule_list = Db::name('auth_rule')->field('id,pid,title,sort,level')->where(['delete_time'=> 0, 'status'=> 1,'type'=> $type])->select()->toArray();
|
||||
// 排序
|
||||
$cmf_arr = array_column($auth_rule_list, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $auth_rule_list);
|
||||
foreach ($auth_rule_list as $value) {
|
||||
$menu[] = $value;
|
||||
$menu[] = [
|
||||
'id' => $value['id'],
|
||||
'pid' => $value['pid'],
|
||||
'title' => Lang::get($value['title']),
|
||||
'level' => $value['level']
|
||||
];
|
||||
}
|
||||
return !empty($menu) ? getTree($menu) : [];
|
||||
}
|
||||
@ -91,6 +141,8 @@ class AdminController extends \app\BaseController
|
||||
Files::delDirAndFile($cache);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
*/
|
||||
namespace app\common\model;
|
||||
|
||||
use think\facade\Lang;
|
||||
use think\Model;
|
||||
use think\model\concern\SoftDelete;
|
||||
|
||||
@ -59,12 +60,13 @@ class Cate extends Model
|
||||
// 分类表
|
||||
public function getList()
|
||||
{
|
||||
$data = $this->field('sort,id,pid,catename,ename,detpl,icon,appname,is_hot,desc')->where(['status'=>1])->select()->toArray();
|
||||
// 排序
|
||||
$cmf_arr = array_column($data, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $data);
|
||||
$data = $this->field('id,pid,sort,catename,ename,detpl,icon,appname,is_hot,desc')->where(['status'=>1])->select()->toArray();
|
||||
|
||||
if(count($data)) {
|
||||
return json(['code'=>0,'msg'=>'ok','data'=>$data]);
|
||||
// 排序
|
||||
$cmf_arr = array_column($data, 'sort');
|
||||
array_multisort($cmf_arr, SORT_ASC, $data);
|
||||
return json(['code'=>0,'msg'=>'ok', 'count' => count($data),'data'=>$data]);
|
||||
} else {
|
||||
return json(['code'=>-1,'msg'=>'no data','data'=>'']);
|
||||
}
|
||||
|
@ -33,8 +33,8 @@ class Auth
|
||||
// var_dump(Request::url(),Request::pathinfo(),$request->baseUrl(),$request->controller());
|
||||
//访问路径
|
||||
// $path = app('http')->getName().'/'.stristr($request->pathinfo(),".html",true);
|
||||
$path = stristr($request->pathinfo(),".html",true);
|
||||
|
||||
$path = stristr($request->pathinfo(),".html",true) ?: Request::pathinfo();
|
||||
// var_dump($path);
|
||||
//登陆前获取加密的Cookie
|
||||
$cooAuth = Cookie::get('adminAuth');
|
||||
|
||||
@ -81,15 +81,18 @@ class Auth
|
||||
// 排除公共权限
|
||||
$not_check = [
|
||||
'captcha',
|
||||
'admin/index',
|
||||
'index/index',
|
||||
'menu/getMenuNavbar',
|
||||
'login/index',
|
||||
'admin/index',
|
||||
'system.menu/getnav',
|
||||
'index/index',
|
||||
'index/console1',
|
||||
'index/console2',
|
||||
'index/news',
|
||||
'menu/getMenuNavbar',
|
||||
'index/home',
|
||||
'Admin/info',
|
||||
'Admin/repass',
|
||||
'Admin/logout',
|
||||
'Index/news',
|
||||
'system.admin/repass',
|
||||
'system.admin/logout',
|
||||
'Index/cunsult',
|
||||
'Index/replys',
|
||||
'Index/reply',
|
||||
|
557
public/static/admin/css/admin.css
Normal file
@ -0,0 +1,557 @@
|
||||
html,
|
||||
body,
|
||||
.layui-layout {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header,
|
||||
.pear-admin .layui-body,
|
||||
.pear-admin .layui-logo,
|
||||
.pear-admin .layui-side,
|
||||
.pear-admin .layui-header .layui-layout-left {
|
||||
transition: all .3s;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side {
|
||||
top: 60px!important;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side .layui-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-logo {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side .layui-side-scroll {
|
||||
height: 100%!important;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side .layui-side-scroll {
|
||||
height: 100%!important;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header.dark-theme .layui-layout-control .layui-this *{
|
||||
background-color: rgba(0,0,0,.1)!important;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header {
|
||||
z-index: 99999;
|
||||
width: 100%;
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-layout-left {
|
||||
left: 230px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-logo .title {
|
||||
top: 2px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-layout-control {
|
||||
display: inline-block;
|
||||
left: 370px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header.dark-theme {
|
||||
box-shadow: 2px 0 6px rgb(0 21 41 / 35%);
|
||||
}
|
||||
|
||||
.pear-admin .layui-header .layui-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-admin .layui-logo .title {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-layout-right .layui-nav-child {
|
||||
border: 1px solid whitesmoke;
|
||||
border-radius: 4px;
|
||||
width: auto;
|
||||
left: auto;
|
||||
right: -23px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header {
|
||||
left: 230px;
|
||||
width: calc(100% - 230px);
|
||||
background-color: white;
|
||||
border-bottom: 1px solid whitesmoke;
|
||||
}
|
||||
|
||||
.pear-admin .layui-layout-control {
|
||||
left: 140px;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.pear-admin .layui-layout-control .layui-nav {
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-logo {
|
||||
width: 230px;
|
||||
height: 59px;
|
||||
line-height: 59px;
|
||||
position: relative;
|
||||
background-color: #28333E;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, .12);
|
||||
}
|
||||
|
||||
.pear-admin .layui-logo img {
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-logo .title {
|
||||
font-size: 21px;
|
||||
font-weight: 550;
|
||||
color: #5FB878;
|
||||
position: relative;
|
||||
top: 5px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-logo .logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-admin .layui-side {
|
||||
top: 0px;
|
||||
width: 230px;
|
||||
box-shadow: 2px 0 6px rgba(0, 21, 41, .20);
|
||||
z-index: 9999;
|
||||
}
|
||||
|
||||
.pear-admin .layui-side-scroll::-webkit-scrollbar {
|
||||
width: 0px;
|
||||
height: 0px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-side-scroll {
|
||||
height: calc(100% - 60px) !important;
|
||||
background-color: #28333E;
|
||||
width: 247px;
|
||||
|
||||
}
|
||||
|
||||
.pear-admin .layui-header .layui-nav .layui-nav-item>a {
|
||||
color: black;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-body {
|
||||
left: 230px;
|
||||
bottom: 0px;
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-layout-left {
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-footer {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
left: 230px;
|
||||
background: #fff;
|
||||
border-top: 1px solid #F2F2F2;
|
||||
box-shadow: none;
|
||||
-webkit-transition: left .3s;
|
||||
transition: left .3s;
|
||||
overflow: hidden;
|
||||
color: #3c3c3cb3;
|
||||
font-weight: 300;
|
||||
font-size: 13.6px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-footer.close {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/** 收缩布局 */
|
||||
.pear-mini .layui-side .layui-logo .title {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-mini .layui-side .layui-logo .logo {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.pear-mini .layui-side {
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-header {
|
||||
left: 60px;
|
||||
width: calc(100% - 60px);
|
||||
}
|
||||
|
||||
.pear-mini .layui-body {
|
||||
left: 60px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-side .layui-logo {
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-footer {
|
||||
left: 60px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-nav-tree .layui-nav-item span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-mini .bottom-nav li {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.pear-mini .layui-side-scroll {
|
||||
height: calc(100% - 60px);
|
||||
}
|
||||
|
||||
.pear-admin .layui-header .layui-nav .layui-nav-bar {
|
||||
top: 0px !important;
|
||||
height: 2px !important;
|
||||
background-color: #5FB878;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header .layui-nav .layui-this:after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header .layui-nav-more {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-collapsed-pe {
|
||||
display: none;
|
||||
width: 50px;
|
||||
position: absolute;
|
||||
z-index: 400000;
|
||||
bottom: 30px;
|
||||
right: 30px;
|
||||
background-color: #5FB878 !important;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
text-align: center;
|
||||
border-radius: 50px;
|
||||
box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
|
||||
}
|
||||
|
||||
.pear-collapsed-pe a {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
.layui-hide-sm {
|
||||
display: inline-block !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 769px) {
|
||||
.layui-hide-sm {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/** 新增兼容 */
|
||||
@media screen and (max-width:768px) {
|
||||
.collapse {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.pear-collapsed-pe {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
.layui-layout-control {
|
||||
left: 45px !important;
|
||||
}
|
||||
|
||||
.layui-layout-left {
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.pear-mini .bottom-nav {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-mini .layui-side-scroll {
|
||||
height: calc(100% - 62px);
|
||||
}
|
||||
|
||||
.pear-mini .layui-side {
|
||||
width: 0px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-header {
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.pear-mini .layui-body {
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-footer {
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-logo {
|
||||
width: 0px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-body {
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header {
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.pear-admin .pear-cover {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #1E1E1E;
|
||||
display: block;
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
opacity: 0;
|
||||
margin-top: -60px;
|
||||
}
|
||||
|
||||
.pear-mini .pear-cover {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes am-horizontal-roll_show {
|
||||
0% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateX(2000px);
|
||||
transform: translateX(2000px)
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateX(0);
|
||||
transform: translateX(0)
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes am-horizontal-roll_show {
|
||||
0% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateX(800px);
|
||||
-ms-transform: translateX(800px);
|
||||
transform: translateX(800px)
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateX(0);
|
||||
-ms-transform: translateX(0);
|
||||
transform: translateX(0)
|
||||
}
|
||||
}
|
||||
|
||||
.layer-anim-right {
|
||||
-webkit-animation: am-horizontal-roll_show .6s ease-out;
|
||||
animation: am-horizontal-roll_show .6s ease-out;
|
||||
|
||||
}
|
||||
|
||||
/** 侧边主题 (亮) */
|
||||
.light-theme.layui-side {
|
||||
box-shadow: 2px 0 8px 0 rgba(29, 35, 41, .05) !important;
|
||||
}
|
||||
|
||||
.light-theme.layui-side .layui-logo {
|
||||
background-color: white !important;
|
||||
color: black !important;
|
||||
border-bottom: 1px whitesmoke solid;
|
||||
}
|
||||
|
||||
.light-theme.layui-side .layui-side-scroll {
|
||||
background-color: white !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.dark-theme.layui-header {
|
||||
border-bottom: none;
|
||||
background-color: #28333E;
|
||||
color: whitesmoke;
|
||||
}
|
||||
|
||||
.dark-theme.layui-header li>a{
|
||||
color: whitesmoke!important;
|
||||
}
|
||||
|
||||
.dark-theme.layui-header .layui-logo {
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/** 顶部主题 (白) */
|
||||
.light-theme.layui-header .layui-logo {
|
||||
background-color: white;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/** 主题面板 */
|
||||
.pearone-color .set-text {
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
}
|
||||
|
||||
.pearone-color .color-title {
|
||||
padding: 15px 0 0px 20px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.pearone-color .color-content {
|
||||
padding: 15px 10px 0 20px;
|
||||
}
|
||||
|
||||
.pearone-color .color-content ul {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.pearone-color .color-content ul li {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
width: 70px;
|
||||
height: 50px;
|
||||
margin: 0 20px 20px 0;
|
||||
padding: 2px 2px 2px 2px;
|
||||
background-color: #f2f2f2;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.pearone-color .color-content li.layui-this:after,
|
||||
.pearone-color .color-content li:hover:after {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 4px;
|
||||
top: -5px;
|
||||
left: -5px;
|
||||
border: #5FB878 2px solid;
|
||||
opacity: 1;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.pearone-color .color-content li:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
z-index: 20;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 1px;
|
||||
height: 0;
|
||||
border: 2px solid #F2F2F2;
|
||||
transition: all .3s;
|
||||
-webkit-transition: all .3s;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.select-color {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.select-color .select-color-title {
|
||||
padding: 15px 0 0px 20px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.select-color .select-color-content {
|
||||
padding: 20px 0 0px 0px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.select-color .select-color-content .select-color-item {
|
||||
background-color: gray;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border-radius: 3px;
|
||||
float: left;
|
||||
margin-left: 20px;
|
||||
color: white;
|
||||
font-size: 18px;
|
||||
text-align: center;
|
||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .15);
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.message .layui-tab-title li:not(:last-child) {
|
||||
border-right: 1px solid #eee;
|
||||
}
|
||||
|
||||
/* 搜索面板 */
|
||||
.menu-search-content .layui-input {
|
||||
padding-left: 30px;
|
||||
}
|
||||
|
||||
.menu-search-content {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.menu-search-input-wrapper {
|
||||
width: 100%;
|
||||
padding: 15px 15px;
|
||||
}
|
||||
|
||||
.menu-search-no-data {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 122px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.menu-search-list {
|
||||
width: 100%;
|
||||
padding: 5px 15px;
|
||||
}
|
||||
|
||||
.menu-search-list li {
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: nowrap;
|
||||
height: 50px;
|
||||
margin-bottom: 8px;
|
||||
padding: 0px 10px;
|
||||
color: currentColor;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 1px 3px #d4d9e1;
|
||||
cursor: pointer;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.menu-search-list li:hover {
|
||||
background-color: #5FB878;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.menu-search-list li.this {
|
||||
background-color: #5FB878;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* 搜索面板结束 */
|
105
public/static/admin/css/loader.css
Normal file
@ -0,0 +1,105 @@
|
||||
.loader-main{
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: whitesmoke;
|
||||
z-index: 9999999;
|
||||
}
|
||||
.loader {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
margin: 30px auto 40px;
|
||||
margin-top: 20%;
|
||||
position: relative;
|
||||
z-index: 999999;
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
.loader:before {
|
||||
content: "";
|
||||
width: 50px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: #000;
|
||||
opacity: 0.1;
|
||||
position: absolute;
|
||||
top: 59px;
|
||||
left: 0;
|
||||
animation: shadow .5s linear infinite;
|
||||
}
|
||||
.loader:after {
|
||||
content: "";
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
border-radius: 3px;
|
||||
background-color: #5FB878;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
animation: loading .5s linear infinite;
|
||||
}
|
||||
@-webkit-keyframes loading {
|
||||
17% {
|
||||
border-bottom-right-radius: 3px;
|
||||
}
|
||||
|
||||
25% {
|
||||
transform: translateY(9px) rotate(22.5deg);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: translateY(18px) scale(1, 0.9) rotate(45deg);
|
||||
border-bottom-right-radius: 40px;
|
||||
}
|
||||
|
||||
75% {
|
||||
transform: translateY(9px) rotate(67.5deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateY(0) rotate(90deg);
|
||||
}
|
||||
}
|
||||
@keyframes loading {
|
||||
17% {
|
||||
border-bottom-right-radius: 3px;
|
||||
}
|
||||
|
||||
25% {
|
||||
transform: translateY(9px) rotate(22.5deg);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: translateY(18px) scale(1, 0.9) rotate(45deg);
|
||||
border-bottom-right-radius: 40px;
|
||||
}
|
||||
|
||||
75% {
|
||||
transform: translateY(9px) rotate(67.5deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateY(0) rotate(90deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes shadow {
|
||||
|
||||
0%,
|
||||
100% {
|
||||
transform: scale(1, 1);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: scale(1.2, 1);
|
||||
}
|
||||
}
|
||||
@keyframes shadow {
|
||||
|
||||
0%,
|
||||
100% {
|
||||
transform: scale(1, 1);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: scale(1.2, 1);
|
||||
}
|
||||
}
|
141
public/static/admin/css/other/console1.css
Normal file
@ -0,0 +1,141 @@
|
||||
.top-panel {
|
||||
border-radius: 4px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.top-panel>.layui-card-body {
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
.top-panel-number {
|
||||
line-height: 60px;
|
||||
font-size: 29px;
|
||||
border-right: 1px solid #eceff9;
|
||||
}
|
||||
|
||||
.top-panel-tips {
|
||||
padding-left: 8px;
|
||||
padding-top: 16px;
|
||||
line-height: 30px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.pear-container {
|
||||
background-color: whitesmoke;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.card {
|
||||
width: 100%;
|
||||
height: 160px;
|
||||
background-color: whitesmoke;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.card .header .avatar {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
margin: 20px;
|
||||
border-radius: 50px;
|
||||
}
|
||||
|
||||
.card .header {
|
||||
color: dimgray;
|
||||
}
|
||||
|
||||
.card .body {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.card .body {
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.card .footer {
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
margin-top: 20px;
|
||||
font-size: 13px;
|
||||
color: gray;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.custom-tab .layui-tab-title {
|
||||
border-bottom-width: 0px;
|
||||
border-bottom-style: none;
|
||||
}
|
||||
|
||||
.custom-tab .layui-tab-title li {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
height: 31.8px;
|
||||
line-height: 31.8px;
|
||||
color: gray;
|
||||
padding: 5px;
|
||||
padding-left: 15px;
|
||||
border-radius: 4px;
|
||||
margin-top: 5.2px;
|
||||
}
|
||||
|
||||
.list .list-item:hover {
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
|
||||
.list .list-item .title {
|
||||
font-size: 13px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.list .list-item .footer {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.top-panel-tips i {
|
||||
font-size: 33px;
|
||||
}
|
||||
|
||||
.layuiadmin-card-status {
|
||||
padding: 0 10px 10px;
|
||||
}
|
||||
|
||||
.layuiadmin-card-status dd {
|
||||
padding: 15px 0;
|
||||
border-bottom: 1px solid #EEE;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.layuiadmin-card-status dd div.layui-status-img,
|
||||
.layuiadmin-card-team .layui-team-img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.layuiadmin-card-status dd div.layui-status-img a {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.layuiadmin-card-status dd div span {
|
||||
color: #BBB;
|
||||
}
|
||||
|
||||
.layuiadmin-card-status dd div a {
|
||||
color: #01AAED;
|
||||
}
|
||||
|
||||
.top-panel-tips svg {
|
||||
margin-top: -12px;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
121
public/static/admin/css/other/console2.css
Normal file
@ -0,0 +1,121 @@
|
||||
.pear-container {
|
||||
background-color: whitesmoke;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.pear-card {
|
||||
width: 100%;
|
||||
height: 66px;
|
||||
background-color: #F8F8F8;
|
||||
display: inline-block;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.pear-card:hover,
|
||||
.pear-card2:hover {
|
||||
box-shadow: 2px 0 8px 0 lightgray !important;
|
||||
}
|
||||
|
||||
.pear-card2 {
|
||||
width: 100%;
|
||||
height: 90px;
|
||||
background-color: #F8F8F8;
|
||||
display: inline-block;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.pear-card2 i {
|
||||
font-size: 30px;
|
||||
height: 90px;
|
||||
line-height: 90px;
|
||||
}
|
||||
|
||||
.pear-card i {
|
||||
font-size: 30px;
|
||||
height: 66px;
|
||||
line-height: 66px;
|
||||
}
|
||||
|
||||
.layui-col-md3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.pear-card-title {
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.person img {
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
border-radius: 4px;
|
||||
margin-top: 8px;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.pear-card2 .count {
|
||||
color: #51A351;
|
||||
font-size: 30px;
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.pear-card2 .title {
|
||||
color: gray;
|
||||
font-size: 14px;
|
||||
margin-top: 14px;
|
||||
}
|
||||
|
||||
.pear-card-status {
|
||||
padding: 0 10px 10px;
|
||||
}
|
||||
|
||||
.pear-card-status li {
|
||||
position: relative;
|
||||
padding: 10px 0;
|
||||
border-bottom: 1px solid #EEE;
|
||||
}
|
||||
|
||||
.pear-card-status li h3 {
|
||||
padding-bottom: 5px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.pear-card-status li p {
|
||||
padding-bottom: 10px;
|
||||
padding-top: 3px;
|
||||
}
|
||||
|
||||
.pear-card-status li>span {
|
||||
color: #999;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.pear-reply {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 12px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.person .title {
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
margin-left: 18px;
|
||||
margin-top: 16px;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.person .desc {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
margin-left: 115px;
|
||||
margin-top: -30px;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
}
|
6
public/static/admin/css/other/department.css
Normal file
@ -0,0 +1,6 @@
|
||||
.organizationTree {
|
||||
width: 100% !important;
|
||||
height: -webkit-calc(100vh - 130px);
|
||||
height: -moz-calc(100vh - 130px);
|
||||
height: calc(100vh - 130px);
|
||||
}
|
76
public/static/admin/css/other/error.css
Normal file
@ -0,0 +1,76 @@
|
||||
* {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 0.38rem;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
-webkit-tap-highlight-color: transparent
|
||||
}
|
||||
|
||||
.clearfix:after {
|
||||
content: '';
|
||||
width: 0;
|
||||
height: 0;
|
||||
display: block;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
html {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 0.28rem;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
background-color: white !important;
|
||||
}
|
||||
|
||||
.content {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.content>img {
|
||||
height: 300px;
|
||||
max-width: 370px;
|
||||
margin-right: 180px;
|
||||
}
|
||||
|
||||
.content>* {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.content-r {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.content-r>h1 {
|
||||
font-size: 72px;
|
||||
color: #434e59;
|
||||
margin-bottom: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.content-r>p {
|
||||
font-size: 20px;
|
||||
color: rgba(0, 0, 0, .45);
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
button {
|
||||
margin-top: 20px;
|
||||
}
|
531
public/static/admin/css/other/icon.css
Normal file
@ -0,0 +1,531 @@
|
||||
/* Logo 字体 */
|
||||
@font-face {
|
||||
font-family: "iconfont logo";
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-family: "iconfont logo";
|
||||
font-size: 160px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
/* tabs */
|
||||
.nav-tabs {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-more {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
#tabs {
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
#tabs li {
|
||||
cursor: pointer;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
border-bottom: 2px solid transparent;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
margin-bottom: -1px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
|
||||
#tabs .active {
|
||||
border-bottom-color: #f00;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.tab-container .content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* 页面布局 */
|
||||
.main {
|
||||
padding: 30px 100px;
|
||||
width: 960px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.main .logo {
|
||||
color: #333;
|
||||
text-align: left;
|
||||
margin-bottom: 30px;
|
||||
line-height: 1;
|
||||
height: 110px;
|
||||
margin-top: -50px;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.main .logo a {
|
||||
font-size: 160px;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.helps {
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.helps pre {
|
||||
padding: 20px;
|
||||
margin: 10px 0;
|
||||
border: solid 1px #e7e1cd;
|
||||
background-color: #fffdef;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.icon_lists {
|
||||
width: 100% !important;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.icon_lists li {
|
||||
width: 100px;
|
||||
margin-bottom: 10px;
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
list-style: none !important;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.icon_lists li .code-name {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.icon_lists .icon {
|
||||
display: block;
|
||||
height: 100px;
|
||||
line-height: 100px;
|
||||
font-size: 42px;
|
||||
margin: 10px auto;
|
||||
color: #333;
|
||||
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
-moz-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
transition: font-size 0.25s linear, width 0.25s linear;
|
||||
}
|
||||
|
||||
.icon_lists .icon:hover {
|
||||
font-size: 100px;
|
||||
}
|
||||
|
||||
.icon_lists .svg-icon {
|
||||
/* 通过设置 font-size 来改变图标大小 */
|
||||
width: 1em;
|
||||
/* 图标和文字相邻时,垂直对齐 */
|
||||
vertical-align: -0.15em;
|
||||
/* 通过设置 color 来改变 SVG 的颜色/fill */
|
||||
fill: currentColor;
|
||||
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
|
||||
normalize.css 中也包含这行 */
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.icon_lists li .name,
|
||||
.icon_lists li .code-name {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* markdown 样式 */
|
||||
.markdown {
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.markdown img {
|
||||
vertical-align: middle;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
color: #404040;
|
||||
font-weight: 500;
|
||||
line-height: 40px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown h2,
|
||||
.markdown h3,
|
||||
.markdown h4,
|
||||
.markdown h5,
|
||||
.markdown h6 {
|
||||
color: #404040;
|
||||
margin: 1.6em 0 0.6em 0;
|
||||
font-weight: 500;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
.markdown h2 {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.markdown h3 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.markdown h4 {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.markdown h5 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown h6 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown hr {
|
||||
height: 1px;
|
||||
border: 0;
|
||||
background: #e9e9e9;
|
||||
margin: 16px 0;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown>p,
|
||||
.markdown>blockquote,
|
||||
.markdown>.highlight,
|
||||
.markdown>ol,
|
||||
.markdown>ul {
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.markdown ul>li {
|
||||
list-style: circle;
|
||||
}
|
||||
|
||||
.markdown>ul li,
|
||||
.markdown blockquote ul>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown>ul li p,
|
||||
.markdown>ol li p {
|
||||
margin: 0.6em 0;
|
||||
}
|
||||
|
||||
.markdown ol>li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.markdown>ol li,
|
||||
.markdown blockquote ol>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown code {
|
||||
margin: 0 3px;
|
||||
padding: 0 5px;
|
||||
background: #eee;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.markdown strong,
|
||||
.markdown b {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0px;
|
||||
empty-cells: show;
|
||||
border: 1px solid #e9e9e9;
|
||||
width: 95%;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
white-space: nowrap;
|
||||
color: #333;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table th,
|
||||
.markdown>table td {
|
||||
border: 1px solid #e9e9e9;
|
||||
padding: 8px 16px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
background: #F7F7F7;
|
||||
}
|
||||
|
||||
.markdown blockquote {
|
||||
font-size: 90%;
|
||||
color: #999;
|
||||
border-left: 4px solid #e9e9e9;
|
||||
padding-left: 0.8em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown blockquote p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.markdown .anchor {
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.markdown .waiting {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.markdown h1:hover .anchor,
|
||||
.markdown h2:hover .anchor,
|
||||
.markdown h3:hover .anchor,
|
||||
.markdown h4:hover .anchor,
|
||||
.markdown h5:hover .anchor,
|
||||
.markdown h6:hover .anchor {
|
||||
opacity: 1;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.markdown>br,
|
||||
.markdown>p>br {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
background: white;
|
||||
padding: 0.5em;
|
||||
color: #333333;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-meta {
|
||||
color: #969896;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-strong,
|
||||
.hljs-emphasis,
|
||||
.hljs-quote {
|
||||
color: #df5000;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-type {
|
||||
color: #a71d5d;
|
||||
}
|
||||
|
||||
.hljs-literal,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-attribute {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.hljs-section,
|
||||
.hljs-name {
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.hljs-tag {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-attr,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo {
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.hljs-addition {
|
||||
color: #55a532;
|
||||
background-color: #eaffea;
|
||||
}
|
||||
|
||||
.hljs-deletion {
|
||||
color: #bd2c00;
|
||||
background-color: #ffecec;
|
||||
}
|
||||
|
||||
.hljs-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: black;
|
||||
background: none;
|
||||
text-shadow: 0 1px white;
|
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
line-height: 1.5;
|
||||
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::-moz-selection,
|
||||
pre[class*="language-"] ::-moz-selection,
|
||||
code[class*="language-"]::-moz-selection,
|
||||
code[class*="language-"] ::-moz-selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection,
|
||||
pre[class*="language-"] ::selection,
|
||||
code[class*="language-"]::selection,
|
||||
code[class*="language-"] ::selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*="language-"] {
|
||||
padding: 1em;
|
||||
margin: .5em 0;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
:not(pre)>code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
background: #f5f2f0;
|
||||
}
|
||||
|
||||
/* Inline code */
|
||||
:not(pre)>code[class*="language-"] {
|
||||
padding: .1em;
|
||||
border-radius: .3em;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: slategray;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.namespace {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.tag,
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.deleted {
|
||||
color: #905;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.attr-name,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin,
|
||||
.token.inserted {
|
||||
color: #690;
|
||||
}
|
||||
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string {
|
||||
color: #9a6e3a;
|
||||
background: hsla(0, 0%, 100%, .5);
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value,
|
||||
.token.keyword {
|
||||
color: #07a;
|
||||
}
|
||||
|
||||
.token.function,
|
||||
.token.class-name {
|
||||
color: #DD4A68;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important,
|
||||
.token.variable {
|
||||
color: #e90;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
100
public/static/admin/css/other/login.css
Normal file
@ -0,0 +1,100 @@
|
||||
.layui-form {
|
||||
width: 320px !important;
|
||||
margin: auto !important;
|
||||
margin-top: 160px !important;
|
||||
}
|
||||
|
||||
.layui-form button {
|
||||
width: 100% !important;
|
||||
height: 44px !important;
|
||||
line-height: 44px !important;
|
||||
font-size: 16px !important;
|
||||
background-color: #5FB878 !important;
|
||||
font-weight: 550 !important;
|
||||
}
|
||||
|
||||
.layui-form-checked[lay-skin=primary] i {
|
||||
border-color: #5FB878 !important;
|
||||
background-color: #5FB878 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.layui-tab-content {
|
||||
margin-top: 15px !important;
|
||||
padding-left: 0px !important;
|
||||
padding-right: 0px !important;
|
||||
}
|
||||
|
||||
.layui-form-item {
|
||||
margin-top: 20px !important;
|
||||
}
|
||||
|
||||
.layui-input {
|
||||
height: 44px !important;
|
||||
line-height: 44px !important;
|
||||
padding-left: 15px !important;
|
||||
border-radius: 3px !important;
|
||||
}
|
||||
|
||||
.layui-input:focus {
|
||||
box-shadow: 0px 0px 2px 1px #5FB878 !important;
|
||||
}
|
||||
|
||||
.layui-form-danger:focus{
|
||||
box-shadow: 0px 0px 2px 1px #f56c6c !important;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 60px !important;
|
||||
margin-top: 10px !important;
|
||||
margin-bottom: 10px !important;
|
||||
margin-left: 20px !important;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 30px !important;
|
||||
font-weight: 550 !important;
|
||||
margin-left: 20px !important;
|
||||
color: #5FB878 !important;
|
||||
display: inline-block !important;
|
||||
height: 60px !important;
|
||||
line-height: 60px !important;
|
||||
margin-top: 10px !important;
|
||||
position: absolute !important;
|
||||
}
|
||||
|
||||
.desc {
|
||||
width: 100% !important;
|
||||
text-align: center !important;
|
||||
color: gray !important;
|
||||
height: 60px !important;
|
||||
line-height: 60px !important;
|
||||
}
|
||||
|
||||
body {
|
||||
background-repeat:no-repeat;
|
||||
background-color: whitesmoke;
|
||||
background-size: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.code {
|
||||
float: left;
|
||||
margin-right: 13px;
|
||||
margin: 0px !important;
|
||||
border: #e6e6e6 1px solid;
|
||||
display: inline-block!important;
|
||||
}
|
||||
|
||||
.codeImage {
|
||||
float: right;
|
||||
height: 42px;
|
||||
border: #e6e6e6 1px solid;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@media (max-width:768px){
|
||||
body{
|
||||
background-position:center;
|
||||
}
|
||||
}
|
80
public/static/admin/css/other/person.css
Normal file
@ -0,0 +1,80 @@
|
||||
.pear-container {
|
||||
background-color: whitesmoke;
|
||||
margin: 10px;
|
||||
}
|
||||
.layui-body {
|
||||
padding: 25px;
|
||||
}
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
.user-info-head {
|
||||
width: 110px;
|
||||
height: 110px;
|
||||
line-height: 110px;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
border-radius: 50%;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.layui-line-dash {
|
||||
border-bottom: 1px dashed #ccc;
|
||||
margin: 15px 0;
|
||||
}
|
||||
.comment {
|
||||
position: absolute;
|
||||
bottom: 3px;
|
||||
right: 10px;
|
||||
font-size: 12px;
|
||||
color: dimgray;
|
||||
}
|
||||
.content {
|
||||
padding-left: 13px;
|
||||
font-size: 13px;
|
||||
color: dimgray;
|
||||
}
|
||||
.title {
|
||||
padding-left: 13.5px;
|
||||
}
|
||||
.layui-tab-title {
|
||||
border-bottom: none;
|
||||
}
|
||||
.fl-item {
|
||||
height: 30px;
|
||||
font-size: 13.5;
|
||||
}
|
||||
.dot {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50px;
|
||||
background-color: gray;
|
||||
display: inline-block;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
color: gray;
|
||||
padding: 5px;
|
||||
padding-left: 15px;
|
||||
border-radius: 4px;
|
||||
margin-top: 5.2px;
|
||||
}
|
||||
|
||||
.list .list-item:hover {
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
|
||||
.list .list-item .title {
|
||||
font-size: 13px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.list .list-item .footer {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
font-size: 12px;
|
||||
}
|
39
public/static/admin/css/other/result.css
Normal file
@ -0,0 +1,39 @@
|
||||
.result {
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
.result .success svg {
|
||||
color: #32C682;
|
||||
text-align: center;
|
||||
margin-top: 40px;
|
||||
|
||||
}
|
||||
.result .error svg {
|
||||
color: #f56c6c;
|
||||
text-align: center;
|
||||
margin-top: 40px;
|
||||
|
||||
}
|
||||
.result .title {
|
||||
margin-top: 25px;
|
||||
|
||||
}
|
||||
.result .desc {
|
||||
margin-top: 25px;
|
||||
width: 60%;
|
||||
margin-left: 20%;
|
||||
color: rgba(0, 0, 0, .45);
|
||||
}
|
||||
.result .content {
|
||||
margin-top: 20px;
|
||||
width: 80%;
|
||||
border-radius: 10px;
|
||||
background-color: whitesmoke;
|
||||
height: 200px;
|
||||
margin-left: 10%;
|
||||
}
|
||||
.result .action {
|
||||
padding-top: 10px;
|
||||
border-top: 1px whitesmoke solid;
|
||||
margin-top: 25px;
|
||||
}
|
57
public/static/admin/data/card.json
Normal file
@ -0,0 +1,57 @@
|
||||
{
|
||||
"msg": "not data",
|
||||
"count": 30,
|
||||
"data": [{
|
||||
"id": "1",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png",
|
||||
"title": "Alipay",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
}, {
|
||||
"id": "2",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png",
|
||||
"title": "Layui",
|
||||
"remark": "生命就像一盒巧克力,结果往往出人意料",
|
||||
"time": "几秒前"
|
||||
}, {
|
||||
"id": "3",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png",
|
||||
"title": "Angular",
|
||||
"remark": "希望是一个好东西,也许是最好的,好东西是不会消亡的",
|
||||
"time": "几秒前"
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png",
|
||||
"title": "React",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
}, {
|
||||
"id": "5",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png",
|
||||
"title": "Alipay",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
}, {
|
||||
"id": "6",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png",
|
||||
"title": "Layui",
|
||||
"remark": "生命就像一盒巧克力,结果往往出人意料",
|
||||
"time": "几秒前"
|
||||
}, {
|
||||
"id": "7",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png",
|
||||
"title": "Angular",
|
||||
"remark": "希望是一个好东西,也许是最好的,好东西是不会消亡的",
|
||||
"time": "几秒前"
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png",
|
||||
"title": "React",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
}
|
||||
],
|
||||
"code": 0
|
||||
}
|
372
public/static/admin/data/dataMenu.json
Normal file
@ -0,0 +1,372 @@
|
||||
[{
|
||||
"id": 1,
|
||||
"title": "工作空间",
|
||||
"type": 0,
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 10,
|
||||
"title": "控制后台",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/console/console1.html"
|
||||
}, {
|
||||
"id": 13,
|
||||
"title": "数据分析",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/console/console2.html"
|
||||
}, {
|
||||
"id": 14,
|
||||
"title": "百度一下",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "http://www.baidu.com"
|
||||
}, {
|
||||
"id": 15,
|
||||
"title": "主题预览",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/theme.html"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": "component",
|
||||
"title": "常用组件",
|
||||
"icon": "layui-icon layui-icon-component",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 201,
|
||||
"title": "基础组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 2011,
|
||||
"title": "功能按钮",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/button.html"
|
||||
}, {
|
||||
"id": 2014,
|
||||
"title": "表单集合",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/form.html"
|
||||
}, {
|
||||
"id": 2010,
|
||||
"title": "字体图标",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/icon.html"
|
||||
}, {
|
||||
"id": 2012,
|
||||
"title": "多选下拉",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/select.html"
|
||||
}, {
|
||||
"id": 2013,
|
||||
"title": "动态标签",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/tag.html"
|
||||
}]
|
||||
}, {
|
||||
"id": 203,
|
||||
"title": "进阶组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 2031,
|
||||
"title": "数据表格",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/table.html"
|
||||
}, {
|
||||
"id": 2032,
|
||||
"title": "分布表单",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/step.html"
|
||||
}, {
|
||||
"id": 2033,
|
||||
"title": "树形表格",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/treetable.html"
|
||||
}, {
|
||||
"id": 2034,
|
||||
"title": "树状结构",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/dtree.html"
|
||||
}, {
|
||||
"id": 2035,
|
||||
"title": "文本编辑",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/tinymce.html"
|
||||
}, {
|
||||
"id": 2036,
|
||||
"title": "卡片组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/card.html"
|
||||
}]
|
||||
}, {
|
||||
"id": 202,
|
||||
"title": "弹层组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 2021,
|
||||
"title": "抽屉组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/drawer.html"
|
||||
}, {
|
||||
"id": 2022,
|
||||
"title": "消息通知",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/notice.html"
|
||||
}, {
|
||||
"id": 2024,
|
||||
"title": "加载组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/loading.html"
|
||||
}, {
|
||||
"id": 2023,
|
||||
"title": "弹层组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/popup.html"
|
||||
}]
|
||||
}, {
|
||||
"id": 60331,
|
||||
"title": "高级组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 60131,
|
||||
"title": "多选项卡",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/tab.html"
|
||||
}, {
|
||||
"id": 60132,
|
||||
"title": "数据菜单",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/menu.html"
|
||||
}]
|
||||
}, {
|
||||
"id": 204,
|
||||
"title": "其他组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 2041,
|
||||
"title": "哈希加密",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/hash.html"
|
||||
},
|
||||
{
|
||||
"id": 2042,
|
||||
"title": "图标选择",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/iconPicker.html"
|
||||
},
|
||||
{
|
||||
"id": 2043,
|
||||
"title": "省市级联",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/area.html"
|
||||
},
|
||||
{
|
||||
"id": 2044,
|
||||
"title": "数字滚动",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/count.html"
|
||||
},
|
||||
{
|
||||
"id": 2045,
|
||||
"title": "顶部返回",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/topBar.html"
|
||||
}
|
||||
]
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": "result",
|
||||
"title": "结果页面",
|
||||
"icon": "layui-icon layui-icon-auz",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": "success",
|
||||
"title": "成功",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/result/success.html"
|
||||
},
|
||||
{
|
||||
"id": "failure",
|
||||
"title": "失败",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/result/error.html"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "error",
|
||||
"title": "错误页面",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 403,
|
||||
"title": "403",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/error/403.html"
|
||||
},
|
||||
{
|
||||
"id": 404,
|
||||
"title": "404",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/error/404.html"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 500,
|
||||
"title": "500",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/error/500.html"
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "system",
|
||||
"title": "系统管理",
|
||||
"icon": "layui-icon layui-icon-set-fill",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 601,
|
||||
"title": "用户管理",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/user.html"
|
||||
},
|
||||
{
|
||||
"id": 602,
|
||||
"title": "角色管理",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/role.html"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 603,
|
||||
"title": "权限管理",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/power.html"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 604,
|
||||
"title": "部门管理",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/deptment.html"
|
||||
},
|
||||
{
|
||||
"id": 605,
|
||||
"title": "行为日志",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/log.html"
|
||||
}, {
|
||||
"id": 606,
|
||||
"title": "数据字典",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/dict.html"
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "common",
|
||||
"title": "常用页面",
|
||||
"icon": "layui-icon layui-icon-template-1",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 701,
|
||||
"title": "登录页面",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "login.html"
|
||||
}, {
|
||||
"id": 702,
|
||||
"title": "空白页面",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/space.html"
|
||||
}]
|
||||
}
|
||||
]
|
37
public/static/admin/data/dataTree2.json
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"status": {
|
||||
"code": 200,
|
||||
"message": "操作成功"
|
||||
},
|
||||
"data": [{
|
||||
"id": "001",
|
||||
"title": "湖南省",
|
||||
"checkArr": "0",
|
||||
"parentId": "0"
|
||||
},
|
||||
{
|
||||
"id": "002",
|
||||
"title": "湖北省",
|
||||
"checkArr": "0",
|
||||
"parentId": "0"
|
||||
},
|
||||
{
|
||||
"id": "003",
|
||||
"title": "广东省",
|
||||
"checkArr": "0",
|
||||
"parentId": "0"
|
||||
},
|
||||
{
|
||||
"id": "004",
|
||||
"title": "浙江省",
|
||||
"checkArr": "0",
|
||||
"parentId": "0"
|
||||
},
|
||||
{
|
||||
"id": "005",
|
||||
"title": "福建省",
|
||||
"checkArr": "0",
|
||||
"parentId": "0"
|
||||
}
|
||||
]
|
||||
}
|
36
public/static/admin/data/dictData.json
Normal file
@ -0,0 +1,36 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": null,
|
||||
"count": 2,
|
||||
"data": [{
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": "男 : body",
|
||||
"params": null,
|
||||
"dataId": "1317401149287956480",
|
||||
"dataLabel": "男",
|
||||
"dataValue": "boy",
|
||||
"typeCode": "user_sex",
|
||||
"isDefault": null,
|
||||
"enable": "0"
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": "女 : girl",
|
||||
"params": null,
|
||||
"dataId": "1317402976670711808",
|
||||
"dataLabel": "女",
|
||||
"dataValue": "girl",
|
||||
"typeCode": "user_sex",
|
||||
"isDefault": null,
|
||||
"enable": "0"
|
||||
}]
|
||||
}
|
90
public/static/admin/data/dictType.json
Normal file
@ -0,0 +1,90 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": null,
|
||||
"count": 6,
|
||||
"data": [{
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": null,
|
||||
"params": null,
|
||||
"id": "1304489072256876544",
|
||||
"typeName": "用户状态",
|
||||
"typeCode": "user_status",
|
||||
"description": "用户状态",
|
||||
"enable": "0"
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": null,
|
||||
"params": null,
|
||||
"id": "1317360314219495424",
|
||||
"typeName": "登录类型",
|
||||
"typeCode": "login",
|
||||
"description": "登录类型",
|
||||
"enable": "0"
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": null,
|
||||
"params": null,
|
||||
"id": "1317400519127334912",
|
||||
"typeName": "用户类型",
|
||||
"typeCode": "user_status",
|
||||
"description": "用户类型",
|
||||
"enable": "0"
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": null,
|
||||
"params": null,
|
||||
"id": "1317400823096934400",
|
||||
"typeName": "配置类型",
|
||||
"typeCode": "config_type",
|
||||
"description": "配置类型",
|
||||
"enable": "0"
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": null,
|
||||
"params": null,
|
||||
"id": "455184568505470976",
|
||||
"typeName": "用户性别",
|
||||
"typeCode": "user_sex",
|
||||
"description": "用户性别",
|
||||
"enable": "0"
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"createName": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"updateName": null,
|
||||
"remark": null,
|
||||
"params": null,
|
||||
"id": "455184935989415936",
|
||||
"typeName": "全局状态",
|
||||
"typeCode": "sys_status",
|
||||
"description": "状态描述\n",
|
||||
"enable": "0"
|
||||
}]
|
||||
}
|
181
public/static/admin/data/dtree.json
Normal file
@ -0,0 +1,181 @@
|
||||
{
|
||||
"status": {
|
||||
"code": 200,
|
||||
"message": "操作成功"
|
||||
},
|
||||
"data": [{
|
||||
"id": "001",
|
||||
"title": "湖南省",
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "001001",
|
||||
"title": "长沙市",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001002",
|
||||
"title": "株洲市",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001003",
|
||||
"title": "湘潭市",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001004",
|
||||
"title": "衡阳市",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001005",
|
||||
"title": "郴州市",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "002",
|
||||
"title": "湖北省",
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "002001",
|
||||
"title": "武汉市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002002",
|
||||
"title": "黄冈市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002003",
|
||||
"title": "潜江市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002004",
|
||||
"title": "荆州市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002005",
|
||||
"title": "襄阳市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "003",
|
||||
"title": "广东省",
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "003001",
|
||||
"title": "广州市",
|
||||
"last": false,
|
||||
"parentId": "003",
|
||||
"children": [{
|
||||
"id": "003001001",
|
||||
"title": "天河区",
|
||||
"last": true,
|
||||
"parentId": "003001"
|
||||
},
|
||||
{
|
||||
"id": "003001002",
|
||||
"title": "花都区",
|
||||
"last": true,
|
||||
"parentId": "003001"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "003002",
|
||||
"title": "深圳市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003003",
|
||||
"title": "中山市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003004",
|
||||
"title": "东莞市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003005",
|
||||
"title": "珠海市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003006",
|
||||
"title": "韶关市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "004",
|
||||
"title": "浙江省",
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "004001",
|
||||
"title": "杭州市",
|
||||
"last": true,
|
||||
"parentId": "004"
|
||||
},
|
||||
{
|
||||
"id": "004002",
|
||||
"title": "温州市",
|
||||
"last": true,
|
||||
"parentId": "004"
|
||||
},
|
||||
{
|
||||
"id": "004003",
|
||||
"title": "绍兴市",
|
||||
"last": true,
|
||||
"parentId": "004"
|
||||
},
|
||||
{
|
||||
"id": "004004",
|
||||
"title": "金华市",
|
||||
"last": true,
|
||||
"parentId": "004"
|
||||
},
|
||||
{
|
||||
"id": "004005",
|
||||
"title": "义乌市",
|
||||
"last": true,
|
||||
"parentId": "004"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "005",
|
||||
"title": "福建省",
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "005001",
|
||||
"title": "厦门市",
|
||||
"last": true,
|
||||
"parentId": "005"
|
||||
}]
|
||||
}
|
||||
]
|
||||
}
|
211
public/static/admin/data/loginLog.json
Normal file
@ -0,0 +1,211 @@
|
||||
{
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"remark": null,
|
||||
"code": 0,
|
||||
"msg": null,
|
||||
"count": 167,
|
||||
"data": [{
|
||||
"id": "1305106851892822016",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:31:36.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305101593019940864",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:10:42.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305101247900024832",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:09:20.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305099674977304576",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:03:05.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305095186061197312",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T10:45:15.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305092027951611904",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T10:32:42.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305082862634008576",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T09:56:16.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305071134877679616",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T09:09:40.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305070481803575296",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T09:07:05.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305064691009060864",
|
||||
"title": "登录",
|
||||
"description": "登录成功",
|
||||
"businessType": "OTHER",
|
||||
"requestMethod": "POST",
|
||||
"method": "/login",
|
||||
"operateUrl": "/login",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "LOGIN",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T08:44:04.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}]
|
||||
}
|
444
public/static/admin/data/menu.json
Normal file
@ -0,0 +1,444 @@
|
||||
[{
|
||||
"id": 1,
|
||||
"title": "工作空间",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 10,
|
||||
"title": "控制后台",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/console/console1.html"
|
||||
}, {
|
||||
"id": 13,
|
||||
"title": "数据分析",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/console/console2.html"
|
||||
}, {
|
||||
"id": 14,
|
||||
"title": "百度一下",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "http://www.bing.com"
|
||||
}, {
|
||||
"id": 15,
|
||||
"title": "主题预览",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/theme.html"
|
||||
}, {
|
||||
"id": 16,
|
||||
"title": "酸爽翻倍",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/core.html"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": "component",
|
||||
"title": "常用组件",
|
||||
"icon": "layui-icon layui-icon-component",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 201,
|
||||
"title": "基础组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [
|
||||
{
|
||||
"id": 2011,
|
||||
"title": "功能按钮",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/button.html"
|
||||
}, {
|
||||
"id": 2014,
|
||||
"title": "表单集合",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/form.html"
|
||||
}, {
|
||||
"id": 2010,
|
||||
"title": "字体图标",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/icon.html"
|
||||
}, {
|
||||
"id": 2012,
|
||||
"title": "多选下拉",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/select.html"
|
||||
}, {
|
||||
"id": 2013,
|
||||
"title": "动态标签",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/tag.html"
|
||||
}]
|
||||
}, {
|
||||
"id": 203,
|
||||
"title": "进阶组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 2031,
|
||||
"title": "数据表格",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/table.html"
|
||||
}, {
|
||||
"id": 2032,
|
||||
"title": "分布表单",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/step.html"
|
||||
}, {
|
||||
"id": 2033,
|
||||
"title": "树形表格",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/treetable.html"
|
||||
}, {
|
||||
"id": 2034,
|
||||
"title": "树状结构",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/dtree.html"
|
||||
}, {
|
||||
"id": 2035,
|
||||
"title": "文本编辑",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/tinymce.html"
|
||||
}, {
|
||||
"id": 2036,
|
||||
"title": "卡片组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/card.html"
|
||||
}]
|
||||
}, {
|
||||
"id": 202,
|
||||
"title": "弹层组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 2021,
|
||||
"title": "抽屉组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/drawer.html"
|
||||
}, {
|
||||
"id": 2022,
|
||||
"title": "消息通知 (过时)",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/notice.html"
|
||||
}, {
|
||||
"id": 2025,
|
||||
"title": "消息通知 (新增)",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/toast.html"
|
||||
}, {
|
||||
"id": 2024,
|
||||
"title": "加载组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/loading.html"
|
||||
}, {
|
||||
"id": 2023,
|
||||
"title": "弹层组件",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/popup.html"
|
||||
}]
|
||||
},{
|
||||
"id": 60331,
|
||||
"title": "高级组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 60131,
|
||||
"title": "多选项卡",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/tab.html"
|
||||
},{
|
||||
"id": 60132,
|
||||
"title": "数据菜单",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/menu.html"
|
||||
}]
|
||||
}, {
|
||||
"id": 204,
|
||||
"title": "其他组件",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"children": [{
|
||||
"id": 2041,
|
||||
"title": "哈希加密",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/encrypt.html"
|
||||
},
|
||||
{
|
||||
"id": 2042,
|
||||
"title": "图标选择",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/iconPicker.html"
|
||||
},
|
||||
{
|
||||
"id": 2043,
|
||||
"title": "省市级联",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/area.html"
|
||||
},
|
||||
{
|
||||
"id": 2044,
|
||||
"title": "数字滚动",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/count.html"
|
||||
},
|
||||
{
|
||||
"id": 2045,
|
||||
"title": "顶部返回",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/topBar.html"
|
||||
},
|
||||
{
|
||||
"id": 2046,
|
||||
"title": "水印组件",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/watermark.html"
|
||||
},
|
||||
{
|
||||
"id": 2047,
|
||||
"title": "全屏组件",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/fullscreen.html"
|
||||
},
|
||||
{
|
||||
"id": 2048,
|
||||
"title": "汽泡组件",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/popover.html"
|
||||
}
|
||||
]
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": "result",
|
||||
"title": "结果页面",
|
||||
"icon": "layui-icon layui-icon-auz",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": "success",
|
||||
"title": "成功",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/result/success.html"
|
||||
},
|
||||
{
|
||||
"id": "failure",
|
||||
"title": "失败",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/result/error.html"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "error",
|
||||
"title": "错误页面",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 403,
|
||||
"title": "403",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/error/403.html"
|
||||
},
|
||||
{
|
||||
"id": 404,
|
||||
"title": "404",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/error/404.html"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 500,
|
||||
"title": "500",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/error/500.html"
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "system",
|
||||
"title": "系统管理",
|
||||
"icon": "layui-icon layui-icon-set-fill",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 601,
|
||||
"title": "用户管理",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/user.html"
|
||||
},
|
||||
{
|
||||
"id": 602,
|
||||
"title": "角色管理",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/role.html"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 603,
|
||||
"title": "权限管理",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/power.html"
|
||||
},
|
||||
|
||||
{
|
||||
"id": 604,
|
||||
"title": "部门管理",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/deptment.html"
|
||||
},
|
||||
{
|
||||
"id": 605,
|
||||
"title": "行为日志",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/log.html"
|
||||
}, {
|
||||
"id": 606,
|
||||
"title": "数据字典",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/dict.html"
|
||||
}
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "common",
|
||||
"title": "常用页面",
|
||||
"icon": "layui-icon layui-icon-template-1",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 701,
|
||||
"title": "登录页面",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "login.html"
|
||||
}, {
|
||||
"id": 702,
|
||||
"title": "空白页面",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/space.html"
|
||||
}]
|
||||
}, {
|
||||
"id": "echarts",
|
||||
"title": "数据图表",
|
||||
"icon": "layui-icon layui-icon-chart",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 12121,
|
||||
"title": "折线图",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/echarts/line.html"
|
||||
}, {
|
||||
"id": 121212,
|
||||
"title": "柱状图",
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/echarts/column.html"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": "code",
|
||||
"title": "开发工具",
|
||||
"icon": "layui-icon layui-icon-util",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 801,
|
||||
"title": "表单构建",
|
||||
"icon": "layui-icon layui-icon-util",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "component/code/index.html"
|
||||
}]
|
||||
}
|
||||
]
|
90
public/static/admin/data/message.json
Normal file
@ -0,0 +1,90 @@
|
||||
[{
|
||||
"id": 1,
|
||||
"title": "通知",
|
||||
"children": [{
|
||||
"id": 11,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
|
||||
"title": "你收到了 14 份新周报",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png",
|
||||
"title": "曲妮妮 已通过第三轮面试",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png",
|
||||
"title": "可以区分多种通知类型",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
|
||||
"title": "左侧图标用于区分不同的类型",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
|
||||
"title": "内容不要超过两行字",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "消息",
|
||||
"children": [{
|
||||
"id": 11,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
|
||||
"title": "你收到了 14 份新周报",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png",
|
||||
"title": "曲妮妮 已通过第三轮面试",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png",
|
||||
"title": "可以区分多种通知类型",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
|
||||
"title": "左侧图标用于区分不同的类型",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"avatar":"https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
|
||||
"title": "内容不要超过两行字",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "刚刚"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "代办",
|
||||
"children": []
|
||||
}
|
||||
]
|
211
public/static/admin/data/operateLog.json
Normal file
@ -0,0 +1,211 @@
|
||||
{
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"remark": null,
|
||||
"code": 0,
|
||||
"msg": null,
|
||||
"count": 178,
|
||||
"data": [{
|
||||
"id": "1305106857240559616",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:31:37.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305101599714050048",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:10:44.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305101253352620032",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:09:21.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305099681512030208",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T11:03:06.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305095191291494400",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T10:45:16.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305092034448588800",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T10:32:43.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305082868002717696",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T09:56:18.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305071141362073600",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T09:09:42.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305070488145362944",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T09:07:06.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}, {
|
||||
"id": "1305064697174687744",
|
||||
"title": "主页",
|
||||
"description": "返回 Index 主页视图",
|
||||
"businessType": "ADD",
|
||||
"requestMethod": "GET",
|
||||
"method": "/index",
|
||||
"operateUrl": "/index",
|
||||
"operateAddress": "127.0.0.1",
|
||||
"requestParam": null,
|
||||
"requestBody": "",
|
||||
"responseBody": null,
|
||||
"success": true,
|
||||
"loggingType": "OPERATE",
|
||||
"errorMsg": null,
|
||||
"systemOs": "Windows",
|
||||
"createTime": "2020-09-13T08:44:05.000+0000",
|
||||
"operateName": "admin",
|
||||
"map": {},
|
||||
"browser": "谷歌浏览器"
|
||||
}]
|
||||
}
|
41
public/static/admin/data/organization.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "...",
|
||||
"count": 3,
|
||||
"data": [{
|
||||
"name": "软件部",
|
||||
"userCount": 324,
|
||||
"location": "二楼201",
|
||||
"leader": "皮卡丘"
|
||||
}, {
|
||||
"name": "美工部",
|
||||
"userCount": 98,
|
||||
"location": "二楼101",
|
||||
"leader": "皮卡丘"
|
||||
}, {
|
||||
"name": "设计部",
|
||||
"userCount": 43,
|
||||
"location": "六楼602",
|
||||
"leader": "皮卡丘"
|
||||
}, {
|
||||
"name": "销售部",
|
||||
"userCount": 12,
|
||||
"location": "一楼131",
|
||||
"leader": "皮卡丘"
|
||||
}, {
|
||||
"name": "产品部",
|
||||
"userCount": 128,
|
||||
"location": "四楼401",
|
||||
"leader": "皮卡丘"
|
||||
}, {
|
||||
"name": "财务部",
|
||||
"userCount": 23,
|
||||
"location": "三楼105",
|
||||
"leader": "皮卡丘"
|
||||
}, {
|
||||
"name": "人事部",
|
||||
"userCount": 67,
|
||||
"location": "二楼201",
|
||||
"leader": "皮卡丘"
|
||||
}]
|
||||
}
|
143
public/static/admin/data/organizationtree.json
Normal file
@ -0,0 +1,143 @@
|
||||
{
|
||||
"status": {
|
||||
"code": 200,
|
||||
"message": "操作成功"
|
||||
},
|
||||
"data": [{
|
||||
"id": "0",
|
||||
"title": "济南总部",
|
||||
"last": false,
|
||||
"parentId": "9527",
|
||||
"children": [{
|
||||
"id": "001",
|
||||
"title": "杭州市",
|
||||
"last": false,
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "001001",
|
||||
"title": "软件部",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001002",
|
||||
"title": "销售部",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001003",
|
||||
"title": "财务部",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001004",
|
||||
"title": "人事部",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
},
|
||||
{
|
||||
"id": "001005",
|
||||
"title": "行政部",
|
||||
"last": true,
|
||||
"parentId": "001"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "002",
|
||||
"title": "湖北省",
|
||||
"last": false,
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "002001",
|
||||
"title": "武汉市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002002",
|
||||
"title": "黄冈市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002003",
|
||||
"title": "潜江市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002004",
|
||||
"title": "荆州市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
},
|
||||
{
|
||||
"id": "002005",
|
||||
"title": "襄阳市",
|
||||
"last": true,
|
||||
"parentId": "002"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "003",
|
||||
"title": "广东省",
|
||||
"last": false,
|
||||
"parentId": "0",
|
||||
"children": [{
|
||||
"id": "003001",
|
||||
"title": "广州市",
|
||||
"last": false,
|
||||
"parentId": "003",
|
||||
"children": [{
|
||||
"id": "003001001",
|
||||
"title": "天河区",
|
||||
"last": true,
|
||||
"parentId": "003001"
|
||||
},
|
||||
{
|
||||
"id": "003001002",
|
||||
"title": "花都区",
|
||||
"last": true,
|
||||
"parentId": "003001"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "003002",
|
||||
"title": "深圳市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003003",
|
||||
"title": "中山市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003004",
|
||||
"title": "东莞市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003005",
|
||||
"title": "珠海市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
},
|
||||
{
|
||||
"id": "003006",
|
||||
"title": "韶关市",
|
||||
"last": true,
|
||||
"parentId": "003"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}]
|
||||
}
|
185
public/static/admin/data/power.json
Normal file
@ -0,0 +1,185 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "...",
|
||||
"count": null,
|
||||
"data": [{
|
||||
"powerId": "1",
|
||||
"powerName": "系统管理",
|
||||
"powerType": "0",
|
||||
"powerCode": "",
|
||||
"powerUrl": "",
|
||||
"openType": null,
|
||||
"parentId": "0",
|
||||
"icon": "layui-icon-set-fill",
|
||||
"sort": 1,
|
||||
"enable": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "2",
|
||||
"powerName": "用户管理",
|
||||
"powerType": "1",
|
||||
"powerCode": "sys:user:main",
|
||||
"powerUrl": "/system/user/main",
|
||||
"openType": null,
|
||||
"parentId": "1",
|
||||
"icon": "layui-icon-username",
|
||||
"sort": null,
|
||||
"enable": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "3",
|
||||
"powerName": "角色管理",
|
||||
"powerType": "1",
|
||||
"powerCode": "sys:role:main",
|
||||
"powerUrl": "/system/role/main",
|
||||
"openType": null,
|
||||
"parentId": "1",
|
||||
"icon": "layui-icon-user",
|
||||
"sort": null,
|
||||
"enable": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "4",
|
||||
"powerName": "权限管理",
|
||||
"powerType": "1",
|
||||
"powerCode": "sys:power:main",
|
||||
"powerUrl": "/system/power/main",
|
||||
"openType": null,
|
||||
"parentId": "1",
|
||||
"icon": "layui-icon-vercode",
|
||||
"sort": null,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442359447487123456",
|
||||
"powerName": "角色列表",
|
||||
"powerType": "2",
|
||||
"powerCode": "sys:role:data",
|
||||
"powerUrl": "",
|
||||
"openType": null,
|
||||
"parentId": "3",
|
||||
"icon": "layui-icon-rate",
|
||||
"sort": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442417411065516032",
|
||||
"powerName": "敏捷开发",
|
||||
"powerType": "0",
|
||||
"powerCode": "",
|
||||
"powerUrl": "",
|
||||
"openType": null,
|
||||
"parentId": "0",
|
||||
"icon": "layui-icon-senior",
|
||||
"sort": 2,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442418188639145984",
|
||||
"powerName": "模板管理",
|
||||
"powerType": "1",
|
||||
"powerCode": "exp:template:main",
|
||||
"powerUrl": "/system/user/main",
|
||||
"openType": null,
|
||||
"parentId": "442417411065516032",
|
||||
"icon": "layui-icon-template-1",
|
||||
"sort": null,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442520236248403968",
|
||||
"powerName": "数据监控",
|
||||
"powerType": "1",
|
||||
"powerCode": "/druid/index.html",
|
||||
"powerUrl": "/druid/index.html",
|
||||
"openType": null,
|
||||
"parentId": "694203021537574912",
|
||||
"icon": "layui-icon-chart",
|
||||
"sort": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442650387514789888",
|
||||
"powerName": "定时任务",
|
||||
"powerType": "0",
|
||||
"powerCode": "",
|
||||
"powerUrl": "",
|
||||
"openType": null,
|
||||
"parentId": "0",
|
||||
"icon": "layui-icon-log",
|
||||
"sort": 5,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442650770626711552",
|
||||
"powerName": "任务管理",
|
||||
"powerType": "1",
|
||||
"powerCode": "qrt:task:main",
|
||||
"powerUrl": "/qrt/task/main",
|
||||
"openType": null,
|
||||
"parentId": "442650387514789888",
|
||||
"icon": "layui-icon-chat",
|
||||
"sort": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442651158935375872",
|
||||
"powerName": "任务日志",
|
||||
"powerType": "1",
|
||||
"powerCode": "qrt:log:main",
|
||||
"powerUrl": "/qrt/log/main",
|
||||
"openType": null,
|
||||
"parentId": "442650387514789888",
|
||||
"icon": "layui-icon-file",
|
||||
"sort": 2,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "442722702474743808",
|
||||
"powerName": "数据字典",
|
||||
"powerType": "1",
|
||||
"powerCode": "system:dictType:main",
|
||||
"powerUrl": "/system/dictType/main",
|
||||
"openType": null,
|
||||
"parentId": "1",
|
||||
"icon": "layui-icon-form",
|
||||
"sort": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "5",
|
||||
"powerName": "工作流程",
|
||||
"powerType": "0",
|
||||
"powerCode": "",
|
||||
"powerUrl": "",
|
||||
"openType": null,
|
||||
"parentId": "0",
|
||||
"icon": "layui-icon-util",
|
||||
"sort": 3,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "6",
|
||||
"powerName": "模型管理",
|
||||
"powerType": "1",
|
||||
"powerCode": null,
|
||||
"powerUrl": null,
|
||||
"openType": null,
|
||||
"parentId": "5",
|
||||
"icon": "layui-icon layui-icon-edit",
|
||||
"sort": null,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "694203021537574912",
|
||||
"powerName": "系统监控",
|
||||
"powerType": "0",
|
||||
"powerCode": "",
|
||||
"powerUrl": "",
|
||||
"openType": null,
|
||||
"parentId": "0",
|
||||
"icon": "layui-icon-console",
|
||||
"sort": 4,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "694203311615639552",
|
||||
"powerName": "接口文档",
|
||||
"powerType": "1",
|
||||
"powerCode": "",
|
||||
"powerUrl": "/swagger-ui.html",
|
||||
"openType": null,
|
||||
"parentId": "694203021537574912",
|
||||
"icon": "layui-icon-chart",
|
||||
"sort": 1,
|
||||
"checkArr": "0"
|
||||
}]
|
||||
}
|
42
public/static/admin/data/role.json
Normal file
@ -0,0 +1,42 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "...",
|
||||
"count": 3,
|
||||
"data": [{
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"remark": null,
|
||||
"roleId": "1",
|
||||
"roleName": "超级管理员",
|
||||
"roleCode": "admin",
|
||||
"enable": "1",
|
||||
"details": "超级管理员",
|
||||
"checked": false
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"remark": null,
|
||||
"roleId": "2",
|
||||
"roleName": "普通管理员",
|
||||
"roleCode": "manager",
|
||||
"enable": "0",
|
||||
"details": "普通管理员",
|
||||
"checked": false
|
||||
}, {
|
||||
"createTime": null,
|
||||
"createBy": null,
|
||||
"updateTime": null,
|
||||
"updateBy": null,
|
||||
"remark": null,
|
||||
"roleId": "3",
|
||||
"roleName": "普通用户",
|
||||
"roleCode": "pearson",
|
||||
"enable": "0",
|
||||
"details": "普通用户",
|
||||
"checked": false
|
||||
}]
|
||||
}
|
132
public/static/admin/data/table.json
Normal file
@ -0,0 +1,132 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "...",
|
||||
"count": 3,
|
||||
"data": [{
|
||||
"userId": "1",
|
||||
"username": "admin",
|
||||
"password": "$2a$10$1K7E1.IYCrsoZVCb6utOo.5jENtfOzhdKWhc49t2lk.UQd7Oam4FG",
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "超级'管'理员",
|
||||
"email": "854085'4@'qq.com",
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "15543526531",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "2",
|
||||
"username": "854085467",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "就\"眠\"仪式",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "3",
|
||||
"username": "970796069",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "王二麻子",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "4",
|
||||
"username": "admin",
|
||||
"password": "$2a$10$1K7E1.IYCrsoZVCb6utOo.5jENtfOzhdKWhc49t2lk.UQd7Oam4FG",
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "超级管理员",
|
||||
"email": "8540854@qq.com",
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "15543526531",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "5",
|
||||
"username": "854085467",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "就眠仪式",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "6",
|
||||
"username": "970796069",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "王二麻子",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "7",
|
||||
"username": "admin",
|
||||
"password": "$2a$10$1K7E1.IYCrsoZVCb6utOo.5jENtfOzhdKWhc49t2lk.UQd7Oam4FG",
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "超级管理员",
|
||||
"email": "8540854@qq.com",
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "15543526531",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "8",
|
||||
"username": "854085467",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "就眠仪式",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "9",
|
||||
"username": "970796069",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "王二麻子",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}]
|
||||
}
|
118
public/static/admin/data/user.json
Normal file
@ -0,0 +1,118 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "...",
|
||||
"count": 3,
|
||||
"data": [{
|
||||
"userId": "1",
|
||||
"username": "admin",
|
||||
"password": "$2a$10$1K7E1.IYCrsoZVCb6utOo.5jENtfOzhdKWhc49t2lk.UQd7Oam4FG",
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "超级管理员",
|
||||
"email": "8540854@qq.com",
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "15543526531",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "442488661347536896",
|
||||
"username": "854085467",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "就眠仪式",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "0",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "442492965651353600",
|
||||
"username": "970796069",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "王二麻子",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "1",
|
||||
"username": "admin",
|
||||
"password": "$2a$10$1K7E1.IYCrsoZVCb6utOo.5jENtfOzhdKWhc49t2lk.UQd7Oam4FG",
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "超级管理员",
|
||||
"email": "8540854@qq.com",
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "15543526531",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "442488661347536896",
|
||||
"username": "854085467",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "就眠仪式",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "442492965651353600",
|
||||
"username": "970796069",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "王二麻子",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "1",
|
||||
"username": "admin",
|
||||
"password": "$2a$10$1K7E1.IYCrsoZVCb6utOo.5jENtfOzhdKWhc49t2lk.UQd7Oam4FG",
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "超级管理员",
|
||||
"email": "8540854@qq.com",
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "15543526531",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
"userId": "442488661347536896",
|
||||
"username": "854085467",
|
||||
"password": null,
|
||||
"salt": null,
|
||||
"status": null,
|
||||
"realName": "就眠仪式",
|
||||
"email": null,
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}]
|
||||
}
|
508
public/static/admin/images/403.svg
Normal file
@ -0,0 +1,508 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="227px" height="269px" viewBox="0 0 227 269" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 9</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<path d="M0,131.5 C1.52216317e-15,101.788282 2.0023434,70.3064817 6.0070302,37.054599 L6.00703147,37.0545992 C8.23177711,18.5819983 23.2321456,4.27478563 41.7892683,2.9258328 C68.6224469,0.975277594 91.0407969,-6.24317082e-09 109.044318,0 C127.133265,6.27279111e-09 149.842798,0.984554771 177.17292,2.9536643 L177.17292,2.95366535 C195.745345,4.29179116 210.761581,18.6099912 212.981582,37.0977487 C216.993859,70.5112465 218.999998,102.082949 219,131.812857 C219.000002,161.472158 217.003381,192.843579 213.010137,225.927119 L213.010136,225.927119 C210.780269,244.401296 195.772997,258.705423 177.213148,260.046888 C149.974602,262.015629 127.477504,263 109.721856,263 C91.927568,263 69.2911098,262.01134 41.8124813,260.034021 L41.8124814,260.03402 C23.2430488,258.697792 8.22697111,244.385384 6.00173205,225.9014 C2.00057735,192.665746 1.52149174e-15,161.198612 0,131.5 Z" id="path-1"></path>
|
||||
<filter x="-4.5%" y="-1.4%" width="106.2%" height="104.4%" filterUnits="objectBoundingBox" id="filter-2">
|
||||
<feMorphology radius="0.81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
|
||||
<feOffset dx="-6" dy="4" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<path d="M39.654321,130.992298 C39.654321,110.09311 40.5351746,89.1940983 42.2968819,68.2952631 L42.2968835,68.2952632 C43.2666685,56.7908671 52.197293,47.5570778 63.6629191,46.2039222 C78.8424188,44.4124609 94.0195118,43.5167302 109.194198,43.5167302 C124.360772,43.5167302 139.527341,44.4115034 154.693904,46.2010498 L154.693904,46.2010495 C166.164025,47.5544421 175.09671,56.7944422 176.061501,68.3037662 C177.833381,89.4411461 178.719321,110.482698 178.719321,131.428422 C178.719321,152.307984 177.838969,173.187319 176.078265,194.066429 L176.078265,194.066429 C175.10807,205.571375 166.17633,214.805149 154.709997,216.157282 C139.486491,217.95247 124.287302,218.850064 109.112431,218.850064 C93.9666716,218.850064 78.8209665,217.95591 63.6753158,216.167604 L63.6753156,216.167605 C52.2067135,214.813462 43.275345,205.574785 42.309801,194.06695 C40.539481,172.967394 39.654321,151.94251 39.654321,130.992298 Z" id="path-3"></path>
|
||||
<filter x="-6.0%" y="-2.3%" width="108.6%" height="105.9%" filterUnits="objectBoundingBox" id="filter-4">
|
||||
<feMorphology radius="0.81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
|
||||
<feOffset dx="-5" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<path d="M161.510068,89.8583333 L176.8425,89.8583333 L176.8425,107.391667 L161.510068,107.391667 L161.510068,107.391667 C157.8829,107.391667 154.9425,104.451267 154.9425,100.824099 L154.9425,96.4259009 L154.9425,96.4259009 C154.9425,92.7987335 157.8829,89.8583333 161.510068,89.8583333 Z" id="path-5"></path>
|
||||
<filter x="-13.7%" y="-5.7%" width="118.3%" height="117.1%" filterUnits="objectBoundingBox" id="filter-6">
|
||||
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<path d="M183.957568,89.8583333 L199.29,89.8583333 L199.29,107.391667 L183.957568,107.391667 L183.957568,107.391667 C180.3304,107.391667 177.39,104.451267 177.39,100.824099 L177.39,96.4259009 L177.39,96.4259009 C177.39,92.7987335 180.3304,89.8583333 183.957568,89.8583333 Z" id="path-7"></path>
|
||||
<filter x="-2.3%" y="-2.9%" width="109.1%" height="111.4%" filterUnits="objectBoundingBox" id="filter-8">
|
||||
<feOffset dx="1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<filter x="-55.5%" y="-9.3%" width="177.5%" height="148.0%" filterUnits="objectBoundingBox" id="filter-9">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-55.5%" y="-9.3%" width="177.5%" height="148.0%" filterUnits="objectBoundingBox" id="filter-10">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<path d="M8.86493515,17.2480344 C8.4007802,16.9327578 8.09567896,16.3993146 8.09567896,15.7943295 C8.09567896,14.82567 8.87784133,14.0404164 9.84268751,14.0404164 C10.8075337,14.0404164 11.5896961,14.82567 11.5896961,15.7943295 C11.5896961,16.3993146 11.2845948,16.9327578 10.8204399,17.2480344 L11.7961308,19.984547 C11.9101195,20.3042502 11.743355,20.6558271 11.4236517,20.7698158 C11.3574028,20.7934365 11.2875908,20.8055099 11.2172568,20.8055099 L8.46811816,20.8055099 L8.46811816,20.8055099 C8.1287016,20.8055099 7.85355011,20.5303584 7.85355011,20.1909418 C7.85355011,20.1206079 7.86562345,20.0507959 7.8892442,19.984547 L8.86493515,17.2480344 Z" id="path-11"></path>
|
||||
<filter x="-12.0%" y="-7.4%" width="124.1%" height="114.8%" filterUnits="objectBoundingBox" id="filter-12">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetInner1"></feOffset>
|
||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-13">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-14">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-15">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-16">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-17">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-18">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-19">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-20">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-21">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-22">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-23">
|
||||
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-24">
|
||||
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-25">
|
||||
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-26">
|
||||
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-27">
|
||||
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-28">
|
||||
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-29">
|
||||
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<rect id="path-30" x="79.0833333" y="68.7939815" width="60.8333333" height="24.3518519"></rect>
|
||||
<filter x="-2.5%" y="-2.1%" width="103.3%" height="108.2%" filterUnits="objectBoundingBox" id="filter-31">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<rect id="path-32" x="119.233333" y="71.2346165" width="18.2504951" height="19.5072939"></rect>
|
||||
<path d="M6.69173423,0.214583333 L15.4541667,0.214583333 L15.4541667,30.8979167 L6.69173423,30.8979167 L6.69173423,30.8979167 C3.06456682,30.8979167 0.124166667,27.9575165 0.124166667,24.3303491 L0.124166667,6.7821509 L0.124166667,6.7821509 C0.124166667,3.15498349 3.06456682,0.214583333 6.69173423,0.214583333 Z" id="path-34"></path>
|
||||
<filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="filter-35">
|
||||
<feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.866666667 0 0 0 0 0.890196078 0 0 0 0 0.909803922 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-36">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-37">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<path d="M42.8291667,11.875589 L42.8291667,19.236911 C42.8291667,19.9264853 42.3373793,20.5354959 41.738915,20.595957 L17.6441667,22.6791667 L17.6441667,8.43333333 L41.738915,10.516543 C42.3410444,10.5773757 42.8291667,11.185286 42.8291667,11.875589 Z" id="path-38"></path>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-39">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-40">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<rect id="path-41" x="12.23" y="6.78958333" width="7.1175" height="17.5333333" rx="1.09459459"></rect>
|
||||
<filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="filter-42">
|
||||
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<path d="M6.69173423,0.214583333 L15.4541667,0.214583333 L15.4541667,30.8979167 L6.69173423,30.8979167 L6.69173423,30.8979167 C3.06456682,30.8979167 0.124166667,27.9575165 0.124166667,24.3303491 L0.124166667,6.7821509 L0.124166667,6.7821509 C0.124166667,3.15498349 3.06456682,0.214583333 6.69173423,0.214583333 Z" id="path-43"></path>
|
||||
<filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="filter-44">
|
||||
<feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.866666667 0 0 0 0 0.890196078 0 0 0 0 0.909803922 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-45">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-46">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<path d="M42.8291667,11.875589 L42.8291667,19.236911 C42.8291667,19.9264853 42.3373793,20.5354959 41.738915,20.595957 L17.6441667,22.6791667 L17.6441667,8.43333333 L41.738915,10.516543 C42.3410444,10.5773757 42.8291667,11.185286 42.8291667,11.875589 Z" id="path-47"></path>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-48">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-49">
|
||||
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
|
||||
<feMerge>
|
||||
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
|
||||
<feMergeNode in="SourceGraphic"></feMergeNode>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<rect id="path-50" x="12.23" y="6.78958333" width="7.1175" height="17.5333333" rx="1.09459459"></rect>
|
||||
<filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="filter-51">
|
||||
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<path d="M24.5975819,18.9156325 C22.7107005,18.6906938 20.1873316,18.3702571 18.5998357,18.0903387 C15.7716385,17.5916513 10.2254435,16.2267099 10.2254435,16.2267099 L9.43228672,20.7249253 C9.43228672,20.7249253 15.1331234,21.2766981 17.950402,21.7734603 C19.3152185,22.0141143 21.3273422,22.4758916 23.0359088,22.887195 C22.0718328,24.3735021 20.9147108,26.1229174 20.0932954,27.2534987 C18.405278,29.5768553 14.7471849,33.9633914 14.7471849,33.9633914 L18.4424572,36.6481639 C18.4424572,36.6481639 21.4374695,31.7661671 23.1189701,29.4517801 C23.9598468,28.2944125 25.3148663,26.6203912 26.4570264,25.2388063 C27.4382453,26.7462318 28.6051214,28.5736505 29.3214044,29.8142891 C30.7573178,32.301364 33.2767374,37.4273633 33.2767374,37.4273633 L37.2324017,35.1435594 C37.2324017,35.1435594 33.990657,30.4217925 32.5602872,27.9443193 C31.8079686,26.6412654 30.764866,24.5861738 29.94691,22.9346427 C31.7349883,22.451283 33.9931664,21.8608332 35.4733174,21.5462174 C38.2823878,20.9491311 43.9360463,20.1370415 43.9360463,20.1370415 L42.9863873,15.669247 C42.9863873,15.669247 37.4939659,17.2932232 34.6957402,17.8880045 C33.1431973,18.2180076 30.6947576,18.5971515 28.8277097,18.8686298 C28.722602,16.9801623 28.6032977,14.4864013 28.6032977,12.8962937 C28.6032977,10.024467 28.984416,4.32551158 28.984416,4.32551158 L24.4168083,4.32551158 C24.4168083,4.32551158 24.8633581,10.0355541 24.8633581,12.8962937 C24.8633581,14.5048733 24.7214143,17.0240015 24.5975819,18.9156325 Z" id="path-52"></path>
|
||||
<filter x="-14.6%" y="-6.2%" width="120.9%" height="121.4%" filterUnits="objectBoundingBox" id="filter-54">
|
||||
<feMorphology radius="0.547297297" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
|
||||
<feOffset dx="-3" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
|
||||
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
|
||||
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
<ellipse id="path-55" cx="26.802716" cy="22.6705733" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<filter x="-34.2%" y="-11.4%" width="145.7%" height="134.2%" filterUnits="objectBoundingBox" id="filter-56">
|
||||
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feColorMatrix values="0 0 0 0 0.596078431 0 0 0 0 0.647058824 0 0 0 0 0.701960784 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
</defs>
|
||||
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="403" transform="translate(-592.000000, -260.000000)">
|
||||
<g id="Group-9" transform="translate(599.000000, 261.000000)">
|
||||
<g id="Group-11">
|
||||
<g id="Rectangle-355">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
||||
<use stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-1"></use>
|
||||
</g>
|
||||
<g id="Rectangle-355">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
|
||||
<use stroke="#A3B1BF" stroke-width="1.62" fill-opacity="0.15" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-3"></use>
|
||||
</g>
|
||||
<g id="Rectangle-357">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
|
||||
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-5"></use>
|
||||
<path stroke="#A3B1BF" stroke-width="1.62" d="M176.0325,106.581667 L176.0325,90.6683333 L161.510068,90.6683333 C158.330251,90.6683333 155.7525,93.2460841 155.7525,96.4259009 L155.7525,100.824099 C155.7525,104.003916 158.330251,106.581667 161.510068,106.581667 L176.0325,106.581667 Z"></path>
|
||||
</g>
|
||||
<g id="Rectangle-357" transform="translate(188.340000, 98.625000) scale(-1, 1) translate(-188.340000, -98.625000) ">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
|
||||
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-7"></use>
|
||||
<path stroke="#A3B1BF" stroke-width="1.62" d="M198.48,106.581667 L198.48,90.6683333 L183.957568,90.6683333 C180.777751,90.6683333 178.2,93.2460841 178.2,96.4259009 L178.2,100.824099 C178.2,104.003916 180.777751,106.581667 183.957568,106.581667 L198.48,106.581667 Z"></path>
|
||||
</g>
|
||||
<path d="M169.537821,109.198898 L179.520726,109.198898 L179.520726,106.316665 C179.657239,106.659699 174.968976,106.316665 172.419859,106.316665 L174.153055,100.243742 C171.605657,100.243742 169.537821,102.294522 169.537821,104.822572 L169.537821,109.198898 Z M181.404585,106.764356 L181.334952,105.82938 C178.493277,106.319657 175.877716,105.82938 172.088276,105.82938 L174.153055,98.0162037 C170.365914,98.0162037 167.291667,101.063519 167.291667,104.822572 L167.291667,106.764356 L166.869647,106.764356 L166.869647,106.764356 C165.758829,106.764356 164.858333,107.664852 164.858333,108.775669 L164.858333,108.775669 L164.858333,115.540394 C164.858333,119.983665 168.460316,123.585648 172.903588,123.585648 L176.279745,123.585648 C180.723017,123.585648 184.325,119.983665 184.325,115.540394 L184.325,108.775669 C184.325,107.664852 183.424504,106.764356 182.313686,106.764356 L181.404585,106.764356 Z" id="Shape" fill="#D4DBE2" fill-rule="nonzero"></path>
|
||||
<g id="Group-6" filter="url(#filter-9)" transform="translate(160.419753, 95.472603)">
|
||||
<ellipse id="Oval-191" stroke="#D9D9D9" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#D9D9D9" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-10)" transform="translate(189.259259, 95.472603)">
|
||||
<ellipse id="Oval-191" stroke="#D9D9D9" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#D9D9D9" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="lock" transform="translate(166.683333, 96.798611)">
|
||||
<path d="M2.43333333,9.34812925 L2.43333333,7.750693 C2.43333333,4.33901358 4.64933408,1.45058816 7.70555556,0.476293029 L7.70555556,4.05203095 C6.57838885,4.84048413 5.84,6.15673686 5.84,7.64734194 L5.84,9.34812925 L14.4830461,9.34812925 C14.4830461,8.8280509 14.4830461,8.25372782 14.4830461,7.64734194 C14.4830461,6.44285214 14.0009139,5.352206 13.2211113,4.56188949 L13.2211113,0.864048014 C15.7633754,2.09038625 17.52,4.7131478 17.52,7.750693 C17.52,8.30041562 17.52,8.83504216 17.52,9.3491485 C18.6008993,9.38327886 19.4666667,10.2702555 19.4666667,11.3594429 L19.4666667,18.3317768 C19.4666667,22.7750482 15.8646835,26.3770314 11.4214121,26.3770314 L8.04525456,26.3770314 C3.60198316,26.3770314 5.4414381e-16,22.7750482 0,18.3317768 L0,11.3594429 C-1.36035952e-16,10.248625 0.900495789,9.34812925 2.01131364,9.34812925 L2.01131364,9.34812925 L2.43333333,9.34812925 Z" id="Combined-Shape" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5"></path>
|
||||
<g id="Oval-1115">
|
||||
<use fill-opacity="0.3" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-11"></use>
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-12)" xlink:href="#path-11"></use>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-13)" transform="translate(64.000000, 75.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-11" filter="url(#filter-14)" transform="translate(152.000000, 75.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-2" filter="url(#filter-15)" transform="translate(57.000000, 120.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-3" filter="url(#filter-16)" transform="translate(57.000000, 137.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-4" filter="url(#filter-17)" transform="translate(64.000000, 186.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-5" filter="url(#filter-18)" transform="translate(93.000000, 191.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-6" filter="url(#filter-19)" transform="translate(122.000000, 191.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-7" filter="url(#filter-20)" transform="translate(152.000000, 186.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-21)" transform="translate(160.419753, 95.472603)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-22)" transform="translate(189.259259, 95.472603)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-23)" transform="translate(25.000000, 38.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-8" filter="url(#filter-24)" transform="translate(25.000000, 218.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-9" filter="url(#filter-25)" transform="translate(106.000000, 237.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy-10" filter="url(#filter-26)" transform="translate(185.000000, 219.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-27)" transform="translate(14.419753, 129.698630)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-28)" transform="translate(105.444444, 20.715753)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-29)" transform="translate(185.055000, 37.806250)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F5F5F5" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
|
||||
</g>
|
||||
<g id="Rectangle-373">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-31)" xlink:href="#path-30"></use>
|
||||
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-30"></use>
|
||||
<rect stroke="#A3B1BF" stroke-width="2.43" x="80.2983333" y="70.0089815" width="58.4033333" height="21.9218519"></rect>
|
||||
</g>
|
||||
<mask id="mask-33" fill="white">
|
||||
<use xlink:href="#path-32"></use>
|
||||
</mask>
|
||||
<use id="Mask" fill-opacity="0.3" fill="#A3B1BF" xlink:href="#path-32"></use>
|
||||
<rect id="Rectangle-375" fill="#A3B1BF" x="114.366667" y="77.3171296" width="1.825" height="8.11728395" rx="0.9125"></rect>
|
||||
<rect id="Rectangle-375" fill="#A3B1BF" x="118.016667" y="72.6496914" width="2.43333333" height="16.2345679" rx="1.21666667"></rect>
|
||||
<g id="Group-4" transform="translate(25.000000, 88.000000)">
|
||||
<g id="Rectangle-369">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-35)" xlink:href="#path-34"></use>
|
||||
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-34"></use>
|
||||
<path stroke="#A3B1BF" stroke-width="1.62" d="M14.6441667,30.0879167 L14.6441667,1.02458333 L6.69173423,1.02458333 C3.51191747,1.02458333 0.934166667,3.60233414 0.934166667,6.7821509 L0.934166667,24.3303491 C0.934166667,27.5101659 3.51191747,30.0879167 6.69173423,30.0879167 L14.6441667,30.0879167 Z"></path>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-36)" transform="translate(6.207500, 6.789583)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-37)" transform="translate(6.543210, 19.181507)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Rectangle-371">
|
||||
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-38"></use>
|
||||
<path stroke="#A3B1BF" stroke-width="1.62" d="M18.4541667,9.31638699 L18.4541667,21.7961161 L41.6574976,19.7900592 C41.8219325,19.7734468 42.0191667,19.5280875 42.0191667,19.236911 L42.0191667,11.875589 C42.0191667,11.5822335 41.824213,11.3392839 41.6691435,11.3235325 L18.4541667,9.31638699 Z"></path>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-39)" transform="translate(23.000000, 13.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy" filter="url(#filter-40)" transform="translate(33.000000, 13.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Rectangle-370">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-42)" xlink:href="#path-41"></use>
|
||||
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-41"></use>
|
||||
<rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.59958333" width="5.4975" height="15.9133333" rx="1.09459459"></rect>
|
||||
</g>
|
||||
<path d="M13.59875,15.55625 L17.97875,15.55625" id="Line" stroke="#A3B1BF" stroke-width="2.18918919" stroke-linecap="square"></path>
|
||||
</g>
|
||||
<g id="Group-4-Copy" transform="translate(25.000000, 145.000000)">
|
||||
<g id="Rectangle-369">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-44)" xlink:href="#path-43"></use>
|
||||
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-43"></use>
|
||||
<path stroke="#A3B1BF" stroke-width="1.62" d="M14.6441667,30.0879167 L14.6441667,1.02458333 L6.69173423,1.02458333 C3.51191747,1.02458333 0.934166667,3.60233414 0.934166667,6.7821509 L0.934166667,24.3303491 C0.934166667,27.5101659 3.51191747,30.0879167 6.69173423,30.0879167 L14.6441667,30.0879167 Z"></path>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-45)" transform="translate(6.207500, 6.789583)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-46)" transform="translate(6.543210, 19.181507)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Rectangle-371">
|
||||
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-47"></use>
|
||||
<path stroke="#A3B1BF" stroke-width="1.62" d="M18.4541667,9.31638699 L18.4541667,21.7961161 L41.6574976,19.7900592 C41.8219325,19.7734468 42.0191667,19.5280875 42.0191667,19.236911 L42.0191667,11.875589 C42.0191667,11.5822335 41.824213,11.3392839 41.6691435,11.3235325 L18.4541667,9.31638699 Z"></path>
|
||||
</g>
|
||||
<g id="Group-6" filter="url(#filter-48)" transform="translate(23.000000, 13.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Group-6-Copy" filter="url(#filter-49)" transform="translate(33.000000, 13.000000)">
|
||||
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
|
||||
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
|
||||
</g>
|
||||
<g id="Rectangle-370">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-51)" xlink:href="#path-50"></use>
|
||||
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-50"></use>
|
||||
<rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.59958333" width="5.4975" height="15.9133333" rx="1.09459459"></rect>
|
||||
</g>
|
||||
<path d="M13.59875,15.55625 L17.97875,15.55625" id="Line" stroke="#A3B1BF" stroke-width="2.18918919" stroke-linecap="square"></path>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group-17" transform="translate(135.185185, 131.500000)">
|
||||
<path d="M22.4835494,46.23099 C10.0861375,46.23099 0.0360493827,36.1732534 0.0360493827,23.7664066 C0.0360493827,11.3595599 10.0861375,1.30182331 22.4835494,1.30182331 C34.8809613,1.30182331 44.9310494,11.3595599 44.9310494,23.7664066 C44.9310494,36.1732534 34.8809613,46.23099 22.4835494,46.23099 Z M22.4835494,39.65599 C31.2524505,39.65599 38.3610494,32.5419812 38.3610494,23.7664066 C38.3610494,14.9908321 31.2524505,7.87682331 22.4835494,7.87682331 C13.7146483,7.87682331 6.60604938,14.9908321 6.60604938,23.7664066 C6.60604938,32.5419812 13.7146483,39.65599 22.4835494,39.65599 Z" id="Oval-190" fill-opacity="0.3" fill="#A3B1BF"></path>
|
||||
<mask id="mask-53" fill="white">
|
||||
<use xlink:href="#path-52"></use>
|
||||
</mask>
|
||||
<g id="Mask">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-54)" xlink:href="#path-52"></use>
|
||||
<use stroke="#A3B1BF" stroke-width="1.09459459" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-52"></use>
|
||||
</g>
|
||||
<g id="Group-7" transform="translate(0.360494, 0.078598)" fill="#98A5B3">
|
||||
<path d="M20.5636489,0.927088888 C22.1113303,0.589405992 23.7186545,0.411496914 25.3675,0.411496914 C37.7649119,0.411496914 47.815,10.4692335 47.815,22.8760802 C47.815,33.7386653 40.1110508,42.8005273 29.8728116,44.8880725 L27.4696515,38.6276265 C35.2448963,37.5983622 41.245,30.9384541 41.245,22.8760802 C41.245,14.1005057 34.1364011,6.98649691 25.3675,6.98649691 C22.0362626,6.98649691 18.9446369,8.01317718 16.3913275,9.76760576 L15.30877,6.94744709 L20.5636489,0.927088888 Z" id="Oval-190"></path>
|
||||
</g>
|
||||
<path d="M26.802716,45.1351566 C14.4053041,45.1351566 4.35521605,35.0774201 4.35521605,22.6705733 C4.35521605,10.2637265 14.4053041,0.20598998 26.802716,0.20598998 C39.200128,0.20598998 49.250216,10.2637265 49.250216,22.6705733 C49.250216,35.0774201 39.200128,45.1351566 26.802716,45.1351566 Z M26.802716,38.5601566 C35.5716172,38.5601566 42.680216,31.4461479 42.680216,22.6705733 C42.680216,13.8949988 35.5716172,6.78098998 26.802716,6.78098998 C18.0338149,6.78098998 10.925216,13.8949988 10.925216,22.6705733 C10.925216,31.4461479 18.0338149,38.5601566 26.802716,38.5601566 Z" id="Oval-190" fill="#A3B1BF"></path>
|
||||
<path d="M37.5685802,6.47400902 C37.5685802,6.47400902 40.3560433,8.0639828 43.0005786,12.4958138 C45.6451139,16.9276447 45.9870813,21.4863845 45.9870813,21.4863845" id="Line" stroke="#F7FAFC" stroke-width="1.62" stroke-linecap="round"></path>
|
||||
<g id="Oval-199">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-56)" xlink:href="#path-55"></use>
|
||||
<use fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-55"></use>
|
||||
</g>
|
||||
<path d="M27.0403924,24.1861178 C28.3842853,24.1861178 29.4737257,23.0958483 29.4737257,21.7509326 C29.4737257,20.406017 28.3842853,19.3157475 27.0403924,19.3157475 C27.0403924,19.3157475 27.6699621,20.406017 27.6699621,21.7509326 C27.6699621,23.0958483 27.0403924,24.1861178 27.0403924,24.1861178 Z" id="Oval-199" fill="#F7FAFC" transform="translate(28.257059, 21.750933) rotate(-43.000000) translate(-28.257059, -21.750933) "></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 54 KiB |
314
public/static/admin/images/404.svg
Normal file
@ -0,0 +1,314 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="423px" height="341px" viewBox="0 0 423 341" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 4</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="404" transform="translate(-484.000000, -221.000000)">
|
||||
<g id="Group-4" transform="translate(464.000000, 222.000000)">
|
||||
<g id="Group-5" transform="translate(75.417348, 0.163879)" stroke="#A3B1BF" stroke-width="1.62" opacity="0.6" stroke-linejoin="round" stroke-dasharray="12.15">
|
||||
<path d="M169.575185,288.890375 C103.647066,288.890375 50.2010204,235.455806 50.2010204,169.540425 C50.2010204,103.625045 103.647066,50.1904762 169.575185,50.1904762 C235.50394,50.1904762 288.94935,103.625045 288.94935,169.540425 C288.94935,235.455806 235.50394,288.890375 169.575185,288.890375 Z" id="Stroke-1"></path>
|
||||
<path d="M169.405699,338.555288 C76.0274364,338.555288 0.329411882,262.872619 0.329411882,169.513299 C0.329411882,76.1539786 76.0274364,0.471309613 169.405699,0.471309613 C262.783961,0.471309613 338.481985,76.1539786 338.481985,169.513299 C338.481985,262.872619 262.783961,338.555288 169.405699,338.555288 Z" id="Stroke-3"></path>
|
||||
</g>
|
||||
<polygon id="Fill-6" fill="#F5F5F5" transform="translate(106.914750, 199.432805) rotate(22.000000) translate(-106.914750, -199.432805) " points="97.7112298 198.803016 116.11827 190.231152 107.544667 208.634458"></polygon>
|
||||
<polygon id="Stroke-7" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(106.914750, 199.432805) rotate(22.000000) translate(-106.914750, -199.432805) " points="97.7112298 198.803016 116.11827 190.231152 107.544667 208.634458"></polygon>
|
||||
<polygon id="Fill-8" transform="translate(58.996118, 219.767028) rotate(22.000000) translate(-58.996118, -219.767028) " points="38.8543444 215.183828 54.4119879 199.629341 79.1378915 224.350228 63.580248 239.904716"></polygon>
|
||||
<polygon id="Stroke-9" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(58.996118, 219.767028) rotate(22.000000) translate(-58.996118, -219.767028) " points="38.8543444 215.183828 54.4119879 199.629341 79.1378915 224.350228 63.580248 239.904716"></polygon>
|
||||
<polygon id="Fill-10" fill="#F5F5F5" transform="translate(71.226096, 214.577614) rotate(22.000000) translate(-71.226096, -214.577614) " points="51.4642422 198.657893 55.3028278 194.820086 90.9879502 230.497335 87.1487294 234.335141"></polygon>
|
||||
<polygon id="Stroke-11" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" transform="translate(71.226096, 214.577614) rotate(22.000000) translate(-71.226096, -214.577614) " points="51.4642422 198.657893 55.3028278 194.820086 90.9879502 230.497335 87.1487294 234.335141"></polygon>
|
||||
<polygon id="Fill-12" transform="translate(84.698338, 273.903349) rotate(22.000000) translate(-84.698338, -273.903349) " points="56.0769883 259.690379 70.4821667 245.288122 113.319688 288.116319 98.9145099 302.518575"></polygon>
|
||||
<polygon id="Stroke-13" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(84.698338, 273.903349) rotate(22.000000) translate(-84.698338, -273.903349) " points="56.0769883 259.690379 70.4821667 245.288122 113.319688 288.116319 98.9145099 302.518575"></polygon>
|
||||
<polygon id="Fill-14" transform="translate(75.456149, 212.782520) rotate(22.000000) translate(-75.456149, -212.782520) " points="63.8911557 203.879723 66.5512281 201.22019 87.0211429 221.685318 84.3604352 224.34485"></polygon>
|
||||
<polygon id="Stroke-15" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(75.456149, 212.782520) rotate(22.000000) translate(-75.456149, -212.782520) " points="63.8911557 203.879723 66.5512281 201.22019 87.0211429 221.685318 84.3604352 224.34485"></polygon>
|
||||
<polygon id="Fill-16" fill="#F5F5F5" transform="translate(78.176142, 202.618192) rotate(22.000000) translate(-78.176142, -202.618192) " points="74.4026766 205.006817 80.5652518 198.845492 81.9496076 200.229567 75.7870324 206.390892"></polygon>
|
||||
<polygon id="Stroke-17" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(78.176142, 202.618192) rotate(22.000000) translate(-78.176142, -202.618192) " points="74.4026766 205.006817 80.5652518 198.845492 81.9496076 200.229567 75.7870324 206.390892"></polygon>
|
||||
<polygon id="Fill-18" fill="#F5F5F5" transform="translate(84.676979, 217.928886) rotate(22.000000) translate(-84.676979, -217.928886) " points="80.9035138 220.317511 87.066089 214.156186 88.4504448 215.540261 82.2878696 221.701586"></polygon>
|
||||
<polygon id="Stroke-19" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(84.676979, 217.928886) rotate(22.000000) translate(-84.676979, -217.928886) " points="80.9035138 220.317511 87.066089 214.156186 88.4504448 215.540261 82.2878696 221.701586"></polygon>
|
||||
<polygon id="Fill-20" transform="translate(70.238421, 242.404581) rotate(22.000000) translate(-70.238421, -242.404581) " points="67.8493111 238.631881 74.0118863 244.793206 72.6275305 246.177281 66.4649553 240.015956"></polygon>
|
||||
<polygon id="Stroke-21" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(70.238421, 242.404581) rotate(22.000000) translate(-70.238421, -242.404581) " points="67.8493111 238.631881 74.0118863 244.793206 72.6275305 246.177281 66.4649553 240.015956"></polygon>
|
||||
<polygon id="Fill-22" transform="translate(48.081755, 224.398789) rotate(22.000000) translate(-48.081755, -224.398789) " points="35.1127107 220.725179 36.3242602 211.432376 61.0507992 236.153899 51.756111 237.365203"></polygon>
|
||||
<polygon id="Stroke-23" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(48.081755, 224.398789) rotate(22.000000) translate(-48.081755, -224.398789) " points="35.1127107 220.725179 36.3242602 211.432376 61.0507992 236.153899 51.756111 237.365203"></polygon>
|
||||
<polygon id="Fill-24" transform="translate(38.612968, 228.416820) rotate(22.000000) translate(-38.612968, -228.416820) " points="32.9179858 217.470622 26.2496982 216.056058 50.9762371 240.777581 49.5613861 234.110647"></polygon>
|
||||
<polygon id="Stroke-25" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(38.612968, 228.416820) rotate(22.000000) translate(-38.612968, -228.416820) " points="32.9179858 217.470622 26.2496982 216.056058 50.9762371 240.777581 49.5613861 234.110647"></polygon>
|
||||
<polygon id="Fill-26" transform="translate(31.086342, 221.523909) rotate(22.000000) translate(-31.086342, -221.523909) " points="32.6469986 217.297684 26.8592604 218.37941 34.2314793 225.750133 35.3134242 219.963569"></polygon>
|
||||
<polygon id="Stroke-27" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(31.086342, 221.523909) rotate(22.000000) translate(-31.086342, -221.523909) " points="32.6469986 217.297684 26.8592604 218.37941 34.2314793 225.750133 35.3134242 219.963569"></polygon>
|
||||
<polygon id="Fill-28" transform="translate(38.344372, 238.617819) rotate(22.000000) translate(-38.344372, -238.617819) " points="39.9050284 234.391595 34.1172902 235.47332 41.4895091 242.844044 42.571454 237.05748"></polygon>
|
||||
<polygon id="Stroke-29" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(38.344372, 238.617819) rotate(22.000000) translate(-38.344372, -238.617819) " points="39.9050284 234.391595 34.1172902 235.47332 41.4895091 242.844044 42.571454 237.05748"></polygon>
|
||||
<polygon id="Fill-30" fill="#F0F2F5" transform="translate(75.352798, 203.766862) rotate(22.000000) translate(-75.352798, -203.766862) " points="71.4417859 201.708217 73.2937351 199.856644 79.2638092 205.824871 77.4118601 207.67708"></polygon>
|
||||
<polygon id="Stroke-31" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(75.352798, 203.766862) rotate(22.000000) translate(-75.352798, -203.766862) " points="71.4417859 201.708217 73.2937351 199.856644 79.2638092 205.824871 77.4118601 207.67708"></polygon>
|
||||
<polygon id="Fill-32" fill="#F0F2F5" transform="translate(81.871541, 219.119730) rotate(22.000000) translate(-81.871541, -219.119730) " points="77.9605297 217.061085 79.8124789 215.209512 85.7825531 221.177739 83.9306039 223.029948"></polygon>
|
||||
<polygon id="Stroke-33" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(81.871541, 219.119730) rotate(22.000000) translate(-81.871541, -219.119730) " points="77.9605297 217.061085 79.8124789 215.209512 85.7825531 221.177739 83.9306039 223.029948"></polygon>
|
||||
<polygon id="Fill-34" transform="translate(68.034935, 237.215417) rotate(22.000000) translate(-68.034935, -237.215417) " points="65.1594898 237.106164 67.9256601 234.340555 70.9103796 237.324669 68.1442092 240.090278"></polygon>
|
||||
<polygon id="Stroke-35" stroke="#A3B1BF" stroke-width="1.62" fill="#F5F5F5" stroke-linejoin="round" transform="translate(68.034935, 237.215417) rotate(22.000000) translate(-68.034935, -237.215417) " points="65.1594898 237.106164 67.9256601 234.340555 70.9103796 237.324669 68.1442092 240.090278"></polygon>
|
||||
<path d="M90.2556147,213.065319 C79.2271463,202.039088 74.6433339,188.153875 78.4889079,179.512775 C79.1248602,178.084237 80.8319571,175.429786 84.5339495,179.131027 C88.2353065,182.832268 120.560237,215.150007 123.931865,218.52095 C127.303492,221.891894 125.245065,224.192545 123.817508,224.827733 C115.174655,228.675068 101.284718,224.092186 90.2556147,213.065319 Z" id="Fill-36" fill="#F5F5F5" transform="translate(101.453924, 201.708917) rotate(22.000000) translate(-101.453924, -201.708917) "></path>
|
||||
<path d="M90.2556147,213.065319 C79.2271463,202.039088 74.6433339,188.153875 78.4889079,179.512775 C79.1248602,178.084237 80.8319571,175.429786 84.5339495,179.131027 C88.2353065,182.832268 120.560237,215.150007 123.931865,218.52095 C127.303492,221.891894 125.245065,224.192545 123.817508,224.827733 C115.174655,228.675068 101.284718,224.092186 90.2556147,213.065319 Z" id="Stroke-38" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" transform="translate(101.453924, 201.708917) rotate(22.000000) translate(-101.453924, -201.708917) "></path>
|
||||
<polygon id="Fill-40" fill="#F0F2F5" transform="translate(86.633853, 208.038961) rotate(22.000000) translate(-86.633853, -208.038961) " points="77.9716233 201.230061 79.8235724 199.378488 95.2960835 214.84786 93.4441343 216.699433"></polygon>
|
||||
<polygon id="Stroke-42" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(86.633853, 208.038961) rotate(22.000000) translate(-86.633853, -208.038961) " points="77.9716233 201.230061 79.8235724 199.378488 95.2960835 214.84786 93.4441343 216.699433"></polygon>
|
||||
<path d="M121.635514,196.068815 C120.517356,197.186746 118.704797,197.186746 117.586639,196.068815 C116.469116,194.950884 116.469116,193.138692 117.586639,192.020761 C118.704797,190.903465 120.517356,190.903465 121.635514,192.020761 C122.753672,193.138692 122.753672,194.950884 121.635514,196.068815" id="Fill-44" fill="#A3B1BF" transform="translate(119.611315, 194.045026) rotate(22.000000) translate(-119.611315, -194.045026) "></path>
|
||||
<polygon id="Fill-46" fill-opacity="0.6" fill="#A3B1BF" transform="translate(81.250567, 248.056422) rotate(22.000000) translate(-81.250567, -248.056422) " points="81.2505672 249.672341 79.6343206 248.056422 81.2505672 246.440503 82.8668137 248.056422"></polygon>
|
||||
<polygon id="Stroke-48" transform="translate(81.250567, 248.056422) rotate(22.000000) translate(-81.250567, -248.056422) " points="81.2505672 249.672341 79.6343206 248.056422 81.2505672 246.440503 82.8668137 248.056422"></polygon>
|
||||
<polygon id="Fill-50" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.702196, 251.475282) rotate(22.000000) translate(-82.702196, -251.475282) " points="82.7021965 253.091201 81.0859499 251.475282 82.7021965 249.859363 84.318443 251.475282"></polygon>
|
||||
<polygon id="Stroke-52" transform="translate(82.702196, 251.475282) rotate(22.000000) translate(-82.702196, -251.475282) " points="82.7021965 253.091201 81.0859499 251.475282 82.7021965 249.859363 84.318443 251.475282"></polygon>
|
||||
<polygon id="Fill-54" fill-opacity="0.6" fill="#A3B1BF" transform="translate(84.153791, 254.894059) rotate(22.000000) translate(-84.153791, -254.894059) " points="84.1537906 256.509978 82.5375441 254.894059 84.1537906 253.278141 85.7700372 254.894059"></polygon>
|
||||
<polygon id="Stroke-56" transform="translate(84.153791, 254.894059) rotate(22.000000) translate(-84.153791, -254.894059) " points="84.1537906 256.509978 82.5375441 254.894059 84.1537906 253.278141 85.7700372 254.894059"></polygon>
|
||||
<polygon id="Fill-58" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.605385, 258.312837) rotate(22.000000) translate(-85.605385, -258.312837) " points="85.6053848 259.928756 83.9891383 258.312837 85.6053848 256.696918 87.2216313 258.312837"></polygon>
|
||||
<polygon id="Stroke-60" transform="translate(85.605385, 258.312837) rotate(22.000000) translate(-85.605385, -258.312837) " points="85.6053848 259.928756 83.9891383 258.312837 85.6053848 256.696918 87.2216313 258.312837"></polygon>
|
||||
<polygon id="Fill-62" fill-opacity="0.6" fill="#A3B1BF" transform="translate(78.094482, 249.395723) rotate(22.000000) translate(-78.094482, -249.395723) " points="78.0944819 251.011642 76.4782353 249.395723 78.0944819 247.779804 79.7107284 249.395723"></polygon>
|
||||
<polygon id="Stroke-64" transform="translate(78.094482, 249.395723) rotate(22.000000) translate(-78.094482, -249.395723) " points="78.0944819 251.011642 76.4782353 249.395723 78.0944819 247.779804 79.7107284 249.395723"></polygon>
|
||||
<polygon id="Fill-66" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.546052, 252.814559) rotate(22.000000) translate(-79.546052, -252.814559) " points="79.5460522 254.430478 77.9298057 252.814559 79.5460522 251.198641 81.1622988 252.814559"></polygon>
|
||||
<polygon id="Stroke-68" transform="translate(79.546052, 252.814559) rotate(22.000000) translate(-79.546052, -252.814559) " points="79.5460522 254.430478 77.9298057 252.814559 79.5460522 251.198641 81.1622988 252.814559"></polygon>
|
||||
<polygon id="Fill-70" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.997705, 256.233360) rotate(22.000000) translate(-80.997705, -256.233360) " points="80.9977053 257.849279 79.3814588 256.23336 80.9977053 254.617442 82.6139518 256.23336"></polygon>
|
||||
<polygon id="Stroke-72" transform="translate(80.997705, 256.233360) rotate(22.000000) translate(-80.997705, -256.233360) " points="79.3814588 256.23336 80.9977053 254.617442 82.6139518 256.23336 80.9977053 257.849279"></polygon>
|
||||
<polygon id="Fill-74" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.449276, 259.652197) rotate(22.000000) translate(-82.449276, -259.652197) " points="82.4492757 261.268115 80.8330292 259.652197 82.4492757 258.036278 84.0655222 259.652197"></polygon>
|
||||
<polygon id="Stroke-76" transform="translate(82.449276, 259.652197) rotate(22.000000) translate(-82.449276, -259.652197) " points="82.4492757 261.268115 80.8330292 259.652197 82.4492757 258.036278 84.0655222 259.652197"></polygon>
|
||||
<polygon id="Fill-78" fill-opacity="0.6" fill="#A3B1BF" transform="translate(74.938373, 250.735083) rotate(22.000000) translate(-74.938373, -250.735083) " points="74.9383727 252.351002 73.3221262 250.735083 74.9383727 249.119164 76.5546193 250.735083"></polygon>
|
||||
<polygon id="Stroke-80" transform="translate(74.938373, 250.735083) rotate(22.000000) translate(-74.938373, -250.735083) " points="74.9383727 252.351002 73.3221262 250.735083 74.9383727 249.119164 76.5546193 250.735083"></polygon>
|
||||
<polygon id="Fill-82" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.389967, 254.153860) rotate(22.000000) translate(-76.389967, -254.153860) " points="76.3899669 255.769779 74.7737204 254.15386 76.3899669 252.537942 78.0062134 254.15386"></polygon>
|
||||
<polygon id="Stroke-84" transform="translate(76.389967, 254.153860) rotate(22.000000) translate(-76.389967, -254.153860) " points="76.3899669 255.769779 74.7737204 254.15386 76.3899669 252.537942 78.0062134 254.15386"></polygon>
|
||||
<polygon id="Fill-86" fill-opacity="0.6" fill="#A3B1BF" transform="translate(77.841620, 257.572661) rotate(22.000000) translate(-77.841620, -257.572661) " points="77.84162 259.18858 76.2253735 257.572661 77.84162 255.956743 79.4578665 257.572661"></polygon>
|
||||
<polygon id="Stroke-88" transform="translate(77.841620, 257.572661) rotate(22.000000) translate(-77.841620, -257.572661) " points="77.84162 259.18858 76.2253735 257.572661 77.84162 255.956743 79.4578665 257.572661"></polygon>
|
||||
<polygon id="Fill-90" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.293190, 260.991498) rotate(22.000000) translate(-79.293190, -260.991498) " points="79.2931904 262.607416 77.6769438 260.991498 79.2931904 259.375579 80.9094369 260.991498"></polygon>
|
||||
<polygon id="Stroke-92" transform="translate(79.293190, 260.991498) rotate(22.000000) translate(-79.293190, -260.991498) " points="79.2931904 262.607416 77.6769438 260.991498 79.2931904 259.375579 80.9094369 260.991498"></polygon>
|
||||
<polygon id="Fill-94" fill-opacity="0.6" fill="#A3B1BF" transform="translate(71.782287, 252.074384) rotate(22.000000) translate(-71.782287, -252.074384) " points="71.7822874 253.690302 70.1660409 252.074384 71.7822874 250.458465 73.3985339 252.074384"></polygon>
|
||||
<polygon id="Stroke-96" transform="translate(71.782287, 252.074384) rotate(22.000000) translate(-71.782287, -252.074384) " points="71.7822874 253.690302 70.1660409 252.074384 71.7822874 250.458465 73.3985339 252.074384"></polygon>
|
||||
<polygon id="Fill-98" fill-opacity="0.6" fill="#A3B1BF" transform="translate(73.233882, 255.493161) rotate(22.000000) translate(-73.233882, -255.493161) " points="73.2338816 257.10908 71.6176351 255.493161 73.2338816 253.877242 74.8501281 255.493161"></polygon>
|
||||
<polygon id="Stroke-100" transform="translate(73.233882, 255.493161) rotate(22.000000) translate(-73.233882, -255.493161) " points="73.2338816 257.10908 71.6176351 255.493161 73.2338816 253.877242 74.8501281 255.493161"></polygon>
|
||||
<polygon id="Fill-102" fill-opacity="0.6" fill="#A3B1BF" transform="translate(74.685535, 258.911962) rotate(22.000000) translate(-74.685535, -258.911962) " points="74.6855347 260.527881 73.0692881 258.911962 74.6855347 257.296044 76.3017812 258.911962"></polygon>
|
||||
<polygon id="Stroke-104" transform="translate(74.685535, 258.911962) rotate(22.000000) translate(-74.685535, -258.911962) " points="74.6855347 260.527881 73.0692881 258.911962 74.6855347 257.296044 76.3017812 258.911962"></polygon>
|
||||
<polygon id="Fill-106" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.137105, 262.330799) rotate(22.000000) translate(-76.137105, -262.330799) " points="76.137105 263.946717 74.5208585 262.330799 76.137105 260.71488 77.7533516 262.330799"></polygon>
|
||||
<polygon id="Stroke-108" transform="translate(76.137105, 262.330799) rotate(22.000000) translate(-76.137105, -262.330799) " points="76.137105 263.946717 74.5208585 262.330799 76.137105 260.71488 77.7533516 262.330799"></polygon>
|
||||
<polygon id="Fill-110" fill-opacity="0.6" fill="#A3B1BF" transform="translate(68.626202, 253.413685) rotate(22.000000) translate(-68.626202, -253.413685) " points="68.6262021 255.029603 67.0099556 253.413685 68.6262021 251.797766 70.2424486 253.413685"></polygon>
|
||||
<polygon id="Stroke-112" transform="translate(68.626202, 253.413685) rotate(22.000000) translate(-68.626202, -253.413685) " points="68.6262021 255.029603 67.0099556 253.413685 68.6262021 251.797766 70.2424486 253.413685"></polygon>
|
||||
<polygon id="Fill-114" fill-opacity="0.6" fill="#A3B1BF" transform="translate(70.077796, 256.832462) rotate(22.000000) translate(-70.077796, -256.832462) " points="70.0777963 258.448381 68.4615497 256.832462 70.0777963 255.216543 71.6940428 256.832462"></polygon>
|
||||
<polygon id="Stroke-116" transform="translate(70.077796, 256.832462) rotate(22.000000) translate(-70.077796, -256.832462) " points="70.0777963 258.448381 68.4615497 256.832462 70.0777963 255.216543 71.6940428 256.832462"></polygon>
|
||||
<polygon id="Fill-118" fill-opacity="0.6" fill="#A3B1BF" transform="translate(71.529426, 260.251322) rotate(22.000000) translate(-71.529426, -260.251322) " points="71.5294256 261.867241 69.913179 260.251322 71.5294256 258.635403 73.1456721 260.251322"></polygon>
|
||||
<polygon id="Stroke-120" transform="translate(71.529426, 260.251322) rotate(22.000000) translate(-71.529426, -260.251322) " points="71.5294256 261.867241 69.913179 260.251322 71.5294256 258.635403 73.1456721 260.251322"></polygon>
|
||||
<polygon id="Fill-122" fill-opacity="0.6" fill="#A3B1BF" transform="translate(72.981020, 263.670099) rotate(22.000000) translate(-72.981020, -263.670099) " points="72.9810197 265.286018 71.3647732 263.670099 72.9810197 262.054181 74.5972663 263.670099"></polygon>
|
||||
<polygon id="Stroke-124" transform="translate(72.981020, 263.670099) rotate(22.000000) translate(-72.981020, -263.670099) " points="72.9810197 265.286018 71.3647732 263.670099 72.9810197 262.054181 74.5972663 263.670099"></polygon>
|
||||
<polygon id="Fill-126" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.852907, 265.961362) rotate(22.000000) translate(-88.852907, -265.961362) " points="88.8529067 267.577281 87.2366602 265.961362 88.8529067 264.345443 90.4691533 265.961362"></polygon>
|
||||
<polygon id="Stroke-128" transform="translate(88.852907, 265.961362) rotate(22.000000) translate(-88.852907, -265.961362) " points="88.8529067 267.577281 87.2366602 265.961362 88.8529067 264.345443 90.4691533 265.961362"></polygon>
|
||||
<polygon id="Fill-130" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.304501, 269.380139) rotate(22.000000) translate(-90.304501, -269.380139) " points="90.3045009 270.996058 88.6882544 269.380139 90.3045009 267.764221 91.9207474 269.380139"></polygon>
|
||||
<polygon id="Stroke-132" transform="translate(90.304501, 269.380139) rotate(22.000000) translate(-90.304501, -269.380139) " points="90.3045009 270.996058 88.6882544 269.380139 90.3045009 267.764221 91.9207474 269.380139"></polygon>
|
||||
<polygon id="Fill-134" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.756130, 272.798999) rotate(22.000000) translate(-91.756130, -272.798999) " points="91.7561302 274.414918 90.1398837 272.798999 91.7561302 271.183081 93.3723767 272.798999"></polygon>
|
||||
<polygon id="Stroke-136" transform="translate(91.756130, 272.798999) rotate(22.000000) translate(-91.756130, -272.798999) " points="91.7561302 274.414918 90.1398837 272.798999 91.7561302 271.183081 93.3723767 272.798999"></polygon>
|
||||
<polygon id="Fill-138" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.207724, 276.217777) rotate(22.000000) translate(-93.207724, -276.217777) " points="93.2077244 277.833695 91.5914778 276.217777 93.2077244 274.601858 94.8239709 276.217777"></polygon>
|
||||
<polygon id="Stroke-140" transform="translate(93.207724, 276.217777) rotate(22.000000) translate(-93.207724, -276.217777) " points="93.2077244 277.833695 91.5914778 276.217777 93.2077244 274.601858 94.8239709 276.217777"></polygon>
|
||||
<polygon id="Fill-142" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.696821, 267.300663) rotate(22.000000) translate(-85.696821, -267.300663) " points="85.6968214 268.916582 84.0805749 267.300663 85.6968214 265.684744 87.313068 267.300663"></polygon>
|
||||
<polygon id="Stroke-144" transform="translate(85.696821, 267.300663) rotate(22.000000) translate(-85.696821, -267.300663) " points="85.6968214 268.916582 84.0805749 267.300663 85.6968214 265.684744 87.313068 267.300663"></polygon>
|
||||
<polygon id="Fill-146" fill-opacity="0.6" fill="#A3B1BF" transform="translate(87.148416, 270.719440) rotate(22.000000) translate(-87.148416, -270.719440) " points="87.1484156 272.335359 85.5321691 270.71944 87.1484156 269.103521 88.7646621 270.71944"></polygon>
|
||||
<polygon id="Stroke-148" transform="translate(87.148416, 270.719440) rotate(22.000000) translate(-87.148416, -270.719440) " points="87.1484156 272.335359 85.5321691 270.71944 87.1484156 269.103521 88.7646621 270.71944"></polygon>
|
||||
<polygon id="Fill-150" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.599986, 274.138276) rotate(22.000000) translate(-88.599986, -274.138276) " points="88.599986 275.754195 86.9837394 274.138276 88.599986 272.522358 90.2162325 274.138276"></polygon>
|
||||
<polygon id="Stroke-152" transform="translate(88.599986, 274.138276) rotate(22.000000) translate(-88.599986, -274.138276) " points="88.599986 275.754195 86.9837394 274.138276 88.599986 272.522358 90.2162325 274.138276"></polygon>
|
||||
<polygon id="Fill-154" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.051639, 277.557078) rotate(22.000000) translate(-90.051639, -277.557078) " points="90.0516391 279.172996 88.4353925 277.557078 90.0516391 275.941159 91.6678856 277.557078"></polygon>
|
||||
<polygon id="Stroke-156" transform="translate(90.051639, 277.557078) rotate(22.000000) translate(-90.051639, -277.557078) " points="90.0516391 279.172996 88.4353925 277.557078 90.0516391 275.941159 91.6678856 277.557078"></polygon>
|
||||
<polygon id="Fill-158" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.540736, 268.639964) rotate(22.000000) translate(-82.540736, -268.639964) " points="82.5407361 270.255882 80.9244896 268.639964 82.5407361 267.024045 84.1569826 268.639964"></polygon>
|
||||
<polygon id="Stroke-160" transform="translate(82.540736, 268.639964) rotate(22.000000) translate(-82.540736, -268.639964) " points="82.5407361 270.255882 80.9244896 268.639964 82.5407361 267.024045 84.1569826 268.639964"></polygon>
|
||||
<polygon id="Fill-162" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.992306, 272.058800) rotate(22.000000) translate(-83.992306, -272.058800) " points="83.9923065 273.674719 82.3760599 272.0588 83.9923065 270.442881 85.608553 272.0588"></polygon>
|
||||
<polygon id="Stroke-164" transform="translate(83.992306, 272.058800) rotate(22.000000) translate(-83.992306, -272.058800) " points="83.9923065 273.674719 82.3760599 272.0588 83.9923065 270.442881 85.608553 272.0588"></polygon>
|
||||
<polygon id="Fill-166" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.443901, 275.477577) rotate(22.000000) translate(-85.443901, -275.477577) " points="85.4439007 277.093496 83.8276541 275.477577 85.4439007 273.861659 87.0601472 275.477577"></polygon>
|
||||
<polygon id="Stroke-168" transform="translate(85.443901, 275.477577) rotate(22.000000) translate(-85.443901, -275.477577) " points="85.4439007 277.093496 83.8276541 275.477577 85.4439007 273.861659 87.0601472 275.477577"></polygon>
|
||||
<polygon id="Fill-170" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.895554, 278.896378) rotate(22.000000) translate(-86.895554, -278.896378) " points="86.8955537 280.512297 85.2793072 278.896378 86.8955537 277.28046 88.5118003 278.896378"></polygon>
|
||||
<polygon id="Stroke-172" transform="translate(86.895554, 278.896378) rotate(22.000000) translate(-86.895554, -278.896378) " points="86.8955537 280.512297 85.2793072 278.896378 86.8955537 277.28046 88.5118003 278.896378"></polygon>
|
||||
<polygon id="Fill-174" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.384651, 269.979265) rotate(22.000000) translate(-79.384651, -269.979265) " points="79.3846508 271.595183 77.7684043 269.979265 79.3846508 268.363346 81.0008973 269.979265"></polygon>
|
||||
<polygon id="Stroke-176" transform="translate(79.384651, 269.979265) rotate(22.000000) translate(-79.384651, -269.979265) " points="79.3846508 271.595183 77.7684043 269.979265 79.3846508 268.363346 81.0008973 269.979265"></polygon>
|
||||
<polygon id="Fill-178" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.836221, 273.398101) rotate(22.000000) translate(-80.836221, -273.398101) " points="80.8362212 275.01402 79.2199746 273.398101 80.8362212 271.782182 82.4524677 273.398101"></polygon>
|
||||
<polygon id="Stroke-180" transform="translate(80.836221, 273.398101) rotate(22.000000) translate(-80.836221, -273.398101) " points="80.8362212 275.01402 79.2199746 273.398101 80.8362212 271.782182 82.4524677 273.398101"></polygon>
|
||||
<polygon id="Fill-182" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.287815, 276.816878) rotate(22.000000) translate(-82.287815, -276.816878) " points="82.2878153 278.432797 80.6715688 276.816878 82.2878153 275.20096 83.9040619 276.816878"></polygon>
|
||||
<polygon id="Stroke-184" transform="translate(82.287815, 276.816878) rotate(22.000000) translate(-82.287815, -276.816878) " points="82.2878153 278.432797 80.6715688 276.816878 82.2878153 275.20096 83.9040619 276.816878"></polygon>
|
||||
<polygon id="Fill-186" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.739445, 280.235738) rotate(22.000000) translate(-83.739445, -280.235738) " points="83.7394446 281.851657 82.1231981 280.235738 83.7394446 278.61982 85.3556912 280.235738"></polygon>
|
||||
<polygon id="Stroke-188" transform="translate(83.739445, 280.235738) rotate(22.000000) translate(-83.739445, -280.235738) " points="83.7394446 281.851657 82.1231981 280.235738 83.7394446 278.61982 85.3556912 280.235738"></polygon>
|
||||
<polygon id="Fill-190" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.228483, 271.318601) rotate(22.000000) translate(-76.228483, -271.318601) " points="76.2284828 272.934519 74.6122362 271.318601 76.2284828 269.702682 77.8447293 271.318601"></polygon>
|
||||
<polygon id="Stroke-192" transform="translate(76.228483, 271.318601) rotate(22.000000) translate(-76.228483, -271.318601) " points="76.2284828 272.934519 74.6122362 271.318601 76.2284828 269.702682 77.8447293 271.318601"></polygon>
|
||||
<polygon id="Fill-194" fill-opacity="0.6" fill="#A3B1BF" transform="translate(77.680136, 274.737402) rotate(22.000000) translate(-77.680136, -274.737402) " points="77.6801358 276.353321 76.0638893 274.737402 77.6801358 273.121483 79.2963824 274.737402"></polygon>
|
||||
<polygon id="Stroke-196" transform="translate(77.680136, 274.737402) rotate(22.000000) translate(-77.680136, -274.737402) " points="77.6801358 276.353321 76.0638893 274.737402 77.6801358 273.121483 79.2963824 274.737402"></polygon>
|
||||
<polygon id="Fill-198" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.131730, 278.156179) rotate(22.000000) translate(-79.131730, -278.156179) " points="79.13173 279.772098 77.5154835 278.156179 79.13173 276.540261 80.7479765 278.156179"></polygon>
|
||||
<polygon id="Stroke-200" transform="translate(79.131730, 278.156179) rotate(22.000000) translate(-79.131730, -278.156179) " points="79.13173 279.772098 77.5154835 278.156179 79.13173 276.540261 80.7479765 278.156179"></polygon>
|
||||
<polygon id="Fill-202" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.583359, 281.575039) rotate(22.000000) translate(-80.583359, -281.575039) " points="80.5833593 283.190958 78.9671128 281.575039 80.5833593 279.959121 82.1996058 281.575039"></polygon>
|
||||
<polygon id="Stroke-204" transform="translate(80.583359, 281.575039) rotate(22.000000) translate(-80.583359, -281.575039) " points="80.5833593 283.190958 78.9671128 281.575039 80.5833593 279.959121 82.1996058 281.575039"></polygon>
|
||||
<polygon id="Fill-206" fill-opacity="0.6" fill="#A3B1BF" transform="translate(96.455246, 283.866302) rotate(22.000000) translate(-96.455246, -283.866302) " points="96.4552463 285.48222 94.8389998 283.866302 96.4552463 282.250383 98.0714929 283.866302"></polygon>
|
||||
<polygon id="Stroke-208" transform="translate(96.455246, 283.866302) rotate(22.000000) translate(-96.455246, -283.866302) " points="96.4552463 285.48222 94.8389998 283.866302 96.4552463 282.250383 98.0714929 283.866302"></polygon>
|
||||
<polygon id="Fill-210" fill-opacity="0.6" fill="#A3B1BF" transform="translate(97.906840, 287.285079) rotate(22.000000) translate(-97.906840, -287.285079) " points="97.9068405 288.900998 96.290594 287.285079 97.9068405 285.66916 99.523087 287.285079"></polygon>
|
||||
<polygon id="Stroke-212" transform="translate(97.906840, 287.285079) rotate(22.000000) translate(-97.906840, -287.285079) " points="97.9068405 288.900998 96.290594 287.285079 97.9068405 285.66916 99.523087 287.285079"></polygon>
|
||||
<polygon id="Fill-214" fill-opacity="0.6" fill="#A3B1BF" transform="translate(99.358435, 290.703856) rotate(22.000000) translate(-99.358435, -290.703856) " points="99.3584347 292.319775 97.7421881 290.703856 99.3584347 289.087938 100.974681 290.703856"></polygon>
|
||||
<polygon id="Stroke-216" transform="translate(99.358435, 290.703856) rotate(22.000000) translate(-99.358435, -290.703856) " points="99.3584347 292.319775 97.7421881 290.703856 99.3584347 289.087938 100.974681 290.703856"></polygon>
|
||||
<polygon id="Fill-218" fill-opacity="0.6" fill="#A3B1BF" transform="translate(100.810064, 294.122716) rotate(22.000000) translate(-100.810064, -294.122716) " points="100.810064 295.738635 99.1938174 294.122716 100.810064 292.506798 102.42631 294.122716"></polygon>
|
||||
<polygon id="Stroke-220" transform="translate(100.810064, 294.122716) rotate(22.000000) translate(-100.810064, -294.122716) " points="100.810064 295.738635 99.1938174 294.122716 100.810064 292.506798 102.42631 294.122716"></polygon>
|
||||
<polygon id="Fill-222" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.299102, 285.205579) rotate(22.000000) translate(-93.299102, -285.205579) " points="93.2991021 286.821497 91.6828556 285.205579 93.2991021 283.58966 94.9153486 285.205579"></polygon>
|
||||
<polygon id="Stroke-224" transform="translate(93.299102, 285.205579) rotate(22.000000) translate(-93.299102, -285.205579) " points="93.2991021 286.821497 91.6828556 285.205579 93.2991021 283.58966 94.9153486 285.205579"></polygon>
|
||||
<polygon id="Fill-226" fill-opacity="0.6" fill="#A3B1BF" transform="translate(94.750755, 288.624380) rotate(22.000000) translate(-94.750755, -288.624380) " points="94.7507552 290.240299 93.1345086 288.62438 94.7507552 287.008461 96.3670017 288.62438"></polygon>
|
||||
<polygon id="Stroke-228" transform="translate(94.750755, 288.624380) rotate(22.000000) translate(-94.750755, -288.624380) " points="94.7507552 290.240299 93.1345086 288.62438 94.7507552 287.008461 96.3670017 288.62438"></polygon>
|
||||
<polygon id="Fill-230" fill-opacity="0.6" fill="#A3B1BF" transform="translate(96.202326, 292.043216) rotate(22.000000) translate(-96.202326, -292.043216) " points="96.2023255 293.659135 94.586079 292.043216 96.2023255 290.427297 97.8185721 292.043216"></polygon>
|
||||
<polygon id="Stroke-232" transform="translate(96.202326, 292.043216) rotate(22.000000) translate(-96.202326, -292.043216) " points="96.2023255 293.659135 94.586079 292.043216 96.2023255 290.427297 97.8185721 292.043216"></polygon>
|
||||
<polygon id="Fill-234" fill-opacity="0.6" fill="#A3B1BF" transform="translate(97.653979, 295.462017) rotate(22.000000) translate(-97.653979, -295.462017) " points="97.6539786 297.077936 96.0377321 295.462017 97.6539786 293.846099 99.2702252 295.462017"></polygon>
|
||||
<polygon id="Stroke-236" transform="translate(97.653979, 295.462017) rotate(22.000000) translate(-97.653979, -295.462017) " points="97.6539786 297.077936 96.0377321 295.462017 97.6539786 293.846099 99.2702252 295.462017"></polygon>
|
||||
<polygon id="Fill-238" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.143017, 286.544880) rotate(22.000000) translate(-90.143017, -286.544880) " points="90.1430168 288.160798 88.5267702 286.54488 90.1430168 284.928961 91.7592633 286.54488"></polygon>
|
||||
<polygon id="Stroke-240" transform="translate(90.143017, 286.544880) rotate(22.000000) translate(-90.143017, -286.544880) " points="90.1430168 288.160798 88.5267702 286.54488 90.1430168 284.928961 91.7592633 286.54488"></polygon>
|
||||
<polygon id="Fill-242" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.594670, 289.963681) rotate(22.000000) translate(-91.594670, -289.963681) " points="91.5946698 291.5796 89.9784233 289.963681 91.5946698 288.347762 93.2109164 289.963681"></polygon>
|
||||
<polygon id="Stroke-244" transform="translate(91.594670, 289.963681) rotate(22.000000) translate(-91.594670, -289.963681) " points="91.5946698 291.5796 89.9784233 289.963681 91.5946698 288.347762 93.2109164 289.963681"></polygon>
|
||||
<polygon id="Fill-246" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.046240, 293.382517) rotate(22.000000) translate(-93.046240, -293.382517) " points="93.0462402 294.998436 91.4299937 293.382517 93.0462402 291.766598 94.6624868 293.382517"></polygon>
|
||||
<polygon id="Stroke-248" transform="translate(93.046240, 293.382517) rotate(22.000000) translate(-93.046240, -293.382517) " points="93.0462402 294.998436 91.4299937 293.382517 93.0462402 291.766598 94.6624868 293.382517"></polygon>
|
||||
<polygon id="Fill-250" fill-opacity="0.6" fill="#A3B1BF" transform="translate(94.497893, 296.801318) rotate(22.000000) translate(-94.497893, -296.801318) " points="94.4978933 298.417237 92.8816468 296.801318 94.4978933 295.1854 96.1141398 296.801318"></polygon>
|
||||
<polygon id="Stroke-252" transform="translate(94.497893, 296.801318) rotate(22.000000) translate(-94.497893, -296.801318) " points="94.4978933 298.417237 92.8816468 296.801318 94.4978933 295.1854 96.1141398 296.801318"></polygon>
|
||||
<polygon id="Fill-254" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.986931, 287.884181) rotate(22.000000) translate(-86.986931, -287.884181) " points="86.9869315 289.500099 85.3706849 287.884181 86.9869315 286.268262 88.603178 287.884181"></polygon>
|
||||
<polygon id="Stroke-256" transform="translate(86.986931, 287.884181) rotate(22.000000) translate(-86.986931, -287.884181) " points="86.9869315 289.500099 85.3706849 287.884181 86.9869315 286.268262 88.603178 287.884181"></polygon>
|
||||
<polygon id="Fill-258" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.438585, 291.302982) rotate(22.000000) translate(-88.438585, -291.302982) " points="88.4385845 292.9189 86.822338 291.302982 88.4385845 289.687063 90.0548311 291.302982"></polygon>
|
||||
<polygon id="Stroke-260" transform="translate(88.438585, 291.302982) rotate(22.000000) translate(-88.438585, -291.302982) " points="88.4385845 292.9189 86.822338 291.302982 88.4385845 289.687063 90.0548311 291.302982"></polygon>
|
||||
<polygon id="Fill-262" fill-opacity="0.6" fill="#A3B1BF" transform="translate(89.890155, 294.721818) rotate(22.000000) translate(-89.890155, -294.721818) " points="89.8901549 296.337737 88.2739084 294.721818 89.8901549 293.105899 91.5064014 294.721818"></polygon>
|
||||
<polygon id="Stroke-264" transform="translate(89.890155, 294.721818) rotate(22.000000) translate(-89.890155, -294.721818) " points="89.8901549 296.337737 88.2739084 294.721818 89.8901549 293.105899 91.5064014 294.721818"></polygon>
|
||||
<polygon id="Fill-266" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.341749, 298.140595) rotate(22.000000) translate(-91.341749, -298.140595) " points="91.3417491 299.756514 89.7255025 298.140595 91.3417491 296.524677 92.9579956 298.140595"></polygon>
|
||||
<polygon id="Stroke-268" transform="translate(91.341749, 298.140595) rotate(22.000000) translate(-91.341749, -298.140595) " points="91.3417491 299.756514 89.7255025 298.140595 91.3417491 296.524677 92.9579956 298.140595"></polygon>
|
||||
<polygon id="Fill-270" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.830846, 289.223482) rotate(22.000000) translate(-83.830846, -289.223482) " points="83.8308461 290.8394 82.2145996 289.223482 83.8308461 287.607563 85.4470927 289.223482"></polygon>
|
||||
<polygon id="Stroke-272" transform="translate(83.830846, 289.223482) rotate(22.000000) translate(-83.830846, -289.223482) " points="82.2145996 289.223482 83.8308461 287.607563 85.4470927 289.223482 83.8308461 290.8394"></polygon>
|
||||
<polygon id="Fill-274" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.282417, 292.642318) rotate(22.000000) translate(-85.282417, -292.642318) " points="85.2824165 294.258236 83.66617 292.642318 85.2824165 291.026399 86.898663 292.642318"></polygon>
|
||||
<polygon id="Stroke-276" transform="translate(85.282417, 292.642318) rotate(22.000000) translate(-85.282417, -292.642318) " points="85.2824165 294.258236 83.66617 292.642318 85.2824165 291.026399 86.898663 292.642318"></polygon>
|
||||
<polygon id="Fill-278" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.734070, 296.061119) rotate(22.000000) translate(-86.734070, -296.061119) " points="86.7340696 297.677038 85.1178231 296.061119 86.7340696 294.4452 88.3503161 296.061119"></polygon>
|
||||
<polygon id="Stroke-280" transform="translate(86.734070, 296.061119) rotate(22.000000) translate(-86.734070, -296.061119) " points="86.7340696 297.677038 85.1178231 296.061119 86.7340696 294.4452 88.3503161 296.061119"></polygon>
|
||||
<polygon id="Fill-282" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.185664, 299.479896) rotate(22.000000) translate(-88.185664, -299.479896) " points="88.1856638 301.095815 86.5694172 299.479896 88.1856638 297.863978 89.8019103 299.479896"></polygon>
|
||||
<polygon id="Stroke-284" transform="translate(88.185664, 299.479896) rotate(22.000000) translate(-88.185664, -299.479896) " points="88.1856638 301.095815 86.5694172 299.479896 88.1856638 297.863978 89.8019103 299.479896"></polygon>
|
||||
<polygon id="Fill-286" transform="translate(37.779995, 163.402514) rotate(22.000000) translate(-37.779995, -163.402514) " points="51.9961666 192.018058 66.401345 177.615802 23.5644587 134.78697 9.15864501 149.189862"></polygon>
|
||||
<polygon id="Fill-290" transform="translate(50.400318, 195.682118) rotate(22.000000) translate(-50.400318, -195.682118) " points="54.1737837 198.070743 48.0112085 191.909418 46.6268527 193.293493 52.7894279 199.454818"></polygon>
|
||||
<polygon id="Stroke-292" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(50.400318, 195.682118) rotate(22.000000) translate(-50.400318, -195.682118) " points="54.1737837 198.070743 48.0112085 191.909418 46.6268527 193.293493 52.7894279 199.454818"></polygon>
|
||||
<polygon id="Fill-294" fill-opacity="0.8" fill="#A3B1BF" transform="translate(52.603532, 200.871447) rotate(22.000000) translate(-52.603532, -200.871447) " points="52.712807 203.746308 55.4789773 200.980699 52.4942579 197.996585 49.7280876 200.762195"></polygon>
|
||||
<polygon id="Stroke-296" stroke="#A3B1BF" stroke-width="1.62" fill="#FFFFFF" stroke-linejoin="round" transform="translate(52.603532, 200.871447) rotate(22.000000) translate(-52.603532, -200.871447) " points="52.712807 203.746308 55.4789773 200.980699 52.4942579 197.996585 49.7280876 200.762195"></polygon>
|
||||
<polygon id="Fill-298" fill-opacity="0.8" fill="#A3B1BF" transform="translate(53.983257, 183.836778) rotate(22.000000) translate(-53.983257, -183.836778) " points="52.3670108 183.836778 53.9832574 185.452697 55.5995039 183.836778 53.9832574 182.22086"></polygon>
|
||||
<polygon id="Stroke-300" transform="translate(53.983257, 183.836778) rotate(22.000000) translate(-53.983257, -183.836778) " points="52.3670108 183.836778 53.9832574 185.452697 55.5995039 183.836778 53.9832574 182.22086"></polygon>
|
||||
<polygon id="Fill-302" fill-opacity="0.8" fill="#A3B1BF" transform="translate(52.531663, 180.418001) rotate(22.000000) translate(-52.531663, -180.418001) " points="50.9154167 180.418001 52.5316632 182.03392 54.1479097 180.418001 52.5316632 178.802082"></polygon>
|
||||
<polygon id="Stroke-304" transform="translate(52.531663, 180.418001) rotate(22.000000) translate(-52.531663, -180.418001) " points="50.9154167 180.418001 52.5316632 182.03392 54.1479097 180.418001 52.5316632 178.802082"></polygon>
|
||||
<polygon id="Fill-306" fill-opacity="0.8" fill="#A3B1BF" transform="translate(51.080034, 176.999141) rotate(22.000000) translate(-51.080034, -176.999141) " points="49.4637874 176.999141 51.0800339 178.61506 52.6962805 176.999141 51.0800339 175.383222"></polygon>
|
||||
<polygon id="Stroke-308" transform="translate(51.080034, 176.999141) rotate(22.000000) translate(-51.080034, -176.999141) " points="49.4637874 176.999141 51.0800339 178.61506 52.6962805 176.999141 51.0800339 175.383222"></polygon>
|
||||
<polygon id="Fill-310" fill-opacity="0.8" fill="#A3B1BF" transform="translate(49.628440, 173.580364) rotate(22.000000) translate(-49.628440, -173.580364) " points="48.0121932 173.580364 49.6284397 175.196282 51.2446863 173.580364 49.6284397 171.964445"></polygon>
|
||||
<polygon id="Stroke-312" transform="translate(49.628440, 173.580364) rotate(22.000000) translate(-49.628440, -173.580364) " points="48.0121932 173.580364 49.6284397 175.196282 51.2446863 173.580364 49.6284397 171.964445"></polygon>
|
||||
<polygon id="Fill-314" fill-opacity="0.8" fill="#A3B1BF" transform="translate(50.827172, 185.176079) rotate(22.000000) translate(-50.827172, -185.176079) " points="49.2109255 185.176079 50.8271721 186.791998 52.4434186 185.176079 50.8271721 183.560161"></polygon>
|
||||
<polygon id="Stroke-316" transform="translate(50.827172, 185.176079) rotate(22.000000) translate(-50.827172, -185.176079) " points="49.2109255 185.176079 50.8271721 186.791998 52.4434186 185.176079 50.8271721 183.560161"></polygon>
|
||||
<polygon id="Fill-318" fill-opacity="0.8" fill="#A3B1BF" transform="translate(49.375578, 181.757302) rotate(22.000000) translate(-49.375578, -181.757302) " points="47.7593313 181.757302 49.3755779 183.373221 50.9918244 181.757302 49.3755779 180.141383"></polygon>
|
||||
<polygon id="Stroke-320" transform="translate(49.375578, 181.757302) rotate(22.000000) translate(-49.375578, -181.757302) " points="47.7593313 181.757302 49.3755779 183.373221 50.9918244 181.757302 49.3755779 180.141383"></polygon>
|
||||
<polygon id="Fill-322" fill-opacity="0.8" fill="#A3B1BF" transform="translate(47.923949, 178.338442) rotate(22.000000) translate(-47.923949, -178.338442) " points="46.3077021 178.338442 47.9239486 179.954361 49.5401951 178.338442 47.9239486 176.722523"></polygon>
|
||||
<polygon id="Stroke-324" transform="translate(47.923949, 178.338442) rotate(22.000000) translate(-47.923949, -178.338442) " points="46.3077021 178.338442 47.9239486 179.954361 49.5401951 178.338442 47.9239486 176.722523"></polygon>
|
||||
<polygon id="Fill-326" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.472354, 174.919665) rotate(22.000000) translate(-46.472354, -174.919665) " points="44.8561079 174.919665 46.4723544 176.535583 48.088601 174.919665 46.4723544 173.303746"></polygon>
|
||||
<polygon id="Stroke-328" transform="translate(46.472354, 174.919665) rotate(22.000000) translate(-46.472354, -174.919665) " points="44.8561079 174.919665 46.4723544 176.535583 48.088601 174.919665 46.4723544 173.303746"></polygon>
|
||||
<polygon id="Fill-330" fill-opacity="0.8" fill="#A3B1BF" transform="translate(47.671087, 186.515380) rotate(22.000000) translate(-47.671087, -186.515380) " points="46.0548402 186.51538 47.6710867 188.131299 49.2873333 186.51538 47.6710867 184.899461"></polygon>
|
||||
<polygon id="Stroke-332" transform="translate(47.671087, 186.515380) rotate(22.000000) translate(-47.671087, -186.515380) " points="46.0548402 186.51538 47.6710867 188.131299 49.2873333 186.51538 47.6710867 184.899461"></polygon>
|
||||
<polygon id="Fill-334" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.219493, 183.096603) rotate(22.000000) translate(-46.219493, -183.096603) " points="44.603246 183.096603 46.2194926 184.712521 47.8357391 183.096603 46.2194926 181.480684"></polygon>
|
||||
<polygon id="Stroke-336" transform="translate(46.219493, 183.096603) rotate(22.000000) translate(-46.219493, -183.096603) " points="44.603246 183.096603 46.2194926 184.712521 47.8357391 183.096603 46.2194926 181.480684"></polygon>
|
||||
<polygon id="Fill-338" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.767839, 179.677802) rotate(22.000000) translate(-44.767839, -179.677802) " points="43.1515929 179.677802 44.7678395 181.29372 46.384086 179.677802 44.7678395 178.061883"></polygon>
|
||||
<polygon id="Stroke-340" transform="translate(44.767839, 179.677802) rotate(22.000000) translate(-44.767839, -179.677802) " points="43.1515929 179.677802 44.7678395 181.29372 46.384086 179.677802 44.7678395 178.061883"></polygon>
|
||||
<polygon id="Fill-342" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.316269, 176.258965) rotate(22.000000) translate(-43.316269, -176.258965) " points="41.7000226 176.258965 43.3162691 177.874884 44.9325156 176.258965 43.3162691 174.643047"></polygon>
|
||||
<polygon id="Stroke-344" transform="translate(43.316269, 176.258965) rotate(22.000000) translate(-43.316269, -176.258965) " points="41.7000226 176.258965 43.3162691 177.874884 44.9325156 176.258965 43.3162691 174.643047"></polygon>
|
||||
<polygon id="Fill-346" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.514978, 187.854740) rotate(22.000000) translate(-44.514978, -187.854740) " points="42.8987311 187.85474 44.5149776 189.470659 46.1312242 187.85474 44.5149776 186.238821"></polygon>
|
||||
<polygon id="Stroke-348" transform="translate(44.514978, 187.854740) rotate(22.000000) translate(-44.514978, -187.854740) " points="42.8987311 187.85474 44.5149776 189.470659 46.1312242 187.85474 44.5149776 186.238821"></polygon>
|
||||
<polygon id="Fill-350" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.063348, 184.435880) rotate(22.000000) translate(-43.063348, -184.435880) " points="41.4471018 184.43588 43.0633483 186.051799 44.6795949 184.43588 43.0633483 182.819961"></polygon>
|
||||
<polygon id="Stroke-352" transform="translate(43.063348, 184.435880) rotate(22.000000) translate(-43.063348, -184.435880) " points="41.4471018 184.43588 43.0633483 186.051799 44.6795949 184.43588 43.0633483 182.819961"></polygon>
|
||||
<polygon id="Fill-354" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.611754, 181.017103) rotate(22.000000) translate(-41.611754, -181.017103) " points="39.9955076 181.017103 41.6117542 182.633021 43.2280007 181.017103 41.6117542 179.401184"></polygon>
|
||||
<polygon id="Stroke-356" transform="translate(41.611754, 181.017103) rotate(22.000000) translate(-41.611754, -181.017103) " points="39.9955076 181.017103 41.6117542 182.633021 43.2280007 181.017103 41.6117542 179.401184"></polygon>
|
||||
<polygon id="Fill-358" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.160184, 177.598266) rotate(22.000000) translate(-40.160184, -177.598266) " points="38.5439373 177.598266 40.1601838 179.214185 41.7764303 177.598266 40.1601838 175.982348"></polygon>
|
||||
<polygon id="Stroke-360" transform="translate(40.160184, 177.598266) rotate(22.000000) translate(-40.160184, -177.598266) " points="38.5439373 177.598266 40.1601838 179.214185 41.7764303 177.598266 40.1601838 175.982348"></polygon>
|
||||
<polygon id="Fill-362" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.358892, 189.194041) rotate(22.000000) translate(-41.358892, -189.194041) " points="39.7426458 189.194041 41.3588923 190.80996 42.9751388 189.194041 41.3588923 187.578122"></polygon>
|
||||
<polygon id="Stroke-364" transform="translate(41.358892, 189.194041) rotate(22.000000) translate(-41.358892, -189.194041) " points="39.7426458 189.194041 41.3588923 190.80996 42.9751388 189.194041 41.3588923 187.578122"></polygon>
|
||||
<polygon id="Fill-366" fill-opacity="0.8" fill="#A3B1BF" transform="translate(39.907263, 185.775181) rotate(22.000000) translate(-39.907263, -185.775181) " points="38.2910165 185.775181 39.907263 187.3911 41.5235095 185.775181 39.907263 184.159262"></polygon>
|
||||
<polygon id="Stroke-368" transform="translate(39.907263, 185.775181) rotate(22.000000) translate(-39.907263, -185.775181) " points="38.2910165 185.775181 39.907263 187.3911 41.5235095 185.775181 39.907263 184.159262"></polygon>
|
||||
<polygon id="Fill-370" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.455669, 182.356404) rotate(22.000000) translate(-38.455669, -182.356404) " points="36.8394223 182.356404 38.4556688 183.972322 40.0719154 182.356404 38.4556688 180.740485"></polygon>
|
||||
<polygon id="Stroke-372" transform="translate(38.455669, 182.356404) rotate(22.000000) translate(-38.455669, -182.356404) " points="36.8394223 182.356404 38.4556688 183.972322 40.0719154 182.356404 38.4556688 180.740485"></polygon>
|
||||
<polygon id="Fill-374" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.004016, 178.937602) rotate(22.000000) translate(-37.004016, -178.937602) " points="35.3877692 178.937602 37.0040158 180.553521 38.6202623 178.937602 37.0040158 177.321684"></polygon>
|
||||
<polygon id="Stroke-376" transform="translate(37.004016, 178.937602) rotate(22.000000) translate(-37.004016, -178.937602) " points="35.3877692 178.937602 37.0040158 180.553521 38.6202623 178.937602 37.0040158 177.321684"></polygon>
|
||||
<polygon id="Fill-378" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.380894, 165.931897) rotate(22.000000) translate(-46.380894, -165.931897) " points="44.7646475 165.931897 46.380894 167.547816 47.9971405 165.931897 46.380894 164.315979"></polygon>
|
||||
<polygon id="Stroke-380" transform="translate(46.380894, 165.931897) rotate(22.000000) translate(-46.380894, -165.931897) " points="44.7646475 165.931897 46.380894 167.547816 47.9971405 165.931897 46.380894 164.315979"></polygon>
|
||||
<polygon id="Fill-382" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.929324, 162.513061) rotate(22.000000) translate(-44.929324, -162.513061) " points="43.3130771 162.513061 44.9293236 164.12898 46.5455702 162.513061 44.9293236 160.897143"></polygon>
|
||||
<polygon id="Stroke-384" transform="translate(44.929324, 162.513061) rotate(22.000000) translate(-44.929324, -162.513061) " points="43.3130771 162.513061 44.9293236 164.12898 46.5455702 162.513061 44.9293236 160.897143"></polygon>
|
||||
<polygon id="Fill-386" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.477729, 159.094284) rotate(22.000000) translate(-43.477729, -159.094284) " points="41.8614829 159.094284 43.4777295 160.710203 45.093976 159.094284 43.4777295 157.478365"></polygon>
|
||||
<polygon id="Stroke-388" transform="translate(43.477729, 159.094284) rotate(22.000000) translate(-43.477729, -159.094284) " points="41.8614829 159.094284 43.4777295 160.710203 45.093976 159.094284 43.4777295 157.478365"></polygon>
|
||||
<polygon id="Fill-390" fill-opacity="0.8" fill="#A3B1BF" transform="translate(42.026100, 155.675424) rotate(22.000000) translate(-42.026100, -155.675424) " points="40.4098536 155.675424 42.0261002 157.291342 43.6423467 155.675424 42.0261002 154.059505"></polygon>
|
||||
<polygon id="Stroke-392" transform="translate(42.026100, 155.675424) rotate(22.000000) translate(-42.026100, -155.675424) " points="40.4098536 155.675424 42.0261002 157.291342 43.6423467 155.675424 42.0261002 154.059505"></polygon>
|
||||
<polygon id="Fill-394" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.224809, 167.271198) rotate(22.000000) translate(-43.224809, -167.271198) " points="41.6085622 167.271198 43.2248087 168.887117 44.8410552 167.271198 43.2248087 165.65528"></polygon>
|
||||
<polygon id="Stroke-396" transform="translate(43.224809, 167.271198) rotate(22.000000) translate(-43.224809, -167.271198) " points="41.6085622 167.271198 43.2248087 168.887117 44.8410552 167.271198 43.2248087 165.65528"></polygon>
|
||||
<polygon id="Fill-398" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.773238, 163.852362) rotate(22.000000) translate(-41.773238, -163.852362) " points="40.1569918 163.852362 41.7732383 165.468281 43.3894848 163.852362 41.7732383 162.236443"></polygon>
|
||||
<polygon id="Stroke-400" transform="translate(41.773238, 163.852362) rotate(22.000000) translate(-41.773238, -163.852362) " points="40.1569918 163.852362 41.7732383 165.468281 43.3894848 163.852362 41.7732383 162.236443"></polygon>
|
||||
<polygon id="Fill-402" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.321585, 160.433561) rotate(22.000000) translate(-40.321585, -160.433561) " points="38.7053387 160.433561 40.3215852 162.04948 41.9378318 160.433561 40.3215852 158.817642"></polygon>
|
||||
<polygon id="Stroke-404" transform="translate(40.321585, 160.433561) rotate(22.000000) translate(-40.321585, -160.433561) " points="38.7053387 160.433561 40.3215852 162.04948 41.9378318 160.433561 40.3215852 158.817642"></polygon>
|
||||
<polygon id="Fill-406" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.869991, 157.014784) rotate(22.000000) translate(-38.869991, -157.014784) " points="37.2537445 157.014784 38.8699911 158.630702 40.4862376 157.014784 38.8699911 155.398865"></polygon>
|
||||
<polygon id="Stroke-408" transform="translate(38.869991, 157.014784) rotate(22.000000) translate(-38.869991, -157.014784) " points="37.2537445 157.014784 38.8699911 158.630702 40.4862376 157.014784 38.8699911 155.398865"></polygon>
|
||||
<polygon id="Fill-410" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.068723, 168.610499) rotate(22.000000) translate(-40.068723, -168.610499) " points="38.4524768 168.610499 40.0687234 170.226418 41.6849699 168.610499 40.0687234 166.994581"></polygon>
|
||||
<polygon id="Stroke-412" transform="translate(40.068723, 168.610499) rotate(22.000000) translate(-40.068723, -168.610499) " points="38.4524768 168.610499 40.0687234 170.226418 41.6849699 168.610499 40.0687234 166.994581"></polygon>
|
||||
<polygon id="Fill-414" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.617129, 165.191722) rotate(22.000000) translate(-38.617129, -165.191722) " points="37.0008827 165.191722 38.6171292 166.807641 40.2333757 165.191722 38.6171292 163.575803"></polygon>
|
||||
<polygon id="Stroke-416" transform="translate(38.617129, 165.191722) rotate(22.000000) translate(-38.617129, -165.191722) " points="37.0008827 165.191722 38.6171292 166.807641 40.2333757 165.191722 38.6171292 163.575803"></polygon>
|
||||
<polygon id="Fill-418" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.165500, 161.772862) rotate(22.000000) translate(-37.165500, -161.772862) " points="35.5492534 161.772862 37.1654999 163.388781 38.7817464 161.772862 37.1654999 160.156943"></polygon>
|
||||
<polygon id="Stroke-420" transform="translate(37.165500, 161.772862) rotate(22.000000) translate(-37.165500, -161.772862) " points="35.5492534 161.772862 37.1654999 163.388781 38.7817464 161.772862 37.1654999 160.156943"></polygon>
|
||||
<polygon id="Fill-422" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.713906, 158.354085) rotate(22.000000) translate(-35.713906, -158.354085) " points="34.0976592 158.354085 35.7139057 159.970003 37.3301523 158.354085 35.7139057 156.738166"></polygon>
|
||||
<polygon id="Stroke-424" transform="translate(35.713906, 158.354085) rotate(22.000000) translate(-35.713906, -158.354085) " points="34.0976592 158.354085 35.7139057 159.970003 37.3301523 158.354085 35.7139057 156.738166"></polygon>
|
||||
<polygon id="Fill-426" fill-opacity="0.8" fill="#A3B1BF" transform="translate(36.912638, 169.949800) rotate(22.000000) translate(-36.912638, -169.949800) " points="35.2963915 169.9498 36.912638 171.565719 38.5288846 169.9498 36.912638 168.333882"></polygon>
|
||||
<polygon id="Stroke-428" transform="translate(36.912638, 169.949800) rotate(22.000000) translate(-36.912638, -169.949800) " points="35.2963915 169.9498 36.912638 171.565719 38.5288846 169.9498 36.912638 168.333882"></polygon>
|
||||
<polygon id="Fill-430" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.461068, 166.530964) rotate(22.000000) translate(-35.461068, -166.530964) " points="33.8448211 166.530964 35.4610677 168.146883 37.0773142 166.530964 35.4610677 164.915045"></polygon>
|
||||
<polygon id="Stroke-432" transform="translate(35.461068, 166.530964) rotate(22.000000) translate(-35.461068, -166.530964) " points="33.8448211 166.530964 35.4610677 168.146883 37.0773142 166.530964 35.4610677 164.915045"></polygon>
|
||||
<polygon id="Fill-434" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.009415, 163.112163) rotate(22.000000) translate(-34.009415, -163.112163) " points="32.3931681 163.112163 34.0094146 164.728081 35.6256611 163.112163 34.0094146 161.496244"></polygon>
|
||||
<polygon id="Stroke-436" transform="translate(34.009415, 163.112163) rotate(22.000000) translate(-34.009415, -163.112163) " points="32.3931681 163.112163 34.0094146 164.728081 35.6256611 163.112163 34.0094146 161.496244"></polygon>
|
||||
<polygon id="Fill-438" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.557820, 159.693385) rotate(22.000000) translate(-32.557820, -159.693385) " points="30.9415739 159.693385 32.5578204 161.309304 34.174067 159.693385 32.5578204 158.077467"></polygon>
|
||||
<polygon id="Stroke-440" transform="translate(32.557820, 159.693385) rotate(22.000000) translate(-32.557820, -159.693385) " points="30.9415739 159.693385 32.5578204 161.309304 34.174067 159.693385 32.5578204 158.077467"></polygon>
|
||||
<polygon id="Fill-442" fill-opacity="0.8" fill="#A3B1BF" transform="translate(33.756553, 171.289101) rotate(22.000000) translate(-33.756553, -171.289101) " points="32.1403062 171.289101 33.7565527 172.90502 35.3727993 171.289101 33.7565527 169.673182"></polygon>
|
||||
<polygon id="Stroke-444" transform="translate(33.756553, 171.289101) rotate(22.000000) translate(-33.756553, -171.289101) " points="32.1403062 171.289101 33.7565527 172.90502 35.3727993 171.289101 33.7565527 169.673182"></polygon>
|
||||
<polygon id="Fill-446" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.304959, 167.870324) rotate(22.000000) translate(-32.304959, -167.870324) " points="30.688712 167.870324 32.3049586 169.486242 33.9212051 167.870324 32.3049586 166.254405"></polygon>
|
||||
<polygon id="Stroke-448" transform="translate(32.304959, 167.870324) rotate(22.000000) translate(-32.304959, -167.870324) " points="30.688712 167.870324 32.3049586 169.486242 33.9212051 167.870324 32.3049586 166.254405"></polygon>
|
||||
<polygon id="Fill-450" fill-opacity="0.8" fill="#A3B1BF" transform="translate(30.853329, 164.451464) rotate(22.000000) translate(-30.853329, -164.451464) " points="29.2370827 164.451464 30.8533293 166.067382 32.4695758 164.451464 30.8533293 162.835545"></polygon>
|
||||
<polygon id="Stroke-452" transform="translate(30.853329, 164.451464) rotate(22.000000) translate(-30.853329, -164.451464) " points="29.2370827 164.451464 30.8533293 166.067382 32.4695758 164.451464 30.8533293 162.835545"></polygon>
|
||||
<polygon id="Fill-454" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.401735, 161.032686) rotate(22.000000) translate(-29.401735, -161.032686) " points="27.7854886 161.032686 29.4017351 162.648605 31.0179816 161.032686 29.4017351 159.416768"></polygon>
|
||||
<polygon id="Stroke-456" transform="translate(29.401735, 161.032686) rotate(22.000000) translate(-29.401735, -161.032686) " points="27.7854886 161.032686 29.4017351 162.648605 31.0179816 161.032686 29.4017351 159.416768"></polygon>
|
||||
<polygon id="Fill-458" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.778613, 148.026981) rotate(22.000000) translate(-38.778613, -148.026981) " points="37.1623668 148.026981 38.7786133 149.6429 40.3948599 148.026981 38.7786133 146.411063"></polygon>
|
||||
<polygon id="Stroke-460" transform="translate(38.778613, 148.026981) rotate(22.000000) translate(-38.778613, -148.026981) " points="37.1623668 148.026981 38.7786133 149.6429 40.3948599 148.026981 38.7786133 146.411063"></polygon>
|
||||
<polygon id="Fill-462" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.326984, 144.608121) rotate(22.000000) translate(-37.326984, -144.608121) " points="35.7107375 144.608121 37.3269841 146.22404 38.9432306 144.608121 37.3269841 142.992203"></polygon>
|
||||
<polygon id="Stroke-464" transform="translate(37.326984, 144.608121) rotate(22.000000) translate(-37.326984, -144.608121) " points="35.7107375 144.608121 37.3269841 146.22404 38.9432306 144.608121 37.3269841 142.992203"></polygon>
|
||||
<polygon id="Fill-466" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.875390, 141.189344) rotate(22.000000) translate(-35.875390, -141.189344) " points="34.2591433 141.189344 35.8753899 142.805263 37.4916364 141.189344 35.8753899 139.573425"></polygon>
|
||||
<polygon id="Stroke-468" transform="translate(35.875390, 141.189344) rotate(22.000000) translate(-35.875390, -141.189344) " points="34.2591433 141.189344 35.8753899 142.805263 37.4916364 141.189344 35.8753899 139.573425"></polygon>
|
||||
<polygon id="Fill-470" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.423796, 137.770567) rotate(22.000000) translate(-34.423796, -137.770567) " points="32.8075492 137.770567 34.4237957 139.386485 36.0400422 137.770567 34.4237957 136.154648"></polygon>
|
||||
<polygon id="Stroke-472" fill="#B2BECA" transform="translate(34.423796, 137.770567) rotate(22.000000) translate(-34.423796, -137.770567) " points="34.4237957 139.386485 36.0400422 137.770567 34.4237957 136.154648 32.8075492 137.770567"></polygon>
|
||||
<polygon id="Fill-474" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.622528, 149.366282) rotate(22.000000) translate(-35.622528, -149.366282) " points="34.0062815 149.366282 35.622528 150.982201 37.2387746 149.366282 35.622528 147.750364"></polygon>
|
||||
<polygon id="Stroke-476" transform="translate(35.622528, 149.366282) rotate(22.000000) translate(-35.622528, -149.366282) " points="34.0062815 149.366282 35.622528 150.982201 37.2387746 149.366282 35.622528 147.750364"></polygon>
|
||||
<polygon id="Fill-478" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.170875, 145.947481) rotate(22.000000) translate(-34.170875, -145.947481) " points="32.5546284 145.947481 34.1708749 147.5634 35.7871215 145.947481 34.1708749 144.331563"></polygon>
|
||||
<polygon id="Stroke-480" transform="translate(34.170875, 145.947481) rotate(22.000000) translate(-34.170875, -145.947481) " points="32.5546284 145.947481 34.1708749 147.5634 35.7871215 145.947481 34.1708749 144.331563"></polygon>
|
||||
<polygon id="Fill-482" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.719305, 142.528645) rotate(22.000000) translate(-32.719305, -142.528645) " points="31.103058 142.528645 32.7193046 144.144564 34.3355511 142.528645 32.7193046 140.912726"></polygon>
|
||||
<polygon id="Stroke-484" transform="translate(32.719305, 142.528645) rotate(22.000000) translate(-32.719305, -142.528645) " points="31.103058 142.528645 32.7193046 144.144564 34.3355511 142.528645 32.7193046 140.912726"></polygon>
|
||||
<polygon id="Fill-486" fill-opacity="0.8" fill="#A3B1BF" transform="translate(31.267651, 139.109844) rotate(22.000000) translate(-31.267651, -139.109844) " points="29.651405 139.109844 31.2676515 140.725763 32.883898 139.109844 31.2676515 137.493925"></polygon>
|
||||
<polygon id="Stroke-488" transform="translate(31.267651, 139.109844) rotate(22.000000) translate(-31.267651, -139.109844) " points="29.651405 139.109844 31.2676515 140.725763 32.883898 139.109844 31.2676515 137.493925"></polygon>
|
||||
<polygon id="Fill-490" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.466384, 150.705559) rotate(22.000000) translate(-32.466384, -150.705559) " points="30.8501373 150.705559 32.4663838 152.321478 34.0826303 150.705559 32.4663838 149.089641"></polygon>
|
||||
<polygon id="Stroke-492" transform="translate(32.466384, 150.705559) rotate(22.000000) translate(-32.466384, -150.705559) " points="30.8501373 150.705559 32.4663838 152.321478 34.0826303 150.705559 32.4663838 149.089641"></polygon>
|
||||
<polygon id="Fill-494" fill-opacity="0.8" fill="#A3B1BF" transform="translate(31.014790, 147.286782) rotate(22.000000) translate(-31.014790, -147.286782) " points="29.3985431 147.286782 31.0147896 148.902701 32.6310362 147.286782 31.0147896 145.670863"></polygon>
|
||||
<polygon id="Stroke-496" transform="translate(31.014790, 147.286782) rotate(22.000000) translate(-31.014790, -147.286782) " points="29.3985431 147.286782 31.0147896 148.902701 32.6310362 147.286782 31.0147896 145.670863"></polygon>
|
||||
<polygon id="Fill-498" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.563219, 143.867946) rotate(22.000000) translate(-29.563219, -143.867946) " points="27.9469727 143.867946 29.5632192 145.483865 31.1794658 143.867946 29.5632192 142.252027"></polygon>
|
||||
<polygon id="Stroke-500" transform="translate(29.563219, 143.867946) rotate(22.000000) translate(-29.563219, -143.867946) " points="27.9469727 143.867946 29.5632192 145.483865 31.1794658 143.867946 29.5632192 142.252027"></polygon>
|
||||
<polygon id="Fill-502" fill-opacity="0.8" fill="#A3B1BF" transform="translate(28.111566, 140.449145) rotate(22.000000) translate(-28.111566, -140.449145) " points="26.4953196 140.449145 28.1115662 142.065063 29.7278127 140.449145 28.1115662 138.833226"></polygon>
|
||||
<polygon id="Stroke-504" transform="translate(28.111566, 140.449145) rotate(22.000000) translate(-28.111566, -140.449145) " points="26.4953196 140.449145 28.1115662 142.065063 29.7278127 140.449145 28.1115662 138.833226"></polygon>
|
||||
<polygon id="Fill-506" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.310298, 152.044860) rotate(22.000000) translate(-29.310298, -152.044860) " points="27.6940519 152.04486 29.3102985 153.660779 30.926545 152.04486 29.3102985 150.428942"></polygon>
|
||||
<polygon id="Stroke-508" transform="translate(29.310298, 152.044860) rotate(22.000000) translate(-29.310298, -152.044860) " points="27.6940519 152.04486 29.3102985 153.660779 30.926545 152.04486 29.3102985 150.428942"></polygon>
|
||||
<polygon id="Fill-510" fill-opacity="0.8" fill="#A3B1BF" transform="translate(27.858704, 148.626083) rotate(22.000000) translate(-27.858704, -148.626083) " points="26.2424578 148.626083 27.8587043 150.242002 29.4749508 148.626083 27.8587043 147.010164"></polygon>
|
||||
<polygon id="Stroke-512" transform="translate(27.858704, 148.626083) rotate(22.000000) translate(-27.858704, -148.626083) " points="26.2424578 148.626083 27.8587043 150.242002 29.4749508 148.626083 27.8587043 147.010164"></polygon>
|
||||
<polygon id="Fill-514" fill-opacity="0.8" fill="#A3B1BF" transform="translate(26.407134, 145.207247) rotate(22.000000) translate(-26.407134, -145.207247) " points="24.7908874 145.207247 26.4071339 146.823166 28.0233805 145.207247 26.4071339 143.591328"></polygon>
|
||||
<polygon id="Stroke-516" transform="translate(26.407134, 145.207247) rotate(22.000000) translate(-26.407134, -145.207247) " points="24.7908874 145.207247 26.4071339 146.823166 28.0233805 145.207247 26.4071339 143.591328"></polygon>
|
||||
<polygon id="Fill-518" fill-opacity="0.8" fill="#A3B1BF" transform="translate(24.955481, 141.788446) rotate(22.000000) translate(-24.955481, -141.788446) " points="23.3392343 141.788446 24.9554808 143.404364 26.5717274 141.788446 24.9554808 140.172527"></polygon>
|
||||
<polygon id="Stroke-520" transform="translate(24.955481, 141.788446) rotate(22.000000) translate(-24.955481, -141.788446) " points="23.3392343 141.788446 24.9554808 143.404364 26.5717274 141.788446 24.9554808 140.172527"></polygon>
|
||||
<polygon id="Fill-522" fill-opacity="0.8" fill="#A3B1BF" transform="translate(26.154213, 153.384161) rotate(22.000000) translate(-26.154213, -153.384161) " points="24.5379666 153.384161 26.1542132 155.00008 27.7704597 153.384161 26.1542132 151.768243"></polygon>
|
||||
<polygon id="Stroke-524" transform="translate(26.154213, 153.384161) rotate(22.000000) translate(-26.154213, -153.384161) " points="24.5379666 153.384161 26.1542132 155.00008 27.7704597 153.384161 26.1542132 151.768243"></polygon>
|
||||
<polygon id="Fill-526" fill-opacity="0.8" fill="#A3B1BF" transform="translate(24.702619, 149.965384) rotate(22.000000) translate(-24.702619, -149.965384) " points="23.0863724 149.965384 24.702619 151.581303 26.3188655 149.965384 24.702619 148.349465"></polygon>
|
||||
<polygon id="Stroke-528" transform="translate(24.702619, 149.965384) rotate(22.000000) translate(-24.702619, -149.965384) " points="23.0863724 149.965384 24.702619 151.581303 26.3188655 149.965384 24.702619 148.349465"></polygon>
|
||||
<polygon id="Fill-530" fill-opacity="0.8" fill="#A3B1BF" transform="translate(23.250966, 146.546583) rotate(22.000000) translate(-23.250966, -146.546583) " points="21.6347194 146.546583 23.2509659 148.162502 24.8672124 146.546583 23.2509659 144.930664"></polygon>
|
||||
<polygon id="Stroke-532" transform="translate(23.250966, 146.546583) rotate(22.000000) translate(-23.250966, -146.546583) " points="21.6347194 146.546583 23.2509659 148.162502 24.8672124 146.546583 23.2509659 144.930664"></polygon>
|
||||
<polygon id="Fill-534" fill-opacity="0.8" fill="#A3B1BF" transform="translate(21.799396, 143.127747) rotate(22.000000) translate(-21.799396, -143.127747) " points="20.183149 143.127747 21.7993955 144.743665 23.4156421 143.127747 21.7993955 141.511828"></polygon>
|
||||
<polygon id="Stroke-536" transform="translate(21.799396, 143.127747) rotate(22.000000) translate(-21.799396, -143.127747) " points="20.183149 143.127747 21.7993955 144.743665 23.4156421 143.127747 21.7993955 141.511828"></polygon>
|
||||
<path d="M129.314819,189.942425 C126.372666,187.000233 124.490222,184.112668 125.110927,183.492089 C125.731631,182.87151 128.619783,184.753573 131.562571,187.695129 C134.504724,190.637321 136.387169,193.524886 135.766464,194.145465 C135.145759,194.766044 132.257608,192.883981 129.314819,189.942425 Z" id="Fill-538" fill="#F5F5F5" transform="translate(130.438695, 188.818777) rotate(22.000000) translate(-130.438695, -188.818777) "></path>
|
||||
<path d="M129.314819,189.942425 C126.372666,187.000233 124.490222,184.112668 125.110927,183.492089 C125.731631,182.87151 128.619783,184.753573 131.562571,187.695129 C134.504724,190.637321 136.387169,193.524886 135.766464,194.145465 C135.145759,194.766044 132.257608,192.883981 129.314819,189.942425 Z" id="Stroke-540" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(130.438695, 188.818777) rotate(22.000000) translate(-130.438695, -188.818777) "></path>
|
||||
<path d="M136.083433,187.715086 C130.20421,181.837055 126.443133,176.067006 127.683272,174.827118 C128.92341,173.587231 134.69463,177.347545 140.573854,183.225576 C146.453713,189.104243 150.21479,194.874292 148.974651,196.114179 C147.734513,197.354066 141.963293,193.593752 136.083433,187.715086 Z" id="Fill-542" fill="#F5F5F5" transform="translate(138.328961, 185.470648) rotate(22.000000) translate(-138.328961, -185.470648) "></path>
|
||||
<path d="M136.083433,187.715086 C130.20421,181.837055 126.443133,176.067006 127.683272,174.827118 C128.92341,173.587231 134.69463,177.347545 140.573854,183.225576 C146.453713,189.104243 150.21479,194.874292 148.974651,196.114179 C147.734513,197.354066 141.963293,193.593752 136.083433,187.715086 Z" id="Stroke-544" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(138.328961, 185.470648) rotate(22.000000) translate(-138.328961, -185.470648) "></path>
|
||||
<path d="M146.697288,183.650834 C138.818086,175.773231 133.777481,168.04045 135.43947,166.378798 C137.101459,164.717146 144.835809,169.756729 152.715011,177.634332 C160.594213,185.511936 165.634818,193.244716 163.972829,194.906369 C162.310839,196.568021 154.57649,191.528438 146.697288,183.650834 Z" id="Fill-546" fill-opacity="0.35" fill="#F5F5F5" transform="translate(149.706149, 180.642583) rotate(22.000000) translate(-149.706149, -180.642583) "></path>
|
||||
<path d="M146.697288,183.650834 C138.818086,175.773231 133.777481,168.04045 135.43947,166.378798 C137.101459,164.717146 144.835809,169.756729 152.715011,177.634332 C160.594213,185.511936 165.634818,193.244716 163.972829,194.906369 C162.310839,196.568021 154.57649,191.528438 146.697288,183.650834 Z" id="Stroke-548" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(149.706149, 180.642583) rotate(22.000000) translate(-149.706149, -180.642583) "></path>
|
||||
<path d="M65.2279553,90.2345285 C62.4548336,90.0320836 60.4105231,89.3345405 60.4105231,88.5051511 C60.4105231,87.676673 62.4503446,86.9797514 65.2188187,86.7764428 C65.4149139,84.0068366 66.0879499,81.9659221 66.8880741,81.9659221 C67.6881984,81.9659221 68.3612344,84.0068366 68.5573295,86.7764428 C71.3258036,86.9797514 73.3656251,87.676673 73.3656251,88.5051511 C73.3656251,89.3345405 71.3213146,90.0320836 68.548193,90.2345285 C68.3410329,92.9408238 67.6762073,94.9210242 66.8880741,94.9210242 C66.0999409,94.9210242 65.4351154,92.9408238 65.2279553,90.2345285 Z" id="Oval-80-Copy-3" fill-opacity="0.4" fill="#A3B1BF" opacity="0.85" transform="translate(66.888074, 88.443473) rotate(-340.000000) translate(-66.888074, -88.443473) "></path>
|
||||
<path d="M118.775569,329.140492 L118.424988,329.526146 C117.522244,330.5192 115.985396,330.592411 114.992341,329.689667 C114.596934,329.330218 114.331035,328.850456 114.235803,328.324641 L114.143075,327.812647 L113.669257,327.599091 C112.445737,327.047635 111.900921,325.608734 112.452377,324.385214 C112.672015,323.8979 113.046204,323.496601 113.516991,323.243469 L113.97521,322.997095 L114.032158,322.478985 C114.178786,321.144967 115.379087,320.182398 116.713105,320.329026 C117.24418,320.387399 117.741214,320.61917 118.127299,320.988476 L118.503957,321.348765 L119.01334,321.242962 C120.327346,320.970031 121.613813,321.813989 121.886744,323.127995 C121.995449,323.651349 121.928561,324.195943 121.696437,324.677436 L121.470742,325.145594 L121.728812,325.597409 C122.394441,326.762759 121.989337,328.247061 120.823987,328.91269 C120.359975,329.177726 119.82154,329.282421 119.292023,329.21057 L118.775569,329.140492 Z" id="Star-1-Copy-16" fill-opacity="0.4" fill="#A3B1BF"></path>
|
||||
<path d="M432.83752,120.004816 L432.837087,120.005044 L432.837087,120.005044 C432.092472,120.396429 431.171561,120.110079 430.780176,119.365464 C430.624337,119.068978 430.570573,118.729391 430.627206,118.399266 L430.627206,118.399266 L430.627206,118.399266 L430.627206,118.399266 C430.024845,117.812233 430.01242,116.848039 430.599453,116.245678 C430.833262,116.005765 431.139652,115.849637 431.471171,115.801474 L431.471471,115.801431 L431.471471,115.801431 L431.471471,115.801431 C431.843891,115.046982 432.757399,114.737288 433.511848,115.109709 C433.812195,115.25797 434.055308,115.501083 434.20357,115.801431 L434.20357,115.801431 L434.203869,115.801474 L434.203869,115.801474 C435.036229,115.922398 435.612963,116.695187 435.492039,117.527547 C435.443876,117.859067 435.287748,118.165457 435.047835,118.399266 L435.047835,118.399266 L435.047835,118.399266 L435.047835,118.399266 C435.190066,119.228364 434.63325,120.015783 433.804152,120.158014 C433.474027,120.214647 433.134439,120.160883 432.837954,120.005044 L432.83752,120.004816 Z" id="Star-1-Copy-18" fill-opacity="0.4" fill="#A3B1BF" transform="translate(432.837619, 117.566125) rotate(-3.000000) translate(-432.837619, -117.566125) "></path>
|
||||
<path d="M99.7727703,38.762372 L99.0266308,39.1545584 L99.0266308,39.1545584 C97.8386845,39.7789675 96.36948,39.3221304 95.7450708,38.134184 C95.4964477,37.6611755 95.4106732,37.1194035 95.5010241,36.5927278 L95.6433921,35.7628333 L95.0407812,35.1755563 L95.0407812,35.1755563 C94.0796578,34.2388893 94.059832,32.7004261 94.996499,31.7393027 C95.369563,31.3564979 95.8584376,31.1073808 96.3874089,31.0305329 L97.2206742,30.9094778 L97.5937913,30.1536188 L97.5937913,30.1536188 C98.1878378,28.950202 99.6449697,28.4562097 100.848387,29.0502562 C101.327469,29.2867472 101.715258,29.6745363 101.951749,30.1536188 L102.324866,30.9094778 L103.158132,31.0305329 L103.158132,31.0305329 C104.486241,31.223478 105.406474,32.4565366 105.213529,33.7846464 C105.136681,34.3136177 104.887564,34.8024923 104.504759,35.1755563 L103.902148,35.7628333 L104.044516,36.5927278 L104.044516,36.5927278 C104.27143,37.9154575 103.383095,39.1716915 102.060366,39.398605 C101.53369,39.4889559 100.991918,39.4031814 100.51891,39.1545584 L99.7727703,38.762372 Z" id="Star-1-Copy-19" fill-opacity="0.4" fill="#A3B1BF" transform="translate(99.772928, 34.116388) rotate(19.000000) translate(-99.772928, -34.116388) "></path>
|
||||
<path d="M396.631073,305.744172 L396.098125,305.608596 C394.797498,305.277731 394.01135,303.955146 394.342215,302.654518 C394.473956,302.136643 394.772729,301.676633 395.192288,301.345694 L395.623376,301.00566 L395.587617,300.458372 C395.500116,299.119176 396.514815,297.962609 397.854012,297.875108 C398.387399,297.840257 398.917395,297.982247 399.361919,298.279089 L399.818473,298.583965 L400.329362,298.380373 C401.576068,297.883555 402.989473,298.491459 403.486291,299.738164 C403.684076,300.23448 403.712777,300.782145 403.567956,301.296416 L403.418882,301.825788 L403.76981,302.247972 C404.627682,303.280038 404.486471,304.812135 403.454406,305.670007 C403.043346,306.011688 402.531095,306.208301 401.996987,306.229395 L401.44896,306.251039 L401.15585,306.715309 C400.439401,307.850123 398.938655,308.189275 397.80384,307.472826 C397.351988,307.187555 397.006767,306.761296 396.821614,306.260029 L396.631073,305.744172 Z" id="Star-1-Copy-20" fill-opacity="0.4" fill="#A3B1BF"></path>
|
||||
<path d="M439.755536,146.347757 L439.755103,146.347984 L439.755103,146.347984 C439.010488,146.739369 438.089577,146.45302 437.698192,145.708405 C437.542353,145.411919 437.488589,145.072331 437.545222,144.742206 L437.545222,144.742206 L437.545222,144.742206 L437.545222,144.742206 C436.942861,144.155173 436.930436,143.190979 437.517469,142.588619 C437.751277,142.348705 438.057668,142.192577 438.389187,142.144415 L438.389487,142.144371 L438.389487,142.144371 L438.389487,142.144371 C438.761907,141.389923 439.675415,141.080228 440.429864,141.452649 C440.730211,141.600911 440.973324,141.844024 441.121586,142.144371 L441.121586,142.144371 L441.121885,142.144415 L441.121885,142.144415 C441.954245,142.265338 442.530978,143.038128 442.410055,143.870488 C442.361892,144.202007 442.205764,144.508398 441.965851,144.742206 L441.965851,144.742206 L441.965851,144.742206 L441.965851,144.742206 C442.108082,145.571305 441.551266,146.358723 440.722168,146.500955 C440.392043,146.557588 440.052455,146.503823 439.755969,146.347984 L439.755536,146.347757 Z" id="Star-1-Copy-21" fill-opacity="0.4" fill="#A3B1BF" transform="translate(439.755635, 143.909066) rotate(-12.000000) translate(-439.755635, -143.909066) "></path>
|
||||
<path d="M244.621971,220.61341 C277.15945,220.61341 303.536288,194.242112 303.536288,161.711467 C303.536288,129.180822 277.15945,102.809524 244.621971,102.809524 C212.084491,102.809524 185.707653,129.180822 185.707653,161.711467 C185.707653,194.242112 212.084491,220.61341 244.621971,220.61341 Z" id="Oval-8-Copy-2" fill-opacity="0.66" fill="#A3B1BF"></path>
|
||||
<path d="M245.345696,141.060063 C241.146656,141.060063 237.880736,142.342349 235.547936,144.906921 C233.215136,147.354921 232.107056,150.618921 232.107056,154.698921 L236.714336,154.698921 C236.714336,151.842921 237.355856,149.628063 238.638896,147.996063 C240.038576,146.072635 242.196416,145.140063 245.112416,145.140063 C247.561856,145.140063 249.486416,145.781206 250.827776,147.180063 C252.110816,148.462349 252.810656,150.269206 252.810656,152.600635 C252.810656,154.232635 252.227456,155.748063 251.061056,157.205206 C250.711136,157.671492 250.011296,158.370921 249.078176,159.303492 C245.928896,162.101206 244.004336,164.316063 243.187856,166.064635 C242.488016,167.521778 242.138096,169.212063 242.138096,171.135492 L242.138096,172.476063 L246.803696,172.476063 L246.803696,171.135492 C246.803696,169.561778 247.153616,168.162921 247.911776,166.880635 C248.494976,165.831492 249.369776,164.782349 250.652816,163.674921 C253.218896,161.401778 254.793536,159.886349 255.376736,159.186921 C256.834736,157.263492 257.592896,154.990349 257.592896,152.367492 C257.592896,148.870349 256.484816,146.130921 254.326976,144.149206 C252.052496,142.050921 249.078176,141.060063 245.345696,141.060063 Z M244.470896,176.556063 C243.479456,176.556063 242.662976,176.847492 241.963136,177.546921 C241.263296,178.188063 240.971696,179.004063 240.971696,179.994921 C240.971696,180.985778 241.263296,181.801778 241.963136,182.501206 C242.662976,183.142349 243.479456,183.492063 244.470896,183.492063 C245.462336,183.492063 246.278816,183.142349 246.978656,182.501206 C247.678496,181.860063 248.028416,181.044063 248.028416,179.994921 C248.028416,179.004063 247.678496,178.188063 247.036976,177.546921 C246.337136,176.847492 245.462336,176.556063 244.470896,176.556063 Z" id="?" fill="#FFFFFF"></path>
|
||||
<path d="M223.261662,133.139924 C229.077338,129.782947 239.631808,125.828273 236.274126,120.013819 C232.916444,114.199364 220.565868,115.043746 214.750193,118.400722 C208.934517,121.757699 202.729834,131.623951 206.087516,137.438405 C209.445198,143.252859 217.445986,136.4969 223.261662,133.139924" id="Oval-8-Copy-2" fill="#FAFAFA"></path>
|
||||
<path d="M249.679003,119.820589 C252.365149,119.820589 254.5427,117.643495 254.5427,114.957913 C254.5427,112.272332 252.365149,110.095238 249.679003,110.095238 C246.992857,110.095238 244.815306,112.272332 244.815306,114.957913 C244.815306,117.643495 246.992857,119.820589 249.679003,119.820589 Z" id="Oval-10-Copy" fill="#FAFAFA"></path>
|
||||
<path d="M421.5,321.5 L423,323" id="Line-2" stroke="#979797" stroke-linecap="square"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 87 KiB |
208
public/static/admin/images/500.svg
Normal file
@ -0,0 +1,208 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="422px" height="193px" viewBox="0 0 422 193" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 4</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="500" transform="translate(-477.000000, -299.000000)">
|
||||
<g id="Group-4" transform="translate(479.000000, 290.000000)">
|
||||
<polygon id="Fill-1" fill-opacity="0.25" fill="#A3B1BF" opacity="0.900000036" transform="translate(271.351592, 80.180646) rotate(90.000000) translate(-271.351592, -80.180646) " points="214.065678 134.970601 328.637506 134.970601 328.637506 25.3906904 214.065678 25.3906904"></polygon>
|
||||
<polygon id="Stroke-2" stroke="#A3B1BF" stroke-width="1.62" transform="translate(271.351592, 80.180646) rotate(90.000000) translate(-271.351592, -80.180646) " points="214.065678 134.970601 328.637506 134.970601 328.637506 25.3906904 214.065678 25.3906904"></polygon>
|
||||
<path d="M276.053859,94.8252648 C271.491929,94.8252648 267.759441,91.0782313 267.759441,86.4985238 L267.759441,73.9594928 C267.759441,69.3797853 271.491929,65.6327519 276.053859,65.6327519 L393.542211,65.6327519 C398.104141,65.6327519 401.836629,69.3797853 401.836629,73.9594928 L401.836629,86.4985238 C401.836629,91.0782313 398.104141,94.8252648 393.542211,94.8252648 L276.053859,94.8252648 Z" id="Fill-3" fill="#F0F2F5" transform="translate(334.798035, 80.229008) rotate(90.000000) translate(-334.798035, -80.229008) "></path>
|
||||
<path d="M276.053859,94.8252648 C271.491929,94.8252648 267.759441,91.0782313 267.759441,86.4985238 L267.759441,73.9594928 C267.759441,69.3797853 271.491929,65.6327519 276.053859,65.6327519 L393.542211,65.6327519 C398.104141,65.6327519 401.836629,69.3797853 401.836629,73.9594928 L401.836629,86.4985238 C401.836629,91.0782313 398.104141,94.8252648 393.542211,94.8252648 L276.053859,94.8252648 L276.053859,94.8252648 Z" id="Stroke-5" stroke="#A3B1BF" stroke-width="1.62" transform="translate(334.798035, 80.229008) rotate(90.000000) translate(-334.798035, -80.229008) "></path>
|
||||
<path d="M373.091719,31.232323 C373.091719,32.058752 372.424019,32.7290547 371.600798,32.7290547 C370.77654,32.7290547 370.108839,32.058752 370.108839,31.232323 C370.108839,30.405894 370.77654,29.7355913 371.600798,29.7355913 C372.424019,29.7355913 373.091719,30.405894 373.091719,31.232323 L356.360842,4.74110287 L349.082491,-8.6444393" id="Fill-7" transform="translate(361.087105, 12.042308) rotate(90.000000) translate(-361.087105, -12.042308) "></path>
|
||||
<path d="M343.448596,22.5884924 C343.448596,23.4149215 342.780895,24.0852241 341.957674,24.0852241 C341.133416,24.0852241 340.465716,23.4149215 340.465716,22.5884924 C340.465716,21.7620634 341.133416,21.0917607 341.957674,21.0917607 C342.780895,21.0917607 343.448596,21.7620634 343.448596,22.5884924 L343.448596,22.5884924 Z" id="Stroke-9" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 22.588492) rotate(90.000000) translate(-341.957156, -22.588492) "></path>
|
||||
<path d="M343.448596,31.5121872 C343.448596,32.3386162 342.780895,33.0089189 341.957674,33.0089189 C341.133416,33.0089189 340.465716,32.3386162 340.465716,31.5121872 C340.465716,30.6857582 341.133416,30.0154555 341.957674,30.0154555 C342.780895,30.0154555 343.448596,30.6857582 343.448596,31.5121872" id="Fill-11" fill="#FFFFFF" transform="translate(341.957156, 31.512187) rotate(90.000000) translate(-341.957156, -31.512187) "></path>
|
||||
<path d="M343.448596,31.5121872 C343.448596,32.3386162 342.780895,33.0089189 341.957674,33.0089189 C341.133416,33.0089189 340.465716,32.3386162 340.465716,31.5121872 C340.465716,30.6857582 341.133416,30.0154555 341.957674,30.0154555 C342.780895,30.0154555 343.448596,30.6857582 343.448596,31.5121872 L343.448596,31.5121872 Z" id="Stroke-13" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 31.512187) rotate(90.000000) translate(-341.957156, -31.512187) "></path>
|
||||
<path d="M343.448596,40.435882 C343.448596,41.262311 342.780895,41.9326137 341.957674,41.9326137 C341.133416,41.9326137 340.465716,41.262311 340.465716,40.435882 C340.465716,39.609453 341.133416,38.9391503 341.957674,38.9391503 C342.780895,38.9391503 343.448596,39.609453 343.448596,40.435882" id="Fill-15" fill="#FFFFFF" transform="translate(341.957156, 40.435882) rotate(90.000000) translate(-341.957156, -40.435882) "></path>
|
||||
<path d="M343.448596,40.435882 C343.448596,41.262311 342.780895,41.9326137 341.957674,41.9326137 C341.133416,41.9326137 340.465716,41.262311 340.465716,40.435882 C340.465716,39.609453 341.133416,38.9391503 341.957674,38.9391503 C342.780895,38.9391503 343.448596,39.609453 343.448596,40.435882 L343.448596,40.435882 Z" id="Stroke-17" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 40.435882) rotate(90.000000) translate(-341.957156, -40.435882) "></path>
|
||||
<path d="M343.448596,49.3595768 C343.448596,50.1860058 342.780895,50.8563085 341.957674,50.8563085 C341.133416,50.8563085 340.465716,50.1860058 340.465716,49.3595768 C340.465716,48.5331477 341.133416,47.8628451 341.957674,47.8628451 C342.780895,47.8628451 343.448596,48.5331477 343.448596,49.3595768" id="Fill-19" fill="#FFFFFF" transform="translate(341.957156, 49.359577) rotate(90.000000) translate(-341.957156, -49.359577) "></path>
|
||||
<path d="M343.448596,49.3595768 C343.448596,50.1860058 342.780895,50.8563085 341.957674,50.8563085 C341.133416,50.8563085 340.465716,50.1860058 340.465716,49.3595768 C340.465716,48.5331477 341.133416,47.8628451 341.957674,47.8628451 C342.780895,47.8628451 343.448596,48.5331477 343.448596,49.3595768 L343.448596,49.3595768 Z" id="Stroke-21" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 49.359577) rotate(90.000000) translate(-341.957156, -49.359577) "></path>
|
||||
<path d="M343.448596,58.2832715 C343.448596,59.1097006 342.780895,59.7800032 341.957674,59.7800032 C341.133416,59.7800032 340.465716,59.1097006 340.465716,58.2832715 C340.465716,57.4568425 341.133416,56.7865399 341.957674,56.7865399 C342.780895,56.7865399 343.448596,57.4568425 343.448596,58.2832715" id="Fill-23" fill="#FFFFFF" transform="translate(341.957156, 58.283272) rotate(90.000000) translate(-341.957156, -58.283272) "></path>
|
||||
<path d="M343.448596,58.2832715 C343.448596,59.1097006 342.780895,59.7800032 341.957674,59.7800032 C341.133416,59.7800032 340.465716,59.1097006 340.465716,58.2832715 C340.465716,57.4568425 341.133416,56.7865399 341.957674,56.7865399 C342.780895,56.7865399 343.448596,57.4568425 343.448596,58.2832715 L343.448596,58.2832715 Z" id="Stroke-25" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 58.283272) rotate(90.000000) translate(-341.957156, -58.283272) "></path>
|
||||
<path d="M343.448596,67.2069663 C343.448596,68.0333954 342.780895,68.703698 341.957674,68.703698 C341.133416,68.703698 340.465716,68.0333954 340.465716,67.2069663 C340.465716,66.3805373 341.133416,65.7102346 341.957674,65.7102346 C342.780895,65.7102346 343.448596,66.3805373 343.448596,67.2069663" id="Fill-27" fill="#FFFFFF" transform="translate(341.957156, 67.206966) rotate(90.000000) translate(-341.957156, -67.206966) "></path>
|
||||
<path d="M343.448596,67.2069663 C343.448596,68.0333954 342.780895,68.703698 341.957674,68.703698 C341.133416,68.703698 340.465716,68.0333954 340.465716,67.2069663 C340.465716,66.3805373 341.133416,65.7102346 341.957674,65.7102346 C342.780895,65.7102346 343.448596,66.3805373 343.448596,67.2069663 L343.448596,67.2069663 Z" id="Stroke-29" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 67.206966) rotate(90.000000) translate(-341.957156, -67.206966) "></path>
|
||||
<path d="M327.400971,24.0852241 C326.576713,24.0852241 325.909013,23.4149215 325.909013,22.5884924 C325.909013,21.7620634 326.576713,21.0917607 327.400971,21.0917607 C328.224192,21.0917607 328.891893,21.7620634 328.891893,22.5884924 C328.891893,23.4149215 328.224192,24.0852241 327.400971,24.0852241 Z" id="Fill-31" fill="#FFFFFF" transform="translate(327.400453, 22.588492) rotate(90.000000) translate(-327.400453, -22.588492) "></path>
|
||||
<path d="M328.891893,22.5884924 C328.891893,23.4149215 328.224192,24.0852241 327.400971,24.0852241 C326.576713,24.0852241 325.909013,23.4149215 325.909013,22.5884924 C325.909013,21.7620634 326.576713,21.0917607 327.400971,21.0917607 C328.224192,21.0917607 328.891893,21.7620634 328.891893,22.5884924 L328.891893,22.5884924 Z" id="Stroke-33" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 22.588492) rotate(90.000000) translate(-327.400453, -22.588492) "></path>
|
||||
<path d="M328.891893,31.5121872 C328.891893,32.3386162 328.224192,33.0089189 327.400971,33.0089189 C326.576713,33.0089189 325.909013,32.3386162 325.909013,31.5121872 C325.909013,30.6857582 326.576713,30.0154555 327.400971,30.0154555 C328.224192,30.0154555 328.891893,30.6857582 328.891893,31.5121872" id="Fill-35" fill="#FFFFFF" transform="translate(327.400453, 31.512187) rotate(90.000000) translate(-327.400453, -31.512187) "></path>
|
||||
<path d="M328.891893,31.5121872 C328.891893,32.3386162 328.224192,33.0089189 327.400971,33.0089189 C326.576713,33.0089189 325.909013,32.3386162 325.909013,31.5121872 C325.909013,30.6857582 326.576713,30.0154555 327.400971,30.0154555 C328.224192,30.0154555 328.891893,30.6857582 328.891893,31.5121872 L328.891893,31.5121872 Z" id="Stroke-37" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 31.512187) rotate(90.000000) translate(-327.400453, -31.512187) "></path>
|
||||
<path d="M328.891893,40.435882 C328.891893,41.262311 328.224192,41.9326137 327.400971,41.9326137 C326.576713,41.9326137 325.909013,41.262311 325.909013,40.435882 C325.909013,39.609453 326.576713,38.9391503 327.400971,38.9391503 C328.224192,38.9391503 328.891893,39.609453 328.891893,40.435882" id="Fill-39" fill="#FFFFFF" transform="translate(327.400453, 40.435882) rotate(90.000000) translate(-327.400453, -40.435882) "></path>
|
||||
<path d="M328.891893,40.435882 C328.891893,41.262311 328.224192,41.9326137 327.400971,41.9326137 C326.576713,41.9326137 325.909013,41.262311 325.909013,40.435882 C325.909013,39.609453 326.576713,38.9391503 327.400971,38.9391503 C328.224192,38.9391503 328.891893,39.609453 328.891893,40.435882 L328.891893,40.435882 Z" id="Stroke-41" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 40.435882) rotate(90.000000) translate(-327.400453, -40.435882) "></path>
|
||||
<path d="M328.891893,49.3595768 C328.891893,50.1860058 328.224192,50.8563085 327.400971,50.8563085 C326.576713,50.8563085 325.909013,50.1860058 325.909013,49.3595768 C325.909013,48.5331477 326.576713,47.8628451 327.400971,47.8628451 C328.224192,47.8628451 328.891893,48.5331477 328.891893,49.3595768" id="Fill-43" fill="#FFFFFF" transform="translate(327.400453, 49.359577) rotate(90.000000) translate(-327.400453, -49.359577) "></path>
|
||||
<path d="M328.891893,49.3595768 C328.891893,50.1860058 328.224192,50.8563085 327.400971,50.8563085 C326.576713,50.8563085 325.909013,50.1860058 325.909013,49.3595768 C325.909013,48.5331477 326.576713,47.8628451 327.400971,47.8628451 C328.224192,47.8628451 328.891893,48.5331477 328.891893,49.3595768 L328.891893,49.3595768 Z" id="Stroke-45" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 49.359577) rotate(90.000000) translate(-327.400453, -49.359577) "></path>
|
||||
<path d="M328.891893,58.2832715 C328.891893,59.1097006 328.224192,59.7800032 327.400971,59.7800032 C326.576713,59.7800032 325.909013,59.1097006 325.909013,58.2832715 C325.909013,57.4568425 326.576713,56.7865399 327.400971,56.7865399 C328.224192,56.7865399 328.891893,57.4568425 328.891893,58.2832715" id="Fill-47" fill="#FFFFFF" transform="translate(327.400453, 58.283272) rotate(90.000000) translate(-327.400453, -58.283272) "></path>
|
||||
<path d="M328.891893,58.2832715 C328.891893,59.1097006 328.224192,59.7800032 327.400971,59.7800032 C326.576713,59.7800032 325.909013,59.1097006 325.909013,58.2832715 C325.909013,57.4568425 326.576713,56.7865399 327.400971,56.7865399 C328.224192,56.7865399 328.891893,57.4568425 328.891893,58.2832715 L328.891893,58.2832715 Z" id="Stroke-49" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 58.283272) rotate(90.000000) translate(-327.400453, -58.283272) "></path>
|
||||
<path d="M328.891893,67.2069663 C328.891893,68.0333954 328.224192,68.703698 327.400971,68.703698 C326.576713,68.703698 325.909013,68.0333954 325.909013,67.2069663 C325.909013,66.3805373 326.576713,65.7102346 327.400971,65.7102346 C328.224192,65.7102346 328.891893,66.3805373 328.891893,67.2069663" id="Fill-51" fill="#FFFFFF" transform="translate(327.400453, 67.206966) rotate(90.000000) translate(-327.400453, -67.206966) "></path>
|
||||
<path d="M328.891893,67.2069663 C328.891893,68.0333954 328.224192,68.703698 327.400971,68.703698 C326.576713,68.703698 325.909013,68.0333954 325.909013,67.2069663 C325.909013,66.3805373 326.576713,65.7102346 327.400971,65.7102346 C328.224192,65.7102346 328.891893,66.3805373 328.891893,67.2069663 L328.891893,67.2069663 Z" id="Stroke-53" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 67.206966) rotate(90.000000) translate(-327.400453, -67.206966) "></path>
|
||||
<path d="M334.679323,28.141449 C333.855065,28.141449 333.187364,27.4711464 333.187364,26.6447173 C333.187364,25.8182883 333.855065,25.1479856 334.679323,25.1479856 C335.502544,25.1479856 336.170244,25.8182883 336.170244,26.6447173 C336.170244,27.4711464 335.502544,28.141449 334.679323,28.141449 Z" id="Fill-55" fill="#FFFFFF" transform="translate(334.678804, 26.644717) rotate(90.000000) translate(-334.678804, -26.644717) "></path>
|
||||
<path d="M336.170244,26.6447173 C336.170244,27.4711464 335.502544,28.141449 334.679323,28.141449 C333.855065,28.141449 333.187364,27.4711464 333.187364,26.6447173 C333.187364,25.8182883 333.855065,25.1479856 334.679323,25.1479856 C335.502544,25.1479856 336.170244,25.8182883 336.170244,26.6447173 L336.170244,26.6447173 Z" id="Stroke-57" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 26.644717) rotate(90.000000) translate(-334.678804, -26.644717) "></path>
|
||||
<path d="M336.170244,35.5684121 C336.170244,36.3948411 335.502544,37.0651438 334.679323,37.0651438 C333.855065,37.0651438 333.187364,36.3948411 333.187364,35.5684121 C333.187364,34.7419831 333.855065,34.0716804 334.679323,34.0716804 C335.502544,34.0716804 336.170244,34.7419831 336.170244,35.5684121" id="Fill-59" fill="#FFFFFF" transform="translate(334.678804, 35.568412) rotate(90.000000) translate(-334.678804, -35.568412) "></path>
|
||||
<path d="M336.170244,35.5684121 C336.170244,36.3948411 335.502544,37.0651438 334.679323,37.0651438 C333.855065,37.0651438 333.187364,36.3948411 333.187364,35.5684121 C333.187364,34.7419831 333.855065,34.0716804 334.679323,34.0716804 C335.502544,34.0716804 336.170244,34.7419831 336.170244,35.5684121 L336.170244,35.5684121 Z" id="Stroke-61" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 35.568412) rotate(90.000000) translate(-334.678804, -35.568412) "></path>
|
||||
<path d="M336.170244,44.4921069 C336.170244,45.3185359 335.502544,45.9888386 334.679323,45.9888386 C333.855065,45.9888386 333.187364,45.3185359 333.187364,44.4921069 C333.187364,43.6656779 333.855065,42.9953752 334.679323,42.9953752 C335.502544,42.9953752 336.170244,43.6656779 336.170244,44.4921069" id="Fill-63" fill="#FFFFFF" transform="translate(334.678804, 44.492107) rotate(90.000000) translate(-334.678804, -44.492107) "></path>
|
||||
<path d="M336.170244,44.4921069 C336.170244,45.3185359 335.502544,45.9888386 334.679323,45.9888386 C333.855065,45.9888386 333.187364,45.3185359 333.187364,44.4921069 C333.187364,43.6656779 333.855065,42.9953752 334.679323,42.9953752 C335.502544,42.9953752 336.170244,43.6656779 336.170244,44.4921069 L336.170244,44.4921069 Z" id="Stroke-65" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 44.492107) rotate(90.000000) translate(-334.678804, -44.492107) "></path>
|
||||
<path d="M336.170244,53.4158017 C336.170244,54.2422307 335.502544,54.9125333 334.679323,54.9125333 C333.855065,54.9125333 333.187364,54.2422307 333.187364,53.4158017 C333.187364,52.5893726 333.855065,51.91907 334.679323,51.91907 C335.502544,51.91907 336.170244,52.5893726 336.170244,53.4158017" id="Fill-67" fill="#FFFFFF" transform="translate(334.678804, 53.415802) rotate(90.000000) translate(-334.678804, -53.415802) "></path>
|
||||
<path d="M336.170244,53.4158017 C336.170244,54.2422307 335.502544,54.9125333 334.679323,54.9125333 C333.855065,54.9125333 333.187364,54.2422307 333.187364,53.4158017 C333.187364,52.5893726 333.855065,51.91907 334.679323,51.91907 C335.502544,51.91907 336.170244,52.5893726 336.170244,53.4158017 L336.170244,53.4158017 Z" id="Stroke-69" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 53.415802) rotate(90.000000) translate(-334.678804, -53.415802) "></path>
|
||||
<path d="M336.170244,62.3394964 C336.170244,63.1659255 335.502544,63.8362281 334.679323,63.8362281 C333.855065,63.8362281 333.187364,63.1659255 333.187364,62.3394964 C333.187364,61.5130674 333.855065,60.8427648 334.679323,60.8427648 C335.502544,60.8427648 336.170244,61.5130674 336.170244,62.3394964" id="Fill-71" fill="#FFFFFF" transform="translate(334.678804, 62.339496) rotate(90.000000) translate(-334.678804, -62.339496) "></path>
|
||||
<path d="M336.170244,62.3394964 C336.170244,63.1659255 335.502544,63.8362281 334.679323,63.8362281 C333.855065,63.8362281 333.187364,63.1659255 333.187364,62.3394964 C333.187364,61.5130674 333.855065,60.8427648 334.679323,60.8427648 C335.502544,60.8427648 336.170244,61.5130674 336.170244,62.3394964 L336.170244,62.3394964 Z" id="Stroke-73" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 62.339496) rotate(90.000000) translate(-334.678804, -62.339496) "></path>
|
||||
<path d="M336.170244,71.2631912 C336.170244,72.0896203 335.502544,72.7599229 334.679323,72.7599229 C333.855065,72.7599229 333.187364,72.0896203 333.187364,71.2631912 C333.187364,70.4367622 333.855065,69.7664595 334.679323,69.7664595 C335.502544,69.7664595 336.170244,70.4367622 336.170244,71.2631912" id="Fill-75" fill="#FFFFFF" transform="translate(334.678804, 71.263191) rotate(90.000000) translate(-334.678804, -71.263191) "></path>
|
||||
<path d="M336.170244,71.2631912 C336.170244,72.0896203 335.502544,72.7599229 334.679323,72.7599229 C333.855065,72.7599229 333.187364,72.0896203 333.187364,71.2631912 C333.187364,70.4367622 333.855065,69.7664595 334.679323,69.7664595 C335.502544,69.7664595 336.170244,70.4367622 336.170244,71.2631912 L336.170244,71.2631912 Z" id="Stroke-77" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 71.263191) rotate(90.000000) translate(-334.678804, -71.263191) "></path>
|
||||
<path d="M335.089444,136.046978 C332.700651,136.046978 330.763905,134.102684 330.763905,131.704582 C330.763905,129.306481 332.700651,127.362187 335.089444,127.362187 C337.478236,127.362187 339.414983,129.306481 339.414983,131.704582 C339.414983,134.102684 337.478236,136.046978 335.089444,136.046978 Z" id="Fill-79" fill="#A3B1BF" transform="translate(335.089444, 131.704582) rotate(90.000000) translate(-335.089444, -131.704582) "></path>
|
||||
<path d="M307.865544,121.56038 C307.865544,122.386809 307.197843,123.057112 306.374622,123.057112 C305.550365,123.057112 304.882664,122.386809 304.882664,121.56038 C304.882664,120.733951 305.550365,120.063648 306.374622,120.063648 C307.197843,120.063648 307.865544,120.733951 307.865544,121.56038" id="Fill-81" fill="#F5F5F5" transform="translate(306.374104, 121.560380) rotate(90.000000) translate(-306.374104, -121.560380) "></path>
|
||||
<path d="M307.865544,121.56038 C307.865544,122.386809 307.197843,123.057112 306.374622,123.057112 C305.550365,123.057112 304.882664,122.386809 304.882664,121.56038 C304.882664,120.733951 305.550365,120.063648 306.374622,120.063648 C307.197843,120.063648 307.865544,120.733951 307.865544,121.56038 L307.865544,121.56038 Z" id="Stroke-83" stroke="#A3B1BF" stroke-width="0.81" transform="translate(306.374104, 121.560380) rotate(90.000000) translate(-306.374104, -121.560380) "></path>
|
||||
<path d="M294.117547,121.56038 C294.117547,122.386809 293.449846,123.057112 292.626625,123.057112 C291.802367,123.057112 291.134667,122.386809 291.134667,121.56038 C291.134667,120.733951 291.802367,120.063648 292.626625,120.063648 C293.449846,120.063648 294.117547,120.733951 294.117547,121.56038" id="Fill-85" fill="#F5F5F5" transform="translate(292.626107, 121.560380) rotate(90.000000) translate(-292.626107, -121.560380) "></path>
|
||||
<path d="M294.117547,121.56038 C294.117547,122.386809 293.449846,123.057112 292.626625,123.057112 C291.802367,123.057112 291.134667,122.386809 291.134667,121.56038 C291.134667,120.733951 291.802367,120.063648 292.626625,120.063648 C293.449846,120.063648 294.117547,120.733951 294.117547,121.56038 L294.117547,121.56038 Z" id="Stroke-87" stroke="#A3B1BF" stroke-width="0.81" transform="translate(292.626107, 121.560380) rotate(90.000000) translate(-292.626107, -121.560380) "></path>
|
||||
<path d="M307.865544,38.813392 C307.865544,39.6398211 307.197843,40.3101237 306.374622,40.3101237 C305.550365,40.3101237 304.882664,39.6398211 304.882664,38.813392 C304.882664,37.986963 305.550365,37.3166603 306.374622,37.3166603 C307.197843,37.3166603 307.865544,37.986963 307.865544,38.813392" id="Fill-89" fill="#F5F5F5" transform="translate(306.374104, 38.813392) rotate(90.000000) translate(-306.374104, -38.813392) "></path>
|
||||
<path d="M307.865544,38.813392 C307.865544,39.6398211 307.197843,40.3101237 306.374622,40.3101237 C305.550365,40.3101237 304.882664,39.6398211 304.882664,38.813392 C304.882664,37.986963 305.550365,37.3166603 306.374622,37.3166603 C307.197843,37.3166603 307.865544,37.986963 307.865544,38.813392 L307.865544,38.813392 Z" id="Stroke-91" stroke="#A3B1BF" stroke-width="0.81" transform="translate(306.374104, 38.813392) rotate(90.000000) translate(-306.374104, -38.813392) "></path>
|
||||
<path d="M294.117547,38.813392 C294.117547,39.6398211 293.449846,40.3101237 292.626625,40.3101237 C291.802367,40.3101237 291.134667,39.6398211 291.134667,38.813392 C291.134667,37.986963 291.802367,37.3166603 292.626625,37.3166603 C293.449846,37.3166603 294.117547,37.986963 294.117547,38.813392" id="Fill-93" fill="#F5F5F5" transform="translate(292.626107, 38.813392) rotate(90.000000) translate(-292.626107, -38.813392) "></path>
|
||||
<path d="M294.117547,38.813392 C294.117547,39.6398211 293.449846,40.3101237 292.626625,40.3101237 C291.802367,40.3101237 291.134667,39.6398211 291.134667,38.813392 C291.134667,37.986963 291.802367,37.3166603 292.626625,37.3166603 C293.449846,37.3166603 294.117547,37.986963 294.117547,38.813392 L294.117547,38.813392 Z" id="Stroke-95" stroke="#A3B1BF" stroke-width="0.81" transform="translate(292.626107, 38.813392) rotate(90.000000) translate(-292.626107, -38.813392) "></path>
|
||||
<path d="M205.696461,94.8252648 C201.134531,94.8252648 197.402043,91.0782313 197.402043,86.4985238 L197.402043,73.9594928 C197.402043,69.3797853 201.134531,65.6327519 205.696461,65.6327519 L323.184813,65.6327519 C327.746743,65.6327519 331.479231,69.3797853 331.479231,73.9594928 L331.479231,86.4985238 C331.479231,91.0782313 327.746743,94.8252648 323.184813,94.8252648 L205.696461,94.8252648 Z" id="Fill-97" fill="#F0F2F5" transform="translate(264.440637, 80.229008) rotate(90.000000) translate(-264.440637, -80.229008) "></path>
|
||||
<path d="M205.696461,94.8252648 C201.134531,94.8252648 197.402043,91.0782313 197.402043,86.4985238 L197.402043,73.9594928 C197.402043,69.3797853 201.134531,65.6327519 205.696461,65.6327519 L323.184813,65.6327519 C327.746743,65.6327519 331.479231,69.3797853 331.479231,73.9594928 L331.479231,86.4985238 C331.479231,91.0782313 327.746743,94.8252648 323.184813,94.8252648 L205.696461,94.8252648 L205.696461,94.8252648 Z" id="Stroke-99" stroke="#A3B1BF" stroke-width="1.62" transform="translate(264.440637, 80.229008) rotate(90.000000) translate(-264.440637, -80.229008) "></path>
|
||||
<path d="M273.091198,22.5884924 C273.091198,23.4149215 272.423497,24.0852241 271.600276,24.0852241 C270.776019,24.0852241 270.108318,23.4149215 270.108318,22.5884924 C270.108318,21.7620634 270.776019,21.0917607 271.600276,21.0917607 C272.423497,21.0917607 273.091198,21.7620634 273.091198,22.5884924" id="Fill-101" fill="#FFFFFF" transform="translate(271.599758, 22.588492) rotate(90.000000) translate(-271.599758, -22.588492) "></path>
|
||||
<path d="M273.091198,22.5884924 C273.091198,23.4149215 272.423497,24.0852241 271.600276,24.0852241 C270.776019,24.0852241 270.108318,23.4149215 270.108318,22.5884924 C270.108318,21.7620634 270.776019,21.0917607 271.600276,21.0917607 C272.423497,21.0917607 273.091198,21.7620634 273.091198,22.5884924 L273.091198,22.5884924 Z" id="Stroke-103" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 22.588492) rotate(90.000000) translate(-271.599758, -22.588492) "></path>
|
||||
<path d="M273.091198,31.5121872 C273.091198,32.3386162 272.423497,33.0089189 271.600276,33.0089189 C270.776019,33.0089189 270.108318,32.3386162 270.108318,31.5121872 C270.108318,30.6857582 270.776019,30.0154555 271.600276,30.0154555 C272.423497,30.0154555 273.091198,30.6857582 273.091198,31.5121872" id="Fill-105" fill="#FFFFFF" transform="translate(271.599758, 31.512187) rotate(90.000000) translate(-271.599758, -31.512187) "></path>
|
||||
<path d="M273.091198,31.5121872 C273.091198,32.3386162 272.423497,33.0089189 271.600276,33.0089189 C270.776019,33.0089189 270.108318,32.3386162 270.108318,31.5121872 C270.108318,30.6857582 270.776019,30.0154555 271.600276,30.0154555 C272.423497,30.0154555 273.091198,30.6857582 273.091198,31.5121872 L273.091198,31.5121872 Z" id="Stroke-107" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 31.512187) rotate(90.000000) translate(-271.599758, -31.512187) "></path>
|
||||
<path d="M273.091198,40.435882 C273.091198,41.262311 272.423497,41.9326137 271.600276,41.9326137 C270.776019,41.9326137 270.108318,41.262311 270.108318,40.435882 C270.108318,39.609453 270.776019,38.9391503 271.600276,38.9391503 C272.423497,38.9391503 273.091198,39.609453 273.091198,40.435882" id="Fill-109" fill="#FFFFFF" transform="translate(271.599758, 40.435882) rotate(90.000000) translate(-271.599758, -40.435882) "></path>
|
||||
<path d="M273.091198,40.435882 C273.091198,41.262311 272.423497,41.9326137 271.600276,41.9326137 C270.776019,41.9326137 270.108318,41.262311 270.108318,40.435882 C270.108318,39.609453 270.776019,38.9391503 271.600276,38.9391503 C272.423497,38.9391503 273.091198,39.609453 273.091198,40.435882 L273.091198,40.435882 Z" id="Stroke-111" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 40.435882) rotate(90.000000) translate(-271.599758, -40.435882) "></path>
|
||||
<path d="M273.091198,49.3595768 C273.091198,50.1860058 272.423497,50.8563085 271.600276,50.8563085 C270.776019,50.8563085 270.108318,50.1860058 270.108318,49.3595768 C270.108318,48.5331477 270.776019,47.8628451 271.600276,47.8628451 C272.423497,47.8628451 273.091198,48.5331477 273.091198,49.3595768" id="Fill-113" fill="#FFFFFF" transform="translate(271.599758, 49.359577) rotate(90.000000) translate(-271.599758, -49.359577) "></path>
|
||||
<path d="M273.091198,49.3595768 C273.091198,50.1860058 272.423497,50.8563085 271.600276,50.8563085 C270.776019,50.8563085 270.108318,50.1860058 270.108318,49.3595768 C270.108318,48.5331477 270.776019,47.8628451 271.600276,47.8628451 C272.423497,47.8628451 273.091198,48.5331477 273.091198,49.3595768 L273.091198,49.3595768 Z" id="Stroke-115" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 49.359577) rotate(90.000000) translate(-271.599758, -49.359577) "></path>
|
||||
<path d="M273.091198,58.2832715 C273.091198,59.1097006 272.423497,59.7800032 271.600276,59.7800032 C270.776019,59.7800032 270.108318,59.1097006 270.108318,58.2832715 C270.108318,57.4568425 270.776019,56.7865399 271.600276,56.7865399 C272.423497,56.7865399 273.091198,57.4568425 273.091198,58.2832715" id="Fill-117" fill="#FFFFFF" transform="translate(271.599758, 58.283272) rotate(90.000000) translate(-271.599758, -58.283272) "></path>
|
||||
<path d="M273.091198,58.2832715 C273.091198,59.1097006 272.423497,59.7800032 271.600276,59.7800032 C270.776019,59.7800032 270.108318,59.1097006 270.108318,58.2832715 C270.108318,57.4568425 270.776019,56.7865399 271.600276,56.7865399 C272.423497,56.7865399 273.091198,57.4568425 273.091198,58.2832715 L273.091198,58.2832715 Z" id="Stroke-119" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 58.283272) rotate(90.000000) translate(-271.599758, -58.283272) "></path>
|
||||
<path d="M271.600276,68.703698 C270.776019,68.703698 270.108318,68.0333954 270.108318,67.2069663 C270.108318,66.3805373 270.776019,65.7102346 271.600276,65.7102346 C272.423497,65.7102346 273.091198,66.3805373 273.091198,67.2069663 C273.091198,68.0333954 272.423497,68.703698 271.600276,68.703698 Z" id="Fill-121" fill="#FFFFFF" transform="translate(271.599758, 67.206966) rotate(90.000000) translate(-271.599758, -67.206966) "></path>
|
||||
<path d="M273.091198,67.2069663 C273.091198,68.0333954 272.423497,68.703698 271.600276,68.703698 C270.776019,68.703698 270.108318,68.0333954 270.108318,67.2069663 C270.108318,66.3805373 270.776019,65.7102346 271.600276,65.7102346 C272.423497,65.7102346 273.091198,66.3805373 273.091198,67.2069663 L273.091198,67.2069663 Z" id="Stroke-123" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 67.206966) rotate(90.000000) translate(-271.599758, -67.206966) "></path>
|
||||
<path d="M258.534495,22.5884924 C258.534495,23.4149215 257.866794,24.0852241 257.043573,24.0852241 C256.219316,24.0852241 255.551615,23.4149215 255.551615,22.5884924 C255.551615,21.7620634 256.219316,21.0917607 257.043573,21.0917607 C257.866794,21.0917607 258.534495,21.7620634 258.534495,22.5884924" id="Fill-125" fill="#FFFFFF" transform="translate(257.043055, 22.588492) rotate(90.000000) translate(-257.043055, -22.588492) "></path>
|
||||
<path d="M258.534495,22.5884924 C258.534495,23.4149215 257.866794,24.0852241 257.043573,24.0852241 C256.219316,24.0852241 255.551615,23.4149215 255.551615,22.5884924 C255.551615,21.7620634 256.219316,21.0917607 257.043573,21.0917607 C257.866794,21.0917607 258.534495,21.7620634 258.534495,22.5884924 L258.534495,22.5884924 Z" id="Stroke-127" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 22.588492) rotate(90.000000) translate(-257.043055, -22.588492) "></path>
|
||||
<path d="M258.534495,31.5121872 C258.534495,32.3386162 257.866794,33.0089189 257.043573,33.0089189 C256.219316,33.0089189 255.551615,32.3386162 255.551615,31.5121872 C255.551615,30.6857582 256.219316,30.0154555 257.043573,30.0154555 C257.866794,30.0154555 258.534495,30.6857582 258.534495,31.5121872" id="Fill-129" fill="#FFFFFF" transform="translate(257.043055, 31.512187) rotate(90.000000) translate(-257.043055, -31.512187) "></path>
|
||||
<path d="M258.534495,31.5121872 C258.534495,32.3386162 257.866794,33.0089189 257.043573,33.0089189 C256.219316,33.0089189 255.551615,32.3386162 255.551615,31.5121872 C255.551615,30.6857582 256.219316,30.0154555 257.043573,30.0154555 C257.866794,30.0154555 258.534495,30.6857582 258.534495,31.5121872 L258.534495,31.5121872 Z" id="Stroke-131" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 31.512187) rotate(90.000000) translate(-257.043055, -31.512187) "></path>
|
||||
<path d="M258.534495,40.435882 C258.534495,41.262311 257.866794,41.9326137 257.043573,41.9326137 C256.219316,41.9326137 255.551615,41.262311 255.551615,40.435882 C255.551615,39.609453 256.219316,38.9391503 257.043573,38.9391503 C257.866794,38.9391503 258.534495,39.609453 258.534495,40.435882" id="Fill-133" fill="#FFFFFF" transform="translate(257.043055, 40.435882) rotate(90.000000) translate(-257.043055, -40.435882) "></path>
|
||||
<path d="M258.534495,40.435882 C258.534495,41.262311 257.866794,41.9326137 257.043573,41.9326137 C256.219316,41.9326137 255.551615,41.262311 255.551615,40.435882 C255.551615,39.609453 256.219316,38.9391503 257.043573,38.9391503 C257.866794,38.9391503 258.534495,39.609453 258.534495,40.435882 L258.534495,40.435882 Z" id="Stroke-135" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 40.435882) rotate(90.000000) translate(-257.043055, -40.435882) "></path>
|
||||
<path d="M258.534495,49.3595768 C258.534495,50.1860058 257.866794,50.8563085 257.043573,50.8563085 C256.219316,50.8563085 255.551615,50.1860058 255.551615,49.3595768 C255.551615,48.5331477 256.219316,47.8628451 257.043573,47.8628451 C257.866794,47.8628451 258.534495,48.5331477 258.534495,49.3595768" id="Fill-137" fill="#FFFFFF" transform="translate(257.043055, 49.359577) rotate(90.000000) translate(-257.043055, -49.359577) "></path>
|
||||
<path d="M258.534495,49.3595768 C258.534495,50.1860058 257.866794,50.8563085 257.043573,50.8563085 C256.219316,50.8563085 255.551615,50.1860058 255.551615,49.3595768 C255.551615,48.5331477 256.219316,47.8628451 257.043573,47.8628451 C257.866794,47.8628451 258.534495,48.5331477 258.534495,49.3595768 L258.534495,49.3595768 Z" id="Stroke-139" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 49.359577) rotate(90.000000) translate(-257.043055, -49.359577) "></path>
|
||||
<path d="M258.534495,58.2832715 C258.534495,59.1097006 257.866794,59.7800032 257.043573,59.7800032 C256.219316,59.7800032 255.551615,59.1097006 255.551615,58.2832715 C255.551615,57.4568425 256.219316,56.7865399 257.043573,56.7865399 C257.866794,56.7865399 258.534495,57.4568425 258.534495,58.2832715" id="Fill-141" fill="#FFFFFF" transform="translate(257.043055, 58.283272) rotate(90.000000) translate(-257.043055, -58.283272) "></path>
|
||||
<path d="M258.534495,58.2832715 C258.534495,59.1097006 257.866794,59.7800032 257.043573,59.7800032 C256.219316,59.7800032 255.551615,59.1097006 255.551615,58.2832715 C255.551615,57.4568425 256.219316,56.7865399 257.043573,56.7865399 C257.866794,56.7865399 258.534495,57.4568425 258.534495,58.2832715 L258.534495,58.2832715 Z" id="Stroke-143" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 58.283272) rotate(90.000000) translate(-257.043055, -58.283272) "></path>
|
||||
<path d="M258.534495,67.2069663 C258.534495,68.0333954 257.866794,68.703698 257.043573,68.703698 C256.219316,68.703698 255.551615,68.0333954 255.551615,67.2069663 C255.551615,66.3805373 256.219316,65.7102346 257.043573,65.7102346 C257.866794,65.7102346 258.534495,66.3805373 258.534495,67.2069663" id="Fill-145" fill="#FFFFFF" transform="translate(257.043055, 67.206966) rotate(90.000000) translate(-257.043055, -67.206966) "></path>
|
||||
<path d="M258.534495,67.2069663 C258.534495,68.0333954 257.866794,68.703698 257.043573,68.703698 C256.219316,68.703698 255.551615,68.0333954 255.551615,67.2069663 C255.551615,66.3805373 256.219316,65.7102346 257.043573,65.7102346 C257.866794,65.7102346 258.534495,66.3805373 258.534495,67.2069663 L258.534495,67.2069663 Z" id="Stroke-147" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 67.206966) rotate(90.000000) translate(-257.043055, -67.206966) "></path>
|
||||
<path d="M265.812846,26.6447173 C265.812846,27.4711464 265.145146,28.141449 264.321925,28.141449 C263.497667,28.141449 262.829967,27.4711464 262.829967,26.6447173 C262.829967,25.8182883 263.497667,25.1479856 264.321925,25.1479856 C265.145146,25.1479856 265.812846,25.8182883 265.812846,26.6447173" id="Fill-149" fill="#FFFFFF" transform="translate(264.321407, 26.644717) rotate(90.000000) translate(-264.321407, -26.644717) "></path>
|
||||
<path d="M265.812846,26.6447173 C265.812846,27.4711464 265.145146,28.141449 264.321925,28.141449 C263.497667,28.141449 262.829967,27.4711464 262.829967,26.6447173 C262.829967,25.8182883 263.497667,25.1479856 264.321925,25.1479856 C265.145146,25.1479856 265.812846,25.8182883 265.812846,26.6447173 L265.812846,26.6447173 Z" id="Stroke-151" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 26.644717) rotate(90.000000) translate(-264.321407, -26.644717) "></path>
|
||||
<path d="M265.812846,35.5684121 C265.812846,36.3948411 265.145146,37.0651438 264.321925,37.0651438 C263.497667,37.0651438 262.829967,36.3948411 262.829967,35.5684121 C262.829967,34.7419831 263.497667,34.0716804 264.321925,34.0716804 C265.145146,34.0716804 265.812846,34.7419831 265.812846,35.5684121" id="Fill-153" fill="#FFFFFF" transform="translate(264.321407, 35.568412) rotate(90.000000) translate(-264.321407, -35.568412) "></path>
|
||||
<path d="M265.812846,35.5684121 C265.812846,36.3948411 265.145146,37.0651438 264.321925,37.0651438 C263.497667,37.0651438 262.829967,36.3948411 262.829967,35.5684121 C262.829967,34.7419831 263.497667,34.0716804 264.321925,34.0716804 C265.145146,34.0716804 265.812846,34.7419831 265.812846,35.5684121 L265.812846,35.5684121 Z" id="Stroke-155" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 35.568412) rotate(90.000000) translate(-264.321407, -35.568412) "></path>
|
||||
<path d="M265.812846,44.4921069 C265.812846,45.3185359 265.145146,45.9888386 264.321925,45.9888386 C263.497667,45.9888386 262.829967,45.3185359 262.829967,44.4921069 C262.829967,43.6656779 263.497667,42.9953752 264.321925,42.9953752 C265.145146,42.9953752 265.812846,43.6656779 265.812846,44.4921069" id="Fill-157" fill="#FFFFFF" transform="translate(264.321407, 44.492107) rotate(90.000000) translate(-264.321407, -44.492107) "></path>
|
||||
<path d="M265.812846,44.4921069 C265.812846,45.3185359 265.145146,45.9888386 264.321925,45.9888386 C263.497667,45.9888386 262.829967,45.3185359 262.829967,44.4921069 C262.829967,43.6656779 263.497667,42.9953752 264.321925,42.9953752 C265.145146,42.9953752 265.812846,43.6656779 265.812846,44.4921069 L265.812846,44.4921069 Z" id="Stroke-159" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 44.492107) rotate(90.000000) translate(-264.321407, -44.492107) "></path>
|
||||
<path d="M265.812846,53.4158017 C265.812846,54.2422307 265.145146,54.9125333 264.321925,54.9125333 C263.497667,54.9125333 262.829967,54.2422307 262.829967,53.4158017 C262.829967,52.5893726 263.497667,51.91907 264.321925,51.91907 C265.145146,51.91907 265.812846,52.5893726 265.812846,53.4158017" id="Fill-161" fill="#FFFFFF" transform="translate(264.321407, 53.415802) rotate(90.000000) translate(-264.321407, -53.415802) "></path>
|
||||
<path d="M265.812846,53.4158017 C265.812846,54.2422307 265.145146,54.9125333 264.321925,54.9125333 C263.497667,54.9125333 262.829967,54.2422307 262.829967,53.4158017 C262.829967,52.5893726 263.497667,51.91907 264.321925,51.91907 C265.145146,51.91907 265.812846,52.5893726 265.812846,53.4158017 L265.812846,53.4158017 Z" id="Stroke-163" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 53.415802) rotate(90.000000) translate(-264.321407, -53.415802) "></path>
|
||||
<path d="M265.812846,62.3394964 C265.812846,63.1659255 265.145146,63.8362281 264.321925,63.8362281 C263.497667,63.8362281 262.829967,63.1659255 262.829967,62.3394964 C262.829967,61.5130674 263.497667,60.8427648 264.321925,60.8427648 C265.145146,60.8427648 265.812846,61.5130674 265.812846,62.3394964" id="Fill-165" fill="#FFFFFF" transform="translate(264.321407, 62.339496) rotate(90.000000) translate(-264.321407, -62.339496) "></path>
|
||||
<path d="M265.812846,62.3394964 C265.812846,63.1659255 265.145146,63.8362281 264.321925,63.8362281 C263.497667,63.8362281 262.829967,63.1659255 262.829967,62.3394964 C262.829967,61.5130674 263.497667,60.8427648 264.321925,60.8427648 C265.145146,60.8427648 265.812846,61.5130674 265.812846,62.3394964 L265.812846,62.3394964 Z" id="Stroke-167" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 62.339496) rotate(90.000000) translate(-264.321407, -62.339496) "></path>
|
||||
<path d="M265.812846,71.2631912 C265.812846,72.0896203 265.145146,72.7599229 264.321925,72.7599229 C263.497667,72.7599229 262.829967,72.0896203 262.829967,71.2631912 C262.829967,70.4367622 263.497667,69.7664595 264.321925,69.7664595 C265.145146,69.7664595 265.812846,70.4367622 265.812846,71.2631912" id="Fill-169" fill="#FFFFFF" transform="translate(264.321407, 71.263191) rotate(90.000000) translate(-264.321407, -71.263191) "></path>
|
||||
<path d="M265.812846,71.2631912 C265.812846,72.0896203 265.145146,72.7599229 264.321925,72.7599229 C263.497667,72.7599229 262.829967,72.0896203 262.829967,71.2631912 C262.829967,70.4367622 263.497667,69.7664595 264.321925,69.7664595 C265.145146,69.7664595 265.812846,70.4367622 265.812846,71.2631912 L265.812846,71.2631912 Z" id="Stroke-171" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 71.263191) rotate(90.000000) translate(-264.321407, -71.263191) "></path>
|
||||
<path d="M263.92334,136.046978 C261.534548,136.046978 259.597801,134.102684 259.597801,131.704582 C259.597801,129.306481 261.534548,127.362187 263.92334,127.362187 C266.312132,127.362187 268.248879,129.306481 268.248879,131.704582 C268.248879,134.102684 266.312132,136.046978 263.92334,136.046978 Z" id="Fill-173" fill="#A3B1BF" transform="translate(263.923340, 131.704582) rotate(90.000000) translate(-263.923340, -131.704582) "></path>
|
||||
<path d="M170.113409,94.8252648 C165.551479,94.8252648 161.818991,91.0782313 161.818991,86.4985238 L161.818991,73.9594928 C161.818991,69.3797853 165.551479,65.6327519 170.113409,65.6327519 L287.601762,65.6327519 C292.163691,65.6327519 295.896179,69.3797853 295.896179,73.9594928 L295.896179,86.4985238 C295.896179,91.0782313 292.163691,94.8252648 287.601762,94.8252648 L170.113409,94.8252648 Z" id="Fill-175" fill="#F0F2F5" transform="translate(228.857585, 80.229008) rotate(90.000000) translate(-228.857585, -80.229008) "></path>
|
||||
<path d="M170.113409,94.8252648 C165.551479,94.8252648 161.818991,91.0782313 161.818991,86.4985238 L161.818991,73.9594928 C161.818991,69.3797853 165.551479,65.6327519 170.113409,65.6327519 L287.601762,65.6327519 C292.163691,65.6327519 295.896179,69.3797853 295.896179,73.9594928 L295.896179,86.4985238 C295.896179,91.0782313 292.163691,94.8252648 287.601762,94.8252648 L170.113409,94.8252648 L170.113409,94.8252648 Z" id="Stroke-177" stroke="#A3B1BF" stroke-width="1.62" transform="translate(228.857585, 80.229008) rotate(90.000000) translate(-228.857585, -80.229008) "></path>
|
||||
<path d="M237.508146,22.5884924 C237.508146,23.4149215 236.840446,24.0852241 236.017225,24.0852241 C235.192967,24.0852241 234.525266,23.4149215 234.525266,22.5884924 C234.525266,21.7620634 235.192967,21.0917607 236.017225,21.0917607 C236.840446,21.0917607 237.508146,21.7620634 237.508146,22.5884924" id="Fill-179" transform="translate(236.016706, 22.588492) rotate(90.000000) translate(-236.016706, -22.588492) "></path>
|
||||
<path d="M237.508146,22.5884924 C237.508146,23.4149215 236.840446,24.0852241 236.017225,24.0852241 C235.192967,24.0852241 234.525266,23.4149215 234.525266,22.5884924 C234.525266,21.7620634 235.192967,21.0917607 236.017225,21.0917607 C236.840446,21.0917607 237.508146,21.7620634 237.508146,22.5884924 L237.508146,22.5884924 Z" id="Stroke-181" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 22.588492) rotate(90.000000) translate(-236.016706, -22.588492) "></path>
|
||||
<path d="M237.508146,31.5121872 C237.508146,32.3386162 236.840446,33.0089189 236.017225,33.0089189 C235.192967,33.0089189 234.525266,32.3386162 234.525266,31.5121872 C234.525266,30.6857582 235.192967,30.0154555 236.017225,30.0154555 C236.840446,30.0154555 237.508146,30.6857582 237.508146,31.5121872" id="Fill-183" transform="translate(236.016706, 31.512187) rotate(90.000000) translate(-236.016706, -31.512187) "></path>
|
||||
<path d="M237.508146,31.5121872 C237.508146,32.3386162 236.840446,33.0089189 236.017225,33.0089189 C235.192967,33.0089189 234.525266,32.3386162 234.525266,31.5121872 C234.525266,30.6857582 235.192967,30.0154555 236.017225,30.0154555 C236.840446,30.0154555 237.508146,30.6857582 237.508146,31.5121872 L237.508146,31.5121872 Z" id="Stroke-185" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 31.512187) rotate(90.000000) translate(-236.016706, -31.512187) "></path>
|
||||
<path d="M237.508146,40.435882 C237.508146,41.262311 236.840446,41.9326137 236.017225,41.9326137 C235.192967,41.9326137 234.525266,41.262311 234.525266,40.435882 C234.525266,39.609453 235.192967,38.9391503 236.017225,38.9391503 C236.840446,38.9391503 237.508146,39.609453 237.508146,40.435882" id="Fill-187" transform="translate(236.016706, 40.435882) rotate(90.000000) translate(-236.016706, -40.435882) "></path>
|
||||
<path d="M237.508146,40.435882 C237.508146,41.262311 236.840446,41.9326137 236.017225,41.9326137 C235.192967,41.9326137 234.525266,41.262311 234.525266,40.435882 C234.525266,39.609453 235.192967,38.9391503 236.017225,38.9391503 C236.840446,38.9391503 237.508146,39.609453 237.508146,40.435882 L237.508146,40.435882 Z" id="Stroke-189" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 40.435882) rotate(90.000000) translate(-236.016706, -40.435882) "></path>
|
||||
<path d="M237.508146,49.3595768 C237.508146,50.1860058 236.840446,50.8563085 236.017225,50.8563085 C235.192967,50.8563085 234.525266,50.1860058 234.525266,49.3595768 C234.525266,48.5331477 235.192967,47.8628451 236.017225,47.8628451 C236.840446,47.8628451 237.508146,48.5331477 237.508146,49.3595768" id="Fill-191" transform="translate(236.016706, 49.359577) rotate(90.000000) translate(-236.016706, -49.359577) "></path>
|
||||
<path d="M237.508146,49.3595768 C237.508146,50.1860058 236.840446,50.8563085 236.017225,50.8563085 C235.192967,50.8563085 234.525266,50.1860058 234.525266,49.3595768 C234.525266,48.5331477 235.192967,47.8628451 236.017225,47.8628451 C236.840446,47.8628451 237.508146,48.5331477 237.508146,49.3595768 L237.508146,49.3595768 Z" id="Stroke-193" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 49.359577) rotate(90.000000) translate(-236.016706, -49.359577) "></path>
|
||||
<path d="M237.508146,58.2832715 C237.508146,59.1097006 236.840446,59.7800032 236.017225,59.7800032 C235.192967,59.7800032 234.525266,59.1097006 234.525266,58.2832715 C234.525266,57.4568425 235.192967,56.7865399 236.017225,56.7865399 C236.840446,56.7865399 237.508146,57.4568425 237.508146,58.2832715" id="Fill-195" transform="translate(236.016706, 58.283272) rotate(90.000000) translate(-236.016706, -58.283272) "></path>
|
||||
<path d="M237.508146,58.2832715 C237.508146,59.1097006 236.840446,59.7800032 236.017225,59.7800032 C235.192967,59.7800032 234.525266,59.1097006 234.525266,58.2832715 C234.525266,57.4568425 235.192967,56.7865399 236.017225,56.7865399 C236.840446,56.7865399 237.508146,57.4568425 237.508146,58.2832715 L237.508146,58.2832715 Z" id="Stroke-197" stroke-opacity="0.85" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 58.283272) rotate(90.000000) translate(-236.016706, -58.283272) "></path>
|
||||
<path d="M237.508146,67.2069663 C237.508146,68.0333954 236.840446,68.703698 236.017225,68.703698 C235.192967,68.703698 234.525266,68.0333954 234.525266,67.2069663 C234.525266,66.3805373 235.192967,65.7102346 236.017225,65.7102346 C236.840446,65.7102346 237.508146,66.3805373 237.508146,67.2069663" id="Fill-199" transform="translate(236.016706, 67.206966) rotate(90.000000) translate(-236.016706, -67.206966) "></path>
|
||||
<path d="M237.508146,67.2069663 C237.508146,68.0333954 236.840446,68.703698 236.017225,68.703698 C235.192967,68.703698 234.525266,68.0333954 234.525266,67.2069663 C234.525266,66.3805373 235.192967,65.7102346 236.017225,65.7102346 C236.840446,65.7102346 237.508146,66.3805373 237.508146,67.2069663 L237.508146,67.2069663 Z" id="Stroke-201" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 67.206966) rotate(90.000000) translate(-236.016706, -67.206966) "></path>
|
||||
<path d="M223.760149,22.5884924 C223.760149,23.4149215 223.092448,24.0852241 222.269227,24.0852241 C221.44497,24.0852241 220.777269,23.4149215 220.777269,22.5884924 C220.777269,21.7620634 221.44497,21.0917607 222.269227,21.0917607 C223.092448,21.0917607 223.760149,21.7620634 223.760149,22.5884924" id="Fill-203" transform="translate(222.268709, 22.588492) rotate(90.000000) translate(-222.268709, -22.588492) "></path>
|
||||
<path d="M223.760149,22.5884924 C223.760149,23.4149215 223.092448,24.0852241 222.269227,24.0852241 C221.44497,24.0852241 220.777269,23.4149215 220.777269,22.5884924 C220.777269,21.7620634 221.44497,21.0917607 222.269227,21.0917607 C223.092448,21.0917607 223.760149,21.7620634 223.760149,22.5884924 L223.760149,22.5884924 Z" id="Stroke-205" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 22.588492) rotate(90.000000) translate(-222.268709, -22.588492) "></path>
|
||||
<path d="M223.760149,31.5121872 C223.760149,32.3386162 223.092448,33.0089189 222.269227,33.0089189 C221.44497,33.0089189 220.777269,32.3386162 220.777269,31.5121872 C220.777269,30.6857582 221.44497,30.0154555 222.269227,30.0154555 C223.092448,30.0154555 223.760149,30.6857582 223.760149,31.5121872" id="Fill-207" transform="translate(222.268709, 31.512187) rotate(90.000000) translate(-222.268709, -31.512187) "></path>
|
||||
<path d="M223.760149,31.5121872 C223.760149,32.3386162 223.092448,33.0089189 222.269227,33.0089189 C221.44497,33.0089189 220.777269,32.3386162 220.777269,31.5121872 C220.777269,30.6857582 221.44497,30.0154555 222.269227,30.0154555 C223.092448,30.0154555 223.760149,30.6857582 223.760149,31.5121872 L223.760149,31.5121872 Z" id="Stroke-209" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 31.512187) rotate(90.000000) translate(-222.268709, -31.512187) "></path>
|
||||
<path d="M223.760149,40.435882 C223.760149,41.262311 223.092448,41.9326137 222.269227,41.9326137 C221.44497,41.9326137 220.777269,41.262311 220.777269,40.435882 C220.777269,39.609453 221.44497,38.9391503 222.269227,38.9391503 C223.092448,38.9391503 223.760149,39.609453 223.760149,40.435882" id="Fill-211" transform="translate(222.268709, 40.435882) rotate(90.000000) translate(-222.268709, -40.435882) "></path>
|
||||
<path d="M223.760149,40.435882 C223.760149,41.262311 223.092448,41.9326137 222.269227,41.9326137 C221.44497,41.9326137 220.777269,41.262311 220.777269,40.435882 C220.777269,39.609453 221.44497,38.9391503 222.269227,38.9391503 C223.092448,38.9391503 223.760149,39.609453 223.760149,40.435882 L223.760149,40.435882 Z" id="Stroke-213" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 40.435882) rotate(90.000000) translate(-222.268709, -40.435882) "></path>
|
||||
<path d="M223.760149,49.3595768 C223.760149,50.1860058 223.092448,50.8563085 222.269227,50.8563085 C221.44497,50.8563085 220.777269,50.1860058 220.777269,49.3595768 C220.777269,48.5331477 221.44497,47.8628451 222.269227,47.8628451 C223.092448,47.8628451 223.760149,48.5331477 223.760149,49.3595768" id="Fill-215" transform="translate(222.268709, 49.359577) rotate(90.000000) translate(-222.268709, -49.359577) "></path>
|
||||
<path d="M223.760149,49.3595768 C223.760149,50.1860058 223.092448,50.8563085 222.269227,50.8563085 C221.44497,50.8563085 220.777269,50.1860058 220.777269,49.3595768 C220.777269,48.5331477 221.44497,47.8628451 222.269227,47.8628451 C223.092448,47.8628451 223.760149,48.5331477 223.760149,49.3595768 L223.760149,49.3595768 Z" id="Stroke-217" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 49.359577) rotate(90.000000) translate(-222.268709, -49.359577) "></path>
|
||||
<path d="M223.760149,58.2832715 C223.760149,59.1097006 223.092448,59.7800032 222.269227,59.7800032 C221.44497,59.7800032 220.777269,59.1097006 220.777269,58.2832715 C220.777269,57.4568425 221.44497,56.7865399 222.269227,56.7865399 C223.092448,56.7865399 223.760149,57.4568425 223.760149,58.2832715" id="Fill-219" transform="translate(222.268709, 58.283272) rotate(90.000000) translate(-222.268709, -58.283272) "></path>
|
||||
<path d="M223.760149,58.2832715 C223.760149,59.1097006 223.092448,59.7800032 222.269227,59.7800032 C221.44497,59.7800032 220.777269,59.1097006 220.777269,58.2832715 C220.777269,57.4568425 221.44497,56.7865399 222.269227,56.7865399 C223.092448,56.7865399 223.760149,57.4568425 223.760149,58.2832715 L223.760149,58.2832715 Z" id="Stroke-221" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 58.283272) rotate(90.000000) translate(-222.268709, -58.283272) "></path>
|
||||
<path d="M223.760149,67.2069663 C223.760149,68.0333954 223.092448,68.703698 222.269227,68.703698 C221.44497,68.703698 220.777269,68.0333954 220.777269,67.2069663 C220.777269,66.3805373 221.44497,65.7102346 222.269227,65.7102346 C223.092448,65.7102346 223.760149,66.3805373 223.760149,67.2069663" id="Fill-223" transform="translate(222.268709, 67.206966) rotate(90.000000) translate(-222.268709, -67.206966) "></path>
|
||||
<path d="M223.760149,67.2069663 C223.760149,68.0333954 223.092448,68.703698 222.269227,68.703698 C221.44497,68.703698 220.777269,68.0333954 220.777269,67.2069663 C220.777269,66.3805373 221.44497,65.7102346 222.269227,65.7102346 C223.092448,65.7102346 223.760149,66.3805373 223.760149,67.2069663 L223.760149,67.2069663 Z" id="Stroke-225" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 67.206966) rotate(90.000000) translate(-222.268709, -67.206966) "></path>
|
||||
<path d="M230.229795,26.6447173 C230.229795,27.4711464 229.562094,28.141449 228.738873,28.141449 C227.914615,28.141449 227.246915,27.4711464 227.246915,26.6447173 C227.246915,25.8182883 227.914615,25.1479856 228.738873,25.1479856 C229.562094,25.1479856 230.229795,25.8182883 230.229795,26.6447173" id="Fill-227" transform="translate(228.738355, 26.644717) rotate(90.000000) translate(-228.738355, -26.644717) "></path>
|
||||
<path d="M230.229795,26.6447173 C230.229795,27.4711464 229.562094,28.141449 228.738873,28.141449 C227.914615,28.141449 227.246915,27.4711464 227.246915,26.6447173 C227.246915,25.8182883 227.914615,25.1479856 228.738873,25.1479856 C229.562094,25.1479856 230.229795,25.8182883 230.229795,26.6447173 L230.229795,26.6447173 Z" id="Stroke-229" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 26.644717) rotate(90.000000) translate(-228.738355, -26.644717) "></path>
|
||||
<path d="M230.229795,35.5684121 C230.229795,36.3948411 229.562094,37.0651438 228.738873,37.0651438 C227.914615,37.0651438 227.246915,36.3948411 227.246915,35.5684121 C227.246915,34.7419831 227.914615,34.0716804 228.738873,34.0716804 C229.562094,34.0716804 230.229795,34.7419831 230.229795,35.5684121" id="Fill-231" transform="translate(228.738355, 35.568412) rotate(90.000000) translate(-228.738355, -35.568412) "></path>
|
||||
<path d="M230.229795,35.5684121 C230.229795,36.3948411 229.562094,37.0651438 228.738873,37.0651438 C227.914615,37.0651438 227.246915,36.3948411 227.246915,35.5684121 C227.246915,34.7419831 227.914615,34.0716804 228.738873,34.0716804 C229.562094,34.0716804 230.229795,34.7419831 230.229795,35.5684121 L230.229795,35.5684121 Z" id="Stroke-233" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 35.568412) rotate(90.000000) translate(-228.738355, -35.568412) "></path>
|
||||
<path d="M230.229795,44.4921069 C230.229795,45.3185359 229.562094,45.9888386 228.738873,45.9888386 C227.914615,45.9888386 227.246915,45.3185359 227.246915,44.4921069 C227.246915,43.6656779 227.914615,42.9953752 228.738873,42.9953752 C229.562094,42.9953752 230.229795,43.6656779 230.229795,44.4921069" id="Fill-235" transform="translate(228.738355, 44.492107) rotate(90.000000) translate(-228.738355, -44.492107) "></path>
|
||||
<path d="M230.229795,44.4921069 C230.229795,45.3185359 229.562094,45.9888386 228.738873,45.9888386 C227.914615,45.9888386 227.246915,45.3185359 227.246915,44.4921069 C227.246915,43.6656779 227.914615,42.9953752 228.738873,42.9953752 C229.562094,42.9953752 230.229795,43.6656779 230.229795,44.4921069 L230.229795,44.4921069 Z" id="Stroke-237" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 44.492107) rotate(90.000000) translate(-228.738355, -44.492107) "></path>
|
||||
<path d="M230.229795,53.4158017 C230.229795,54.2422307 229.562094,54.9125333 228.738873,54.9125333 C227.914615,54.9125333 227.246915,54.2422307 227.246915,53.4158017 C227.246915,52.5893726 227.914615,51.91907 228.738873,51.91907 C229.562094,51.91907 230.229795,52.5893726 230.229795,53.4158017" id="Fill-239" transform="translate(228.738355, 53.415802) rotate(90.000000) translate(-228.738355, -53.415802) "></path>
|
||||
<path d="M230.229795,53.4158017 C230.229795,54.2422307 229.562094,54.9125333 228.738873,54.9125333 C227.914615,54.9125333 227.246915,54.2422307 227.246915,53.4158017 C227.246915,52.5893726 227.914615,51.91907 228.738873,51.91907 C229.562094,51.91907 230.229795,52.5893726 230.229795,53.4158017 L230.229795,53.4158017 Z" id="Stroke-241" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 53.415802) rotate(90.000000) translate(-228.738355, -53.415802) "></path>
|
||||
<path d="M230.229795,62.3394964 C230.229795,63.1659255 229.562094,63.8362281 228.738873,63.8362281 C227.914615,63.8362281 227.246915,63.1659255 227.246915,62.3394964 C227.246915,61.5130674 227.914615,60.8427648 228.738873,60.8427648 C229.562094,60.8427648 230.229795,61.5130674 230.229795,62.3394964" id="Fill-243" transform="translate(228.738355, 62.339496) rotate(90.000000) translate(-228.738355, -62.339496) "></path>
|
||||
<path d="M230.229795,62.3394964 C230.229795,63.1659255 229.562094,63.8362281 228.738873,63.8362281 C227.914615,63.8362281 227.246915,63.1659255 227.246915,62.3394964 C227.246915,61.5130674 227.914615,60.8427648 228.738873,60.8427648 C229.562094,60.8427648 230.229795,61.5130674 230.229795,62.3394964 L230.229795,62.3394964 Z" id="Stroke-245" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 62.339496) rotate(90.000000) translate(-228.738355, -62.339496) "></path>
|
||||
<path d="M230.229795,71.2631912 C230.229795,72.0896203 229.562094,72.7599229 228.738873,72.7599229 C227.914615,72.7599229 227.246915,72.0896203 227.246915,71.2631912 C227.246915,70.4367622 227.914615,69.7664595 228.738873,69.7664595 C229.562094,69.7664595 230.229795,70.4367622 230.229795,71.2631912" id="Fill-247" transform="translate(228.738355, 71.263191) rotate(90.000000) translate(-228.738355, -71.263191) "></path>
|
||||
<path d="M230.229795,71.2631912 C230.229795,72.0896203 229.562094,72.7599229 228.738873,72.7599229 C227.914615,72.7599229 227.246915,72.0896203 227.246915,71.2631912 C227.246915,70.4367622 227.914615,69.7664595 228.738873,69.7664595 C229.562094,69.7664595 230.229795,70.4367622 230.229795,71.2631912 L230.229795,71.2631912 Z" id="Stroke-249" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 71.263191) rotate(90.000000) translate(-228.738355, -71.263191) "></path>
|
||||
<path d="M233.474533,131.704582 C233.474533,134.102684 231.537786,136.046978 229.148994,136.046978 C226.760202,136.046978 224.823455,134.102684 224.823455,131.704582 C224.823455,129.306481 226.760202,127.362187 229.148994,127.362187 C231.537786,127.362187 233.474533,129.306481 233.474533,131.704582 L226.809752,131.704582" id="Fill-251" fill="#A3B1BF" transform="translate(229.148994, 131.704582) rotate(90.000000) translate(-229.148994, -131.704582) "></path>
|
||||
<path d="M116.93208,108.951605 L112.95698,97.0641411 C111.505457,92.7217457 113.856924,87.977585 118.181426,86.5204054 C118.181426,86.5204054 144.947552,77.5008125 158.330615,72.991016 C182.074402,64.9898842 229.561977,48.9876206 229.561977,48.9876206 C233.887516,47.530441 238.61326,49.8900312 240.064784,54.2313857 L244.039883,66.1188493 C245.491406,70.4612446 243.140976,75.2054053 238.815437,76.662585 L127.434886,114.19537 C123.110384,115.652549 118.383603,113.292959 116.93208,108.951605 Z" id="Stroke-255" stroke="#A3B1BF" stroke-width="1.62" transform="translate(178.498482, 81.591495) rotate(90.000000) translate(-178.498482, -81.591495) "></path>
|
||||
<path d="M170.986678,36.9877796 C170.205966,37.2511128 169.360972,36.8295715 169.098661,36.0447762 C168.83635,35.2610217 169.257292,34.412735 170.038004,34.1494018 C170.818716,33.8860686 171.66371,34.3086507 171.926021,35.0924052 C172.188332,35.8761597 171.76739,36.7254872 170.986678,36.9877796 Z" id="Fill-257" transform="translate(170.512341, 35.568641) rotate(90.000000) translate(-170.512341, -35.568641) "></path>
|
||||
<path d="M170.986678,36.9877796 C170.205966,37.2511128 169.360972,36.8295715 169.098661,36.0447762 C168.83635,35.2610217 169.257292,34.412735 170.038004,34.1494018 C170.818716,33.8860686 171.66371,34.3086507 171.926021,35.0924052 C172.188332,35.8761597 171.76739,36.7254872 170.986678,36.9877796 Z" id="Stroke-259" stroke="#A3B1BF" stroke-width="0.81" transform="translate(170.512341, 35.568641) rotate(90.000000) translate(-170.512341, -35.568641) "></path>
|
||||
<path d="M174.352138,44.0161 C174.614449,44.7998545 174.193507,45.649182 173.412795,45.9114744 C172.632083,46.1748075 171.787089,45.7532663 171.524778,44.968471 C171.262467,44.1847165 171.683409,43.3364297 172.464121,43.0730966 C173.244833,42.8097634 174.089827,43.2323455 174.352138,44.0161" id="Fill-261" transform="translate(172.938458, 44.492336) rotate(90.000000) translate(-172.938458, -44.492336) "></path>
|
||||
<path d="M173.412795,45.9114744 C172.632083,46.1748075 171.787089,45.7532663 171.524778,44.968471 C171.262467,44.1847165 171.683409,43.3364297 172.464121,43.0730966 C173.244833,42.8097634 174.089827,43.2323455 174.352138,44.0161 C174.614449,44.7998545 174.193507,45.649182 173.412795,45.9114744 Z" id="Stroke-263" stroke="#A3B1BF" stroke-width="0.81" transform="translate(172.938458, 44.492336) rotate(90.000000) translate(-172.938458, -44.492336) "></path>
|
||||
<path d="M177.586961,52.1285498 C177.849272,52.9123043 177.42833,53.7616318 176.647618,54.0239242 C175.866906,54.2872573 175.021912,53.8657161 174.759601,53.0809208 C174.49729,52.2971663 174.918232,51.4488795 175.698944,51.1855464 C176.479656,50.9222132 177.32465,51.3447953 177.586961,52.1285498" id="Fill-265" transform="translate(176.173281, 52.604786) rotate(90.000000) translate(-176.173281, -52.604786) "></path>
|
||||
<path d="M176.647618,54.0239242 C175.866906,54.2872573 175.021912,53.8657161 174.759601,53.0809208 C174.49729,52.2971663 174.918232,51.4488795 175.698944,51.1855464 C176.479656,50.9222132 177.32465,51.3447953 177.586961,52.1285498 C177.849272,52.9123043 177.42833,53.7616318 176.647618,54.0239242 Z" id="Stroke-267" stroke="#A3B1BF" stroke-width="0.81" transform="translate(176.173281, 52.604786) rotate(90.000000) translate(-176.173281, -52.604786) "></path>
|
||||
<path d="M180.013078,61.0522445 C180.275389,61.835999 179.854447,62.6853266 179.073735,62.9476189 C178.293023,63.2109521 177.448029,62.7894109 177.185718,62.0046155 C176.923407,61.220861 177.344349,60.3725743 178.125061,60.1092411 C178.905773,59.845908 179.750767,60.2684901 180.013078,61.0522445" id="Fill-269" transform="translate(178.599398, 61.528481) rotate(90.000000) translate(-178.599398, -61.528481) "></path>
|
||||
<path d="M180.013078,61.0522445 C180.275389,61.835999 179.854447,62.6853266 179.073735,62.9476189 C178.293023,63.2109521 177.448029,62.7894109 177.185718,62.0046155 C176.923407,61.220861 177.344349,60.3725743 178.125061,60.1092411 C178.905773,59.845908 179.750767,60.2684901 180.013078,61.0522445 L180.013078,61.0522445 Z" id="Stroke-271" stroke="#A3B1BF" stroke-width="0.81" transform="translate(178.599398, 61.528481) rotate(90.000000) translate(-178.599398, -61.528481) "></path>
|
||||
<path d="M183.247901,69.1646943 C183.510212,69.9484488 183.08927,70.7977764 182.308558,71.0600687 C181.527846,71.3234019 180.682852,70.9018607 180.420541,70.1170653 C180.15823,69.3333108 180.579172,68.4850241 181.359884,68.2216909 C182.140596,67.9583578 182.98559,68.3809399 183.247901,69.1646943" id="Fill-273" transform="translate(181.834221, 69.640931) rotate(90.000000) translate(-181.834221, -69.640931) "></path>
|
||||
<path d="M183.247901,69.1646943 C183.510212,69.9484488 183.08927,70.7977764 182.308558,71.0600687 C181.527846,71.3234019 180.682852,70.9018607 180.420541,70.1170653 C180.15823,69.3333108 180.579172,68.4850241 181.359884,68.2216909 C182.140596,67.9583578 182.98559,68.3809399 183.247901,69.1646943 L183.247901,69.1646943 Z" id="Stroke-275" stroke="#A3B1BF" stroke-width="0.81" transform="translate(181.834221, 69.640931) rotate(90.000000) translate(-181.834221, -69.640931) "></path>
|
||||
<path d="M185.674018,78.0883891 C185.936329,78.8721436 185.515387,79.7214712 184.734675,79.9837635 C183.953963,80.2470967 183.108969,79.8255554 182.846658,79.0407601 C182.584347,78.2570056 183.005289,77.4087189 183.786001,77.1453857 C184.566713,76.8820525 185.411707,77.3046346 185.674018,78.0883891" id="Fill-277" transform="translate(184.260338, 78.564625) rotate(90.000000) translate(-184.260338, -78.564625) "></path>
|
||||
<path d="M185.674018,78.0883891 C185.936329,78.8721436 185.515387,79.7214712 184.734675,79.9837635 C183.953963,80.2470967 183.108969,79.8255554 182.846658,79.0407601 C182.584347,78.2570056 183.005289,77.4087189 183.786001,77.1453857 C184.566713,76.8820525 185.411707,77.3046346 185.674018,78.0883891 L185.674018,78.0883891 Z" id="Stroke-279" stroke="#A3B1BF" stroke-width="0.81" transform="translate(184.260338, 78.564625) rotate(90.000000) translate(-184.260338, -78.564625) "></path>
|
||||
<path d="M168.691198,39.9598751 C168.953509,40.7436296 168.532567,41.5929571 167.751855,41.8552495 C166.971143,42.1185826 166.126149,41.6970414 165.863838,40.9122461 C165.601527,40.1284916 166.022469,39.2802048 166.803181,39.0168717 C167.583893,38.7535385 168.428887,39.1761206 168.691198,39.9598751" id="Fill-281" transform="translate(167.277518, 40.436111) rotate(90.000000) translate(-167.277518, -40.436111) "></path>
|
||||
<path d="M156.962155,41.8552495 C156.181443,42.1185826 155.336449,41.6970414 155.074139,40.9122461 C154.811828,40.1284916 155.232769,39.2802048 156.013481,39.0168717 C156.794193,38.7535385 157.639187,39.1761206 157.901498,39.9598751 C158.163809,40.7436296 157.742867,41.5929571 156.962155,41.8552495 Z" id="Stroke-283" stroke="#A3B1BF" stroke-width="0.81" transform="translate(156.487818, 40.436111) rotate(90.000000) translate(-156.487818, -40.436111) "></path>
|
||||
<path d="M171.117315,48.0723249 C171.379626,48.8560794 170.958684,49.7054069 170.177972,49.9676993 C169.39726,50.2310324 168.552266,49.8094912 168.289955,49.0246959 C168.027644,48.2409414 168.448586,47.3926546 169.229298,47.1293215 C170.01001,46.8659883 170.855004,47.2885704 171.117315,48.0723249" id="Fill-285" transform="translate(169.703635, 48.548561) rotate(90.000000) translate(-169.703635, -48.548561) "></path>
|
||||
<path d="M160.327615,48.0723249 C160.589926,48.8560794 160.168985,49.7054069 159.388273,49.9676993 C158.60756,50.2310324 157.762567,49.8094912 157.500256,49.0246959 C157.237945,48.2409414 157.658886,47.3926546 158.439598,47.1293215 C159.220311,46.8659883 160.065304,47.2885704 160.327615,48.0723249 L160.327615,48.0723249 Z" id="Stroke-287" stroke="#A3B1BF" stroke-width="0.81" transform="translate(158.913936, 48.548561) rotate(90.000000) translate(-158.913936, -48.548561) "></path>
|
||||
<path d="M174.352138,56.9960196 C174.614449,57.7797741 174.193507,58.6291017 173.412795,58.891394 C172.632083,59.1547272 171.787089,58.733186 171.524778,57.9483906 C171.262467,57.1646361 171.683409,56.3163494 172.464121,56.0530162 C173.244833,55.7896831 174.089827,56.2122652 174.352138,56.9960196" id="Fill-289" transform="translate(172.938458, 57.472256) rotate(90.000000) translate(-172.938458, -57.472256) "></path>
|
||||
<path d="M163.562438,56.9960196 C163.824749,57.7797741 163.403807,58.6291017 162.623095,58.891394 C161.842383,59.1547272 160.99739,58.733186 160.735079,57.9483906 C160.472768,57.1646361 160.893709,56.3163494 161.674421,56.0530162 C162.455133,55.7896831 163.300127,56.2122652 163.562438,56.9960196 L163.562438,56.9960196 Z" id="Stroke-291" stroke="#A3B1BF" stroke-width="0.81" transform="translate(162.148758, 57.472256) rotate(90.000000) translate(-162.148758, -57.472256) "></path>
|
||||
<path d="M166.265081,65.1084694 C166.527392,65.8922239 166.10645,66.7415515 165.325738,67.0038438 C164.545026,67.267177 163.700032,66.8456358 163.437721,66.0608404 C163.17541,65.2770859 163.596352,64.4287992 164.377064,64.165466 C165.157776,63.9021329 166.00277,64.324715 166.265081,65.1084694" id="Fill-293" transform="translate(164.851401, 65.584706) rotate(90.000000) translate(-164.851401, -65.584706) "></path>
|
||||
<path d="M166.265081,65.1084694 C166.527392,65.8922239 166.10645,66.7415515 165.325738,67.0038438 C164.545026,67.267177 163.700032,66.8456358 163.437721,66.0608404 C163.17541,65.2770859 163.596352,64.4287992 164.377064,64.165466 C165.157776,63.9021329 166.00277,64.324715 166.265081,65.1084694 L166.265081,65.1084694 Z" id="Stroke-295" stroke="#A3B1BF" stroke-width="0.81" transform="translate(164.851401, 65.584706) rotate(90.000000) translate(-164.851401, -65.584706) "></path>
|
||||
<path d="M169.499903,74.0321642 C169.762214,74.8159187 169.341273,75.6652463 168.560561,75.9275386 C167.779849,76.1908718 166.934855,75.7693305 166.672544,74.9845352 C166.410233,74.2007807 166.831175,73.352494 167.611887,73.0891608 C168.392599,72.8258276 169.237592,73.2484097 169.499903,74.0321642" id="Fill-297" transform="translate(168.086224, 74.508400) rotate(90.000000) translate(-168.086224, -74.508400) "></path>
|
||||
<path d="M169.499903,74.0321642 C169.762214,74.8159187 169.341273,75.6652463 168.560561,75.9275386 C167.779849,76.1908718 166.934855,75.7693305 166.672544,74.9845352 C166.410233,74.2007807 166.831175,73.352494 167.611887,73.0891608 C168.392599,72.8258276 169.237592,73.2484097 169.499903,74.0321642 L169.499903,74.0321642 Z" id="Stroke-299" stroke="#A3B1BF" stroke-width="0.81" transform="translate(168.086224, 74.508400) rotate(90.000000) translate(-168.086224, -74.508400) "></path>
|
||||
<path d="M172.734726,82.144614 C172.997037,82.9283685 172.576096,83.7776961 171.795384,84.0399884 C171.014671,84.3033216 170.169678,83.8817803 169.907367,83.096985 C169.645056,82.3132305 170.065997,81.4649438 170.84671,81.2016106 C171.627422,80.9382774 172.472415,81.3608595 172.734726,82.144614" id="Fill-301" transform="translate(171.321047, 82.620850) rotate(90.000000) translate(-171.321047, -82.620850) "></path>
|
||||
<path d="M172.734726,82.144614 C172.997037,82.9283685 172.576096,83.7776961 171.795384,84.0399884 C171.014671,84.3033216 170.169678,83.8817803 169.907367,83.096985 C169.645056,82.3132305 170.065997,81.4649438 170.84671,81.2016106 C171.627422,80.9382774 172.472415,81.3608595 172.734726,82.144614 L172.734726,82.144614 Z" id="Stroke-303" stroke="#A3B1BF" stroke-width="0.81" transform="translate(171.321047, 82.620850) rotate(90.000000) translate(-171.321047, -82.620850) "></path>
|
||||
<path d="M166.265081,41.582365 C166.527392,42.3661195 166.10645,43.2154471 165.325738,43.4777394 C164.545026,43.7410726 163.700032,43.3195314 163.437721,42.534736 C163.17541,41.7509815 163.596352,40.9026948 164.377064,40.6393616 C165.157776,40.3760284 166.00277,40.7986105 166.265081,41.582365" id="Fill-305" transform="translate(164.851401, 42.058601) rotate(90.000000) translate(-164.851401, -42.058601) "></path>
|
||||
<path d="M166.265081,41.582365 C166.527392,42.3661195 166.10645,43.2154471 165.325738,43.4777394 C164.545026,43.7410726 163.700032,43.3195314 163.437721,42.534736 C163.17541,41.7509815 163.596352,40.9026948 164.377064,40.6393616 C165.157776,40.3760284 166.00277,40.7986105 166.265081,41.582365 L166.265081,41.582365 Z" id="Stroke-307" stroke="#A3B1BF" stroke-width="0.81" transform="translate(164.851401, 42.058601) rotate(90.000000) translate(-164.851401, -42.058601) "></path>
|
||||
<path d="M169.499903,50.5060598 C169.762214,51.2898143 169.341273,52.1391419 168.560561,52.4014342 C167.779849,52.6647674 166.934855,52.2432261 166.672544,51.4584308 C166.410233,50.6746763 166.831175,49.8263896 167.611887,49.5630564 C168.392599,49.2997232 169.237592,49.7223053 169.499903,50.5060598" id="Fill-309" transform="translate(168.086224, 50.982296) rotate(90.000000) translate(-168.086224, -50.982296) "></path>
|
||||
<path d="M169.499903,50.5060598 C169.762214,51.2898143 169.341273,52.1391419 168.560561,52.4014342 C167.779849,52.6647674 166.934855,52.2432261 166.672544,51.4584308 C166.410233,50.6746763 166.831175,49.8263896 167.611887,49.5630564 C168.392599,49.2997232 169.237592,49.7223053 169.499903,50.5060598 L169.499903,50.5060598 Z" id="Stroke-311" stroke-opacity="0.85" stroke="#A3B1BF" stroke-width="0.81" transform="translate(168.086224, 50.982296) rotate(90.000000) translate(-168.086224, -50.982296) "></path>
|
||||
<path d="M171.926021,58.6185096 C172.188332,59.4022641 171.76739,60.2515917 170.986678,60.513884 C170.205966,60.7772172 169.360972,60.3556759 169.098661,59.5708806 C168.83635,58.7871261 169.257292,57.9388394 170.038004,57.6755062 C170.818716,57.412173 171.66371,57.8347551 171.926021,58.6185096" id="Fill-313" transform="translate(170.512341, 59.094746) rotate(90.000000) translate(-170.512341, -59.094746) "></path>
|
||||
<path d="M171.926021,58.6185096 C172.188332,59.4022641 171.76739,60.2515917 170.986678,60.513884 C170.205966,60.7772172 169.360972,60.3556759 169.098661,59.5708806 C168.83635,58.7871261 169.257292,57.9388394 170.038004,57.6755062 C170.818716,57.412173 171.66371,57.8347551 171.926021,58.6185096 L171.926021,58.6185096 Z" id="Stroke-315" stroke="#A3B1BF" stroke-width="0.81" transform="translate(170.512341, 59.094746) rotate(90.000000) translate(-170.512341, -59.094746) "></path>
|
||||
<path d="M175.160844,67.5422044 C175.423154,68.3259589 175.002213,69.1752864 174.221501,69.4375788 C173.440789,69.700912 172.595795,69.2793707 172.333484,68.4945754 C172.071173,67.7108209 172.492115,66.8625342 173.272827,66.599201 C174.053539,66.3358678 174.898533,66.7584499 175.160844,67.5422044" id="Fill-317" transform="translate(173.747164, 68.018441) rotate(90.000000) translate(-173.747164, -68.018441) "></path>
|
||||
<path d="M175.160844,67.5422044 C175.423154,68.3259589 175.002213,69.1752864 174.221501,69.4375788 C173.440789,69.700912 172.595795,69.2793707 172.333484,68.4945754 C172.071173,67.7108209 172.492115,66.8625342 173.272827,66.599201 C174.053539,66.3358678 174.898533,66.7584499 175.160844,67.5422044 L175.160844,67.5422044 Z" id="Stroke-319" stroke="#A3B1BF" stroke-width="0.81" transform="translate(173.747164, 68.018441) rotate(90.000000) translate(-173.747164, -68.018441) "></path>
|
||||
<path d="M177.586961,75.6546542 C177.849272,76.4384087 177.42833,77.2877362 176.647618,77.5500286 C175.866906,77.8133618 175.021912,77.3918205 174.759601,76.6070252 C174.49729,75.8232707 174.918232,74.974984 175.698944,74.7116508 C176.479656,74.4483176 177.32465,74.8708997 177.586961,75.6546542" id="Fill-321" transform="translate(176.173281, 76.130890) rotate(90.000000) translate(-176.173281, -76.130890) "></path>
|
||||
<path d="M177.586961,75.6546542 C177.849272,76.4384087 177.42833,77.2877362 176.647618,77.5500286 C175.866906,77.8133618 175.021912,77.3918205 174.759601,76.6070252 C174.49729,75.8232707 174.918232,74.974984 175.698944,74.7116508 C176.479656,74.4483176 177.32465,74.8708997 177.586961,75.6546542 L177.586961,75.6546542 Z" id="Stroke-323" stroke="#A3B1BF" stroke-width="0.81" transform="translate(176.173281, 76.130890) rotate(90.000000) translate(-176.173281, -76.130890) "></path>
|
||||
<path d="M180.821784,84.578349 C181.084095,85.3621035 180.663153,86.211431 179.882441,86.4737234 C179.101729,86.7370565 178.256735,86.3155153 177.994424,85.53072 C177.732113,84.7469655 178.153055,83.8986787 178.933767,83.6353456 C179.714479,83.3720124 180.559473,83.7945945 180.821784,84.578349" id="Fill-325" transform="translate(179.408104, 85.054585) rotate(90.000000) translate(-179.408104, -85.054585) "></path>
|
||||
<path d="M180.821784,84.578349 C181.084095,85.3621035 180.663153,86.211431 179.882441,86.4737234 C179.101729,86.7370565 178.256735,86.3155153 177.994424,85.53072 C177.732113,84.7469655 178.153055,83.8986787 178.933767,83.6353456 C179.714479,83.3720124 180.559473,83.7945945 180.821784,84.578349 L180.821784,84.578349 Z" id="Stroke-327" stroke="#A3B1BF" stroke-width="0.81" transform="translate(179.408104, 85.054585) rotate(90.000000) translate(-179.408104, -85.054585) "></path>
|
||||
<path d="M199.285547,130.323988 C200.045523,132.597188 198.826243,135.059822 196.56083,135.82276 C194.296454,136.585697 191.844417,135.361666 191.084441,133.087425 C190.323428,130.814225 191.543745,128.352632 193.808121,127.588654 C196.073533,126.825716 198.525571,128.050788 199.285547,130.323988" id="Fill-329" fill="#A3B1BF" transform="translate(195.184790, 131.705757) rotate(90.000000) translate(-195.184790, -131.705757) "></path>
|
||||
<polygon id="Stroke-333" stroke="#A3B1BF" stroke-width="0.81" transform="translate(194.281082, 12.765148) rotate(90.000000) translate(-194.281082, -12.765148) " points="192.77098 15.3911937 191.260359 12.7651478 192.77098 10.1391019 195.791185 10.1391019 197.301806 12.7651478 195.791185 15.3911937"></polygon>
|
||||
<polygon id="Fill-335" transform="translate(263.829774, 193.672778) rotate(90.000000) translate(-263.829774, -193.672778) " points="262.319672 196.298824 260.809051 193.672778 262.319672 191.046732 265.339877 191.046732 266.850498 193.672778 265.339877 196.298824"></polygon>
|
||||
<polygon id="Stroke-337" stroke="#A3B1BF" stroke-width="0.81" transform="translate(263.829774, 193.672778) rotate(90.000000) translate(-263.829774, -193.672778) " points="262.319672 196.298824 260.809051 193.672778 262.319672 191.046732 265.339877 191.046732 266.850498 193.672778 265.339877 196.298824"></polygon>
|
||||
<polygon id="Stroke-341" stroke="#A3B1BF" stroke-width="0.81" transform="translate(199.942022, 45.214947) rotate(90.000000) translate(-199.942022, -45.214947) " points="196.921299 45.214947 198.43192 42.588901 201.452125 42.588901 202.962746 45.214947 201.452125 47.8409929 198.43192 47.8409929"></polygon>
|
||||
<polygon id="Stroke-345" stroke="#A3B1BF" stroke-width="0.81" transform="translate(203.176845, 35.480007) rotate(90.000000) translate(-203.176845, -35.480007) " points="200.156122 35.4800072 201.666743 32.8539613 204.686948 32.8539613 206.197569 35.4800072 204.686948 38.1060531 201.666743 38.1060531"></polygon>
|
||||
<path d="M28.7090531,149.674699 L408.800743,149.674699" id="Path-13-Copy" stroke="#A3B1BF" stroke-width="2.43"></path>
|
||||
<path d="M126.73696,157.381526 C130.786107,157.381526 138.956903,157.381526 138.956903,157.381526 C138.956903,157.381526 146.694174,157.381526 150.585513,157.381526 C275.808174,157.381526 408.39639,157.381526 408.39639,157.381526 C408.39639,157.381526 348.147813,204.433735 274.15124,201.594378 C200.154666,198.75502 175.893495,186.586345 157.293263,179.67788 C138.693031,172.769415 101.923452,169.955823 76.4120034,175.634538 C50.9005548,181.313253 28.3047003,157.381526 28.3047003,157.381526 C28.3047003,157.381526 34.3629836,157.381526 126.73696,157.381526 Z" id="Path-22-Copy" fill-opacity="0.25" fill="#A3B1BF"></path>
|
||||
<g id="Group-2" transform="translate(0.000000, 75.851406)">
|
||||
<ellipse id="Oval-40-Copy-2" stroke="#A3B1BF" stroke-width="2.43" fill-opacity="0.25" fill="#A3B1BF" cx="35.5830518" cy="35.6947791" rx="35.5830518" ry="35.6947791"></ellipse>
|
||||
<ellipse id="Oval-40-Copy-3" fill="#F0F2F5" cx="35.8526204" cy="35.9651941" rx="30.4612489" ry="30.5568942"></ellipse>
|
||||
</g>
|
||||
<path d="M39.6265804,107.895582 L78.4444551,119.253012" id="Path-736" stroke="#A3B1BF" stroke-width="0.81"></path>
|
||||
<path d="M32.7525817,115.60241 L65.9095164,140.751004" id="Path-736-Copy" stroke="#A3B1BF" stroke-width="0.81" transform="translate(49.331049, 128.176707) scale(-1, -1) translate(-49.331049, -128.176707) "></path>
|
||||
<g id="Group" transform="translate(95.154052, 106.919777) rotate(19.000000) translate(-95.154052, -106.919777) translate(34.154052, 63.919777)" fill="#A3B1BF">
|
||||
<path d="M42.7522815,72.4570067 C42.7522815,75.8233475 45.3271005,78.562549 48.4926445,78.562549 C51.6578573,78.562549 54.2333386,75.8233475 54.2333386,72.4570067 C54.2333386,69.091018 51.6578573,66.3525208 48.4926445,66.3525208 C45.3271005,66.3525208 42.7522815,69.091018 42.7522815,72.4570067 M40.1907075,72.4570067 C40.1907075,67.5898976 43.9148573,63.6284609 48.4926445,63.6284609 C53.0707627,63.6284609 56.7949126,67.5898976 56.7949126,72.4570067 C56.7949126,77.3251722 53.0707627,81.2859046 48.4926445,81.2859046 C43.9148573,81.2859046 40.1907075,77.3251722 40.1907075,72.4570067 L54.193687,73.4098081" id="Fill-13" fill-opacity="0.4"></path>
|
||||
<path d="M37.9000472,72.2309321 C37.9000472,78.1565371 42.4331326,82.9775175 48.0049535,82.9775175 C53.5774367,82.9775175 58.110191,78.1565371 58.110191,72.2309321 C58.110191,66.3056792 53.5774367,61.485051 48.0049535,61.485051 C42.4331326,61.485051 37.9000472,66.3056792 37.9000472,72.2309321 M35.3384731,72.2309321 C35.3384731,64.8035024 41.0205583,58.760991 48.0049535,58.760991 C54.9893488,58.760991 60.6724273,64.8035024 60.6724273,72.2309321 C60.6724273,79.6587139 54.9893488,85.7019295 48.0049535,85.7019295 C41.0205583,85.7019295 35.3384731,79.6587139 35.3384731,72.2309321" id="Fill-15"></path>
|
||||
<path d="M1.80809546,66.1576486 C1.80809546,68.834124 3.79009311,71.0116629 6.22625634,71.0116629 C8.66270911,71.0116629 10.644562,68.834124 10.644562,66.1576486 C10.644562,63.4813322 8.66270911,61.3039523 6.22625634,61.3039523 C3.79009311,61.3039523 1.80809546,63.4813322 1.80809546,66.1576486 M0.688100292,66.1576486 C0.688100292,62.8028295 3.17247427,60.0735498 6.22625634,60.0735498 C9.2800384,60.0735498 11.7648467,62.8028295 11.7648467,66.1576486 C11.7648467,69.5126267 9.2800384,72.2422245 6.22625634,72.2422245 C3.17247427,72.2422245 0.688100292,69.5126267 0.688100292,66.1576486" id="Fill-15-Copy"></path>
|
||||
<path d="M8.98009502,66.0939913 L39.179583,29.1533303 L87.9014765,24.076001 L44.6752454,68.7902332 L45.5153066,69.7089343 L8.98009502,66.0939913 Z M5.34865982,69.3835683 L46.1480843,73.419304 C47.0103308,73.4270508 47.6235721,72.9654113 47.8811865,72.2953123 L49.8354794,74.4316711 L93.1120414,29.6649719 L108.025528,67.5588426 C108.413605,68.5455044 109.312607,69.1391917 110.258627,69.1391917 C110.569884,69.1391917 110.886107,69.0747523 111.192066,68.9391832 C112.424508,68.3905682 113.0053,66.8827574 112.490071,65.5728423 L88.7958421,5.36886461 L92.7040968,5.36886461 L92.7040968,12.726573 C92.7040968,13.562172 93.3408479,14.2400178 94.1272671,14.2400178 L108.786782,14.2400178 C109.171548,14.2400178 109.540751,14.0741657 109.809292,13.7794348 L117.408916,5.43506461 C117.934078,5.90550723 118.567187,6.70025945 118.772153,7.90031067 C119.120826,9.94441199 118.336394,13.6565422 112.619209,19.7367313 C112.062921,20.3272495 112.062921,21.2857411 112.619209,21.8769635 C112.896691,22.1727507 113.26159,22.3206444 113.625495,22.3206444 C113.989731,22.3206444 114.354298,22.1727507 114.63178,21.8769635 C119.954265,16.2168628 122.285045,11.3085547 121.560215,7.28796059 C120.892339,3.580408 117.884078,2.16415038 117.756265,2.10569718 C117.213553,1.85709502 116.581768,1.9916078 116.170513,2.44303552 L108.184137,11.2131281 L95.5507685,11.2131281 L95.5507685,5.36886461 L97.3534067,5.36886461 C98.6894914,5.36886461 99.7725975,4.21670276 99.7725975,2.7962196 C99.7725975,1.37538432 98.6894914,0.223222475 97.3534067,0.223222475 L85.1604334,0.223222475 C84.3508356,0.223222475 83.5948798,0.653874656 83.1465381,1.37045453 C82.6972031,2.08738654 82.6157466,2.99517176 82.9286587,3.78957186 L89.4140503,20.2684441 L40.3087153,25.3855639 L38.2463901,12.9619427 C37.9924181,11.9967607 37.0503708,11.4323 36.1411047,11.7044947 C35.232832,11.9752809 34.703365,12.9777884 34.9583303,13.9436747 L36.9981391,26.2845459 L4.21787189,66.3834403 C3.79767573,66.8968425 3.68310688,67.6183522 3.92184717,68.2504214 C4.1595941,68.883547 4.71058417,69.3198332 5.34865982,69.3835683 Z" id="Fill-17"></path>
|
||||
</g>
|
||||
<path d="M120.0928,133.044177 C120.0928,133.044177 117.26233,133.044177 117.26233,134.261044 C117.26233,135.477912 128.179857,144.401606 128.179857,144.401606 L120.0928,133.044177 Z" id="Path-731" fill="#A3B1BF"></path>
|
||||
<path d="M146.375736,133.044177 C146.375736,133.044177 149.206206,133.044177 149.206206,134.261044 C149.206206,135.477912 138.288678,144.401606 138.288678,144.401606 L146.375736,133.044177 Z" id="Path-731-Copy-2" fill="#A3B1BF"></path>
|
||||
<path d="M114.922075,137.687235 C114.922075,137.687235 112.297709,138.747548 112.753556,139.875807 C113.209402,141.004067 126.674832,145.188195 126.674832,145.188195 L114.922075,137.687235 Z" id="Path-731-Copy" fill="#A3B1BF"></path>
|
||||
<path d="M150.02854,138.516693 C150.02854,138.516693 152.652906,139.580123 152.198396,140.708383 C151.743886,141.836643 138.288257,146.008745 138.288257,146.008745 L150.02854,138.516693 Z" id="Path-731-Copy-3" fill="#A3B1BF"></path>
|
||||
<path d="M74.4009265,59.626506 C72.9743667,59.2687463 68.3698232,57.9570172 67.9312807,60.437751 C67.5752067,62.4519795 70.5119271,68.4526327 73.5922208,69.3614461 C80.4662194,71.3895585 88.1489236,68.5502009 95.0229222,70.5783133 C101.896921,72.6064258 101.500006,68.9632854 100.279509,67.7389559 C97.8533925,65.3052209 77.6357492,60.437751 74.4009265,59.626506 Z" id="Path-735" stroke="#A3B1BF" stroke-width="2.43"></path>
|
||||
<g id="Group-2-Copy" transform="translate(346.684026, 76.257028)">
|
||||
<ellipse id="Oval-40-Copy-2" stroke="#A3B1BF" stroke-width="2.43" fill="#DCE1E7" cx="35.5830518" cy="35.6947791" rx="35.5830518" ry="35.6947791"></ellipse>
|
||||
<ellipse id="Oval-40-Copy-3" fill="#F0F2F5" cx="35.8526204" cy="35.9651941" rx="30.4612489" ry="30.5568942"></ellipse>
|
||||
</g>
|
||||
<path d="M364.90109,93.2931727 C363.56683,94.0412049 361.930683,95.8872138 360.413184,99.4391645 C355.560949,110.796594 356.774008,120.937157 356.774008,120.937157 C356.774008,120.937157 358.391419,101.467276 364.861065,97.8166743" id="Path-738" fill="#A3B1BF"></path>
|
||||
<path d="M408.39639,103.839357 C407.06213,104.58739 405.425983,106.433399 403.908483,109.985349 C399.056249,121.342779 400.269308,131.483341 400.269308,131.483341 C400.269308,131.483341 401.886718,112.013461 408.356365,108.362859" id="Path-738-Copy" fill="#A3B1BF" transform="translate(404.265457, 117.661349) scale(-1, -1) translate(-404.265457, -117.661349) "></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 87 KiB |
BIN
public/static/admin/images/act.jpg
Normal file
After Width: | Height: | Size: 197 KiB |
BIN
public/static/admin/images/avatar.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
24
public/static/admin/images/background.svg
Normal file
@ -0,0 +1,24 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="100%" height="100%" viewBox="0 0 1400 800">
|
||||
|
||||
<rect x="1300" y="400" rx="40" ry="40" width="300" height="300" stroke="rgb(129, 201, 149)" fill="rgb(129, 201, 149)">
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 1450 550" to="360 1450 550" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
|
||||
<path d="M 100 350 A 150 150 0 1 1 400 350 Q400 370 380 370 L 250 370 L 120 370 Q100 370 100 350" stroke="rgb(253, 214, 99)" fill="rgb(253, 214, 99)">
|
||||
<animateMotion path="M 800 -200 L 800 -300 L 800 -200" dur="20s" begin="0s" repeatCount="indefinite"/>
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 210 530 ; -30 210 530 ; 0 210 530" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
|
||||
</path>
|
||||
|
||||
<circle cx="200" cy="150" r="20" stroke="#1a73e8" fill="#1a73e8">
|
||||
<animateMotion path="M 0 0 L 40 20 Z" dur="5s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
|
||||
<!-- 三角形 -->
|
||||
<path d="M 165 580 L 270 580 Q275 578 270 570 L 223 483 Q220 480 217 483 L 165 570 Q160 578 165 580" stroke="rgb(238, 103, 92)" fill="rgb(238, 103, 92)">
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 210 530" to="360 210 530" repeatCount="indefinite"/>
|
||||
</path>
|
||||
|
||||
<rect x="400" y="600" rx="40" ry="40" width="100" height="100" stroke="rgb(129, 201, 149)" fill="rgb(129, 201, 149)">
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-30 550 750" to="330 550 750" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/static/admin/images/captcha.gif
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
public/static/admin/images/document.jpg
Normal file
After Width: | Height: | Size: 296 KiB |
BIN
public/static/admin/images/logo.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
public/static/admin/images/show.png
Normal file
After Width: | Height: | Size: 55 KiB |