Initial commit: 小众厨房项目代码

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

查看文件

@@ -0,0 +1,66 @@
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="">
</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-8">
<input id="c-type" class="form-control" name="row[type]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-content" class="form-control" name="row[content]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-images" class="form-control" size="50" name="row[images]" type="text">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline plupload-preview" id="p-images"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Phone')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-phone" class="form-control" name="row[phone]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
{foreach name="statusList" item="vo"}
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="0"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-remark" class="form-control" name="row[remark]" type="text">
</div>
</div>
<div class="form-group 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-success btn-embossed disabled">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</div>
</form>

查看文件

@@ -0,0 +1,68 @@
<link rel="stylesheet" href="__CDN__/assets/addons/shopro/libs/element/element.css">
<link rel="stylesheet" href="__CDN__/assets/addons/shopro/libs/common.css">
<style>
#feedbackDetail {
color: #444;
padding: 0 20px 30px;
background-color: #fff;
}
.el-input__inner,
.el-input__icon {
height: 34px;
line-height: 34px;
}
.el-form-item {
margin-bottom: 10px;
}
[v-cloak] {
display: none
}
</style>
<script src="__CDN__/assets/addons/shopro/libs/vue.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/element/element.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/moment.js"></script>
<div id="feedbackDetail" v-cloak>
<el-form :model="detailForm" ref="detailForm" label-width="100px" class="demo-detailForm">
<el-form-item label="反馈用户:">
<div v-if="detailForm.user && detailForm.user.nickname" class="theme-color cursor-pointer" @click="goUserDetail(detailForm.user.id)">
{{detailForm.user.nickname}}</div>
<span v-else>-</span>
</el-form-item>
<el-form-item label="反馈类型:">
<div>{{detailForm.type_text}}</div>
</el-form-item>
<el-form-item label="反馈内容:">
<div class="ellipsis-item">{{detailForm.content}}</div>
</el-form-item>
<el-form-item label="图片:">
<div class="display-flex">
<el-image v-if="detailForm.images" class="label-auto" v-for="ing in detailForm.images.split(',')" :src="Fast.api.cdnurl(ing)" :preview-src-list="detailForm.images_arr"
style="border-radius: 4px;margin-right: 5px;">
</el-image>
<spanv-else>-</span>
</div>
</el-form-item>
<el-form-item label="联系电话:">
<div v-if="detailForm.phone">{{detailForm.phone}}</div>
<div v-else>-</div>
</el-form-item>
<el-form-item label="是否处理:" prop="status">
<el-radio-group v-model="detailForm.status">
<el-radio :label="0">未处理</el-radio>
<el-radio :label="1">已处理</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="处理备注:" prop="remark">
<el-input v-model="detailForm.remark" placeholder="请输入处理备注" size="small"></el-input>
</el-form-item>
</el-form>
<div class="dialog-footer">
<div @click="submitFrom" class="dialog-cancel-btn display-flex-c cursor-pointer">取消</div>
<div @click="submitFrom('yes')" class="dialog-define-btn display-flex-c cursor-pointer">确定
</div>
</div>
</div>

查看文件

