Initial commit: 小众厨房项目代码

Co-authored-by: Cursor <cursoragent@cursor.com>
这个提交包含在:
可乐加冰
2026-09-23 17:04:10 +08:00
当前提交 f7d3d7d1bd
共有 1761 个文件被更改,包括 453668 次插入 和 0 次删除

查看文件

@@ -0,0 +1,62 @@
<form id="add-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
{if $config.upload.cdnurl}
<div class="form-group">
<label for="c-third" class="control-label col-xs-12 col-sm-2">{:__('Upload to third')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[third]" id="c-third" class="form-control"/>
<ul class="row list-inline faupload-preview" id="p-third"></ul>
</div>
</div>
<div class="form-group">
<label for="c-third" class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<div style="width:180px;display:inline-block;">
<select name="category-third" id="category-third" class="form-control selectpicker">
<option value="">{:__('Please select category')}</option>
{foreach name="categoryList" id="item"}
<option value="{$key}">{$item}</option>
{/foreach}
</select>
</div>
<button type="button" id="faupload-third" class="btn btn-danger faupload" data-multiple="true" data-input-id="c-third" data-preview-id="p-third"><i class="fa fa-upload"></i> {:__("Upload to third")}</button>
{if $config.upload.chunking}
<button type="button" id="faupload-third-chunking" class="btn btn-danger faupload" data-chunking="true" data-maxsize="1gb" data-multiple="true" data-input-id="c-third" data-preview-id="p-third"><i class="fa fa-upload"></i> {:__("Upload to third by chunk")}</button>
{/if}
</div>
</div>
{/if}
<div class="form-group">
<label for="c-local" class="control-label col-xs-12 col-sm-2">{:__('Upload to local')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[local]" id="c-local" class="form-control"/>
<ul class="row list-inline faupload-preview" id="p-local"></ul>
</div>
</div>
<div class="form-group">
<label for="c-local" class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<div style="width:180px;display:inline-block;">
<select name="category-local" id="category-local" class="form-control selectpicker">
<option value="">{:__('Please select category')}</option>
{foreach name="categoryList" id="item"}
<option value="{$key}">{$item}</option>
{/foreach}
</select>
</div>
<button type="button" id="faupload-local" class="btn btn-primary faupload" data-input-id="c-local" data-multiple="true" data-preview-id="p-local" data-url="{:url('ajax/upload')}"><i class="fa fa-upload"></i> {:__("Upload to local")}</button>
{if $config.upload.chunking}
<button type="button" id="faupload-local-chunking" class="btn btn-primary faupload" data-chunking="true" data-maxsize="1gb" data-input-id="c-local" data-multiple="true" data-preview-id="p-local" data-url="{:url('ajax/upload')}"><i class="fa fa-upload"></i> {:__("Upload to local by chunk")}</button>
{/if}
</div>
</div>
<div class="form-group hidden layer-footer">
<div class="col-xs-2"></div>
<div class="col-xs-12 col-sm-8">
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</div>
</form>

查看文件

@@ -0,0 +1,89 @@
<form id="edit-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label for="c-url" class="control-label col-xs-12 col-sm-2">{:__('Category')}:</label>
<div class="col-xs-12 col-sm-8">
<select name="row[category]" class="form-control">
<option value="">{:__('Please select category')}</option>
{foreach name="categoryList" id="item"}
<option value="{$key}" {if $key==$row.category}selected{/if}>{$item}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label for="c-url" class="control-label col-xs-12 col-sm-2">{:__('Url')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[url]" value="{$row.url|htmlentities}" id="c-url" class="form-control" required />
</div>
</div>
<div class="form-group">
<label for="c-imagewidth" class="control-label col-xs-12 col-sm-2">{:__('Imagewidth')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[imagewidth]" value="{$row.imagewidth}" id="c-imagewidth" class="form-control" required />
</div>
</div>
<div class="form-group">
<label for="c-imageheight" class="control-label col-xs-12 col-sm-2">{:__('Imageheight')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[imageheight]" value="{$row.imageheight}" id="c-imageheight" class="form-control" required />
</div>
</div>
<div class="form-group">
<label for="c-imagetype" class="control-label col-xs-12 col-sm-2">{:__('Imagetype')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[imagetype]" value="{$row.imagetype|htmlentities}" id="c-imagetype" class="form-control" required />
</div>
</div>
<div class="form-group">
<label for="c-imageframes" class="control-label col-xs-12 col-sm-2">{:__('Imageframes')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="number" name="row[imageframes]" value="{$row.imageframes}" id="c-imageframes" class="form-control" />
</div>
</div>
<div class="form-group">
<label for="c-filename" class="control-label col-xs-12 col-sm-2">{:__('Filename')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[filename]" value="{$row.filename|htmlentities}" id="c-filename" class="form-control" />
</div>
</div>
<div class="form-group">
<label for="c-filesize" class="control-label col-xs-12 col-sm-2">{:__('Filesize')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="number" name="row[filesize]" value="{$row.filesize}" id="c-filesize" class="form-control" />
</div>
</div>
<div class="form-group">
<label for="c-mimetype" class="control-label col-xs-12 col-sm-2">{:__('Mimetype')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[mimetype]" value="{$row.mimetype|htmlentities}" id="c-mimetype" class="form-control" />
</div>
</div>
<div class="form-group">
<label for="c-extparam" class="control-label col-xs-12 col-sm-2">{:__('Extparam')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[extparam]" value="{$row.extparam|htmlentities}" id="c-extparam" class="form-control" />
</div>
</div>
<div class="form-group">
<label for="c-uploadtime" class="control-label col-xs-12 col-sm-2">{:__('Uploadtime')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="datetime" name="row[uploadtime]" value="{$row.uploadtime|datetime}" id="c-uploadtime" class="form-control datetimepicker" />
</div>
</div>
<div class="form-group">
<label for="c-storage" class="control-label col-xs-12 col-sm-2">{:__('Storage')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" name="row[storage]" value="{$row.storage}" id="c-storage" class="form-control" />
</div>
</div>
<div class="form-group hide layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</div>
</form>

查看文件

@@ -0,0 +1,206 @@
<link rel="stylesheet" href="__CDN__/assets/element-ui-2.15.14/css/index.css">
<link rel="stylesheet" href="__CDN__/assets/css/vvv.css">
<style>
.el-form-item__label {
width: 120px !important;
}
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
input[type="file"] {
display: none !important;
}
.el-form-item__error {
margin-left: 30px;
}
.search-select .el-select .el-input__inner {
width: 130px;
}
.key .el-input__inner {
/*width: 240px !important;*/
}
.vue-table {
padding: 0;
}
#box {
display: flex;
}
#box .left {
width: 180px;
border-right: 1px solid #ebeef5;
margin-right: 20px;
}
#box .left .li {
height: 30px;
line-height: 30px;
margin-bottom: 20px;
text-align: center;
cursor: pointer;
font-size: 14px;
}
#box .left .category-selected {
background: #7438d5;
color: #fff;
}
#box .right {
width: 100%;
}
</style>
<div id="vue" v-cloak>
<div id="box">
<div class="left">
<div class="ul">
<div @click="handleSelectCategory(index)" v-for="(item, index) of categoryOpt" :class="item.selected === true ? 'li category-selected' : 'li'">{{item.name}}</div>
</div>
</div>
<div class="right">
<div class="screen-container">
<div class="screen-container-show">
<div class="screen-container-left display-flex">
<el-button size="small" @click="refreshPage" icon="el-icon-refresh" circle type="primary"></el-button>
<div class="datetime">
<el-date-picker
v-model="search.startTime"
type="datetime"
placeholder="选择起始时间">
</el-date-picker>
</div>
<div class="datetime">
<el-date-picker
v-model="search.endTime"
type="datetime"
placeholder="选择结束时间">
</el-date-picker>
</div>
</div>
<div class="search-select screen-container-right display-flex keyword">
<el-select v-model="search.typeIndex" @clear="handleClearSelect('typeIndex')" clearable placeholder="文件类型">
<el-option
v-for="item in typeList"
:key="item.index"
:label="item.name"
:value="item.index">
</el-option>
</el-select>
</div>
<div class="search-select screen-container-right display-flex keyword key">
<el-input @clear="handleClearSearchInp" clearable v-model="search.keyword" placeholder="请输入您要搜索的内容">
<el-select v-model="search.type" filterable clearable slot="prepend" placeholder="请选择">
<el-option v-for="(item, index) in searchOpt" :label="item.value"
:value="item.id">
</el-option>
</el-select>
<el-button slot="append" @click="searchData" icon="el-icon-search"></el-button>
</el-input>
</div>
<div class="screen-container-right display-flex keyword">
<el-upload
style="margin-right: 10px;"
class="upload-img"
:multiple="true"
:show-file-list="false"
:before-upload="beforeFileUpload"
:on-success="uploadFileSuccess"
accept=".jpg,.jpeg,.gif,.png"
action="{:url('ajax/upload')}"
>
<el-button size="small" type="primary" plain icon="el-icon-upload">上传
</el-button>
</el-upload>
{if ($multiple == 'true')}
<el-button size="small" @click="handleSelectFile('', 'multiple')" type="success" plain icon="el-icon-check">选择
</el-button>
{/if}
</div>
</div>
</div>
<div class="vue-table background-white color-666">
<el-table :data="tableData" border highlight-current-row v-loading="listLoading"
@sort-change="sortChange" element-loading-text="拼命加载中..."
@selection-change="handleSelectionChange" style="width: 100%">
{if ($multiple == 'true')}
<el-table-column type="selection" width="60" align="center"></el-table-column>
{/if}
<el-table-column prop="id" width="80" label="ID" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="category" width="130" label="类别" show-overflow-tooltip
align="center">
<template scope="scope">
<span v-if="scope.row.category !== ''">{{categoryList[scope.row.category]}}</span>
<span v-else>未归类</span>
</template>
</el-table-column>
<el-table-column prop="image" label="图片" width="100" align="center">
<template scope="scope">
<a style="cursor: pointer;" :href="scope.row.url" target="_blank">
<img :src="scope.row.url" style="border-radius: 10px;width: 50px;height: 50px;padding: 5px">
</a>
</template>
</el-table-column>
<el-table-column prop="filename" label="文件名" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="imagewidth" width="100" label="宽" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="imageheight" width="100" label="高" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="mimetype" width="130" label="文件类型" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="createtime" width="160" :formatter="dateFormat" label="创建日期" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column align="center" width="130" fixed="right" label="操作">
<template scope="scope">
<button
@click="handleSelectFile(scope.row, 'multiple')"
type="button"
class="el-button el-button--success el-button--small"
>
<i class="el-icon-check"></i><span>选择</span></button>
</template>
</el-table-column>
</el-table>
<div class="layout-pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</div>
</div>
</div>
</div>
</div>
<script src="__CDN__/assets/element-ui-2.15.14/js/vue.js"></script>
<script src="__CDN__/assets/element-ui-2.15.14/js/index.js"></script>
<script src="__CDN__/assets/tool/libs/moment.js"></script>
<script src="__CDN__/assets/js/jquery-2.1.1.min.js"></script>

查看文件

@@ -0,0 +1,53 @@
<div class="panel panel-default panel-intro">
<div class="panel-heading">
{:build_heading(null,FALSE)}
<ul class="nav nav-tabs" data-field="category">
<li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
{foreach name="categoryList" item="vo"}
<li><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
{/foreach}
<li class="pull-right dropdown filter-type">
<a href="javascript:" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-filter"></i> {:__('Filter Type')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li class="active"><a href="javascript:" data-value="">{:__('All')}</a></li>
{foreach name="mimetypeList" id="item"}
<li><a href="javascript:" data-value="{$key}">{$item}</a></li>
{/foreach}
</ul>
</li>
</ul>
</div>
<div class="panel-body">
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="one">
<div class="widget-body no-padding">
<div id="toolbar" class="toolbar">
{:build_toolbar('refresh,add,edit,del')}
<a class="btn btn-info btn-classify dropdown-toggle btn-disabled disabled {:$auth->check('general/attachment/edit')?'':'hide'}"><i class="fa fa-arrow-right"></i> {:__('Classify')}</a>
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
data-operate-edit="{:$auth->check('general/attachment/edit')}"
data-operate-del="{:$auth->check('general/attachment/del')}"
width="100%">
</table>
</div>
</div>
</div>
</div>
</div>
<script id="typetpl" type="text/html">
<div class="row">
<div class="col-xs-12">
<select name="category" class="form-control">
<option value="">{:__('Please select category')}</option>
{foreach name="categoryList" id="item"}
<option value="{$key}">{$item}</option>
{/foreach}
</select>
</div>
</div>
</script>

查看文件

@@ -0,0 +1,232 @@
<link rel="stylesheet" href="__CDN__/assets/element-ui-2.15.14/css/index.css">
<link rel="stylesheet" href="__CDN__/assets/css/vvv.css">
<style>
.el-form-item__label {
width: 120px !important;
}
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
input[type="file"] {
display: none !important;
}
.el-form-item__error {
margin-left: 30px;
}
.search-select .el-select .el-input__inner {
width: 130px;
}
.key .el-input__inner {
/*width: 240px !important;*/
}
.vue-table {
padding: 0;
}
#box {
display: flex;
}
#box .left {
width: 270px;
border-right: 1px solid #ebeef5;
margin-right: 20px;
}
#box .left .li {
height: 30px;
line-height: 30px;
margin-bottom: 20px;
text-align: center;
cursor: pointer;
font-size: 14px;
}
#box .left .category-selected {
background: #7438d5;
color: #fff;
}
#box .right {
width: 100%;
}
.content {
padding: 0 !important;
}
.el-tree-node__label {
font-size: 16px !important;
}
.el-tree-node {
margin-bottom: 4px;
}
.search {
margin: 10px;
}
</style>
<div id="vue" v-cloak>
<div id="box">
<div class="left">
<div class="search">
<el-input placeholder="输入名称搜索" v-model="navName" size="small" class="input-with-select">
<el-button @click="handleSearchNav" slot="append" icon="el-icon-search"></el-button>
</el-input>
</div>
<div class="ul">
<el-tree :data="navList" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
</div>
</div>
<div class="right">
<div class="screen-container">
<div class="screen-container-show">
<div class="screen-container-left display-flex">
<el-button size="small" @click="refreshPage" icon="el-icon-refresh" circle type="primary"></el-button>
<div class="datetime">
<el-date-picker
v-model="search.startTime"
type="datetime"
placeholder="选择起始时间">
</el-date-picker>
</div>
<div class="datetime">
<el-date-picker
v-model="search.endTime"
type="datetime"
placeholder="选择结束时间">
</el-date-picker>
</div>
</div>
<div class="search-select screen-container-right display-flex keyword">
<el-select v-model="search.typeIndex" @clear="handleClearSelect('typeIndex')" clearable placeholder="文件类型">
<el-option
v-for="item in typeList"
:key="item.index"
:label="item.name"
:value="item.index">
</el-option>
</el-select>
</div>
<div class="search-select screen-container-right display-flex keyword key">
<el-input @keyup.enter.native="searchData" @clear="handleClearSearchInp" clearable v-model="search.keyword" placeholder="请输入您要搜索的内容">
<el-select v-model="search.type" filterable clearable slot="prepend" placeholder="请选择">
<el-option v-for="(item, index) in searchOpt" :label="item.value"
:value="item.id">
</el-option>
</el-select>
<el-button slot="append" @click="searchData" icon="el-icon-search"></el-button>
</el-input>
</div>
<div class="screen-container-right display-flex keyword">
<el-upload
:data="{nid: search.nid}"
style="margin-right: 10px;"
class="upload-img"
:multiple="true"
:show-file-list="false"
:before-upload="beforeFileUpload"
:on-success="uploadFileSuccess"
accept=".jpg,.jpeg,.gif,.png,.svg"
action="{:url('ajax/upload')}"
>
<el-button size="small" type="primary" plain icon="el-icon-upload">上传
</el-button>
</el-upload>
{if ($multiple == 'true')}
<el-button size="small" @click="handleSelectFile('', 'multiple')" type="success" plain icon="el-icon-check">选择
</el-button>
{/if}
<el-button size="small" @click="handleOpenNav" type="primary" plain icon="el-icon-menu">分类管理
</el-button>
</div>
</div>
</div>
<div class="vue-table background-white color-666">
<el-table :data="tableData" border highlight-current-row v-loading="listLoading"
@sort-change="handleTableFieldSort" element-loading-text="拼命加载中..."
@selection-change="handleSelectionChange" style="width: 100%">
{if ($multiple == 'true')}
<el-table-column type="selection" width="60" align="center"></el-table-column>
{/if}
<!-- <el-table-column prop="id" width="80" label="ID" show-overflow-tooltip-->
<!-- align="center"></el-table-column>-->
<el-table-column prop="category" width="200" label="类别" show-overflow-tooltip
align="center">
<template scope="scope">
<span>{{scope.row.nav_name}}</span>
</template>
</el-table-column>
<el-table-column prop="image" label="图片" width="100" align="center">
<template scope="scope">
<a v-if="scope.row.mimetype.indexOf('image') >= 0" style="cursor: pointer;" :href="scope.row.url" target="_blank">
<img :src="scope.row.url" style="border-radius: 10px;width: 50px;height: 50px;padding: 5px">
</a>
<a v-else style="cursor: pointer;" :href="scope.row.url" target="_blank">
<img src="/assets/img/video-video.png" style="border-radius: 10px;width: 50px;height: 50px;padding: 5px">
</a>
</template>
</el-table-column>
<el-table-column prop="filename" sortable="custom" label="文件名" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="imagewidth" width="80" label="宽" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="imageheight" width="80" label="高" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="mimetype" width="110" label="文件类型" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="createtime" sortable="custom" width="160" :formatter="dateFormat" label="创建日期" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column align="center" width="130" fixed="right" label="操作">
<template scope="scope">
<button
@click="handleSelectFile(scope.row, 'one')"
type="button"
class="el-button el-button--success el-button--small"
>
<i class="el-icon-check"></i><span>选择</span></button>
</template>
</el-table-column>
</el-table>
<div class="layout-pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</div>
</div>
</div>
</div>
</div>
<script src="__CDN__/assets/element-ui-2.15.14/js/vue.js"></script>
<script src="__CDN__/assets/element-ui-2.15.14/js/index.js"></script>
<script src="__CDN__/assets/tool/libs/moment.js"></script>
<script src="__CDN__/assets/js/jquery-2.1.1.min.js"></script>

查看文件

@@ -0,0 +1,47 @@
<style>
#one .commonsearch-table{
padding-top:15px!important;
}
</style>
<div class="panel panel-default panel-intro">
<div class="panel-heading">
{:build_heading(null,FALSE)}
<ul class="nav nav-tabs" data-field="category">
<li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
{foreach name="categoryList" item="vo"}
<li><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
{/foreach}
{if stripos(request()->get('mimetype'),'image/')===false}
<li class="pull-right dropdown filter-type">
<a href="javascript:" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-filter"></i> {:__('Filter Type')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li class="active"><a href="javascript:" data-value="">{:__('All')}</a></li>
{foreach name="mimetypeList" id="item"}
<li><a href="javascript:" data-value="{$key}">{$item}</a></li>
{/foreach}
</ul>
</li>
{/if}
</ul>
</div>
<div class="panel-body no-padding">
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="one">
<div class="widget-body no-padding">
<div id="toolbar" class="toolbar">
{:build_toolbar('refresh')}
<span><button type="button" id="faupload-image" class="btn btn-success faupload" data-mimetype="{$mimetype|default=''|htmlentities}" data-multiple="true"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
{if request()->get('multiple') == 'true'}
<a class="btn btn-danger btn-choose-multi"><i class="fa fa-check"></i> {:__('Choose')}</a>
{/if}
</div>
<table id="table" class="table table-bordered table-hover table-nowrap" width="100%">
</table>
</div>
</div>
</div>
</div>
</div>

查看文件

@@ -0,0 +1,347 @@
<style type="text/css">
@media (max-width: 375px) {
.edit-form tr td input {
width: 100%;
}
.edit-form tr th:first-child, .edit-form tr td:first-child {
width: 20%;
}
.edit-form tr th:nth-last-of-type(-n+2), .edit-form tr td:nth-last-of-type(-n+2) {
display: none;
}
}
.edit-form table > tbody > tr td a.btn-delcfg {
visibility: hidden;
}
.edit-form table > tbody > tr:hover td a.btn-delcfg {
visibility: visible;
}
</style>
<div class="panel panel-default panel-intro">
<div class="panel-heading">
{:build_heading(null, false)}
<ul class="nav nav-tabs">
{foreach $siteList as $index=>$vo}
<li class="{$vo.active?'active':''}"><a href="#tab-{$vo.name}" data-toggle="tab">{:__($vo.title)}</a></li>
{/foreach}
{if $Think.config.app_debug}
<li data-toggle="tooltip" title="{:__('Add new config')}">
<a href="#addcfg" data-toggle="tab"><i class="fa fa-plus"></i></a>
</li>
{/if}
</ul>
</div>
<div class="panel-body">
<div id="myTabContent" class="tab-content">
<!--@formatter:off-->
{foreach $siteList as $index=>$vo}
<div class="tab-pane fade {$vo.active ? 'active in' : ''}" id="tab-{$vo.name}">
<div class="widget-body no-padding">
<form id="{$vo.name}-form" class="edit-form form-horizontal" role="form" data-toggle="validator" method="POST" action="{:url('general.config/edit')}">
{:token()}
<table class="table table-striped">
<thead>
<tr>
<th width="15%">{:__('Title')}</th>
<th width="68%">{:__('Value')}</th>
{if $Think.config.app_debug}
<th width="15%">{:__('Name')}</th>
<th width="2%"></th>
{/if}
</tr>
</thead>
<tbody>
{foreach $vo.list as $item}
<tr data-favisible="{$item.visible|default=''|htmlentities}" data-name="{$item.name}" class="{if $item.visible??''}hidden{/if}">
<td>{$item.title}</td>
<td>
<div class="row">
<div class="col-sm-8 col-xs-12">
{switch $item.type}
{case string}
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}"/>
{/case}
{case password}
<input {$item.extend_html} type="password" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}"/>
{/case}
{case text}
<textarea {$item.extend_html} name="row[{$item.name}]" class="form-control" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value|htmlentities}</textarea>
{/case}
{case editor}
<textarea {$item.extend_html} name="row[{$item.name}]" id="editor-{$item.name}" class="form-control editor" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value|htmlentities}</textarea>
{/case}
{case array}
<dl {$item.extend_html} class="fieldlist" data-name="row[{$item.name}]">
<dd>
<ins>{:isset($item["setting"]["key"])&&$item["setting"]["key"]?$item["setting"]["key"]:__('Array key')}</ins>
<ins>{:isset($item["setting"]["value"])&&$item["setting"]["value"]?$item["setting"]["value"]:__('Array value')}</ins>
</dd>
<dd><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
<textarea name="row[{$item.name}]" class="form-control hide" cols="30" rows="5">{$item.value|htmlentities}</textarea>
</dl>
{/case}
{case date}
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case time}
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control datetimepicker" data-date-format="HH:mm:ss" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case datetime}
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case datetimerange}
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control datetimerange" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case number}
<input {$item.extend_html} type="number" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case checkbox}
<div class="checkbox">
{foreach name="item.content" item="vo"}
<label for="row[{$item.name}][]-{$key}"><input id="row[{$item.name}][]-{$key}" name="row[{$item.name}][]" type="checkbox" value="{$key}" data-tip="{$item.tip}" {in name="key" value="$item.value" }checked{/in} /> {$vo}</label>
{/foreach}
</div>
{/case}
{case radio}
<div class="radio">
{foreach name="item.content" item="vo"}
<label for="row[{$item.name}]-{$key}"><input id="row[{$item.name}]-{$key}" name="row[{$item.name}]" type="radio" value="{$key}" data-tip="{$item.tip}" {in name="key" value="$item.value" }checked{/in} /> {$vo}</label>
{/foreach}
</div>
{/case}
{case value="select" break="0"}{/case}
{case value="selects"}
<select {$item.extend_html} name="row[{$item.name}]{$item.type=='selects'?'[]':''}" class="form-control selectpicker" data-tip="{$item.tip}" {$item.type=='selects'?'multiple':''}>
{foreach name="item.content" item="vo"}
<option value="{$key}" {in name="key" value="$item.value" }selected{/in}>{$vo}</option>
{/foreach}
</select>
{/case}
{case value="image" break="0"}{/case}
{case value="images"}
<div class="form-inline">
<input id="c-{$item.name}" class="form-control" size="50" name="row[{$item.name}]" type="text" value="{$item.value|htmlentities}" data-tip="{$item.tip}">
<span><button type="button" id="faupload-{$item.name}" class="btn btn-danger faupload" data-input-id="c-{$item.name}" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="{$item.type=='image'?'false':'true'}" data-preview-id="p-{$item.name}"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-{$item.name}" class="btn btn-primary fachoose" data-input-id="c-{$item.name}" data-mimetype="image/*" data-multiple="{$item.type=='image'?'false':'true'}"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
<span class="msg-box n-right" for="c-{$item.name}"></span>
<ul class="row list-inline faupload-preview" id="p-{$item.name}"></ul>
</div>
{/case}
{case value="file" break="0"}{/case}
{case value="files"}
<div class="form-inline">
<input id="c-{$item.name}" class="form-control" size="50" name="row[{$item.name}]" type="text" value="{$item.value|htmlentities}" data-tip="{$item.tip}">
<span><button type="button" id="faupload-{$item.name}" class="btn btn-danger faupload" data-input-id="c-{$item.name}" data-multiple="{$item.type=='file'?'false':'true'}"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-{$item.name}" class="btn btn-primary fachoose" data-input-id="c-{$item.name}" data-multiple="{$item.type=='file'?'false':'true'}"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
<span class="msg-box n-right" for="c-{$item.name}"></span>
</div>
{/case}
{case switch}
<input id="c-{$item.name}" name="row[{$item.name}]" type="hidden" value="{:$item.value?1:0}">
<a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-{$item.name}" data-yes="1" data-no="0">
<i class="fa fa-toggle-on text-success {if !$item.value}fa-flip-horizontal text-gray{/if} fa-2x"></i>
</a>
{/case}
{case bool}
<label for="row[{$item.name}]-yes"><input id="row[{$item.name}]-yes" name="row[{$item.name}]" type="radio" value="1" {$item.value?'checked':''} data-tip="{$item.tip}" /> {:__('Yes')}</label>
<label for="row[{$item.name}]-no"><input id="row[{$item.name}]-no" name="row[{$item.name}]" type="radio" value="0" {$item.value?'':'checked'} data-tip="{$item.tip}" /> {:__('No')}</label>
{/case}
{case city}
<div style="position:relative">
<input {$item.extend_html} type="text" name="row[{$item.name}]" id="c-{$item.name}" value="{$item.value|htmlentities}" class="form-control" data-toggle="city-picker" data-tip="{$item.tip}" data-rule="{$item.rule}" />
</div>
{/case}
{case value="selectpage" break="0"}{/case}
{case value="selectpages"}
<input {$item.extend_html} type="text" name="row[{$item.name}]" id="c-{$item.name}" value="{$item.value|htmlentities}" class="form-control selectpage" data-source="{:url('general.config/selectpage')}?id={$item.id}" data-primary-key="{$item.setting.primarykey}" data-field="{$item.setting.field}" data-multiple="{$item.type=='selectpage'?'false':'true'}" data-tip="{$item.tip}" data-rule="{$item.rule}" />
{/case}
{case custom}
{$item.extend_html}
{/case}
{/switch}
</div>
<div class="col-sm-4"></div>
</div>
</td>
{if $Think.config.app_debug}
<td>{php}echo "{\$site.". $item['name'] . "}";{/php}</td>
<td>{if $item['id']>18}<a href="javascript:;" class="btn-delcfg text-muted" data-name="{$item.name}"><i class="fa fa-times"></i></a>{/if}</td>
{/if}
</tr>
{/foreach}
</tbody>
<tfoot>
<tr>
<td></td>
<td>
<div class="layer-footer">
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</td>
{if $Think.config.app_debug}
<td></td>
<td></td>
{/if}
</tr>
</tfoot>
</table>
</form>
</div>
</div>
{/foreach}
<div class="tab-pane fade" id="addcfg">
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="{:url('general.config/add')}">
{:token()}
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Group')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[group]" class="form-control selectpicker">
{foreach name="groupList" item="vo"}
<option value="{$key}" {in name="key" value="basic" }selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[type]" id="c-type" class="form-control selectpicker">
{foreach name="typeList" item="vo"}
<option value="{$key}" {in name="key" value="string" }selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label for="name" class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" class="form-control" id="name" name="row[name]" value="" data-rule="required; length(3~30); remote(general/config/check)"/>
</div>
</div>
<div class="form-group">
<label for="title" class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" class="form-control" id="title" name="row[title]" value="" data-rule="required"/>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label for="c-selectpage-table" class="control-label col-xs-12 col-sm-2">{:__('Selectpage table')}:</label>
<div class="col-xs-12 col-sm-4">
<select id="c-selectpage-table" name="row[setting][table]" class="form-control selectpicker" data-live-search="true">
<option value="">{:__('Please select table')}</option>
</select>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label for="c-selectpage-primarykey" class="control-label col-xs-12 col-sm-2">{:__('Selectpage primarykey')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[setting][primarykey]" class="form-control selectpicker" id="c-selectpage-primarykey"></select>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label for="c-selectpage-field" class="control-label col-xs-12 col-sm-2">{:__('Selectpage field')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[setting][field]" class="form-control selectpicker" id="c-selectpage-field"></select>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label class="control-label col-xs-12 col-sm-2">{:__('Selectpage conditions')}:</label>
<div class="col-xs-12 col-sm-8">
<dl class="fieldlist" data-name="row[setting][conditions]">
<dd>
<ins>{:__('Field title')}</ins>
<ins>{:__('Field value')}</ins>
</dd>
<dd><a href="javascript:;" class="append btn btn-sm btn-success"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
<textarea name="row[setting][conditions]" class="form-control hide" cols="30" rows="5"></textarea>
</dl>
</div>
</div>
<div class="form-group hidden tf tf-array">
<label for="c-array-key" class="control-label col-xs-12 col-sm-2">{:__('Array key')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" name="row[setting][key]" class="form-control" id="c-array-key">
</div>
</div>
<div class="form-group hidden tf tf-array">
<label for="c-array-value" class="control-label col-xs-12 col-sm-2">{:__('Array value')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" name="row[setting][value]" class="form-control" id="c-array-value">
</div>
</div>
<div class="form-group">
<label for="value" class="control-label col-xs-12 col-sm-2">{:__('Value')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" class="form-control" id="value" name="row[value]" value="" data-rule=""/>
</div>
</div>
<div class="form-group hide" id="add-content-container">
<label for="content" class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
<div class="col-xs-12 col-sm-4">
<textarea name="row[content]" id="content" cols="30" rows="5" class="form-control" data-rule="required(content)">value1|title1
value2|title2</textarea>
</div>
</div>
<div class="form-group">
<label for="tip" class="control-label col-xs-12 col-sm-2">{:__('Tip')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" class="form-control" id="tip" name="row[tip]" value="" data-rule=""/>
</div>
</div>
<div class="form-group">
<label for="rule" class="control-label col-xs-12 col-sm-2">{:__('Rule')}:</label>
<div class="col-xs-12 col-sm-4">
<div class="input-group pull-left">
<input type="text" class="form-control" id="rule" name="row[rule]" value="" data-tip="{:__('Rule tips')}"/>
<span class="input-group-btn">
<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" type="button">{:__('Choose')}</button>
<ul class="dropdown-menu pull-right rulelist">
{volist name="ruleList" id="item"}
<li><a href="javascript:;" data-value="{$key}">{$item}<span class="text-muted">({$key})</span></a></li>
{/volist}
</ul>
</span>
</div>
<span class="msg-box n-right" for="rule"></span>
</div>
</div>
<div class="form-group">
<label for="visible" class="control-label col-xs-12 col-sm-2">{:__('Visible condition')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" class="form-control" id="visible" name="row[visible]" value="" data-rule=""/>
</div>
</div>
<div class="form-group">
<label for="extend" class="control-label col-xs-12 col-sm-2">{:__('Extend')}:</label>
<div class="col-xs-12 col-sm-4">
<textarea name="row[extend]" id="extend" cols="30" rows="5" class="form-control" data-tip="{:__('Extend tips')}" data-rule="required(extend)" data-msg-extend="当类型为自定义时,扩展属性不能为空"></textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-4">
{if !$Think.config.app_debug}
<button type="button" class="btn btn-primary disabled">{:__('Only work at development environment')}</button>
{else/}
<button type="submit" class="btn btn-primary btn-embossed">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
{/if}
</div>
</div>
</form>
</div>
<!--@formatter:on-->
</div>
</div>
</div>

查看文件

@@ -0,0 +1,382 @@
<link rel="stylesheet" href="__CDN__/assets/element-ui-2.15.14/css/index.css">
<link rel="stylesheet" href="__CDN__/assets/css/vvv.css">
<style>
input[type="file"] {
display: none !important;
}
/*定义滚动条高宽及背景
高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar {
width: 10px;
height: 10px;
background-color: rgba(0, 0, 0, .2);
}
/*定义滚动条轨道
内阴影+圆角*/
::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
border-radius: 10px;
background-color: #F5F5F5;
}
/*定义滑块
内阴影+圆角*/
::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);
background-color: #ababab;
}
#vue {
display: flex;
background: #fff;
border-radius: 6px;
padding: 20px;
}
.el-tree .el-tree-node__content {
height: 40px;
}
.el-tree .el-tree-node__label {
font-size: 15px;
}
.tree-box {
width: 240px;
/*height: 100vh;*/
border-radius: 6px;
padding: 10px;
background: #fff;
border: 1px solid #f3f3f3;
}
.tree-box .header {
padding: 10px 0 10px 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.tree-box .header img {
width: 18px;
height: 18px;
}
.tree-box .header .name {
font-size: 14px;
}
.main {
width: 100%;
margin-left: 10px;
padding: 10px;
}
.main .header {
display: flex;
align-items: center;
justify-content: space-between;
}
.main .header .left {
display: flex;
align-items: center;
}
.main .header .left .select-all {
margin-left: 20px;
position: relative;
top: 3px;
}
.main .header .right {
display: flex;
align-items: center;
}
.main .file {
margin-top: 30px;
}
.main .file .title {
font-size: 14px;
margin-bottom: 25px;
}
.main .file-box {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
grid-gap: 20px 0;
align-content: center;
}
.main .file-box .file-list {
width: 130px;
height: 150px;
position: relative;
}
.main .file-box .file-list .file-item {
border-radius: 12px;
text-align: center;
padding: 21px;
}
.main .file-box .file-list .file-img-item {
height: 120px;
width: 120px;
border-radius: 12px;
position: relative;
background-size: contain;
text-align: center;
background-color: #f7f8fa;
display: grid;
place-items: center;
}
.main .file-box .file-list .file-item-bg {
background-color: #f7f8fa;
}
.main .file-box .file-list .tools {
position: absolute;
top: 0;
width: 120px;
height: 120px;
/*padding: 10px 8px 0 10px;*/
display: flex;
flex-direction: column;
justify-content: space-between;
cursor: pointer;
}
.main .file-box .file-list .tools .top {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
}
.main .file-box .file-list .tools .top .v-checked img {
width: 24px;
height: 24px;
}
.main .file-box .file-list .tools .top .v-checked-left {
margin-right: 8px;
}
.main .file-box .file-list .tools .bottom {
display: flex;
align-items: center;
background-image: linear-gradient(180deg, transparent, rgba(0, 0, 0, .5));
height: 30px;
}
.main .file-box .file-list .tools .bottom .v-icon {
}
.main .file-box .file-list .tools .bottom .v-icon img {
width: 16px;
height: 16px;
}
.main .file-box .file-list .file-name {
margin-top: 10px;
text-align: center;
font-size: 12px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.main .file-box .file-list .file-item .file-img {
cursor: pointer;
height: 78px;
width: 78px;
}
.main .file-box .file-list .file-img-item .file-image {
cursor: pointer;
vertical-align: middle;
max-width: 120px;
max-height: 120px;
-o-object-fit: contain;
object-fit: contain;
}
.input-with-select {
width: 270px;
margin-left: 8px;
}
.empty {
text-align: center;
margin-top: 200px;
font-weight: bold;
font-size: 22px;
}
.layout-pagination {
margin-top: 70px;
}
</style>
<div id="vue" v-cloak>
<div class="tree-box">
<div class="header">
<div class="name">文件目录</div>
<!-- <img src="/assets/img/add-add.png" alt="添加文件"> -->
</div>
<el-tree :data="navList" @node-click="handleClickNode"></el-tree>
</div>
<div class="main">
<div class="header">
<div class="left">
<el-button size="mini" @click="refreshPage" icon="el-icon-refresh" circle type="primary"></el-button>
<div class="select-all">
<el-checkbox @change="checkAllChange" v-model="checkAll">全选</el-checkbox>
</div>
</div>
<div class="right">
<el-button size="mini" @click="handleOpenNav" type="primary" plain icon="el-icon-folder">文件目录管理
</el-button>
{if ($multiple == 'true')}
<el-button size="mini" style="margin-left: 10px;" @click="onSelectFile([], 'multiple')" type="primary" plain icon="el-icon-check">选择
</el-button>
{/if}
<el-upload
style="margin-left: 10px;"
class="upload-img"
:data="{nav: search.nav}"
:multiple="true"
:show-file-list="false"
:before-upload="beforeFileUpload"
:on-success="uploadFileSuccess"
accept=".jpg,.jpeg,.gif,.png,.svg"
action="{:url('ajax/upload')}"
>
<el-button size="mini" type="success" plain icon="el-icon-upload">上传文件
</el-button>
</el-upload>
<el-button size="mini" style="margin-left: 10px;" @click="handleNavDialog" type="warning" plain icon="el-icon-right">归类
</el-button>
<el-button size="mini" style="margin-left: 10px;" @click="del" type="danger" plain icon="el-icon-document-delete">删除
</el-button>
<el-button size="mini" style="margin-left: 10px;" type="danger" @click="handleOpenRecycle" plain icon="el-icon-delete-solid">回收站
</el-button>
<el-select style="width: 120px;margin-left: 10px;" @change="handleOrderChange" size="mini" filterable v-model="search.order" placeholder="排序方式">
<el-option
v-for="item of sortList"
:key="item.id"
:label="item.value"
:value="item.id"
>
</el-option>
</el-select>
<el-input size="mini" v-model="search.keyword" clearable @clear="handleInpClear" placeholder="您可以输入相关内容搜索图片" class="input-with-select">
<el-button slot="append" @click="searchData" icon="el-icon-search"></el-button>
</el-input>
</div>
</div>
<div class="file">
<div class="title">
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item v-for="(item, index) of breadcrumb">
<a href="javascript:void(0);" @click="handleOpenDir(item.id)">{{item.name}}</a>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div v-if="dirList.length || fileList.length">
<div class="file-box">
<div v-if="currentPage == 1 && item.value > 0" v-for="(item, index) of dirList" @dblclick="handleOpenDir(item.value)" :key="item.id" class="file-list">
<div class="file-item">
<img class="file-img" src="/assets/img/directory.png" alt="">
</div>
<div class="file-name">{{item.label}}</div>
</div>
<div @click="handleSelectFile(index)" v-for="(item, index) of fileList" :key="item.id" class="file-list" @mouseenter="enterFileItem($event, index)" @mouseleave="leaveFileItem($event, index)">
<div class="file-img-item">
<img class="file-image" :src="item.mimetype.indexOf('image') >= 0 ? item.url : `/s.php/ajax/icon?suffix=${item.imagetype}`" alt="">
</div>
<div v-if="item.checked || item.showTools" class="tools">
<div class="top">
<div class="v-position"></div>
<div v-if="item.checked" class="v-checked v-checked-left">
<img src="/assets/img/okok.png" alt="">
</div>
</div>
<div class="bottom">
{if ($select)}
<div @click.stop="onSelectFile(item, 'one')" style="margin-left: 12px;" class="v-icon">
<img src="/assets/img/check-check.png" alt="">
</div>
{/if}
<div @click.stop="handleOpenFile(item.url)" style="margin: 0 12px;" class="v-icon">
<img src="/assets/img/see-see.png?id=1" alt="">
</div>
<div @click.stop="dell(item.id)" class="v-icon">
<img src="/assets/img/del-del.png?id=2" alt="">
</div>
</div>
</div>
<div class="file-name">{{item.filename}}</div>
</div>
</div>
<div class="layout-pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</div>
</div>
<div v-else class="empty">
暂无图片
</div>
</div>
</div>
<!-- 归类 -->
<div class="nav-dialog">
<el-dialog
:close-on-click-modal="false"
title="归类"
:visible.sync="navDialog"
width="40%"
>
<div class="form">
<el-form ref="form" :model="formData" label-width="90px">
<el-form-item label="所属分类:" prop="pid">
<el-cascader
style="width: 330px;"
:options="navList"
:props="{ checkStrictly: true }"
clearable
placeholder="选择所属分类"
filterable
v-model="formData.nav"
>
</el-cascader>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="navDialog = false" size="small" icon="el-icon-switch-button">取 消</el-button>
<el-button type="primary" size="small" @click="submitNav" icon="el-icon-position">提 交</el-button>
</span>
</el-dialog>
</div>
</div>
<script src="__CDN__/assets/element-ui-2.15.14/js/vue.js"></script>
<script src="__CDN__/assets/element-ui-2.15.14/js/index.js"></script>
<script src="__CDN__/assets/js/jquery-2.1.1.min.js"></script>

查看文件

@@ -0,0 +1,166 @@
<link rel="stylesheet" href="__CDN__/assets/element-ui-2.15.14/css/index.css">
<link rel="stylesheet" href="__CDN__/assets/css/vvv.css">
<style>
.el-form-item__label {
width: 120px !important;
}
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
input[type="file"] {
display: none !important;
}
.el-form-item__error {
margin-left: 30px;
}
.search-select .el-select .el-input__inner {
width: 130px;
}
.key .el-input__inner {
/*width: 240px !important;*/
}
.vue-table {
padding: 0;
}
</style>
<div id="vue" v-cloak>
<div class="screen-container">
<div class="screen-container-show">
<div class="screen-container-left display-flex">
<el-button size="small" @click="refreshPage" icon="el-icon-refresh" circle type="primary"></el-button>
<div class="datetime">
<el-date-picker
v-model="search.startTime"
type="datetime"
placeholder="选择起始时间">
</el-date-picker>
</div>
<div class="datetime">
<el-date-picker
v-model="search.endTime"
type="datetime"
placeholder="选择结束时间">
</el-date-picker>
</div>
</div>
<div class="search-select screen-container-right display-flex keyword">
<el-select v-model="search.typeIndex" @clear="handleClearSelect('typeIndex')" clearable placeholder="文件类型">
<el-option
v-for="item in typeList"
:key="item.index"
:label="item.name"
:value="item.index">
</el-option>
</el-select>
</div>
<div class="search-select screen-container-right display-flex keyword key">
<el-input @clear="handleClearSearchInp" clearable v-model="search.keyword" placeholder="请输入您要搜索的内容">
<el-select v-model="search.type" filterable clearable slot="prepend" placeholder="请选择">
<el-option v-for="(item, index) in searchOpt" :label="item.value"
:value="item.id">
</el-option>
</el-select>
<el-button slot="append" @click="searchData" icon="el-icon-search"></el-button>
</el-input>
</div>
<div class="screen-container-right display-flex keyword">
<el-button size="small" @click="restoreMany" type="success" plain icon="el-icon-check">恢复
</el-button>
<el-button size="small" @click="del" type="danger" plain icon="el-icon-delete">删除
</el-button>
</div>
</div>
</div>
<div class="vue-table background-white color-666">
<el-table
:data="tableData"
border
highlight-current-row v-loading="listLoading"
element-loading-text="拼命加载中..."
@selection-change="handleSelectionChange"
@sort-change="handleTableFieldSort"
style="width: 100%"
>
<el-table-column type="selection" width="60" align="center"></el-table-column>
<el-table-column prop="id" width="80" label="ID" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="category" width="200" label="所属分类" show-overflow-tooltip
align="center">
<template scope="scope">
<span>{{scope.row.navName}}</span>
</template>
</el-table-column>
<el-table-column prop="image" label="图片" width="100" align="center">
<template scope="scope">
<a v-if="scope.row.mimetype.indexOf('image') >= 0" style="cursor: pointer;" :href="scope.row.url" target="_blank">
<img :src="scope.row.url" style="border-radius: 10px;width: 50px;height: 50px;padding: 5px">
</a>
<a v-else style="cursor: pointer;" :href="`/s.php/ajax/icon?suffix=${scope.row.imagetype}`" target="_blank">
<img :src="`/s.php/ajax/icon?suffix=${scope.row.imagetype}`" style="border-radius: 10px;width: 50px;height: 50px;padding: 5px">
</a>
</template>
</el-table-column>
<el-table-column prop="filename" sortable="custom" width="220" label="文件名" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="imagewidth" width="100" label="宽" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="imageheight" width="100" label="高" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="mimetype" width="110" label="文件类型" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="imagetype" width="110" label="图片类型" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="storage" width="110" label="存储类型" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="createtime" sortable="custom" width="160" :formatter="dateFormat" label="创建日期" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column align="center" width="200" fixed="right" label="操作">
<template scope="scope">
<button @click="restore(scope.row.id)" type="button"
class="el-button el-button--success el-button--small"><i
class="el-icon-check"></i><span>恢复</span></button>
<button @click="dell(scope.row.id)" type="button"
class="el-button el-button--danger el-button--small"><i
class="el-icon-delete"></i><span>删除</span></button>
</template>
</el-table-column>
</el-table>
<div class="layout-pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</div>
</div>
</div>
<script src="__CDN__/assets/element-ui-2.15.14/js/vue.js"></script>
<script src="__CDN__/assets/element-ui-2.15.14/js/index.js"></script>
<script src="__CDN__/assets/tool/libs/moment.js"></script>
<script src="__CDN__/assets/js/jquery-2.1.1.min.js"></script>

查看文件

@@ -0,0 +1,145 @@
<link rel="stylesheet" href="__CDN__/assets/element-ui-2.15.14/css/index.css">
<link rel="stylesheet" href="__CDN__/assets/css/vvv.css">
<style>
.el-form-item__label {
width: 120px !important;
}
.el-tag + .el-tag {
margin-left: 10px;
}
.button-new-tag {
margin-left: 10px;
height: 32px;
line-height: 30px;
padding-top: 0;
padding-bottom: 0;
}
.input-new-tag {
width: 90px;
margin-left: 10px;
vertical-align: bottom;
}
input[type="file"] {
display: none !important;
}
.el-form-item__error {
margin-left: 30px;
}
.search-select .el-input--suffix .el-input__inner {
width: 130px;
}
</style>
<div id="vue" v-cloak>
<div class="screen-container">
<div class="screen-container-show">
<div class="screen-container-right display-flex keyword">
<el-button @click="openAddDialog('add', '')" size="small" type="primary" plain icon="el-icon-plus">添加
</el-button>
</div>
</div>
</div>
<div class="vue-table background-white color-666">
<el-table :data="tableData" border highlight-current-row v-loading="listLoading"
@sort-change="sortChange" element-loading-text="拼命加载中..."
@selection-change="handleSelectionChange"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
row-key="id"
style="width: 100%">
<el-table-column prop="id" width="120" label="编号" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="name" label="名称" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="sort" width="120" label="排序" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column prop="status" width="170" label="分类状态" show-overflow-tooltip
align="center">
<template scope="scope">
<el-switch
active-text="启用"
inactive-text="禁用"
v-model="scope.row.status"
:active-value="1"
:inactive-value="2"
@change="handleStatusChange(scope.row)"
>
</el-switch>
</template>
</el-table-column>
<el-table-column prop="create_time" width="160" :formatter="dateFormat" label="创建时间" show-overflow-tooltip
align="center"></el-table-column>
<el-table-column align="center" width="220" fixed="right" label="操作">
<template scope="scope">
<button @click="openAddDialog('edit', scope.row)" type="button"
class="el-button el-button--primary el-button--small"><i
class="el-icon-edit"></i><span>编辑</span></button>
<button @click="dell(scope.row.id)" type="button"
class="el-button el-button--danger el-button--small"><i
class="el-icon-delete"></i><span>删除</span></button>
</template>
</el-table-column>
</el-table>
<div class="layout-pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</div>
</div>
<!-- 添加编辑 -->
<div class="nav-dialog">
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="addDialog"
width="50%"
>
<div class="form">
<el-form ref="form" :rules="rules" :model="formData" label-width="90px">
<el-form-item label="所属上级:" prop="pid">
<el-select style="width: 330px;" v-model="formData.pid" clearable filterable placeholder="所属上级,不选择则为顶级。">
<el-option
v-for="item in tableData"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="名称:" prop="name">
<el-input style="width: 330px;" show-word-limit :maxlength="50" placeholder="请您输入名称" v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="排序:" prop="sort">
<el-input style="width: 330px;" type="number" placeholder="排序" v-model="formData.sort"></el-input>
</el-form-item>
<el-form-item label="是否启用:" prop="status">
<el-radio style="margin-right: 0;" v-model="formData.status" label="1" border size="small">是
</el-radio>
<el-radio v-model="formData.status" label="2" border size="small">否</el-radio>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialog = false" size="small" icon="el-icon-switch-button">取 消</el-button>
<el-button type="primary" size="small" @click="submit" icon="el-icon-position">提 交</el-button>
</span>
</el-dialog>
</div>
</div>
<script src="__CDN__/assets/element-ui-2.15.14/js/vue.js"></script>
<script src="__CDN__/assets/element-ui-2.15.14/js/index.js"></script>
<script src="__CDN__/assets/tool/libs/moment.js"></script>
<script src="__CDN__/assets/js/jquery-2.1.1.min.js"></script>

查看文件

@@ -0,0 +1,118 @@
<style>
.profile-avatar-container {
position: relative;
width: 100px;
margin: 0 auto;
}
.profile-avatar-container .profile-user-img {
width: 100px;
height: 100px;
}
.profile-avatar-container .profile-avatar-text {
display: none;
}
.profile-avatar-container:hover .profile-avatar-text {
display: block;
position: absolute;
height: 100px;
width: 100px;
background: #444;
opacity: .6;
color: #fff;
top: 0;
left: 0;
line-height: 100px;
text-align: center;
}
.profile-avatar-container button {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
opacity: 0;
}
</style>
<div class="row animated fadeInRight">
<div class="col-md-4">
<div class="box box-primary">
<div class="panel-heading">
{:__('Profile')}
</div>
<div class="panel-body">
<form id="update-form" role="form" data-toggle="validator" method="POST" action="{:url('general.profile/update')}">
{:token()}
<input type="hidden" id="c-avatar" name="row[avatar]" value="{$admin.avatar|htmlentities}"/>
<div class="box-body box-profile">
<div class="profile-avatar-container">
<img class="profile-user-img img-responsive img-circle" src="{$admin.avatar|cdnurl|htmlentities}" alt="">
<div class="profile-avatar-text img-circle">{:__('Click to edit')}</div>
<button type="button" id="faupload-avatar" class="faupload" data-input-id="c-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button>
</div>
<h3 class="profile-username text-center">{$admin.nickname|htmlentities}</h3>
<div class="form-group">
<label for="username" class="control-label">{:__('Username')}:</label>
<input type="text" class="form-control" id="username" name="row[username]" value="{$admin.username|htmlentities}" disabled/>
</div>
<div class="form-group">
<label for="mobile" class="control-label">{:__('Mobile')}:</label>
<input type="text" class="form-control" id="mobile" name="row[mobile]" value="{$admin.mobile|htmlentities}" disabled/>
</div>
<div class="form-group">
<label for="email" class="control-label">{:__('Email')}:</label>
<input type="text" class="form-control" id="email" name="row[email]" value="{$admin.email|htmlentities}" data-rule="required;email"/>
</div>
<div class="form-group">
<label for="nickname" class="control-label">{:__('Nickname')}:</label>
<input type="text" class="form-control" id="nickname" name="row[nickname]" value="{$admin.nickname|htmlentities}" data-rule="required"/>
</div>
<div class="form-group">
<label for="password" class="control-label">{:__('Password')}:</label>
<input type="password" class="form-control" id="password" placeholder="{:__('Leave password blank if dont want to change')}" autocomplete="new-password" name="row[password]" value="" data-rule="password"/>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">{:__('Submit')}</button>
<button type="reset" class="btn btn-default">{:__('Reset')}</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-md-8">
<div class="panel panel-default panel-intro panel-nav">
<div class="panel-heading">
<ul class="nav nav-tabs">
<li class="active"><a href="#one" data-toggle="tab"><i class="fa fa-list"></i> {:__('Admin log')}</a></li>
</ul>
</div>
<div class="panel-body">
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="one">
<div class="widget-body no-padding">
<div id="toolbar" class="toolbar">
{:build_toolbar('refresh')}
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>