添加上传文件到OSS

This commit is contained in:
wangxiaowei 2024-07-20 17:44:02 +08:00
parent e275f76813
commit cc66900147
6 changed files with 621 additions and 1 deletions

@ -0,0 +1,47 @@
<?php
namespace app\admin\controller;
use app\admin\logic\live\LiveGoodsLogic;
use app\admin\logic\live\LiveRoomLogic;
use app\admin\logic\MallNewsLogic;
use app\common\basics\AdminBase;
use app\common\server\JsonServer;
use think\Exception;
class MallNews extends AdminBase
{
public function lists()
{
if ($this->request->isAjax()) {
$get = $this->request->get();
$lists = LiveGoodsLogic::lists($get);
return JsonServer::success('', $lists);
}
return view('', [
'shop' => LiveRoomLogic::shopLists()
]);
}
public function add()
{
return view('');
}
public function edit()
{
}
/**
* 上传视频到OSS
*/
public function uploadVideo()
{
$result = MallNewsLogic::uploadVideo();
if ($result['code'] == 1) {
return JsonServer::success('', $result['data']);
}
return JsonServer::error('', $result['msg']);
}
}

@ -0,0 +1,40 @@
<?php
namespace app\admin\logic;
use app\common\basics\Logic;
use app\common\server\ConfigServer;
use app\common\server\storage\Driver as StorageDriver;
use think\facade\Config;
class MallNewsLogic extends Logic
{
private static $MAX_UPLOAD_SIZE = 50 * 1024 * 1024;
private static $FILE_PATH = 'mall_news/video';
public static function uploadVideo()
{
$file = request()->file('file');
if ($file->getSize() > self::$MAX_UPLOAD_SIZE) {
return ['code' => -1, 'msg' => '视频最大上传为50M'];
}
$config = [
'default' => ConfigServer::get('storage', 'default', 'local'),
'engine' => ConfigServer::get('storage_engine') ?? ['local'=>[]]
];
$StorageDriver = new StorageDriver($config);
$StorageDriver->setUploadFile('file');
if (!$StorageDriver->upload(self::$FILE_PATH)) {
return ['code' => -1, 'msg' => '上传错误'];
}
$fileName = $StorageDriver->getFileName();
if ($fileName) {
return ['code' => 1, 'msg' => '', 'data' => array('file' => Config::get('aliyunoss.domain') . self::$FILE_PATH . '/'. $fileName)];
}
return ['code' => -1, 'msg' => '上传失败'];
}
}

