feat: #10000 团购修改,前端优化

This commit is contained in:
赵世界 2022-10-25 22:08:55 +08:00
parent 7e44bd1a27
commit fcb0ad5208
7 changed files with 93 additions and 42 deletions

View File

@ -24,6 +24,7 @@ use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use App\Models\DailyStockRecord; use App\Models\DailyStockRecord;
use App\Models\Shop;
class GoodsSkusController extends Controller class GoodsSkusController extends Controller
{ {
@ -107,11 +108,24 @@ class GoodsSkusController extends Controller
public function show($id) public function show($id)
{ {
return new GoodsSkuResource(GoodsSku::query() $sku = GoodsSku::query()
->with(['goods' => function ($query) { ->with(['goods' => function ($query) {
$query->with(['type:id,name', 'brand:id,name']); $query->with(['type:id,name', 'brand:id,name']);
}]) }])
->find($id)); ->find($id)
->toArray();
$shops = Shop::query()->get(['id', 'name'])->toArray();
if (empty($sku['thumb_url'])) {
foreach ($shops as $shop) {
$sku['thumb_url'][] = [
'shop_id' => $shop['id'],
'shop_name' => $shop['name'],
'img_url' => '',
];
}
}
return ['data' => $sku];
} }
public function update($id, Request $request) public function update($id, Request $request)

View File

@ -27,7 +27,8 @@ class UploadController extends Controller
]; ];
} }
$this->addLog(0, 'add'); $this->addLog(0, 'add');
$this->res['resource'] = UploadUtils::putForUploadedFile('image', $request->uploadFile); $this->res['resource'] = UploadUtils::getFullImgUrl(UploadUtils::putForUploadedFile('image', $request->uploadFile));
$this->res['shop_id'] = $request->get('shop_id') ?: 0;
return response($this->res, $this->res['httpCode']); return response($this->res, $this->res['httpCode']);
} }

View File

@ -32,6 +32,7 @@ class GoodsSku extends Model
'yesterday_num', 'yesterday_num',
'reference_price', 'reference_price',
'reserve', 'reserve',
'thumb_url'
]; ];
protected $hidden = ['created_at']; protected $hidden = ['created_at'];
@ -52,6 +53,17 @@ class GoodsSku extends Model
return $map[$value]; return $map[$value];
} }
public function setThumbUrlAttribute($value)
{
$this->attributes['thumb_url'] = json_encode($value, 256);
}
public function getThumbUrlAttribute($value)
{
return json_decode($value, true);
}
/** /**
* 此规格从属于一个商品 * 此规格从属于一个商品
*/ */

View File