@@ -0,0 +1,450 @@
<link rel="stylesheet" href="__CDN__/assets/addons/shopro/libs/element/element.css">
<link rel="stylesheet" href="__CDN__/assets/addons/shopro/libs/common.css">
<style>
#feedbackIndex {
color: #444;
background: #fff;
}
.custom-header {
padding: 0 20px;
margin-bottom: 10px;
}
.color-7536D0 {
color: #7536D0;
cursor: pointer;
}
.common-btn {
height: 32px;
cursor: pointer;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}
.el-input__inner,
.el-input__icon {
line-height: 32px;
height: 32px;
}
.btn-box {
display: flex;
align-items: center;
margin-bottom: 20px;
justify-content: space-between;
}
.refresh-btn {
width: 32px;
border: 1px solid #E6E6E6;
font-size: 14px;
margin-right: 20px;
}
.create-goods,
.add-params,
.add-level1-sku {
width: 98px;
background: #7536D0;
color: #fff;
}
.create-goods {
margin-right: 40px;
}
.create-goods span,
.add-params span,
.add-level1-sku span {
margin-left: 8px;
}
.platform-name span {
display: flex;
}
.goods-img {
width: 34px;
height: 34px;
margin-right: 10px;
border: 1px solid #e6e6e6;
}
.display-flex {
display: flex;
align-items: center;
}
.label-auto {
width: 100%;
height: 100%;
}
.one-ellipsis {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.sort-order {
margin-left: 6px;
color: #C0C4CC;
flex-direction: row-reverse;
}
.recycle-btn {
width: 88px;
color: #444;
border: #444 1px solid;
}
.recycle-btn i {
margin-right: 6px;
font-size: 14px;
}
.status-box {
width: 100%;
justify-content: space-between;
}
.status-btn {
width: 56px;
height: 26px;
border: 1px solid #7438D5;
color: #7438D5;
font-size: 12px;
}
.status-btn-2 {
color: #FF5959;
border-color: #FF5959;
}
.status-btn-3 {
color: #999;
border-color: #999;
}
.icon-top {
margin-left: -5px;
}
.edit-text,
.del-text,
.enable-text,
.disable-text {
cursor: pointer;
color: #444;
margin-right: 14px;
}
.edit-text {
color: #7438D5;
}
.enable-text {
color: #01CFA1;
}
.del-text {
color: #FF5959;
}
.el-popover {
left: 46px;
top: 10px;
padding: 16px;
}
.choose-container {
margin-bottom: 10px;
color: #666;
}
.custom-choose,
.custom-choose-type,
.custom-choose-sub {
height: 50px;
border-radius: 4px;
justify-content: space-between;
padding: 0 20px;
background: #fff;
}
.custom-choose-type,
.custom-choose-sub {
justify-content: flex-start;
}
.custom-choose-sub {
height: 70px;
padding: 0 10px 20px 20px;
}
.choose-status-tip {
margin-right: 12px;
}
.custom-choose-type-tip {
margin-right: 16px;
}
.choose-btn {
width: 80px;
border: 1px solid #E6E6E6;
margin-right: 10px;
height: 30px;
}
.choose-btn-active {
background-color: #7536D0;
border: none;
color: #fff;
}
.custom-table {
/* padding: 20px 20px 30px; */
padding: 0px 20px 30px;
background: #fff;
}
label {
margin-bottom: 0;
}
.page-container {
justify-content: flex-end;
margin-top: 30px;
}
.goods-title {
margin-bottom: 4px;
width: 154px;
line-height: 14px;
}
.activity-type {
justify-content: space-around;
}
.activity-type-btn {
width: 40px;
height: 20px;
padding-top: 2px;
border-radius: 4px;
color: #fff;
justify-content: center;
}
.groupon-btn {
background: #A17BDF;
}
.seckill-btn {
background: #FE9387;
}
.score-btn {
background: #FBB74A;
}
.el-table .bg-color {
background: #f9f9f9;
}
.cell-left .cell {
justify-content: flex-start !important;
}
.el-table_1_column_11.is-leaf,
.el-table_1_column_11 {
border-color: #EBEEF5 !important;
}
.avatar-img {
width: 26px;
height: 26px;
border: 1px solid #E5E5E5;
}
.el-popover {
padding-bottom: 6px;
color: #444;
}
.popover-container>div {
margin-bottom: 10px;
}
.popover-tip {
width: 56px;
color: #666;
text-align: justify;
text-align-last: justify;
}
.custom-table {
padding-top: 14px;
}
.user-avatar {
margin-right: 20px;
}
.no-handle{
color: #FF5959;
}
.yes-handle{
color: #18d3a9;
}
[v-cloak] {
display: none
}
</style>
<script src="__CDN__/assets/addons/shopro/libs/vue.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/element/element.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/Sortable.min.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/vuedraggable.js"></script>
<script src="__CDN__/assets/addons/shopro/libs/moment.js"></script>
<div id="feedbackIndex" v-cloak>
<div class="custom-header display-flex">
<div class="choose-status" style="font-size: 14px;">
反馈列表
</div>
<div class="custom-search">
<el-input placeholder="请输入搜索内容" suffix-icon="el-icon-search" v-model="searchKey">
</el-input>
</div>
</div>
<div class="display-flex-b" style="padding: 0 20px;">
<div class="custom-refresh display-flex-c" @click="getData">
<i class="el-icon-refresh"></i>
</div>
{if condition = "$auth->check('shopro/feedback/recyclebin')"}
<div class="recycle-btn display-flex-c" @click="operation('recyclebin')">
<i class="fa fa-recycle"></i>
回收站
</div>
{/if}
</div>
<div class="custom-table">
<div class="custom-table-border">
<el-table ref="multipleTable" :data="data" tooltip-effect="dark" style="width: 100%" border
:row-class-name="tableRowClassName" :cell-class-name="tableCellClassName"
:header-cell-class-name="tableCellClassName" @row-dblclick="operation">
<el-table-column label="ID" prop="id" min-width="60">
</el-table-column>
<el-table-column label="反馈用户" min-width="200">
<template slot-scope="scope">
<div class="display-flex" v-if="scope.row.user.nickname" @click="goUserDetail(scope.row.user.id)">
<div class="avatar-img user-avatar">
<el-image v-if="scope.row.user.avatar"
:src="Fast.api.cdnurl(scope.row.user.avatar)"
:preview-src-list="scope.row.user.avatar_arr">
</el-image>
</div>
<div class="ellipsis-item theme-color cursor-pointer">
{{scope.row.user.nickname}}
</div>
</div>
<div v-else>-</div>
</template>
</el-table-column>
<el-table-column label="反馈类型" min-width="160">
<template slot-scope="scope">
<div class="ellipsis-item">{{scope.row.type_text}}</div>
</template>
</el-table-column>
<el-table-column label="反馈内容" min-width="110">
<template slot-scope="scope">
<div><span class="ellipsis-item" v-if="scope.row.content">{{scope.row.content}}</span><span
v-else>-</span></div>
</template>
</el-table-column>
<el-table-column label="图片" min-width="60">
<template slot-scope="scope">
<div v-if="scope.row.images">
<el-image class="avatar-img"
:src="Fast.api.cdnurl(scope.row.images.split(',')[0])"
:preview-src-list="scope.row.images_arr">
</el-image>
</div>
<div v-else>-</div>
</template>
</el-table-column>
<el-table-column label="联系电话" width="110">
<template slot-scope="scope">
<div class="display-flex-c">
<span v-if="scope.row.phone">{{scope.row.phone}}</span>
<span v-else>-</span>
</div>
</template>
</el-table-column>
<el-table-column label="是否处理" min-width="120">
<template slot-scope="scope">
<!-- <div class="display-flex-c">
<span :class="scope.row.status==0?'no-handle':'yes-handle'">{{scope.row.status_text}}</span>
</div> -->
<div class="display-flex">
<span v-if="scope.row.status==1" class="display-flex">
<span class="shopro-status-dot shopro-status-normal-dot"></span>
<span class="shopro-status-normal">{{scope.row.status_text}}</span>
</span>
<span v-else-if="scope.row.status==0" class="display-flex">
<span class="shopro-status-dot shopro-status-default-dot"></span>
<span class="shopro-status-default">{{scope.row.status_text}}</span>
</span>
</div>
</template>
</el-table-column>
<el-table-column label="处理备注" prop="remark" min-width="120">
<template slot-scope="scope">
<div class="display-flex-c">
<span v-if="scope.row.remark">{{scope.row.remark}}</span>
<span v-else>-</span>
</div>
</template>
</el-table-column>
<el-table-column label="创建时间" min-width="160">
<template slot-scope="scope">
<div>
{{moment(scope.row.createtime*1000).format("YYYY-MM-DD HH:mm:ss")}}
</div>
</template>
</el-table-column>
<el-table-column label="更新时间" min-width="160">
<template slot-scope="scope">
<div>
{{moment(scope.row.updatetime*1000).format("YYYY-MM-DD HH:mm:ss")}}
</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" min-width="134">
<template slot-scope="scope">
<div>
{if condition = "$auth->check('shopro/feedback/detail')"}
<span class="edit-text" @click="operation('edit',scope.row.id)">查看详情</span>
{/if}
{if condition = "$auth->check('shopro/feedback/del')"}
<span class="del-text" @click="operation('del',scope.row.id)">删除</span>
{/if}
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="page-container display-flex">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="limit"
layout="total, sizes, prev, pager, next, jumper" :total="totalPage">
</el-pagination>
</div>
</div>
</div>

查看文件

@@ -0,0 +1,25 @@
<div class="panel panel-default panel-intro">
{:build_heading()}
<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')}
<a class="btn btn-info btn-multi btn-disabled disabled {:$auth->check('shopro/feedback/restore')?'':'hide'}" href="javascript:;" data-url="shopro/feedback/restore" data-action="restore"><i class="fa fa-rotate-left"></i> {:__('Restore')}</a>
<a class="btn btn-danger btn-multi btn-disabled disabled {:$auth->check('shopro/feedback/destroy')?'':'hide'}" href="javascript:;" data-url="shopro/feedback/destroy" data-action="destroy"><i class="fa fa-times"></i> {:__('Destroy')}</a>
<a class="btn btn-success btn-restoreall {:$auth->check('shopro/feedback/restore')?'':'hide'}" href="javascript:;" data-url="shopro/feedback/restore" title="{:__('Restore all')}"><i class="fa fa-rotate-left"></i> {:__('Restore all')}</a>
<a class="btn btn-danger btn-destroyall {:$auth->check('shopro/feedback/destroy')?'':'hide'}" href="javascript:;" data-url="shopro/feedback/destroy" title="{:__('Destroy all')}"><i class="fa fa-times"></i> {:__('Destroy all')}</a>
</div>
<table id="table" class="table table-striped table-bordered table-hover"
data-operate-restore="{:$auth->check('shopro/feedback/restore')}"
data-operate-destroy="{:$auth->check('shopro/feedback/destroy')}"
width="100%">
</table>
</div>
</div>
</div>
</div>
</div>