@ -0,0 +1,243 @@
{layout name="layout2" /}
<style>
.layui-form {padding: 20px 30px;background-color: #ffffff;}
.layui-form-item .layui-form-label { width: 95px; }
.layui-form-item .layui-input-inline { width: 240px; }
.layui-form-item .map-container{ width: 600px; height: 400px; margin-left: 100px; margin-top: 20px; }
#video-block {position: relative; width: 700px;height: 300px}
</style>
<div class="layui-card layui-form">
<div class="layui-tab-item layui-show">
<div class="layui-form-item">
<label for="title" class="layui-form-label"><span style="color:red;">*</span>标题:</label>
<div class="layui-input-inline">
<input type="text" name="title" id="title" lay-verType="tips" lay-verify="title"
switch-tab="0" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>文章类型:</label>
<div class="layui-input-inline">
<input type="radio" name="type" value="0" title="文章" checked lay-filter="article">
<input type="radio" name="type" value="1" title="视频" lay-filter="video">
</div>
</div>
<div id="mall-image" class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>图片:</label>
<div class="layui-input-block">
<div class="like-upload-image" switch-tab="0" lay-verType="tips" lay-verify="logo">
<div class="upload-image-elem"><a class="add-upload-image"> + 添加图片</a></div>
</div>
</div>
</div>
<div id="mall-video" class="layui-form-item" style="display: none">
<label class="layui-form-label"><span style="color:red;">*</span>视频:</label>
<div id="upload-video-block" class="layui-input-block">
<div class="like-upload-image" switch-tab="0" lay-verType="tips" lay-verify="logo">
<div class="upload-image-elem"><a class="add-upload-video"> + 上传视频</a></div>
</div>
</div>
<div id="video-block" style="display: none">
<div class="del-upload-btn" style="visibility: inherit">x</div>
<video src="https://zjeloong.oss-cn-hangzhou.aliyuncs.com/mall_news/video/20240720172404a4dc53630.mp4" controls></video>
</div>
</div>
<div class="layui-form-item">
<label for="shop_name" class="layui-form-label"><span style="color:red;">*</span>商品名称:</label>
<div class="layui-input-inline">
<input type="text" name="shop_name" id="shop_name" lay-verType="tips" lay-verify="shop_name"
switch-tab="0" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>是否置顶:</label>
<div class="layui-input-inline">
<input type="radio" name="is_top" value="0" title="否" checked>
<input type="radio" name="is_top" value="1" title="是">
</div>
</div>
<div class="layui-form-item">
<label for="order" class="layui-form-label"><span style="color:red;">*</span>排序:</label>
<div class="layui-input-inline">
<input type="text" name="order" id="order" lay-verType="tips" lay-verify="title"
switch-tab="0" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>文章详情:</label>
<div class="layui-input-block">
<textarea name="content" id="content" lay-verify="content"></textarea>
</div>
</div>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="addSubmit" id="addSubmit" value="确认">
</div>
</div>
<script src="__PUBLIC__/static/common/js/area.js"></script>
<script>
layui.config({
base: "/static/lib/"
}).extend({
likeedit: 'likeedit/likeedit',
likeArea: "likeArea/likeArea",
txMap: "likeMap/txMap"
}).use(["form", "laydate", "likeArea", "txMap", 'likeedit', 'upload', 'element'], function(){
var $ = layui.$;
var form = layui.form;
var laydate = layui.laydate;
var likeedit = layui.likeedit;
var likeupload = layui.upload;
var element = layui.element;
form.on('radio(article)', function(data){
if(data.value =='0'){
$("#mall-image").show()
$("#mall-video").hide()
}
});
form.on('radio(video)', function(data){
if(data.value =='1'){
$("#mall-image").hide()
$("#mall-video").show()
}
});
laydate.render({type:"datetime", elem:"#expire_time", trigger:"click",min:0});
like.delUpload();
$(document).on("click", ".add-upload-image", function () {
like.imageUpload({
limit: 1,
field: "logo",
that: $(this)
});
});
// 视频上传
likeupload
var uploadInst = likeupload.render({
elem: '.add-upload-video' //绑定元素
,url: "{:url('MallNews/uploadVideo')}" //上传接口
,exts: "mp4"
,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
layer.load(); //上传loading
}
,done: function(res, index, upload){
if (res.code === 1) {
$("#upload-video-block").hide()
$("#video-block").show()
} else {
layer.msg('上传错误');
return false;
}
layer.closeAll('loading'); //关闭loading
}
,error: function(index, upload){
layer.msg('上传错误');
layer.closeAll('loading'); //关闭loading
}
});
//------------------------------------------富文本编辑器 begin --------------------------------
likeedit.set({
uploadImage: {
url: '{:url("file/lists")}?type=10',
type: 'post'
}
});
var likeedit_index = likeedit.build('content');
form.verify({
content: function () {
likeedit.sync(likeedit_index)
}
});
//------------------------------------------富文本编辑器 end --------------------------------
form.verify({
name: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请填写商家名称";
}
},
cid: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请选择主营类目";
}
},
nickname: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请填写联系人";
}
},
mobile: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请填写联系手机号";
}
},
logo: function (value, item) {
if (!value) {
if ($(item).find(".upload-image-div").length <= 0) {
switchTab($(item).attr("switch-tab"))
return "请上传商家logo";
}
}
},
expire_time: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请选择到期时间";
}
},
trade_service_fee: function (value, item) {
if (!value && parseInt(value) !== 0) {
switchTab($(item).attr("switch-tab"));
return "请填写交易服务费";
}
},
account: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请填写商家账号";
}
},
password: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请填写商家登录密码";
}
},
pwd: function (value, item) {
if (!value) {
switchTab($(item).attr("switch-tab"));
return "请填确认商家登录密码";
}
}
});
function switchTab(number) {
$('.layui-tab-card .layui-tab-title li').removeClass('layui-this');
$('.layui-tab-content .layui-tab-item').removeClass('layui-show');
$('.layui-tab-card .layui-tab-title li').eq(number).addClass('layui-this');
$('.layui-tab-content .layui-tab-item').eq(number).addClass('layui-show');
}
})
</script>