@ -4,6 +4,7 @@ namespace App\Services\Business\KuaiTuanTuan;
use App\Models\Groups as GroupsModel; use App\Models\Groups as GroupsModel;
use App\Models\GroupGoods; use App\Models\GroupGoods;
use App\Utils\ArrayUtils;
use App\Utils\DateTimeUtils; use App\Utils\DateTimeUtils;
class Groups class Groups
@ -14,13 +15,15 @@ class Groups
$group = GroupsModel::query()->where('parent_id', $localGroupId)->where('shop_id', $shop->id)->first(); $group = GroupsModel::query()->where('parent_id', $localGroupId)->where('shop_id', $shop->id)->first();
$groupGoods = GroupGoods::query() $groupGoods = GroupGoods::query()
->where('group_id', $group->parent_id) ->where('group_id', $group->parent_id)
->with(['goodsSku:id,stock']) ->with(['goodsSku:id,stock,thumb_url'])
->orderBy('sort') ->orderBy('sort')
->get(); ->get();
$goodsSkus = []; $goodsSkus = [];
$operator = substr($shop->ratio, 0, 1); $operator = substr($shop->ratio, 0, 1);
$ratio = (float)trim(substr($shop->ratio, 1)); $ratio = (float)trim(substr($shop->ratio, 1));
foreach ($groupGoods as $item) { foreach ($groupGoods as $item) {
$thumbUrls = $item['goodsSku']['thumb_url'];
$thumbUrls = ArrayUtils::index($thumbUrls, 'shop_id');
$priceInFen = $item['price_in_fen']; // 常规数值 $priceInFen = $item['price_in_fen']; // 常规数值
switch ($operator) { switch ($operator) {
case '+': case '+':
@ -37,7 +40,7 @@ class Groups
break; break;
} }
$priceInFen *= 100; $priceInFen *= 100;
$goodsSkus[] = [ $info = [
'category_name' => $item['category_name'], 'category_name' => $item['category_name'],
'goods_desc' => $item['goods_name'], 'goods_desc' => $item['goods_name'],
'goods_name' => $item['goods_name'], 'goods_name' => $item['goods_name'],
@ -51,6 +54,10 @@ class Groups
'total_quantity' => $item['goodsSku']['stock'], 'total_quantity' => $item['goodsSku']['stock'],
]] ]]
]; ];
if (isset($thumbUrls[$shop->id]) && $thumbUrls[$shop->id]['img_url']) {
$info['pic_url_list'] = [$thumbUrls[$shop->id]['img_url']];
}
$goodsSkus[] = $info;
} }
$appendParams = [ $appendParams = [
'end_time' => $group->getOriginal('end_time'), 'end_time' => $group->getOriginal('end_time'),

View File

@ -16,8 +16,8 @@
<el-image v-if="disabled" style="width: 148px; height: 148px" :src="form.img_url" fit="cover"> <el-image v-if="disabled" style="width: 148px; height: 148px" :src="form.img_url" fit="cover">
</el-image> </el-image>
<el-upload v-else class="avatar-uploader" action="#" :limit="1" :auto-upload="false" <el-upload v-else class="avatar-uploader" action="#" :limit="1" :auto-upload="false"
:show-file-list="true" list-type="picture-card" :on-change="handleAvatarSuccess"> :show-file-list="false" list-type="picture-card" :on-change="handleAvatarSuccess">
<img v-if="imageUrl" :src="imageUrl" class="avatar" /> <img v-if="form.img_url" :src="form.img_url" class="avatar" />
<i v-else class="el-icon-plus avatar-uploader-icon"></i> <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
@ -87,7 +87,6 @@ import { goods_types, Brand_goods_types } from "../../../api/rankingData.js";
export default { export default {
data() { data() {
return { return {
imageUrl: "",
lid: "", // id lid: "", // id
gid: "", // id gid: "", // id
brand: [], // brand: [], //

View File

@ -67,26 +67,14 @@
<div> <div>
<el-form-item label="规格图片:"> <el-form-item label="规格图片:">
<div class="shop-sku-img"> <div class="shop-sku-img">
<div class="shop"> <div class="shop" v-for="item in goodsData.thumb_url" :key="item.shop_id">
<div class="shop-name">花梨油品</div> <div class="shop-name">{{ item.shop_name }}</div>
<div> <div>
<el-upload class="avatar-uploader" action="#" :limit="1" :auto-upload="false" <el-upload class="avatar-uploader" action="/api/upload" :limit="1"
:show-file-list="true" list-type="picture-card" accept="image/png,image/jpg,image/jpeg" :show-file-list="false"
:on-change="handleAvatarSuccess"> list-type="picture-card" :data="{ shop_id: item.shop_id }" name="uploadFile"
<img v-if="goodsData.goods.img_url" :src="goodsData.goods.img_url" :on-success="handleShopImgSuccess" :before-upload="beforeAvatarUpload">
class="avatar" /> <img v-if="item.img_url" :src="item.img_url" class="avatar" />
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
</div>
<div class="shop">
<div class="shop-name">花梨油品</div>
<div>
<el-upload class="avatar-uploader" action="#" :limit="1" :auto-upload="false"
:show-file-list="true" list-type="picture-card"
:on-change="handleAvatarSuccess">
<img v-if="goodsData.goods.img_url" :src="goodsData.goods.img_url"
class="avatar" />
<i v-else class="el-icon-plus avatar-uploader-icon"></i> <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload> </el-upload>
</div> </div>
@ -106,7 +94,6 @@
</template> </template>
<script> <script>
import { storeList } from "../../api/shop";
import { checkGoods, goodsList, updateGoods, imgUpload } from "../../api/goods.js"; import { checkGoods, goodsList, updateGoods, imgUpload } from "../../api/goods.js";
import { goods_types, Brand_goods_types } from "../../api/rankingData.js"; import { goods_types, Brand_goods_types } from "../../api/rankingData.js";
export default { export default {
@ -124,6 +111,7 @@ export default {
num: "", num: "",
cost: "", cost: "",
sku_code: "", sku_code: "",
thumb_url: [],
goods: { goods: {
img_url: "", img_url: "",
title: "", title: "",
@ -167,6 +155,38 @@ export default {
this.goodsData.goods.img_url = res.data.resource; this.goodsData.goods.img_url = res.data.resource;
}); });
}, },
handleShopImgSuccess(res) {
this.goodsData.thumb_url.forEach((val, key) => {
if (val.shop_id == res.shop_id) {
this.goodsData.thumb_url[key].img_url = res.resource;
}
})
},
beforeAvatarUpload(file) {
const isLt1M = file.size / 1024 / 1024 < 1;
if (!isLt1M) {
this.$message.error('上传头像图片大小不能超过 1MB!');
return false;
}
const isSize = new Promise(function (resolve, reject) {
let width = 1200;
let height = 1200;
let _URL = window.URL || window.webkitURL;
let img = new Image();
img.onload = function () {
let valid = img.width <= width && img.height <= height;
valid ? resolve() : reject();
}
img.src = _URL.createObjectURL(file);
}).then(() => {
return file;
}, () => {
this.$message.error('图片尺寸限制为1200 x 1200大小不可超过1MB')
return Promise.reject();
});
return isSize;
},
// //
handleList() { handleList() {
goodsList().then((res) => { goodsList().then((res) => {
@ -194,7 +214,15 @@ export default {
status: this.goodsData.status, status: this.goodsData.status,
num: this.goodsData.num, num: this.goodsData.num,
cost: this.goodsData.cost, cost: this.goodsData.cost,
thumb_url: this.goodsData.thumb_url
}; };
if (sku.status == "下架") {
sku.status = 0;
} else if (sku.status == "在售") {
sku.status = 1;
} else if (sku.status == "预警") {
sku.status = 2;
}
let updateData = { let updateData = {
goods_id: this.goodsData.goods_id, goods_id: this.goodsData.goods_id,
goods, goods,
@ -209,16 +237,6 @@ export default {
cancel() { cancel() {
this.$router.push("/GOODS_LIST"); this.$router.push("/GOODS_LIST");
}, },
getStoreList() {
let params = {
plat_id: 1,
page: 1,
per_page: 999,
};
storeList(params).then((res) => {
this.shopList = res.data.data
})
}
}, },
created() { created() {
this.skuId = parseInt(this.$route.query.id); this.skuId = parseInt(this.$route.query.id);
@ -237,7 +255,6 @@ export default {
}); });
this.handleList(); this.handleList();
this.getGoodsSkuData(); this.getGoodsSkuData();
this.getStoreList();
} }
}; };
</script> </script>

View File

@ -44,12 +44,11 @@ Route::middleware(['auth:api', 'check.permissions'])->group(function () {
Route::resource('permissions', 'Permission\PermissionsController', ['only' => ['index', Route::resource('permissions', 'Permission\PermissionsController', ['only' => ['index',
// 'store', 'show', 'update', 'destroy' // 'store', 'show', 'update', 'destroy'
]]); ]]);
Route::post('upload', [UploadController::class, 'store'])->name('upload.file');
// 平台 // 平台
Route::resource('plat_goods', 'Business\BusinessGoodsSkusController', ['only' => ['index', 'update', 'destroy']]); Route::resource('plat_goods', 'Business\BusinessGoodsSkusController', ['only' => ['index', 'update', 'destroy']]);
Route::post('plat/sync/{id}/stock', [BusinessGoodsSkusController::class, 'syncStock'])->name('plat.sync.stock'); Route::post('plat/sync/{id}/stock', [BusinessGoodsSkusController::class, 'syncStock'])->name('plat.sync.stock');
// 团购 // 团购
// Route::resource('group', 'Group\GroupsController', ['only' => ['index', 'store', 'show', 'update', 'destroy']]); Route::resource('group', 'Group\GroupsController', ['only' => ['index', 'store', 'show', 'update', 'destroy']]);
}); });
// 登录 // 登录
Route::post('/auth/login', [LoginController::class, 'login'])->name('auth.login'); Route::post('/auth/login', [LoginController::class, 'login'])->name('auth.login');
@ -67,10 +66,12 @@ Route::get('goodsList', [GroupsController::class, 'goodsList'])->name('goods.lis
Route::get('groupGoods', [GroupsController::class, 'getGoods'])->name('group.get_goods')->middleware('auth:api'); Route::get('groupGoods', [GroupsController::class, 'getGoods'])->name('group.get_goods')->middleware('auth:api');
Route::post('groupGoods', [GroupsController::class, 'addGroupGoods'])->name('group.add_goods')->middleware('auth:api'); Route::post('groupGoods', [GroupsController::class, 'addGroupGoods'])->name('group.add_goods')->middleware('auth:api');
Route::get('addGoods', [GroupsController::class, 'addGoods'])->name('group.add_goods')->middleware('auth:api'); Route::get('addGoods', [GroupsController::class, 'addGoods'])->name('group.add_goods')->middleware('auth:api');
Route::resource('group', 'Group\GroupsController', ['only' => ['index', 'store', 'show', 'update', 'destroy']]);
// 妙选商城数据推送 // 妙选商城数据推送
Route::post('business', [ShopsController::class, 'business'])->name('shop.put.business'); Route::post('business', [ShopsController::class, 'business'])->name('shop.put.business');
// 盘点导入 // 盘点导入
Route::post('inventory/goods_skus', [GoodsSkusController::class, 'inventoryImport'])->name('goods_sku.inventory'); Route::post('inventory/goods_skus', [GoodsSkusController::class, 'inventoryImport'])->name('goods_sku.inventory');
Route::post('upload', [UploadController::class, 'store'])->name('upload.file');