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>