@ -0,0 +1,279 @@
{layout name="layout1" /}
<style>
.layui-table-cell {
height: auto;
white-space: normal;
}
</style>
<div class="wrapper">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-collapse like-layui-collapse">
<div class="layui-colla-item">
<h2 class="layui-colla-title like-layui-colla-title">操作提示</h2>
<div class="layui-colla-content layui-show">
<p>* 商家提交直播商品后,平台审核后,将交由微信再次进行审核;</p>
<p>* 直播商品每天最多可添加500次,删除商品每天最多可删除1000次。</p>
</div>
</div>
</div>
</div>
<!-- 搜索区域 -->
<div class="layui-card-body layui-form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">商家名称:</label>
<div class="layui-input-block">
<select name="shop_id" id="shop_id">
<option value="">全部</option>
{foreach $shop as $val}
<option value="{$val.id}">{$val.name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-inline">
<label for="goods_name" class="layui-form-label">商品名称:</label>
<div class="layui-inline" style="margin-right:0;">
<div class="layui-input-inline" >
<input type="text" id="goods_name" name="goods_name" placeholder="请输入商品名称"
autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-inline">
<a class="layui-btn layui-btn-sm layui-btn-normal" lay-submit lay-filter="search">搜索</a>
<a class="layui-btn layui-btn-sm layui-btn-primary" lay-submit lay-filter="clear-search">重置</a>
</div>
</div>
</div>
<div class="layui-tab layui-tab-card" lay-filter="tab-all">
<div class="layui-tab-item layui-show">
<div class="layui-card">
<div class="layui-card-body">
<button type="button" id="add-mail-news" class="layui-btn layui-btn-normal layui-btn-sm layEvent">添加</button>
<table id="like-table-lists" lay-filter="like-table-lists"></table>
<script type="text/html" id="operation">
{{# if(d.sys_audit_status < 1 ){ }}
<a class="layui-btn layui-btn-normal layui-btn-sm" lay-event="audit">审核</a>
{{# } }}
<a class="layui-btn layui-btn-primary layui-btn-sm" lay-event="detail">详情</a>
{{# if(d.sys_audit_status > 1 ){ }}
<a class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del">删除</a>
{{# } }}
</script>
<!-- 商品信息 -->
<script type="text/html" id="table-goods">
<div class="goods-content">
<div style="text-align: left;">
<img src="{{ d.cover_img }}" style="height:80px;width: 80px" class="image-show">
<div class="layui-input-inline ">
<span class="">{{ d.name }}</span>
</div>
</div>
</div>
</script>
<!-- 商品价格 -->
<script type="text/html" id="table-price">
<div class="price-content">
<span>{{ d.price_text }}</span>
</div>
</script>
<!-- 审核状态 -->
<script type="text/html" id="table-audit">
<div class="audit-content">
<span>{{ d.audit_status_text }}</span>
<span>{{ d.audit_remark }}</span>
</div>
</script>
<!-- 商家状态 -->
<script type="text/html" id="table-shop">
<img src="{{d.shop.logo}}" alt="图标" style="width:60px;height:60px;margin-right:5px;">
<div class="layui-inline" style="text-align:left;">
<p>商家名称:{{d.shop.name}}</p>
<p>商家类型:{{d.shop.type_desc}}</p>
</div>
</script>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
layui.use(['table', 'laydate', 'form'], function () {
var $ = layui.$
, table = layui.table
, element = layui.element
, form = layui.form
, status = 'all';
form.on("submit(search)", function(data){
table.reload("like-table-lists", {
where: data.field,
page: {
curr: 1
}
});
});
form.on("submit(clear-search)", function(){
$("#goods_name").val("");
$("#shop_id").val("");
form.render();
table.reload("like-table-lists", {
where: {},
page: {
curr: 1
}
});
});
getList();
element.on('tab(tab-all)', function (data) {
status = $(this).attr('data-type');
getList();
});
function getList() {
like.tableLists("#like-table-lists", '{:url("live.LiveGoods/lists")}?status=' + status, [
{field: 'goodsId', width: 80, title: 'ID', sort: true, hide: true}
,{field:"storeInfo", title:"商家信息", templet:"#table-shop", width:250}
, {field: 'goods_info', title: '商品信息', width: 300, templet:'#table-goods'}
, {field: 'price', title: '商品价格', width: 200, align: 'center',templet: '#table-price'}
, {field: 'url', title: '商品链接', width: 320, align: 'center'}
, {field: 'audit_status', title: '状态', width: 200, align: 'center', templet:'#table-audit'}
, {fixed: 'right', title: '操作', width: 150, align: 'center', toolbar: '#operation'}
]);
}
//图片放大
$(document).on('click', '.image-show', function () {
var src = $(this).attr('src');
like.showImg(src, 400);
});
//添加快讯
$(document).on('click', '#add-mail-news', function () {
layer.open({
type: 2
, title: '添加快讯'
, content: '{:url("MallNews/add")}'
, area: ['90%', '90%']
, yes: function (index, layero) {
var iframeWindow = window['layui-layer-iframe' + index]
, submitID = 'addSubmit'
, submit = layero.find('iframe').contents().find('#' + submitID);
iframeWindow.layui.form.on('submit(' + submitID + ')', function (data) {
var field = data.field;
console.log(field);
like.ajax({
url: '{:url("live.LiveGoods/audit")}',
data: field,
type: "post",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg, {offset: '15px', icon: 1, time: 1000});
layer.close(index);
table.reload('like-table-lists');
}
}
});
});
submit.trigger('click');
}
});
});
//事件
var active = {
add: function() {
console.log(123)
},
audit: function (obj) {
layer.open({
type: 2
, title: '审核'
, content: '{:url("live.LiveGoods/audit")}?id=' + obj.data.id
, area: ['90%', '90%']
, yes: function (index, layero) {
var iframeWindow = window['layui-layer-iframe' + index]
, submitID = 'addSubmit'
, submit = layero.find('iframe').contents().find('#' + submitID);
iframeWindow.layui.form.on('submit(' + submitID + ')', function (data) {
var field = data.field;
console.log(field);
like.ajax({
url: '{:url("live.LiveGoods/audit")}',
data: field,
type: "post",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg, {offset: '15px', icon: 1, time: 1000});
layer.close(index);
table.reload('like-table-lists');
}
}
});
});
submit.trigger('click');
}
});
},
detail: function (obj) {
layer.open({
type: 2
, title: '商品信息'
, content: '{:url("live.LiveGoods/detail")}?id=' + obj.data.id
, area: ['90%', '90%']
, yes: function (index, layero) {
}
});
},
// 同步商品库
sync: function () {
table.reload('like-table-lists');
},
// 删除
del: function (obj) {
layer.confirm('确定要删除商品:' + obj.data.name, function (index) {
like.ajax({
url: '{:url("live.LiveGoods/del")}',
data: {id: obj.data.id},
type: "post",
success: function (res) {
if (res.code === 1) {
layui.layer.msg(res.msg, {offset: '15px', icon: 1, time: 1000});
layer.close(index);
obj.del();
}
}
});
layer.close(index);
})
}
};
// 监听表格右侧工具条
table.on('tool(like-table-lists)', function (obj) {
var type = obj.event;
active[type] ? active[type].call(this, obj) : '';
});
// 绑定点击按钮事件
$('.layui-btn.layuiadmin-btn').on('click', function () {
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

@ -57,7 +57,10 @@
} }
}, },
"config": { "config": {
"preferred-install": "dist" "preferred-install": "dist",
"allow-plugins": {
"easywechat-composer/easywechat-composer": true
}
}, },
"scripts": { "scripts": {
"post-autoload-dump": [ "post-autoload-dump": [

8
config/aliyunoss.php Normal file

@ -0,0 +1,8 @@
<?php
return [
"bucket" => "zjeloong",
"access_key_id" => "LTAI5t5dcGDXvRSM9k2MAtqC",
"access_key_secret" => "X2cRzvWbtKpzSip8o3m8URJKFo1piJ",
"domain" => "https://zjeloong.oss-cn-hangzhou.aliyuncs.com/"
];