first commit

This commit is contained in:
675061370@qq.com
2024-04-04 21:28:09 +08:00
commit fe9661855e
4192 changed files with 618218 additions and 0 deletions
+162
View File
@@ -0,0 +1,162 @@
<?php
declare(strict_types=1);
namespace app\qfadmin;
use think\App;
use think\facade\View;
use app\model\Admin as AdminModel;
use app\model\Access as AccessModel;
use app\model\Auth as AuthModel;
use app\model\Node as NodeModel;
use app\model\Group as GroupModel;
use app\model\Conf as ConfModel;
/**
* 控制器基础类
*/
abstract class QfShop
{
/**
* Request实例
* @var \think\Request
*/
protected $request;
/**
* 应用实例
* @var \think\App
*/
protected $app;
protected $module;
protected $controller;
protected $action;
//模型
protected $AdminModel;
protected $accessModel;
protected $authModel;
protected $nodeModel;
protected $groupModel;
protected $confModel;
//主键key
protected $pk = '';
//表名称
protected $table = '';
//主键value
protected $pk_value = '';
/**
* 构造方法
* @access public
* @param App $app 应用对象
*/
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}
// 初始化
protected function initialize()
{
$this->module = "qfadmin";
$this->controller = $this->request->controller() ? $this->request->controller() : "Index";
$this->action = strtolower($this->request->action()) ? strtolower($this->request->action()) : "index";
View::assign('controller', strtolower($this->controller));
View::assign('action', strtolower($this->action));
$this->table = strtolower($this->controller);
$this->pk = $this->table . "_id";
$this->pk_value = input($this->pk);
$this->adminModel = new AdminModel();
$this->accessModel = new AccessModel();
$this->authModel = new AuthModel();
$this->nodeModel = new NodeModel();
$this->groupModel = new GroupModel();
$this->confModel = new ConfModel();
$configs = $this->confModel->select()->toArray();
$c = [];
foreach ($configs as $config) {
$c[$config['conf_key']] = $config['conf_value'];
}
config($c, 'yadmin');
}
/**
* 后台简单的身份判断
*
* @return void
*/
protected function access()
{
$callback = "/qfadmin";
if (strtolower($this->controller) != "index") {
$callback .= "/" . strtolower($this->controller);
}
if ($this->action != "index") {
$callback .= "/" . $this->action;
}
$access_token = cookie('access_token');
if (!$access_token) {
return redirect('/qfadmin/admin/login/?callback=' . urlencode($callback));
}
View::assign("access_token", $access_token);
$this->admin = $this->adminModel->getAdminByAccessToken($access_token);
if (!$this->admin) {
return redirect('/qfadmin/admin/login/?callback=' . urlencode($callback));
}
if ($this->admin['admin_status'] > 0) {
return $this->error("抱歉,你的帐号已被禁用,暂时无法登录系统!");
}
cookie("access_token", $access_token);
View::assign('adminInfo', $this->admin);
$this->group = $this->groupModel->where('group_id', $this->admin['admin_group'])->find();
if ($this->group) {
if ($this->group['group_id'] != 1 && $this->group['group_status'] == 1) {
return $this->error("抱歉,你所在的用户组已被禁用,暂时无法登录系统");
} else {
$menuList = $this->authModel->getAdminMenuListByAdminId($this->group['group_id']);
View::assign('menuList', $menuList);
$node = $this->nodeModel->where(['node_module' => $this->module, 'node_controller' => strtolower($this->controller), 'node_action' => $this->action])->find();
View::assign('node', $node);
if($node['node_pid']==0){
View::assign('menu', 0);
}else{
$res = $this->nodeModel->where('node_id',$node['node_pid'])->find();
View::assign('menu', $res['node_pid']);
}
$menuLists = [];
foreach ($menuList as $key => $value) {
if($value['node_id'] == $node['node_pid']){
$menuLists = $value['subList'];
}else{
foreach ($value['subList'] as $k => $v) {
if($v['node_id'] == $node['node_pid']){
$menuLists = $value['subList'];
}
}
}
}
View::assign('menuLists', $menuLists);
View::assign('action', $this->request->action());
}
} else {
return $this->error("抱歉,没有查到你的用户组信息,暂时无法登录系统");
}
}
protected function error($message)
{
echo $message;
die;
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace app\qfadmin\controller;
use app\qfadmin\QfShop;
use think\facade\View;
class Error extends QfShop
{
/**
* 监听所有请求 渲染对应控制器下方法的页面
*/
public function __call($method, $args)
{
// 判断是否是登录/注册/找回密码
// 否则进行accesss授权验证 如错误 直接返回
if (!(strtolower($this->controller) == "admin" && in_array(strtolower($this->action), ['login', 'resetpassword', 'reg']))) {
$error = $this->access();
if ($error) {
return $error;
}
}else{
cookie('access_token', null);
}
if (key_exists('callback', $args)) {
View::assign('callback', $args['callback']);
} else {
View::assign('callback', '/qfadmin');
}
View::assign('datas', $args);
return View::fetch();
}
}
+449
View File
@@ -0,0 +1,449 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-form :inline="true">
<el-form-item>
<el-button icon="el-icon-plus" size="small" @click="clickAdd" plain>添加</el-button>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-delete" size="small" @click="postMultDelete" plain>批量删除</el-button>
</el-form-item>
<div style="float:right">
<el-form-item>
<el-select placeholder="请选择状态" size="small" v-model="search.admin_status">
<el-option value="" label="全部用户">
</el-option>
<el-option value="0" label="正常用户">
</el-option>
<el-option value="1" label="禁用用户">
</el-option>
</el-select>
</el-form-item>
<el-form-item style="width:120px;">
<el-select placeholder="筛选类别" size="small" v-model="search.filter">
<el-option value="admin_id" label="用户ID">
</el-option>
<el-option value="admin_name" label="用户昵称">
</el-option>
<el-option value="admin_account" label="用户帐号">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input placeholder="输入关键词搜索" size="small" v-model="search.keyword"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="getList_search" plain>搜索</el-button>
</el-form-item>
</div>
</el-form>
<el-table :data="dataList.data" @selection-change="changeSelection" v-loading="loading">
<el-table-column type="selection" width="50">
</el-table-column>
<el-table-column prop="admin_id" label="ID" width="100">
</el-table-column>
<el-table-column prop="admin_account" label="帐号">
</el-table-column>
<el-table-column prop="admin_name" label="昵称">
</el-table-column>
<el-table-column prop="group_name" label="用户组">
</el-table-column>
<el-table-column prop="admin_ipreg" label="注册IP" width="150">
</el-table-column>
<el-table-column label="最后活跃" width="120">
<template slot-scope="scope">
{{time2string(scope.row.admin_updatetime)}}
</template>
</el-table-column>
<el-table-column label="注册时间" width="120">
<template slot-scope="scope">
{{time2string(scope.row.admin_createtime)}}
</template>
</el-table-column>
<el-table-column label="禁用" width="80">
<template slot-scope="scope">
<el-switch v-model="scope.row.admin_status==1?true:false" active-color="#ff4949"
@change="clickStatus(scope.row)">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="180">
<template slot-scope="scope">
<el-link type="primary" @click="clickEdit(scope.row)" :underline="false">编辑</el-link>&nbsp;
<el-link type="danger" @click="clickDelete(scope.row)" :underline="false">删除</el-link>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination @size-change="handleSizeChange" :page-sizes="[10, 20, 50, 100,200,500]" :page-size="10"
layout="total, sizes, prev, pager, next, jumper" background @current-change="changeCurrentPage"
:current-page="dataList.current_page" :page-count="dataList.last_page" :total="dataList.total">
</el-pagination>
</div>
<!-- 添加框 -->
<el-dialog title="添加用户" :visible.sync="dialogFormAdd" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formAdd" status-icon :rules="rules" ref="formAdd">
<el-form-item label="帐号" :label-width="formLabelWidth" prop="admin_account">
<el-input size="medium" autocomplete="off" v-model="formAdd.admin_account"></el-input>
</el-form-item>
<el-form-item label="密码" :label-width="formLabelWidth" prop="admin_password">
<el-input size="medium" show-password="true" autocomplete="off" v-model="formAdd.admin_password">
</el-input>
</el-form-item>
<el-form-item label="昵称" :label-width="formLabelWidth" prop="admin_name">
<el-input size="medium" autocomplete="off" v-model="formAdd.admin_name"></el-input>
</el-form-item>
<el-form-item label="邮箱" :label-width="formLabelWidth" prop="admin_email">
<el-input size="medium" autocomplete="off" v-model="formAdd.admin_email"></el-input>
</el-form-item>
<el-form-item label="身份证" :label-width="formLabelWidth" prop="admin_idcard">
<el-input size="medium" autocomplete="off" v-model="formAdd.admin_idcard"></el-input>
</el-form-item>
<el-form-item label="真实姓名" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formAdd.admin_truename"></el-input>
</el-form-item>
<el-form-item label="用户组" :label-width="formLabelWidth">
<el-select size="medium" placeholder="请选择用户组" v-model="formAdd.admin_group">
<el-option v-for="group_add in groupList" :value="group_add.group_id" :label="group_add.group_name">
</el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postAdd">确认添加</el-button>
</div>
</el-dialog>
<!-- 修改框 -->
<el-dialog title="修改用户" :visible.sync="dialogFormEdit" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formEdit" status-icon :rules="rules" ref="formEdit">
<el-form-item label="帐号" :label-width="formLabelWidth" prop="admin_account">
<el-input size="medium" autocomplete="off" v-model="formEdit.admin_account"></el-input>
</el-form-item>
<el-form-item label="密码" :label-width="formLabelWidth" prop="new_password">
<el-input size="medium" show-password="true" autocomplete="off" v-model="formEdit.new_password"
placeholder="不修改请留空">
</el-input>
</el-form-item>
<el-form-item label="昵称" :label-width="formLabelWidth" prop="admin_name">
<el-input size="medium" autocomplete="off" v-model="formEdit.admin_name"></el-input>
</el-form-item>
<el-form-item label="邮箱" :label-width="formLabelWidth" prop="admin_email">
<el-input size="medium" autocomplete="off" v-model="formEdit.admin_email"></el-input>
</el-form-item>
<el-form-item label="身份证" :label-width="formLabelWidth" prop="admin_idcard">
<el-input size="medium" autocomplete="off" v-model="formEdit.admin_idcard"></el-input>
</el-form-item>
<el-form-item label="真实姓名" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formEdit.admin_truename"></el-input>
</el-form-item>
<el-form-item label="用户组" :label-width="formLabelWidth">
<el-select size="medium" placeholder="请选择用户组" v-model="formEdit.admin_group">
<el-option v-for="group_edit in groupList" :value="group_edit.group_id"
:label="group_edit.group_name"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postEdit">确认修改</el-button>
</div>
</el-dialog>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
this.getList();
return {
search: {
admin_status: "",
keyword: "",
filter: "admin_id"
},
formLabelWidth: '80px',
dialogFormAdd: false,
dialogFormEdit: false,
loading: true,
dataList: [],
groupList: [],
selectList: [],
form: {
page: 1,
per_page: 10
},
formAdd: {
admin_group: 1
},
formEdit: {
admin_group: 1
},
rules: {
admin_account: [
{ required: true, message: '帐号必须填写', trigger: 'blur' },
],
admin_name: [
{ required: true, message: '昵称必须填写', trigger: 'blur' },
],
admin_password: [
{ required: true, message: '密码必须填写', trigger: 'blur' },
// { required: true, pattern: /^(?=.*[a-z])(?=.*\d).{6,16}$/, message: '密码必须包含字母和数字(6-16位)', trigger: 'blur' },
],
new_password: [
{ required: true, message: '密码必须填写', trigger: 'blur' },
// { pattern: /^(?=.*[a-z])(?=.*\d).{6,16}$/, message: '密码必须包含字母和数字(6-16位)', trigger: 'blur' },
],
admin_email: [
{ pattern: /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/, message: '邮箱格式不正确', trigger: 'blur' },
],
admin_idcard: [
{ pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, message: '身份证格式不正确', trigger: 'blur' },
],
}
}
},
methods: {
getList_search() {
this.form.page = 1;
this.getList();
},
time2string(timestamps) {
var now = new Date(timestamps * 1000),
y = now.getFullYear(),
m = now.getMonth() + 1,
d = now.getDate();
// return y + "-" + (m < 10 ? "0" + m : m) + "-" + (d < 10 ? "0" + d : d) + " " + now.toTimeString().substr(0, 8);
return (m < 10 ? "0" + m : m) + "-" + (d < 10 ? "0" + d : d) + " " + now.toTimeString().substr(0, 5);
},
handleSizeChange(per_page) {
this.form.per_page = per_page;
this.getList();
},
postMultDelete() {
var that = this;
if (that.selectList.length == 0) {
that.$message.error('未选择任何用户!');
return;
}
this.$confirm('即将删除选中的用户, 是否确认?', '批量删除', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/admin/delete', Object.assign({}, PostBase, {
admin_id: that.selectList.join(",")
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
changeSelection(list) {
var that = this;
that.selectList = [];
for (var index in list) {
that.selectList.push(list[index].admin_id);
}
},
postEdit() {
var that = this;
that.$refs['formEdit'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
axios.post('/admin/admin/update', Object.assign({}, PostBase, that.formEdit))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormEdit = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
postAdd() {
var that = this;
that.$refs['formAdd'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
axios.post('/admin/admin/add', Object.assign({}, PostBase, that.formAdd))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormAdd = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
clickAdd() {
var that = this;
that.formAdd = {
admin_group: 1
};
axios.post('/admin/group/getList', Object.assign({}, PostBase))
.then(function (response) {
that.groupList = response.data.data;
if (response.data.code == CODE_SUCCESS) {
that.dialogFormAdd = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickDelete(row) {
var that = this;
this.$confirm('即将删除这个用户, 是否确认?', '删除提醒', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/admin/delete', Object.assign({}, PostBase, {
admin_id: row.admin_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
clickStatus(row) {
var that = this;
axios.post(row.admin_status ? '/admin/admin/enable' : '/admin/admin/disable', Object.assign({}, PostBase, {
admin_id: row.admin_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickEdit(row) {
var that = this;
that.formEdit = row;
axios.post('/admin/group/getList', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.groupList = response.data.data;
axios.post('/admin/admin/detail', Object.assign({}, PostBase, {
admin_id: row.admin_id
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.formEdit = response.data.data;
that.dialogFormEdit = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/admin/getList', Object.assign({}, PostBase, that.form, that.search))
.then(function (response) {
that.loading = false;
if (response.data.code == CODE_SUCCESS) {
that.dataList = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
console.log(error);
});
},
}
})
</script>
</html>
+263
View File
@@ -0,0 +1,263 @@
<!DOCTYPE html>
<html>
<head>
<title>后台管理系统</title>
<meta charset="UTF-8">
<!-- import CSS -->
<link rel="stylesheet" href="/static/admin/css/element.css">
<link rel="stylesheet" href="/static/admin/css/YAdmin.css">
<style>
.login-container {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: space-around;
min-width: 1280px;
min-height: 800px;
background: url(/static/admin/images/login_bg.jpg) no-repeat;
background-size: 100% 100%;
background-color: #ffffff;
}
.login-container:before{
content: " ";
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: url(/static/admin/images/login_bg_bottom.png) no-repeat;
background-size: 100% 100%;
height: 170px;
}
.login-box img{
width: 720px;
}
.login-border {
display: flex;
justify-content: center;
flex-direction: column;
position: relative;
top: -30px;
right: 100px;
}
.login-main{
background-color: #ffffff;
padding: 35px 45px 15px 45px;
border-radius: 6px;
}
.login-main .vadmin{
font-size: 16px;
font-weight: bold;
color: #6881ec;
line-height: 20px;
padding-bottom: 6px;
}
.login-logo {
margin: 0 0 20px;
}
.login-logo p {
color: #ffffff;
font-size: 25px;
font-weight: bold;
}
.login-submit {
margin-top: 10px;
width: 100%;
}
.login-form {
margin: 10px 0;
}
.login-form .el-form-item__content {
width: 270px;
}
.login-form .el-form-item {
margin-bottom: 26px;
}
.login-form .el-input input {
text-indent: 5px;
border-color: #DCDCDC;
border-radius: 3px;
border: none;
border-bottom: 1px solid #eee;
}
.login-form .el-input .el-input__prefix i {
padding: 0 5px;
font-size: 16px !important;
}
.login-code {
display: flex;
align-items: center;
justify-content: space-around;
margin-left: 10px;
cursor: pointer;
}
.login-code-img {
margin-top: 1px;
width: 100px;
height: 38px;
}
</style>
</head>
<body>
<div id="app" v-cloak>
<div id="app" v-cloak>
<div class="login-container">
<div class="login-box">
<img src="/static/admin/images/login_bg_box.png">
</div>
<div class="login-border">
<div class="login-logo">
<p>后台登录</p>
</div>
<div class="login-main">
<p class="vadmin">管理员登录</p>
<el-form class="login-form" status-icon :rules="loginRules" ref="loginForm" :model="loginForm"
label-width="0" size="default">
<el-form-item prop="admin_account">
<el-input @keyup.enter.native="handleLogin()" v-model="loginForm.admin_account"
auto-complete="off" placeholder="请输入账号">
<i slot="prefix" class="el-icon-user"></i>
</el-input>
</el-form-item>
<el-form-item prop="admin_password">
<el-input @keyup.enter.native="handleLogin()" v-model="loginForm.admin_password" show-password
auto-complete="off" placeholder="请输入密码">
<i slot="prefix" class="el-icon-key"></i>
</el-input>
</el-form-item>
<el-form-item v-if="codeUrl" prop="admin_code">
<el-row :span="34">
<el-col :span="14">
<el-input @keyup.enter.native="handleLogin()" v-model="loginForm.admin_code"
auto-complete="off" placeholder="请输入验证码">
<i slot="prefix" class="el-icon-mobile"></i>
</el-input>
</el-col>
<el-col :span="10">
<div class="login-code">
<img :src="codeUrl" class="login-code-img" @click="getCaptcha" alt="" />
</div>
</el-col>
</el-row>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="loading" @click.native.prevent="handleLogin"
class="login-submit">登 录
</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</div>
</div>
</body>
<script src="/static/admin/js/vue-2.6.10.min.js"></script>
<script src="/static/admin/js/axios.min.js"></script>
<script src="/static/admin/js/element.js"></script>
<script src="/static/admin/js/YAdmin.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
codeUrl: '',
codeToken: '',
loading: false,
loginForm: {
admin_account: '',
admin_password: '',
admin_code: '',
},
loginRules: {
admin_account: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
admin_password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, message: '密码长度最少为6位', trigger: 'blur' }
],
admin_code: [
{ required: true, message: '请输入验证码', trigger: 'blur' },
{ min: 4, max: 4, message: '验证码长度为4位', trigger: 'blur' }
]
}
}
},
created() {
this.getCaptcha();
},
methods: {
/**
* @description 正式登录
*/
handleLogin() {
var that = this;
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true
this.loginForm.token = this.codeToken
axios.post('/admin/admin/login', Object.assign({}, PostBase, this.loginForm))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: '登录成功,正在跳转中',
type: 'success'
});
setTimeout(function () {
location.replace('/qfadmin');
}, 1000)
} else {
that.$message.error(response.data.message);
that.loading = false
that.getCaptcha();
}
})
.catch(function (error) {
that.$message.error('登录失败,服务器内部错误');
that.loading = false
});
}
})
},
onSubmit() {
var that = this;
axios.post('/admin/admin/login', Object.assign({}, PostBase, this.form))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: '登录成功,正在跳转中',
type: 'success'
});
setTimeout(function () {
location.replace('{$callback}');
}, 1000)
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('登录失败,服务器内部错误');
});
},
getCaptcha() {
var that = this;
axios.post('/admin/system/getCaptcha', Object.assign({}, PostBase))
.then(function (res) {
that.codeUrl = res.data.data.img
that.codeToken = res.data.data.token
})
.catch(function (error) {
that.$message.error('获取失败');
});
},
}
})
</script>
</html>
@@ -0,0 +1,94 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span>修改我的密码</span>
</div>
<div class="text item">
<el-form :model="form" status-icon :rules="rules" ref="form" label-width="80px">
<el-form-item label="原密码" prop="oldPassword">
<el-input show-password v-model="form.oldPassword" placeholder="请输入原密码"></el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input show-password password="password" v-model="form.newPassword" placeholder="请输入新密码">
</el-input>
</el-form-item>
<el-form-item label="新密码" prop="checkPassword">
<el-input show-password v-model="form.checkPassword" placeholder="请确认新密码"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">修改密码</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
return {
form: {
oldPassword: "",
newPassword: "",
checkPassword: "",
},
rules: {
oldPassword: [
{ required: true, message: '原密码必须输入', trigger: 'blur' },
],
newPassword: [
{ required: true, pattern: /^(?=.*[a-z])(?=.*\d).{6,16}$/, message: '密码必须包含大小写字母和数字(6-16位)', trigger: 'blur' },
],
checkPassword: [
{ required: true, pattern: /^(?=.*[a-z])(?=.*\d).{6,16}$/, message: '密码必须包含大小写字母和数字(6-16位)', trigger: 'blur' },
],
}
}
},
methods: {
onSubmit() {
var that = this;
that.$refs['form'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
if (that.form.newPassword != that.form.checkPassword) {
that.$message.error('两次密码输入不一致,请确认');
return;
}
axios.post('/admin/admin/motifypassword', Object.assign({}, PostBase, {
oldPassword: that.form.oldPassword,
newPassword: that.form.newPassword,
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
setTimeout(function () {
location.href = "/qfadmin";
}, 2000);
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
}
});
</script>
</html>
+103
View File
@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span>修改我的资料</span>
</div>
<div class="text item">
<el-form :model="form" status-icon :rules="rules" ref="form" label-width="80px">
<el-form-item label="昵称" prop="admin_name">
<el-input v-model="form.admin_name" placeholder="请输入你的昵称"></el-input>
</el-form-item>
<el-form-item label="姓名" prop="admin_truename">
<el-input v-model="form.admin_truename" placeholder="请输入你的真实姓名"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="admin_email">
<el-input v-model="form.admin_email" placeholder="请输入你的邮箱"></el-input>
</el-form-item>
<el-form-item label="身份证" prop="admin_idcard">
<el-input v-model="form.admin_idcard" placeholder="请输入你的身份证"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">更新资料</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
this.getData();
return {
form: {
},
rules: {
admin_name: [
{ required: true, message: '昵称必须填写', trigger: 'blur' },
],
admin_email: [
{ pattern: /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/, message: '邮箱格式不正确', trigger: 'blur' },
],
admin_idcard: [
{ pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, message: '身份证格式不正确', trigger: 'blur' },
],
}
}
},
methods: {
getData() {
var that = this;
axios.post('/admin/admin/getmyinfo', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.form = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
onSubmit() {
var that = this;
that.$refs['form'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
if (that.form.newPassword != that.form.checkPassword) {
that.$message.error('两次密码输入不一致,请确认');
return;
}
axios.post('/admin/admin/updateMyInfo', Object.assign({}, PostBase, that.form))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
}
});
</script>
</html>
+214
View File
@@ -0,0 +1,214 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-form :inline="true">
<el-form-item>
<el-upload class="upload-demo" action="/admin/attach/uploadImage" :on-success="handleUploadSuccess"
:file-list="fileList" :show-file-list="false" :before-upload="beforeUpload" :data="postData"
v-loading.fullscreen.lock="fullscreenLoading">
<el-button size="small" type="primary">上传图片</el-button>
</el-upload>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-delete" size="small" @click="postMultDelete" plain>批量删除</el-button>
</el-form-item>
</el-form>
<el-table :data="dataList.data" @selection-change="changeSelection" v-loading="loading">
<el-table-column type="selection" width="50">
</el-table-column>
<el-table-column prop="attach_id" label="ID" width="60">
</el-table-column>
<el-table-column label="文件预览" width="120">
<template slot-scope="scope">
<div style="display: flex;align-items: center;">
<el-link :href="scope.row.attach_path" :underline="false" target="_blank">
<el-image style="width: 80px; height: 80px;flex:none;margin-right: 10px;background-color: #f8f8f9;border-radius: 6px;"
fit="contain" :src="scope.row.attach_path">
</el-image>
</el-link>
</div>
</template>
</el-table-column>
<el-table-column prop="attach_name" label="文件名称">
</el-table-column>
<el-table-column prop="attach_size" label="附件大小" width="100">
</el-table-column>
<el-table-column label="附件类型" width="100">
<template slot-scope="scope">
<el-tag size="medium" type="warning">{{scope.row.attach_type.toUpperCase()}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template slot-scope="scope">
<el-link type="danger" @click="clickDelete(scope.row)" :underline="false">删除</el-link>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination @size-change="handleSizeChange" :page-sizes="[10, 20, 50, 100,200,500]" :page-size="10"
layout="total, sizes, prev, pager, next, jumper" background @current-change="changeCurrentPage"
:current-page="dataList.current_page" :page-count="dataList.last_page" :total="dataList.total">
</el-pagination>
</div>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
this.getList();
return {
fullscreenLoading: false,
search: {
keyword: "",
filter: "attach_phone"
},
loading: true,
dataList: [],
selectList: [],
fileList: [],
form: {
page: 1,
per_page: 10,
},
postData: PostBase,
}
},
methods: {
handleUploadSuccess(res, file) {
this.fullscreenLoading = false;
if (res.code == CODE_SUCCESS) {
this.$message({
message: res.message,
type: 'success'
});
this.getList();
} else {
this.$message.error(res.message);
}
},
beforeUpload(file) {
const isImage = file.type === 'image/jpeg' || file.type === 'image/png';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isImage) {
this.$message.error('上传图片只能是 JPG/PNG 格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
this.fullscreenLoading = true;
return isImage && isLt2M;
},
handleSizeChange(per_page) {
this.form.per_page = per_page;
this.getList();
},
time2string(timestamps, formatStr = 'MM-dd hh:mm') {
var now = new Date(timestamps * 1000),
y = now.getFullYear(),
m = now.getMonth() + 1,
d = now.getDate();
return y + "-" + (m < 10 ? "0" + m : m) + "-" + (d < 10 ? "0" + d : d) + " " + now.toTimeString().substr(0, 8);
},
postMultDelete() {
var that = this;
if (that.selectList.length == 0) {
that.$message.error('未选择任何附件!');
return;
}
this.$confirm('即将删除选中的附件, 是否确认?', '批量删除', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/attach/delete', Object.assign({}, PostBase, {
attach_id: that.selectList.join(",")
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => { });
},
changeSelection(list) {
var that = this;
that.selectList = [];
for (var index in list) {
that.selectList.push(list[index].attach_id);
}
},
clickAdd() {
var that = this;
that.formAdd = {};
that.dialogFormAdd = true;
},
clickDelete(row) {
var that = this;
this.$confirm('即将删除这个附件, 是否确认?', '删除提醒', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/attach/delete', Object.assign({}, PostBase, {
attach_id: row.attach_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => { });
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/attach/getList', Object.assign({}, PostBase, that.form, that.search))
.then(function (response) {
that.loading = false;
if (response.data.code == CODE_SUCCESS) {
that.dataList = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
console.log(error);
});
}
}
})
</script>
</html>
+19
View File
@@ -0,0 +1,19 @@
</el-main>
</el-container>
</el-container>
<Uploads ref="upload"></Uploads>
<Goodslists ref="goodslist"></Goodslists>
</div>
</body>
{include file="component/view"/}
<script src="/static/admin/js/vue-2.6.10.min.js"></script>
<script src="/static/admin/js/axios.min.js"></script>
<script src="/static/admin/js/element.js"></script>
<script src="/static/admin/js/YAdmin.js"></script>
<script src="/static/admin/js/SkuForm.umd.js"></script>
<script src="/static/admin/UEditor/vue-ueditor-wrap.min.js"></script>
<script src="/static/admin/UEditor/ueditor.config.js"></script>
<script src="/static/admin/UEditor/ueditor.all.js"></script>
<script src="/static/admin/js/component.js"></script>
<script src="/static/admin/js/Sortable.min.js"></script>
<script src="/static/admin/js/vuedraggable.umd.min.js"></script>
+67
View File
@@ -0,0 +1,67 @@
<meta charset="UTF-8">
<!-- import CSS -->
<link rel="stylesheet" href="/static/admin/css/element.css">
<link rel="stylesheet" href="/static/admin/css/YAdmin.css">
</head>
<body>
<div id="app" v-cloak>
<el-container>
<el-header>
<el-col style="width: auto;">
<el-menu class="el-menu-vertical" text-color="#333333" :default-active="'{if condition="$node.node_pid"}{$node.node_pid}{else}{$node.node_id}{/if}'" unique-opened
style="border:none;" mode="horizontal" active-text-color="#333333">
{volist name="menuList" id="item"}
{if condition="count($item.subList)>0"}
{if condition="count($item.subList[0]['subList'])>0"}
<el-menu-item index="{$item.node_id}"
onclick="location.href='/{$item['subList'][0]['subList'][0]['node_module']}/{$item['subList'][0]['subList'][0]['node_controller']}/{$item['subList'][0]['subList'][0]['node_action']}';"
{if
condition="$menu==$item.node_id"
}class="is-active" {/if}>
<i class="{$item.node_icon}"></i> {$item.node_title}
</el-menu-item>
{else}
<el-menu-item index="{$item.node_id}"
onclick="location.href='/{$item['subList'][0]['node_module']}/{$item['subList'][0]['node_controller']}/{$item['subList'][0]['node_action']}';" {if
condition="$menu==$item.node_id"
}class="is-active" {/if}>
<i class="{$item.node_icon}"></i> {$item.node_title}
</el-menu-item>
{/if}
{else}
{if condition="count($item.subList)>0 || $item.node_controller=='index'"}
<el-menu-item index="{$item.node_id}"
onclick="location.href='/{$item.node_module}/{$item.node_controller}/{$item.node_action}';" {if
condition="$menu==$item.node_id"
}class="is-active" {/if}>
<i class="{$item.node_icon}"></i> {$item.node_title}
</el-menu-item>
{/if}
{/if}
{/volist}
</el-menu>
</el-col>
<el-col style="width: 240px;float: right;">
<span class="topArea">
<el-link :underline="false" class="el-icon-full-screen menuicon" onclick="requestFullScreen()"></el-link>
<!-- <el-link :underline="false" class="el-icon-brush menuicon"></el-link> -->
<el-dropdown>
<el-link :underline="false">&nbsp;{$adminInfo['admin_name']}<i class="el-icon-arrow-down"></i></el-link>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item onclick="location.href='/qfadmin/admin/updatemyinfo';">修改资料
</el-dropdown-item>
<el-dropdown-item onclick="location.href='/qfadmin/admin/motifypassword';">修改密码
</el-dropdown-item>
<el-dropdown-item onclick="location.href='/qfadmin/system/clean';">清除缓存
</el-dropdown-item>
<el-dropdown-item onclick="logout()">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
</el-col>
</el-header>
<el-container class="body">
{include file="common/menu"/}
<el-main>
@@ -0,0 +1,47 @@
<meta charset="UTF-8">
<!-- import CSS -->
<link rel="stylesheet" href="/static/admin/css/element.css">
<link rel="stylesheet" href="/static/admin/css/YAdmin.css">
</head>
<body>
<div id="app" v-cloak>
<el-container>
<el-header>
<el-col style="width: auto;">
<el-menu class="el-menu-vertical" text-color="#333333" unique-opened
style="border:none;" mode="horizontal" active-text-color="#333333">
<el-menu-item onclick="location.href='./index.html?meeting_id={$datas.meeting_id??''}'" {if
condition="$action=='index'"
}class="is-active" {/if}>
<i class="el-icon-user-solid"></i> 客户管理
</el-menu-item>
<el-menu-item onclick="location.href='./team.html?meeting_id={$datas.meeting_id??''}'" {if
condition="$action=='team'"
}class="is-active" {/if}>
<i class="el-icon-s-custom"></i> 团队管理
</el-menu-item>
<el-menu-item onclick="location.href='./valetor.html?meeting_id={$datas.meeting_id??''}'" {if
condition="$action=='valetor'"
}class="is-active" {/if}>
<i class="el-icon-s-help"></i> 会务人员管理
</el-menu-item>
</el-menu>
</el-col>
<el-col style="width: 240px;float: right;">
<span class="topArea">
<el-link :underline="false" class="el-icon-full-screen menuicon" onclick="requestFullScreen()"></el-link>
<!-- <el-link :underline="false" class="el-icon-brush menuicon"></el-link> -->
<el-dropdown>
<el-link :underline="false">&nbsp;{$adminInfo['admin_name']}<i class="el-icon-arrow-down"></i></el-link>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item onclick="logout()">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
</el-col>
</el-header>
<el-container class="body">
{include file="common/menu"/}
<el-main>
+44
View File
@@ -0,0 +1,44 @@
{if condition="$menuLists"}
<el-aside width="160px">
<a class="titlehome" href="/qfadmin" style="display: block;height: 62px;line-height: 62px;text-align: center;"><img src="/static/admin/images/logo.png" width="40px" style="vertical-align: middle;" /></a>
<el-menu class="el-menu-vertical-demo" text-color="#333333" default-active="'{$node.node_pid}-{$node.node_id}'" :collapse="false" :default-openeds="['{$node.node_pid}']">
{volist name="menuLists" id="item"}
{if condition="count($item.subList)>0"}
<el-submenu index="{$item.node_id}">
<template slot="title">
<i {if condition='$item.node_icon'}class="{$item.node_icon}"{else}class="el-icon-menu"{/if}></i> {$item.node_title}
</template>
{volist name="$item.subList" id="subItem"}
<el-menu-item onclick="location.href='/{$subItem.node_module}/{$subItem.node_controller}/{$subItem.node_action}';"
index="{$item.node_id}-{$subItem.node_id}" {if
condition="$subItem.node_controller==strtolower($controller) && $subItem.node_action==strtolower($action)"
}class="is-active" {/if}>{$subItem.node_title}</el-menu-item>
{/volist}
</el-submenu>
{else}
{if condition="$item.node_controller=='' && $item.node_action==''"}
<el-menu-item index="{$item.node_id}" onclick="testalert('暂无该功能')">
<i {if condition='$item.node_icon' }class="{$item.node_icon}" {else}class="el-icon-menu" {/if}></i>
{$item.node_title}
</el-menu-item>
{else}
<el-menu-item index="{$item.node_id}"
onclick="location.href='/{$item.node_module}/{$item.node_controller}/{$item.node_action}';" {if
condition="$item.node_controller==strtolower($controller) && $item.node_action==strtolower($action)"
}class="is-active" {/if}>
<i {if condition='$item.node_icon' }class="{$item.node_icon}" {else}class="el-icon-menu" {/if}></i>
{$item.node_title}
</el-menu-item>
{/if}
{/if}
{/volist}
<div style="height: 120px;"></div>
</el-menu>
<div class="version">资源管理系统<br> Version 1.0.0</div>
</el-aside>
{else}
<div style="position: absolute;top: -72px;left: 0;width: 160px;background-color: #ffffff;box-shadow: 0 0 12px 0 rgb(47 75 168 / 6%);border-radius: 12px;">
<a class="title" href="/admin" style="display: block;height: 62px;line-height: 62px;text-align: center;"><img
src="/static/admin/images/logo.png" width="40px" style="vertical-align: middle;" /></a>
</div>
{/if}
+152
View File
@@ -0,0 +1,152 @@
<template id="Upload">
<el-dialog title="图片库" :visible.sync="visible" :modal-append-to-body='false' append-to-body :close-on-click-modal="false"
width="725px">
<div class="upload-boxs">
<el-upload class="upload-right" action="/admin/attach/uploadImage" :on-success="handleUploadSuccess"
:file-list="fileList" :show-file-list="false" :before-upload="beforeUpload" :data="postData"
v-loading.fullscreen.lock="fullscreenLoading">
<el-button size="small" type="primary" icon="el-icon-upload">上传图片</el-button>
</el-upload>
</div>
<ul class="storage-list">
<li :class="item.select?'active':''" v-for="(item, index) in dataList.data" :key="index" @click="select(index)">
<el-image fit="contain" :src="item.attach_path"></el-image>
<p>{{item.attach_name}}</p>
</li>
</ul>
<p v-if="dataList.data&&dataList.data.length==0" style="text-align: center;">暂无资源</p>
<el-pagination @current-change="changeCurrentPage" layout="prev, pager, next" :current-page="dataList.current_page"
:page-count="dataList.last_page" hide-on-single-page background>
</el-pagination>
<div slot="footer" class="dialog-footer">
<div style="float: left; font-size: 13px;">
<span v-if="multiple">
当前已选 <span style="color: #F56C6C;">{{selectList.length+selected_num}}</span> 个,最多允许选择 <span
style="color: #F56C6C;">{{total_num}}</span> 个资源
</span>
<span v-else>当前已选 <span style="color: #F56C6C;">{{selectList.length}}</span> 个资源</span>
</div>
<el-button @click="visible = false" size="small">取消</el-button>
<el-button type="primary" @click="save" size="small">确定</el-button>
</div>
</el-dialog>
</template>
<template id="Single">
<div class="slectimg" v-if="multiple">
<block v-if="value.length>0">
<draggable v-model="value" chosenClass="chosen" forceFallback="true" animation="600" @start="onStart"
@end="onEnd">
<transition-group>
<div class="imgs" v-for="(v, s) in value" :key="s" style="cursor: all-scroll;">
<el-image fit="contain" :src="v" :preview-src-list="value" :z-index="s"></el-image>
<!-- <el-image fit="contain" :src="v" ></el-image> -->
<i class="close el-icon-error" @click="deles(s)"></i>
</div>
</transition-group>
</draggable>
</block>
<div class="noimg" @click="selectimg()">
<i class="el-icon-plus"></i>
</div>
</div>
<div class="slectimg" v-else>
<div class="imgs" v-if="value.length>0">
<el-image fit="contain" :src="value" :preview-src-list="[value]"></el-image>
<i class="close el-icon-error" @click="deles()"></i>
</div>
<div class="noimg" v-else @click="selectimg()">
<i class="el-icon-plus"></i>
</div>
</div>
</template>
<template id="Ueditor">
<Ueditors v-model="value" ref="Ueditor" :config="config"></Ueditors>
</template>
<template id="skuforms">
<div>
<div style="padding-bottom: 10px;">
<el-input style="width: 120px;" v-if="inputVisible" v-model="inputValue" ref="saveTagInput" size="small"
@keyup.enter.native="handleInputConfirm" placeholder="回车确定">
</el-input>
<el-button v-else class="button-new-tag" size="small" @click="showInput" style="width: 120px;">+添加规格组</el-button>
</div>
<sku-form :source-attribute="sourceAttribute" :attribute.sync="attribute" :structure="structure" :sku.sync="sku"
ref="skuForm"></sku-form>
</div>
</template>
<template id="Goodslist">
<el-dialog title="商品库" :before-close="handleClose" :visible.sync="visible" :modal-append-to-body='false' append-to-body
:close-on-click-modal="false" width="900px">
<el-form :inline="true">
<div style="float:right">
<el-form-item style="width:100px; margin-bottom: 0;">
<el-cascader v-model="search.classify" placeholder="商品分类" :options="categoryList" :props="cascaderProps"
style="width: 100%;" filterable clearable size="small" :show-all-levels="false">
</el-cascader>
</el-form-item>
<el-form-item style="margin-bottom: 0;">
<el-input placeholder="输入商品名称搜索" size="small" v-model="search.keyword" @keyup.enter.native="getList_search"
clearable @clear="getList_search"></el-input>
</el-form-item>
<el-form-item style="margin-bottom: 0;">
<el-button type="primary" icon="el-icon-search" size="small" @click="getList_search" plain>搜索
</el-button>
<el-button icon="el-icon-refresh-left" size="small" @click="getList_search(0)" plain>重置</el-button>
</el-form-item>
</div>
</el-form>
<el-table :data="dataList.data" ref="multipleTable" @selection-change="changeSelection" row-key="goods_id" reserve-selection="true" style="min-height: 425px;" v-loading="loading">
<el-table-column align="center" type="selection" reserve-selection="true" width="55"></el-table-column>
<el-table-column label="商品" prop="goods_id" min-width="380">
<template slot-scope="scope">
<el-image class="goods-image" style="width: 50px;height: 50px;" :src="scope.row.picture[0]" :preview-src-list="[scope.row.picture[0]]"
fit="contain" lazy></el-image>
<div class="goods-info cs-ml">
<p class="action" style="overflow:hidden;text-overflow:ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;">
<span :title="scope.row.goods_name" class="link">{{scope.row.goods_name}}</span>
</p>
</div>
</template>
</el-table-column>
<el-table-column label="本店价" prop="goods_price">
<template slot-scope="scope">
<div class="action">
<span class="goods-shop-price">{{scope.row.goods_price}}</span>
</div>
</template>
</el-table-column>
<el-table-column label="库存" prop="stock_total">
<template slot-scope="scope">
<div class="action">
<span>{{scope.row.stock_total}}</span>
</div>
</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<p style="padding-bottom: 10px;">
<el-pagination hide-on-single-page="true" layout="prev, pager, next" background :current-page="form.page" @current-change="changeCurrentPage" :page-size="5" :total="dataList.total">
</el-pagination>
</p>
<p>
<el-button @click="cancels" size="small">取消</el-button>
<el-button type="primary" @click="save" size="small">确定</el-button>
</p>
</div>
</el-dialog>
</template>
+186
View File
@@ -0,0 +1,186 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-card class="box-card" shadow="never">
<el-tabs v-model="activeName">
<el-tab-pane :label="item.name" :name="item.val" v-for="(item, index) in tabname" :key="index" v-if="item.show">
<div class="base_form" style="padding-right: 220px;">
<el-form ref="form" label-width="220px">
<block v-for="(items, indexs) in form" :key="indexs">
<el-form-item :label="items.conf_title?items.conf_title:items.conf_key" v-if="items.conf_type==item.val">
<block v-if="items.conf_spec==1">
<el-input type="textarea" :rows="4" v-model="items.conf_value"></el-input>
</block>
<block v-else-if="items.conf_spec==2">
<el-radio v-model="items.conf_value" v-for="(val, key) in items.conf_content" :key="key" :label="val.value">{{val.name}}</el-radio>
</block>
<block v-else-if="items.conf_spec==3">
<el-checkbox-group v-model="items.conf_value">
<el-checkbox v-for="(val, key) in items.conf_content" :key="key" :label="val.value">{{val.name}}</el-checkbox>
</el-checkbox-group>
</block>
<block v-else-if="items.conf_spec==4">
<Single v-model="items.conf_value"/>
</block>
<block v-else-if="items.conf_spec==5">
<Single v-model="items.conf_value" multiple="true" :selected_num="items.conf_value.length"/>
</block>
<block v-else-if="items.conf_spec==6">
<Ueditor v-model="items.conf_value"></Ueditor>
</block>
<block v-else>
<el-input v-model="items.conf_value"></el-input>
</block>
<span class="f_tips" v-html="items.conf_desc"><span v-if="items.conf_spec==5"> 最多上传10张</span></span>
</el-form-item>
</block>
<el-form-item>
<el-button type="primary" @click="onSubmit(item.val)">保存配置</el-button>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
</el-tabs>
</el-card>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
this.getData();
return {
form: [],
activeName: "0",
tabname: [
{
name: '基础设置',
val: '0',
show: false,
},
{
name: '微信设置',
val: '8',
show: false,
},
{
name: '交易设置',
val: '10',
show: false,
},
{
name: '售后设置',
val: '11',
show: false,
},
{
name: '上传配置',
val: '2',
show: false,
},
{
name: '短信配置',
val: '3',
show: false,
},
{
name: '物流配置',
val: '9',
show: false,
},
{
name: '其他配置',
val: '4',
show: false,
},
],
}
},
methods: {
getData() {
var that = this;
axios.post('/admin/conf/getBaseConfig', Object.assign({}, PostBase))
.then(function (res) {
if (res.data.code == 200) {
for (let item of res.data.data) {
if (item.conf_spec == 2) {
for (let i = 0; i < item.conf_content.length; i++) {
let d = item.conf_content[i].split("=>");
item.conf_content[i] = {
name: d[0].toString(),
value: d[1].toString()
}
}
}else if(item.conf_spec==3){
for (let i = 0; i < item.conf_content.length; i++) {
let d = item.conf_content[i].split("=>");
item.conf_content[i] = {
name: d[0].toString(),
value: d[1].toString()
}
}
if(item.conf_value){
item.conf_value = item.conf_value.split(",");
}else{
item.conf_value = []
}
}else if (item.conf_spec == 5) {
if(item.conf_value){
item.conf_value = item.conf_value.split(",");
for (let i = 0; i < item.conf_value.length; i++) {
if (!item.conf_value[i]) {
item.conf_value.splice(i, 1);
}
}
} else {
item.conf_value = []
}
}
for (let i = 0; i < that.tabname.length; i++) {
if(that.tabname[i].val == item.conf_type){
that.tabname[i].show = true
}
}
}
that.form = res.data.data;
} else {
that.$message.error(res.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
onSubmit(index) {
var that = this;
var postData = {};
for (var i = 0; i < that.form.length; i++) {
if(that.form[i].conf_type == index){
postData[that.form[i].conf_key] = that.form[i].conf_value;
}
}
axios.post('/admin/conf/updateBaseConfig', Object.assign({}, PostBase, postData))
.then(function (res) {
if (res.data.code == 200) {
that.$message({
message: res.data.message,
type: 'success'
});
} else {
that.$message.error(res.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
}
})
</script>
</html>
+467
View File
@@ -0,0 +1,467 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-form :inline="true">
<el-form-item>
<el-button icon="el-icon-plus" size="small" @click="clickAdd" plain>添加</el-button>
</el-form-item>
<div style="float:right">
<el-form-item style="width:120px;">
<el-select placeholder="筛选类别" size="small" v-model="search.filter">
<el-option value="conf_id" label="参数ID">
</el-option>
<el-option value="conf_title" label="参数名称">
</el-option>
<el-option value="conf_key" label="参数字段">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input placeholder="输入关键词搜索" size="small" v-model="search.keyword"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="getList_search" plain>搜索</el-button>
</el-form-item>
</div>
</el-form>
<el-table :data="dataList.data" @selection-change="changeSelection" v-loading="loading">
<el-table-column prop="conf_id" label="ID" width="60">
</el-table-column>
<el-table-column prop="conf_type" label="所属分类" width="150">
<template slot-scope="scope">
<el-tag size="small" type="success" v-if="scope.row.conf_type==1">店铺设置</el-tag>
<el-tag size="small" type="warning" v-else-if="scope.row.conf_type==2">上传配置</el-tag>
<el-tag size="small" type="info" v-else-if="scope.row.conf_type==3">短信配置</el-tag>
<el-tag size="small" type="danger" v-else-if="scope.row.conf_type==4">其他配置</el-tag>
<el-tag size="small" type="success" v-else-if="scope.row.conf_type==5">微信支付配置</el-tag>
<el-tag size="small" type="warning" v-else-if="scope.row.conf_type==6">支付宝支付配置</el-tag>
<el-tag size="small" type="success" v-else-if="scope.row.conf_type==7">微信小程序配置</el-tag>
<el-tag size="small" type="danger" v-else-if="scope.row.conf_type==8">微信公众号配置</el-tag>
<el-tag size="small" type="danger" v-else-if="scope.row.conf_type==9">物流配置</el-tag>
<el-tag size="small" type="danger" v-else-if="scope.row.conf_type==10">交易设置</el-tag>
<el-tag size="small" type="danger" v-else-if="scope.row.conf_type==11">售后设置</el-tag>
<el-tag size="small" v-else>基础设置</el-tag>
</template>
</el-table-column>
<el-table-column prop="conf_title" label="参数名称">
</el-table-column>
<el-table-column prop="conf_desc" label="参数描述">
</el-table-column>
<el-table-column prop="conf_key" label="参数字段">
<template slot-scope="scope">
<el-tooltip class="item" effect="dark" :content="scope.row.conf_title" placement="top">
<el-link>{{scope.row.conf_key}}</el-link>
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="conf_sort" label="排序" width="90">
</el-table-column>
<el-table-column label="操作" width="180">
<template slot-scope="scope">
<el-link type="primary" @click="clickEdit(scope.row)" :underline="false">编辑</el-link>&nbsp;
<el-link type="danger" @click="clickDelete(scope.row)" :underline="false" v-if="scope.row.conf_system==0">删除</el-link>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination @size-change="handleSizeChange" :page-sizes="[10, 20, 50, 100,200,500]" :page-size="10"
layout="total, sizes, prev, pager, next, jumper" background @current-change="changeCurrentPage"
:current-page="dataList.current_page" :page-count="dataList.last_page" :total="dataList.total">
</el-pagination>
</div>
<!-- 添加框 -->
<el-dialog title="添加配置" :visible.sync="dialogFormAdd" width="800px" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formAdd" status-icon :rules="rules" ref="formAdd">
<el-form-item label="所属分类" :label-width="formLabelWidth" prop="conf_type">
<el-select v-model="formAdd.conf_type" placeholder="请选择所属分类" size="medium">
<el-option label="基础设置" value="0"></el-option>
<el-option label="店铺设置" value="1"></el-option>
<el-option label="上传配置" value="2"></el-option>
<el-option label="短信配置" value="3"></el-option>
<el-option label="其他配置" value="4"></el-option>
<el-option label="微信支付配置" value="5"></el-option>
<el-option label="支付宝支付配置" value="6"></el-option>
<el-option label="微信小程序配置" value="7"></el-option>
<el-option label="微信公众号配置" value="8"></el-option>
<el-option label="物流配置" value="9"></el-option>
<el-option label="交易设置" value="10"></el-option>
<el-option label="售后设置" value="11"></el-option>
</el-select>
</el-form-item>
<el-form-item label="参数名称" :label-width="formLabelWidth" prop="conf_title">
<el-input size="medium" autocomplete="off" v-model="formAdd.conf_title"></el-input>
<span style="color: #999;">参数名称,如:网站LOGO</span>
</el-form-item>
<el-form-item label="参数字段" :label-width="formLabelWidth" prop="conf_key">
<el-input size="medium" autocomplete="off" v-model="formAdd.conf_key"></el-input>
<span style="color: #999;">参数字段,如:logo</span>
</el-form-item>
<el-form-item label="参数描述" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formAdd.conf_desc"></el-input>
<span style="color: #999;">参数描述,如:建议尺寸: 300*300</span>
</el-form-item>
<el-form-item label="字段类型" :label-width="formLabelWidth">
<el-radio-group v-model="formAdd.conf_spec" size="small">
<el-radio-button label="0">文本框</el-radio-button>
<el-radio-button label="1">多行文本框</el-radio-button>
<el-radio-button label="2">单选框</el-radio-button>
<el-radio-button label="3">多选框</el-radio-button>
<el-radio-button label="4">单图</el-radio-button>
<el-radio-button label="5">多图</el-radio-button>
<el-radio-button label="6">富文本</el-radio-button>
</el-radio-group>
<el-input v-if="formAdd.conf_spec==2 || formAdd.conf_spec==3" type="textarea" v-model="formAdd.conf_content"
:rows="4" placeholder="参数方式例如:&#10;开启=>1&#10;关闭=>0" style="margin-top: 10px;"></el-input>
</el-form-item>
<el-form-item label="显示隐藏" :label-width="formLabelWidth">
<el-switch size="medium" v-model="formAdd.conf_status"></el-switch>
</el-form-item>
<el-form-item label="排序" :label-width="formLabelWidth">
<el-input-number v-model="formAdd.conf_sort" :min="0" :max="999" size="medium" style="width: 120px;" controls-position="right" />
</el-form-item>
<el-form-item label="系统参数" :label-width="formLabelWidth">
<el-switch size="medium" v-model="formAdd.conf_system"></el-switch>
<div style="color: #999;">开启后,添加的参数将无法删除</div>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postAdd">确认添加</el-button>
</div>
</el-dialog>
<!-- 修改框 -->
<el-dialog title="修改配置" :visible.sync="dialogFormEdit" width="800px" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formEdit" status-icon :rules="rules" ref="formEdit">
<el-form-item label="所属分类" :label-width="formLabelWidth" prop="conf_type">
<el-select v-model="formEdit.conf_type" placeholder="请选择所属分类" size="medium">
<el-option label="基础设置" value="0"></el-option>
<el-option label="店铺设置" value="1"></el-option>
<el-option label="上传配置" value="2"></el-option>
<el-option label="短信配置" value="3"></el-option>
<el-option label="其他配置" value="4"></el-option>
<el-option label="微信支付配置" value="5"></el-option>
<el-option label="支付宝支付配置" value="6"></el-option>
<el-option label="微信小程序配置" value="7"></el-option>
<el-option label="微信公众号配置" value="8"></el-option>
<el-option label="物流配置" value="9"></el-option>
<el-option label="交易设置" value="10"></el-option>
<el-option label="售后设置" value="11"></el-option>
</el-select>
</el-form-item>
<el-form-item label="参数名称" :label-width="formLabelWidth" prop="conf_title">
<el-input size="medium" autocomplete="off" v-model="formEdit.conf_title"></el-input>
<span style="color: #999;">参数名称,如:网站LOGO</span>
</el-form-item>
<el-form-item label="参数字段" :label-width="formLabelWidth" prop="conf_key">
<el-input size="medium" autocomplete="off" v-model="formEdit.conf_key"></el-input>
<span style="color: #6881ec;">参数字段,切勿随意修改</span>
</el-form-item>
<el-form-item label="参数描述" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formEdit.conf_desc"></el-input>
<span style="color: #999;">参数描述,如:建议尺寸: 300*300</span>
</el-form-item>
<el-form-item label="字段类型" :label-width="formLabelWidth">
<el-radio-group v-model="formEdit.conf_spec" size="small">
<el-radio-button label="0">文本框</el-radio-button>
<el-radio-button label="1">多行文本框</el-radio-button>
<el-radio-button label="2">单选框</el-radio-button>
<el-radio-button label="3">多选框</el-radio-button>
<el-radio-button label="4">单图</el-radio-button>
<el-radio-button label="5">多图</el-radio-button>
<el-radio-button label="6">富文本</el-radio-button>
</el-radio-group>
<el-input v-if="formEdit.conf_spec==2 || formEdit.conf_spec==3" type="textarea" v-model="formEdit.conf_content" :rows="4" placeholder="参数方式例如:&#10;开启=>1&#10;关闭=>0" style="margin-top: 10px;"></el-input>
</el-form-item>
<el-form-item label="显示隐藏" :label-width="formLabelWidth">
<el-switch size="medium" v-model="formEdit.conf_status"></el-switch>
</el-form-item>
<el-form-item label="排序" :label-width="formLabelWidth">
<el-input-number v-model="formEdit.conf_sort" :min="0" :max="999" size="medium" style="width: 120px;"
controls-position="right" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postEdit">确认修改</el-button>
</div>
</el-dialog>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
this.getList();
return {
search: {
keyword: "",
filter: "conf_id"
},
formLabelWidth: '80px',
dialogFormAdd: false,
dialogFormEdit: false,
loading: true,
dataList: [],
selectList: [],
form: {
page: 1,
per_page: 10
},
formAdd: {
conf_status: true,
conf_spec: 0,
conf_sort: 0,
},
formEdit: {},
rules: {
conf_title: [
{ required: true, message: '参数名称必须填写', trigger: 'blur' },
],
conf_key: [
{ required: true, message: '参数字段必须填写', trigger: 'blur' },
],
conf_type: [
{ required: true, message: '所属分类必须填写', trigger: 'blur' },
],
}
}
},
methods: {
getList_search() {
this.form.page = 1;
this.getList();
},
handleSizeChange(per_page) {
this.form.per_page = per_page;
this.getList();
},
postMultDelete() {
var that = this;
if (that.selectList.length == 0) {
that.$message.error('未选择任何配置!');
return;
}
this.$confirm('即将删除选中的配置, 是否确认?', '批量删除', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/conf/delete', Object.assign({}, PostBase, {
conf_id: that.selectList.join(",")
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
changeSelection(list) {
var that = this;
that.selectList = [];
for (var index in list) {
that.selectList.push(list[index].conf_id);
}
},
postEdit() {
var that = this;
that.$refs['formEdit'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
axios.post('/admin/conf/update', Object.assign({}, PostBase, that.formEdit))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormEdit = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
postAdd() {
var that = this;
that.$refs['formAdd'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
axios.post('/admin/conf/add', Object.assign({}, PostBase, that.formAdd))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormAdd = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
clickAdd() {
var that = this;
that.formAdd = {
conf_status: true,
conf_spec: 0,
conf_sort: 0,
};
axios.post('/admin/conf/getList', Object.assign({}, PostBase))
.then(function (response) {
that.groupList = response.data.data;
if (response.data.code == CODE_SUCCESS) {
that.dialogFormAdd = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickDelete(row) {
var that = this;
this.$confirm('即将删除这个配置, 是否确认?', '删除提醒', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/conf/delete', Object.assign({}, PostBase, {
conf_id: row.conf_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
clickStatus(row) {
var that = this;
axios.post(row.conf_status ? '/admin/conf/enable' : '/admin/conf/disable', Object.assign({}, PostBase, {
conf_id: row.conf_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickEdit(row) {
var that = this;
that.formEdit = row;
axios.post('/admin/conf/getList', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.groupList = response.data.data;
axios.post('/admin/conf/detail', Object.assign({}, PostBase, {
conf_id: row.conf_id
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
response.data.data.conf_status = response.data.data.conf_status?true:false;
response.data.data.conf_type = response.data.data.conf_type.toString();
that.formEdit = response.data.data;
that.dialogFormEdit = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/conf/getList', Object.assign({}, PostBase, that.form, that.search))
.then(function (response) {
that.loading = false;
if (response.data.code == CODE_SUCCESS) {
that.dataList = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
console.log(error);
});
}
}
})
</script>
</html>
+408
View File
@@ -0,0 +1,408 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-form :inline="true">
<el-form-item>
<el-button icon="el-icon-plus" size="small" @click="clickAdd" plain>添加</el-button>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-delete" size="small" @click="postMultDelete" plain>批量删除</el-button>
</el-form-item>
</el-form>
<el-table :data="dataList" @selection-change="changeSelection" v-loading="loading">
<el-table-column type="selection" width="50">
</el-table-column>
<el-table-column prop="group_id" label="组ID" width="100">
</el-table-column>
<el-table-column prop="group_name" label="组名称" width="200">
</el-table-column>
<el-table-column prop="group_desc" label="组描述">
</el-table-column>
</el-table-column>
<el-table-column label="禁用" width="80">
<template slot-scope="scope">
<el-switch v-model="scope.row.group_status==1?true:false" active-color="#ff4949"
@change="clickStatus(scope.row)">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-link type="primary" @click="clickEdit(scope.row)" :underline="false">编辑</el-link>&nbsp;
<el-link type="primary" @click="clickAuth(scope.row)" :underline="false">授权</el-link>&nbsp;
<el-link type="danger" @click="clickDelete(scope.row)" :underline="false">删除</el-link>
</template>
</el-table-column>
</el-table>
<!-- 添加框 -->
<el-dialog title="添加用户组" :visible.sync="dialogFormAdd" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formAdd" status-icon :rules="rules" ref="formAdd">
<el-form-item label="组名称" :label-width="formLabelWidth" prop="group_name">
<el-input size="medium" autocomplete="off" v-model="formAdd.group_name"></el-input>
</el-form-item>
<el-form-item label="组描述" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formAdd.group_desc"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postAdd">确认添加</el-button>
</div>
</el-dialog>
<!-- 修改框 -->
<el-dialog title="修改用户组" :visible.sync="dialogFormEdit" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formEdit" status-icon :rules="rules" ref="formEdit">
<el-form-item label="组名称" :label-width="formLabelWidth" prop="group_name">
<el-input size="medium" autocomplete="off" v-model="formEdit.group_name"></el-input>
</el-form-item>
<el-form-item label="组描述" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formEdit.group_desc"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postEdit">确认修改</el-button>
</div>
</el-dialog>
<!-- 授权框 -->
<el-dialog class="pub_dialog" title="用户组授权" :visible.sync="dialogFormAuth" :modal-append-to-body='false' append-to-body
width="60%" :close-on-click-modal='false'>
<div style="padding: 10px 30px;">
<el-tree :data="nodeList" @check="currentChecked" show-checkbox node-key="node_id" :props="defaultProps" :default-checked-keys="defaultkeys"></el-tree>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postAuth">确认授权</el-button>
</div>
</el-dialog>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
this.getList();
return {
checkAll: false,
search: {
group_status: "",
keyword: "",
filter: "group_id"
},
formLabelWidth: '80px',
dialogFormAdd: false,
dialogFormEdit: false,
dialogFormAuth: false,
loading: true,
dataList: [],
groupList: [],
selectList: [],
selectNodeList: [],
selectedGroupId: 0,
nodeList: [],
defaultProps: {
children: 'sub',
label: 'node_title'
},
defaultkeys: [],
form: {
page: 1
},
formAdd: {},
formEdit: {},
rules: {
group_name: [
{ required: true, message: '组名称必须填写', trigger: 'blur' },
],
}
}
},
methods: {
postMultDelete() {
var that = this;
if (that.selectList.length == 0) {
that.$message.error('未选择任何用户!');
return;
}
this.$confirm('即将删除选中的用户, 是否确认?', '批量删除', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/group/delete', Object.assign({}, PostBase, {
group_id: that.selectList.join(",")
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
changeSelection(list) {
var that = this;
that.selectList = [];
for (var index in list) {
that.selectList.push(list[index].group_id);
}
},
postAuth() {
var that = this;
axios.post('/admin/group/authorize', Object.assign({}, PostBase, {
node_ids: that.selectNodeList.join(','),
group_id: that.selectedGroupId
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormAuth = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
postEdit() {
var that = this;
that.$refs['formEdit'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
axios.post('/admin/group/update', Object.assign({}, PostBase, that.formEdit))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormEdit = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
postAdd() {
var that = this;
that.$refs['formAdd'].validate((valid) => {
if (!valid) {
that.$message.error('仔细检查检查,是不是有个地方写得不对?');
return;
}
axios.post('/admin/group/add', Object.assign({}, PostBase, that.formAdd))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormAdd = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
});
},
clickAdd() {
var that = this;
that.formAdd = {};
axios.post('/admin/group/getList', Object.assign({}, PostBase))
.then(function (response) {
that.groupList = response.data.data;
if (response.data.code == CODE_SUCCESS) {
that.dialogFormAdd = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickDelete(row) {
var that = this;
this.$confirm('即将删除这个用户, 是否确认?', '删除提醒', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/group/delete', Object.assign({}, PostBase, {
group_id: row.group_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
clickStatus(row) {
var that = this;
axios.post(row.group_status ? '/admin/group/enable' : '/admin/group/disable', Object.assign({}, PostBase, {
group_id: row.group_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickAuth(row) {
var that = this;
that.selectNodeList = [];
that.selectedGroupId = row.group_id;
axios.post('/admin/node/getList', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.nodeList = response.data.data.data;
that.dialogFormAuth = true;
that.getAuthList(row);
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
getAuthList(row) {
var that = this;
that.defaultkeys = [];
axios.post('/admin/group/getAuthorize', Object.assign({}, PostBase, {
group_id: row.group_id
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.defaultkeys = [];
for (var i in response.data.data) {
that.defaultkeys.push(response.data.data[i].auth_node);
}
that.dialogFormAuth = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('设置选中状态失败');
});
},
currentChecked(nodeObj, SelectedObj) {
this.selectNodeList = SelectedObj.checkedKeys
},
clickEdit(row) {
var that = this;
that.formEdit = row;
axios.post('/admin/group/getList', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.groupList = response.data.data;
axios.post('/admin/group/detail', Object.assign({}, PostBase, {
group_id: row.group_id
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.formEdit = response.data.data;
that.dialogFormEdit = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/group/getList', Object.assign({}, PostBase, that.form, that.search))
.then(function (response) {
that.loading = false;
if (response.data.code == CODE_SUCCESS) {
that.dataList = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
console.log(error);
});
}
}
})
</script>
</html>
+28
View File
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html>
<head>
<title>后台管理系统</title>
{include file="common/header"/}
<div class="homecontainer" style="height: 100%;display: flex;align-items: center;justify-content: center;">
<div>
<img src="/static/admin/images/logo@2x.png" alt="">
<p style="color: #999999;">@资源管理系统</p>
</div>
</div>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
return {
data: {}
}
},
methods: {
}
});
</script>
</html>
+462
View File
@@ -0,0 +1,462 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-form :inline="true">
<el-form-item>
<el-button icon="el-icon-plus" size="small" @click="clickAdd" plain>添加</el-button>
</el-form-item>
<div style="float:right">
<el-form-item style="width:120px;">
<el-select placeholder="显示状态" size="small" v-model="search.node_show">
<el-option value="" label="全部状态">
</el-option>
<el-option v-for="show in showList" :value="show.show_id" :label="show.show_title">
</el-option>
</el-select>
</el-form-item>
<el-form-item style="width:120px;">
<el-select placeholder="筛选类别" size="small" v-model="search.filter">
<el-option value="node_id" label="节点ID">
</el-option>
<el-option value="node_title" label="节点名称">
</el-option>
<el-option value="node_desc" label="节点描述">
</el-option>
<el-option value="node_module" label="模块">
</el-option>
<el-option value="node_controller" label="控制器">
</el-option>
<el-option value="node_action" label="方法">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input placeholder="输入关键词搜索" size="small" v-model="search.keyword"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="getList_search" plain>搜索</el-button>
</el-form-item>
</div>
</el-form>
<el-table :data="dataList" default-expand-all @selection-change="changeSelection" v-loading="loading" row-key="node_id" :tree-props="{children: 'sub', hasChildren: 'hasChildren'}">
<el-table-column prop="node_id" label="ID" width="120">
</el-table-column>
<el-table-column prop="node_title" label="节点名称">
<template slot-scope="scope">
<i :class="scope.row.node_icon" style="font-size: 16px;"></i>&nbsp;{{scope.row.node_title}}
</template>
</el-table-column>
<el-table-column label="节点地址">
<template slot-scope="scope">
{{scope.row.node_module+"/"+scope.row.node_controller+"/"+scope.row.node_action}}
</template>
</el-table-column>
<el-table-column prop="node_order" label="排序" width="">
</el-table-column>
<el-table-column label="隐藏" width="80">
<template slot-scope="scope">
<el-switch v-model="scope.row.node_show==0?true:false" active-color="#ff4949"
@change="clickShow(scope.row)">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="180">
<template slot-scope="scope">
<el-link type="primary" @click="clickEdit(scope.row)" :underline="false">编辑</el-link>&nbsp;
<el-link type="danger" @click="clickDelete(scope.row)" :underline="false">删除</el-link>
</template>
</el-table-column>
</el-table>
<!-- 添加框 -->
<el-dialog title="添加节点" :visible.sync="dialogFormAdd" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formAdd" status-icon :rules="rules" ref="formAdd">
<el-form-item label="节点名称" :label-width="formLabelWidth" prop="node_title">
<el-input size="medium" autocomplete="off" v-model="formAdd.node_title"></el-input>
</el-form-item>
<el-form-item label="节点描述" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formAdd.node_desc"></el-input>
</el-form-item>
<el-form-item label="节点图标" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formAdd.node_icon"></el-input>
</el-form-item>
<el-form-item label="所属模块" :label-width="formLabelWidth" prop="node_module">
<el-input size="medium" autocomplete="off" v-model="formAdd.node_module"></el-input>
</el-form-item>
<el-form-item label="控制器" :label-width="formLabelWidth" prop="node_controller">
<el-input size="medium" autocomplete="off" v-model="formAdd.node_controller"></el-input>
</el-form-item>
<el-form-item label="方法" :label-width="formLabelWidth" prop="node_action">
<el-input size="medium" autocomplete="off" v-model="formAdd.node_action"></el-input>
</el-form-item>
<el-form-item label="是否显示" :label-width="formLabelWidth">
<el-select placeholder="请选择是否显示到菜单" size="small" v-model="formAdd.node_show">
<el-option v-for="show in showList" :value="show.show_id" :label="show.show_title">
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="父级菜单" :label-width="formLabelWidth">
<el-select placeholder="请选择菜单" size="small" v-model="formAdd.node_pid">
<el-option v-for="parent in parentList" :value="parent.node_id" :label="parent.node_title">
</el-option>
</el-select>
</el-form-item> -->
<el-form-item label="父级菜单" :label-width="formLabelWidth">
<el-cascader :options="parentList" v-model="formAdd.node_pid" :props="props" :show-all-levels="false">
</el-cascader>
</el-form-item>
<el-form-item label="显示顺序" :label-width="formLabelWidth" prop="node_order">
<el-input size="medium" autocomplete="off" v-model="formAdd.node_order"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postAdd">确认添加</el-button>
</div>
</el-dialog>
<!-- 修改框 -->
<el-dialog title="修改节点" :visible.sync="dialogFormEdit" :modal-append-to-body='false' append-to-body :close-on-click-modal='false'>
<el-form :model="formEdit" status-icon :rules="rules" ref="formEdit">
<el-form-item label="节点名称" :label-width="formLabelWidth" prop="node_title">
<el-input size="medium" autocomplete="off" v-model="formEdit.node_title"></el-input>
</el-form-item>
<el-form-item label="节点描述" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formEdit.node_desc"></el-input>
</el-form-item>
<el-form-item label="节点图标" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" v-model="formEdit.node_icon"></el-input>
</el-form-item>
<el-form-item label="所属模块" :label-width="formLabelWidth" prop="node_module">
<el-input size="medium" autocomplete="off" v-model="formEdit.node_module"></el-input>
</el-form-item>
<el-form-item label="控制器" :label-width="formLabelWidth" prop="node_controller">
<el-input size="medium" autocomplete="off" v-model="formEdit.node_controller"></el-input>
</el-form-item>
<el-form-item label="方法" :label-width="formLabelWidth" prop="node_action">
<el-input size="medium" autocomplete="off" v-model="formEdit.node_action"></el-input>
</el-form-item>
<el-form-item label="是否显示" :label-width="formLabelWidth">
<el-select placeholder="请选择是否显示到菜单" size="small" v-model="formEdit.node_show">
<el-option v-for="show in showList" :value="show.show_id" :label="show.show_title">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="父级菜单" :label-width="formLabelWidth">
<el-cascader :options="parentList" v-model="formEdit.node_pid" :props="props" :show-all-levels="false"></el-cascader>
</el-form-item>
<el-form-item label="显示顺序" :label-width="formLabelWidth" prop="node_order">
<el-input size="medium" autocomplete="off" v-model="formEdit.node_order"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postEdit">确认修改</el-button>
</div>
</el-dialog>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
this.getList();
return {
search: {
node_show: "",
keyword: "",
filter: "node_id"
},
formLabelWidth: '80px',
dialogFormAdd: false,
dialogFormEdit: false,
loading: true,
dataList: [],
parentList: [],
props: {
checkStrictly: true,
emitPath: false,
value: 'node_id',
label: 'node_title',
children: 'sub',
},
showList: [
{
show_id: 0,
show_title: "隐藏"
},
{
show_id: 1,
show_title: "显示"
}
],
selectList: [],
formAdd: {
node_readonly: 0,
node_pid: 0,
node_order: 1,
node_show: 1,
},
formEdit: {
node_readonly: 0,
node_pid: 0,
},
rules: {
node_title: [
{ required: true, message: '节点名称必须填写', trigger: 'blur' },
],
node_controller: [
// { required: true, pattern: /^[a-z]+$/, message: '控制器为有效小写字母', trigger: 'blur' },
],
node_module: [
{ required: true, pattern: /^[a-z]+$/, message: '模块名为有效小写字母', trigger: 'blur' },
],
node_action: [
{ required: true, pattern: /^[a-z]+$/, message: '方法名为有效小写字母', trigger: 'blur' },
],
node_order: [
{ required: true, pattern: /^\d$/, message: '顺序为有效自然数', trigger: 'blur' },
],
}
}
},
methods: {
getList_search() {
this.form.page = 1;
this.getList();
},
postMultDelete() {
var that = this;
if (that.selectList.length == 0) {
that.$message.error('未选择任何节点!');
return;
}
this.$confirm('即将删除选中的节点, 是否确认?', '批量删除', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/node/delete', Object.assign({}, PostBase, {
node_id: that.selectList.join(",")
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
changeSelection(list) {
var that = this;
that.selectList = [];
for (var index in list) {
that.selectList.push(list[index].node_id);
}
},
postEdit() {
var that = this;
axios.post('/admin/node/update', Object.assign({}, PostBase, that.formEdit))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormEdit = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
postAdd() {
var that = this;
axios.post('/admin/node/add', Object.assign({}, PostBase, that.formAdd))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormAdd = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickAdd() {
var that = this;
that.formAdd = {
node_readonly: 0,
node_pid: 0,
node_order: 1,
node_show: 1,
};
axios.post('/admin/node/getList', Object.assign({}, PostBase))
.then(function (response) {
that.groupList = response.data.data;
if (response.data.code == CODE_SUCCESS) {
that.dialogFormAdd = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickDelete(row) {
var that = this;
this.$confirm('即将删除这个节点, 是否确认?', '删除提醒', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/node/delete', Object.assign({}, PostBase, {
node_id: row.node_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
clickShow(row) {
var that = this;
axios.post(row.node_show ? '/admin/node/hide_menu' : '/admin/node/show_menu', Object.assign({}, PostBase, {
node_id: row.node_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
clickEdit(row) {
var that = this;
that.formEdit = row;
axios.post('/admin/node/getList', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.groupList = response.data.data;
axios.post('/admin/node/detail', Object.assign({}, PostBase, {
node_id: row.node_id
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
response.data.data.node_pid = response.data.data.node_pid==0?'0':response.data.data.node_pid
that.formEdit = response.data.data;
that.dialogFormEdit = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/node/getList', Object.assign({}, PostBase, that.form, that.search))
.then(function (res) {
that.loading = false;
if (res.data.code == 200) {
that.dataList = JSON.parse(JSON.stringify(res.data.data.data));
that.parentList = [];
that.parentList.push({
node_id: "0",
node_title: "顶级菜单",
sub: [],
});
for (var i in res.data.data.data) {
res.data.data.data[i].node_id = res.data.data.data[i].node_id
that.parentList.push(res.data.data.data[i]);
}
for (let item of that.parentList) {
if(item.sub.length>0){
for (let items of item.sub) {
items.sub = undefined
}
}else{
item.sub = undefined
}
}
} else {
that.$message.error(res.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
console.log(error);
});
}
}
})
</script>
</html>
+212
View File
@@ -0,0 +1,212 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span>目前仅支持夸克</span>
</div>
<div class="text item">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>设置夸克cookie</span>
</div>
<div style="font-size:14px;color:#666;">
<el-form :model="form">
<el-form-item>
<el-input style="width: 100%;" v-model="form.cookie" placeholder="夸克云盘网页版的cookie"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">保存</el-button>
</el-form-item>
</el-form>
<p>Tips:夸克云盘网页版的cookie,不懂如何获取请百度;填写并保存后才能使用下面功能</p>
</div>
</el-card>
<br>
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>一键转存他人链接</span>
</div>
<div style="margin-bottom: 20px;font-size:14px;color:#666;">
<font color=orangered>简单理解就是将别人的资源分享转成自己的并添加该资源到系统中</font>
<p>功能说明:</p>
<p>1、转存短剧资源到自己的网盘</p>
<p>2、生成自己的分享链接</p>
<p>3、将分享链接添加到该系统资源管理中</p>
<p>Tips:该功能仅支持单条操作;资源标题重复的会跳过;复制他人分享的网盘链接,如:https://pan.quark.cn/s/fb8402aed9c4</p>
</div>
<el-button type="danger" @click="s1Btn">立即转存</el-button>
</el-card>
<br>
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>每日自动更新</span>
</div>
<div style="margin-bottom: 20px;font-size:14px;color:#666;">
<p>自动更新:<font color=orangered>转存当日及昨天的资源数据;</font></p>
<font color=orangered>将此接口添加到计划任务中,计划任务每日执行一次即可;接口地址:https://你的域名/api/source/day</font>
<p>Tips:添加计划任务后方可生效;名称重复的资源会跳过转存;</p>
</div>
</el-card>
<br>
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>转存心悦搜剧资源</span>
</div>
<div style="margin-bottom: 20px;font-size:14px;color:#666;">
<p>全部转存:<font color=orangered>一键转存心悦搜剧所有资源到自己的网盘及系统中</font></p>
<font color=orangered>全部转存速度比较慢,提交后请耐心等待;名称重复的资源会跳过转存;</font>
<p>Tips:心悦搜剧:https://pan.xinyuedh.com</p>
</div>
<el-button type="danger" @click="s2Btn">全部转存</el-button>
</el-card>
<!-- <el-card class="box-card">
<div slot="header" class="clearfix">
<span>清除缓存</span>
</div>
<div style="margin-bottom: 20px;font-size:14px;color:#666;">
清除缓存
<font color=orangered>不可逆操作</font>
</div>
<el-button type="danger" @click="">清除缓存</el-button>
</el-card> -->
</div>
</el-card>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
return {
form: {
cookie: '',
},
file: '',
files: [],
};
},
created() {
this.getData();
this.getFile()
},
methods: {
getData(){
let that = this
axios.post('/admin/conf/getBaseConfig', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == 200) {
for (let item of response.data.data) {
if(item.conf_key === 'quark_cookie'){
that.form.cookie = item.conf_value
}
if(item.conf_key === 'quark_file'){
that.file = item.conf_value
}
}
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
});
},
onSubmit(){
let that = this
axios.post('/admin/conf/updateBaseConfig', Object.assign({}, PostBase, {
quark_cookie: that.form.cookie
}))
.then(function (response) {
if (response.data.code == 200) {
that.$message({
message: response.data.message,
type: 'success'
});
that.getFile()
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
s1Btn(){
let that = this
this.$prompt('请输入夸克资源分享地址', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /.+/,
inputErrorMessage: '不能为空'
}).then(({ value }) => {
axios.post('/admin/source/transfer', Object.assign({}, PostBase, {
url: value
}))
.then(function (res) {
if (res.data.code == 200) {
that.$message({
message: res.data.message,
type: 'success'
});
} else {
that.$message.error(res.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {});
},
s2Btn(){
let that = this
this.$confirm('全部转存速度比较慢,提交后请耐心等待, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/source/transferAll', Object.assign({}, PostBase))
.then(function (res) {
if (res.data.code == 200) {
} else {
that.$message.error(res.data.message);
}
})
.catch(function (error) {
});
that.$message({
message: "已提交任务,稍后查看结果",
type: 'success'
});
}).catch(() => {});
},
getFile(){
let that = this
axios.post('/admin/source/getFiles', Object.assign({}, PostBase))
.then(function (res) {
if (res.data.code == 200) {
that.files = res.data || []
} else {
that.$message.error(res.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
},
}
})
</script>
</html>
+74
View File
@@ -0,0 +1,74 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-table :data="dataList.data" v-loading="loading">
<el-table-column prop="id" label="ID" align="center" width="100">
</el-table-column>
<el-table-column prop="content" label="用户想要的资源描述">
</el-table-column>
<el-table-column prop="create_time" label="提交时间" align="center" width="200">
</el-table-column>
</el-table>
<div class="page">
<el-pagination @size-change="handleSizeChange" :page-sizes="[10, 20, 50, 100,200,500]" :page-size="10"
layout="total, sizes, prev, pager, next, jumper" background @current-change="changeCurrentPage"
:current-page="dataList.current_page" :page-count="dataList.last_page" :total="dataList.total">
</el-pagination>
</div>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
return {
loading: true,
dataList: [],
form: {
page: 1,
per_page: 10,
order: 'id desc'
},
}
},
created() {
this.getList();
},
methods: {
handleSizeChange(per_page) {
this.form.per_page = per_page;
this.getList();
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/feedback/getList', Object.assign({}, PostBase, that.form))
.then(function (response) {
that.loading = false;
if (response.data.code == CODE_SUCCESS) {
that.dataList = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
});
},
}
})
</script>
</html>
+320
View File
@@ -0,0 +1,320 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-form :inline="true" @submit.native.prevent>
<el-form-item>
<el-button icon="el-icon-plus" size="small" @click="clickAdd" plain>添加资源</el-button>
<el-button icon="el-icon-plus" size="small" @click="ImportShow" plain>导入资源</el-button>
</el-form-item>
<div style="float:right">
<el-form-item>
<el-input placeholder="输入关键词搜索" size="small" v-model="search.keyword" @keyup.enter.native="getList_search"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="getList_search" plain>搜索
</el-button>
<el-button icon="el-icon-refresh-left" size="small" @click="getList_search(0)" plain>重置</el-button>
</el-form-item>
</div>
</el-form>
<el-table :data="dataList.data" v-loading="loading">
<el-table-column prop="source_id" label="ID" width="60">
</el-table-column>
<el-table-column prop="title" label="资源名称">
</el-table-column>
<el-table-column prop="url" label="资源地址" align="center">
</el-table-column>
<el-table-column prop="create_time" label="入库时间" align="center" width="200">
</el-table-column>
<el-table-column prop="update_time" label="更新时间" align="center" width="200">
</el-table-column>
<el-table-column label="操作" width="180" align="center">
<template slot-scope="scope">
<div class="order-text">
<p>
<el-link type="success" @click="clickEdit(scope.row)" :underline="false">编辑</el-link>
</p>
<p>
<el-link type="danger" @click="clickDelete(scope.row)" :underline="false">删除</el-link>
</p>
</div>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination @size-change="handleSizeChange" :page-sizes="[10, 20, 50, 100,200,500]" :page-size="10"
layout="total, sizes, prev, pager, next, jumper" background @current-change="changeCurrentPage"
:current-page="dataList.current_page" :page-count="dataList.last_page" :total="dataList.total">
</el-pagination>
</div>
<!-- 添加框 -->
<el-dialog title="添加资源" :visible.sync="dialogFormAdd" :modal-append-to-body='false' append-to-body
:close-on-click-modal='false' width="680px">
<el-form :model="formAdd" :rules="rules" ref="formAdd">
<el-form-item prop="title" label="资源名称" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" placeholder="请输入资源名称" v-model="formAdd.title"></el-input>
</el-form-item>
<el-form-item prop="url" label="资源地址" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" placeholder="请输入资源地址" v-model="formAdd.url"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postAdd()">确认添加</el-button>
</div>
</el-dialog>
<!-- 修改框 -->
<el-dialog title="修改资源" :visible.sync="dialogFormEdit" :modal-append-to-body='false' append-to-body
:close-on-click-modal='false' width="680px">
<el-form :model="formEdit" :rules="rules" ref="formEdit">
<el-form-item prop="title" label="资源名称" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" placeholder="请输入资源名称" v-model="formEdit.title"></el-input>
</el-form-item>
<el-form-item prop="url" label="资源地址" :label-width="formLabelWidth">
<el-input size="medium" autocomplete="off" placeholder="请输入资源地址" v-model="formEdit.url"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="postEdit()">确认修改</el-button>
</div>
</el-dialog>
<!-- 导入数据 -->
<el-dialog title="导入资源" :visible.sync="dialogImport" :modal-append-to-body='false' append-to-body
:close-on-click-modal='false' width="600px">
<el-form :model="Importform">
<el-form-item label="" :label-width="formLabelWidth">
<el-upload class="upload-demo" :data="Importform" name="file"
ref="ImportUpload"
drag
:auto-upload="false"
limit="1"
:on-exceed="handleExceed"
:on-success="handleAvatarSuccess"
action="/admin/source/imports"
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
<span style="color: #999;">请导入夸克官方导出的csv文件</span>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="ImportPost()">提交</el-button>
</div>
</el-dialog>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
return {
search: {
keyword: "",
filter: "title"
},
formLabelWidth: '120px',
dialogFormAdd: false,
dialogFormEdit: false,
loading: true,
dataList: [],
form: {
page: 1,
per_page: 10,
order: 'source_id desc'
},
formAdd: {
},
formEdit: {
},
rules: {
title: [{ required: true, message: '请输入资源名称', trigger: 'blur' }],
url: [{ required: true, message: '请输入资源地址', trigger: 'blur' }],
},
dialogImport: false,
Importform: {
},
}
},
created() {
this.getList();
},
methods: {
getList_search(val) {
if (val == 0) {
this.search = {
keyword: "",
filter: "title"
}
}
this.form.page = 1;
this.getList();
},
handleSizeChange(per_page) {
this.form.per_page = per_page;
this.getList();
},
postEdit() {
var that = this;
that.$refs["formEdit"].validate((valid) => {
if (valid) {
axios.post('/admin/source/update', Object.assign({}, PostBase, that.formEdit))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormEdit = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}
});
},
postAdd() {
var that = this;
that.$refs['formAdd'].validate((valid) => {
if (valid) {
axios.post('/admin/source/add', Object.assign({}, PostBase, that.formAdd))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
that.dialogFormAdd = false;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
});
}
});
},
clickAdd() {
var that = this;
that.formAdd = { status: 1, share_image: '' };
that.dialogFormAdd = true;
},
clickDelete(row) {
var that = this;
this.$confirm('删除后,资源将无法查看,是否继续删除?', '删除提醒', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/source/delete', Object.assign({}, PostBase, {
source_id: row.source_id
}))
.then(function (response) {
that.getList();
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
});
}).catch(() => {
});
},
clickEdit(row) {
var that = this;
that.formEdit = row;
axios.post('/admin/source/detail', Object.assign({}, PostBase, {
source_id: row.source_id
}))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.formEdit = response.data.data;
that.dialogFormEdit = true;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
});
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/source/getList', Object.assign({}, PostBase, that.form, that.search))
.then(function (response) {
that.loading = false;
if (response.data.code == CODE_SUCCESS) {
that.dataList = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
});
},
//导入数据
ImportShow() {
this.Importform = {
}
this.dialogImport = true
},
handleExceed(files, fileList) {
this.$message.warning(`只能选择一个文件`);
},
handleAvatarSuccess(res, file) {
if (res.code == 200) {
this.getList();
this.$message({
message: res.message,
type: 'success'
});
this.dialogImport = false;
} else {
this.$message.error(res.message);
}
this.$refs.ImportUpload.clearFiles();
},
ImportPost(){
this.Importform = Object.assign(this.Importform, PostBase)
this.$nextTick(() => {
this.$refs.ImportUpload.submit();
})
},
}
})
</script>
</html>
+90
View File
@@ -0,0 +1,90 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-table :data="dataList.data" v-loading="loading">
<el-table-column prop="name" label="转存任务名称">
</el-table-column>
<el-table-column prop="total_num" label="转存总数" align="center">
</el-table-column>
<el-table-column prop="new_num" label="新增数" align="center">
</el-table-column>
<el-table-column prop="skip_num" label="重复跳过" align="center">
</el-table-column>
<el-table-column prop="fail_num" label="失败数" align="center">
</el-table-column>
<el-table-column label="状态" align="center">
<template slot-scope="scope">
<el-tag v-if="scope.row.end_time">已完成</el-tag>
<el-tag type="danger" v-else>转存中</el-tag>
</template>
</el-table-column>
<el-table-column prop="create_time" label="时间" align="center" width="240">
<template slot-scope="scope">
<p>任务开始:{{scope.row.create_time}}</p>
<p v-if="scope.row.end_time">任务结束:{{scope.row.end_time}}</p>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination @size-change="handleSizeChange" :page-sizes="[10, 20, 50, 100,200,500]" :page-size="10"
layout="total, sizes, prev, pager, next, jumper" background @current-change="changeCurrentPage"
:current-page="dataList.current_page" :page-count="dataList.last_page" :total="dataList.total">
</el-pagination>
</div>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
return {
loading: true,
dataList: [],
form: {
page: 1,
per_page: 10,
order: 'source_log_id desc'
},
}
},
created() {
this.getList();
},
methods: {
handleSizeChange(per_page) {
this.form.per_page = per_page;
this.getList();
},
changeCurrentPage(page) {
this.form.page = page;
this.getList();
},
getList() {
var that = this;
that.loading = true;
axios.post('/admin/source_log/getList', Object.assign({}, PostBase, that.form))
.then(function (response) {
that.loading = false;
if (response.data.code == CODE_SUCCESS) {
that.dataList = response.data.data;
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.loading = false;
that.$message.error('服务器内部错误');
});
},
}
})
</script>
</html>
+100
View File
@@ -0,0 +1,100 @@
<!DOCTYPE html>
<html>
<head>
<title>{$node.node_title}</title>
{include file="common/header"/}
<el-card class="box-card" shadow="never">
<div slot="header" class="clearfix">
<span>系统数据清理</span>
</div>
<div class="text item">
<!-- <el-card class="box-card">
<div slot="header" class="clearfix">
<span>清理授权记录</span>
</div>
<div style="margin-bottom: 20px;font-size:14px;color:#666;">
用户组授权信息清理为
<font color=orangered>不可逆操作</font>,请谨慎操作!<br> 清理完毕后,除超级管理用户组外,其他任何用户组将无法访问系统任何功能!
<br> 建议仅在用户组权限混乱或出现其他账号安全问题时进行清理操作。
<br> 清理成功后可重新对用户组进行权限授权,即可恢复正常使用。
</div>
<el-button type="danger" @click="clearAuth">清理授权</el-button>
</el-card>
<br> -->
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>清除缓存</span>
</div>
<div style="margin-bottom: 20px;font-size:14px;color:#666;">
清除缓存
<font color=orangered>不可逆操作</font>
</div>
<el-button type="danger" @click="clearLog">清除缓存</el-button>
</el-card>
</div>
</el-card>
{include file="common/footer"/}
<script>
var app = new Vue({
el: '#app',
data() {
return {};
},
methods: {
clearLog() {
var that = this;
this.$confirm('即将清除缓存, 是否确认?', '删除日志', {
confirmButtonText: '删除',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.post('/admin/system/clean', Object.assign({}, PostBase))
.then(function (response) {
if (response.data.code == CODE_SUCCESS) {
that.$message({
message: response.data.message,
type: 'success'
});
} else {
that.$message.error(response.data.message);
}
})
.catch(function (error) {
that.$message.error('服务器内部错误');
console.log(error);
});
}).catch(() => {
});
},
// clearAuth() {
// var that = this;
// this.$confirm('即将删除授权信息, 是否确认?', '清空授权', {
// confirmButtonText: '删除',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(() => {
// axios.post('/admin/auth/clean', Object.assign({}, PostBase))
// .then(function (response) {
// if (response.data.code == CODE_SUCCESS) {
// that.$message({
// message: response.data.message,
// type: 'success'
// });
// } else {
// that.$message.error(response.data.message);
// }
// })
// .catch(function (error) {
// that.$message.error('服务器内部错误');
// console.log(error);
// });
// }).catch(() => {
// });
// },
}
})
</script>
</html>