完善本地生活商家信息的添加

This commit is contained in:
wangxiaowei 2024-08-14 18:34:36 +08:00
parent d7502fb23a
commit 7e7e0c9d5b
7 changed files with 477 additions and 91 deletions

@ -2,13 +2,15 @@
namespace app\admin\controller\shop;
use app\admin\logic\user\UserLogic;
use app\common\basics\AdminBase;
use app\common\server\ConfigServer;
use app\common\enum\LocalLifeICBCEnum;
use app\admin\logic\shop\LocalStoreLogic;
use app\common\server\JsonServer;
use think\facade\Request;
use app\common\utils\UploadAliOSS;
use app\admin\validate\shop\LocalStoreValidate;
class LocalStore extends AdminBase
{
@ -24,6 +26,13 @@ class LocalStore extends AdminBase
public function add()
{
if ($this->request->isAjax()) {
$post = $this->request->post();
(new LocalStoreValidate())->goCheck();
$lists = LocalStoreLogic::create($post);
// return JsonServer::success('获取成功', $lists);
}
return view('', [
'crftType1List' => LocalLifeICBCEnum::crftType1List(), // 商户证件类型列表
'crftType2List' => LocalLifeICBCEnum::crftType2List(), //法人/负责任人证件类型
@ -118,4 +127,54 @@ class LocalStore extends AdminBase
}
}
}
public function uploadImage()
{
if ($this->request->isAjax()) {
$post = $this->request->post();
$result = UploadAliOSS::uploadImage(LocalStoreLogic::$UPLOAD_PATH[$post['type']]);
if ($result['code'] == 1) {
return JsonServer::success('上传成功', $result['data']);
}
return JsonServer::error('上传失败');
}
}
public function delFile()
{
if ($this->request->isAjax()) {
$post = $this->request->post();
$result = UploadAliOSS::delFile(LocalStoreLogic::$UPLOAD_PATH[$post['type']], $post['file']);
if ($result['code'] == 1) {
return JsonServer::success('上传成功', $result['data']);
}
return JsonServer::error('上传失败');
}
}
public function user()
{
if ($this->request->isAjax()) {
$get = $this->request->get();
return JsonServer::success('', UserLogic::lists($get));
}
return view();
}
public function map()
{
if ($this->request->isAjax()) {
$post = $this->request->post();
$url = 'https://apis.map.qq.com/ws/geocoder/v1?key=' . ConfigServer::get('map', 'tx_map_key') . '&address=' . $post['address'];
$result = file_get_contents($url);
$data = json_decode($result, true);
if ($data['message'] == 'Success') {
return JsonServer::success('', $data['result']['location']);
}
return JsonServer::error('获取失败');
}
}
}

@ -32,6 +32,15 @@ class LocalStoreLogic extends Logic
);
}
// 添加
public static function create($form)
{
unset($form['file']);
$form['create_time'] = date('Y-m-d H:i:s');
$result = LocalStore::create($form);
dump($result);die;
}
public static function get_data($id)
{
return LocalStore::where(['lstore_id' => $id])->find();

@ -0,0 +1,47 @@
<?php
namespace app\admin\validate\shop;
use app\common\basics\Validate;
class LocalStoreValidate extends Validate
{
protected $rule = [
'shopName' => 'require',
'shopLogo' => 'require',
'bankType' => 'require|checkBankType',
'bankName' => 'require',
'bankCard' => 'require',
'businessLicense' => 'require',
'crftNo1' => 'require',
'idCard' => 'require',
'name' => 'require',
'empowerPhone' => 'require',
'address' => 'require',
'longitude' => 'require',
'latitude' => 'require',
];
protected $message = [
'shopName.require' => '商家名称不能为空',
'shopLogo.require' => '商家Logo不能为空',
'bankName.require' => '银行名称不能为空',
'bankCard.require' => '银行卡号不能为空',
'businessLicense.require' => '营业执照不能为空',
'crftNo1.require' => '社会信用代码不能为空',
'idCard.require' => '自拍照不能为空',
'name.require' => '商户联系人不能为空',
'empowerPhone.require' => '联系电话不能为空',
'address.require' => '地址不能为空',
'longitude.require' => '经纬度不能为空',
'latitude.require' => '经纬度不能为空',
];
protected function checkBankType($value, $rule, $data)
{
if ($value == 1 && empty($data['largeNumber'])) {
return '大额卡号不能为空';
}
return true;
}
}

@ -8,12 +8,39 @@
<div class="layui-card layui-form">
<div class="layui-tab-item layui-show">
<div class="layui-form-item" id="one-shop">
<label class="layui-form-label">用户:</label>
<div class="layui-input-inline" style="display: flex">
<div id="sel_user_id"></div>
<input type="hidden" id="user_id" name="user_id">
<a class="layui-btn layui-btn-normal select-goods">绑定用户</a>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>账号类型:</label>
<label class="layui-form-label"><span style="color:red;">*</span>商家名称:</label>
<div class="layui-input-inline">
<input type="text" name="shopName" id="shopName" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>商家Logo:</label>
<div class="layui-input-block">
<div class="like-upload-image">
<div class="upload-image-elem"><a id="add-shop" class="add-upload-video" data-type="shop_logo"> + 添加图片</a></div>
<input type="hidden" name="shopLogo" >
</div>
<div class="layui-form-mid layui-word-aux">建议尺寸:宽200像素*高200像素的jpg,jpeg,png图片</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>账户类型:</label>
<div class="layui-input-inline">
<select id="bankType" name="bankType" class="layui-select" lay-filter="bankType">
<option value="1">对公账户</option>
<option value="2">私有账户</option>
<option value="1">对公银行账户</option>
<option value="2">对私银行账户</option>
</select>
</div>
</div>
@ -29,24 +56,23 @@
<div class="layui-form-item">
<label class="layui-form-label"><span style="color:red;">*</span>银行名称:</label>
<div class="layui-input-inline">
<input type="text" name="bankName" id="bankName" lay-verType="tips" lay-verify="crftNo1"
switch-tab="0" autocomplete="off" class="layui-input">
<input type="text" name="bankName" id="bankName" 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="text" name="bankCard" id="bankCard" lay-verType="tips" lay-verify="crftNo1"
switch-tab="0" autocomplete="off" class="layui-input">
<input type="text" name="bankCard" id="bankCard" 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">
<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 class="like-upload-image">
<div class="upload-image-elem"><a id="business-license" class="add-upload-video" data-type="bussines_license"> + 添加图片</a></div>
<input type="hidden" name="businessLicense">
</div>
<div class="layui-form-mid layui-word-aux">建议尺寸:宽200像素*高200像素的jpg,jpeg,png图片</div>
</div>
@ -55,16 +81,16 @@
<div class="layui-form-item">
<label for="crftNo1" class="layui-form-label"><span style="color:red;">*</span>社会信用代码:</label>
<div class="layui-input-inline">
<input type="text" name="crftNo1" id="crftNo1" lay-verType="tips" lay-verify="crftNo1"
switch-tab="0" autocomplete="off" class="layui-input">
<input type="text" name="crftNo1" id="crftNo1" 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">
<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 class="like-upload-image">
<div class="upload-image-elem"><a id="self-photo" class="add-upload-video" data-type="self_photo"> + 添加图片</a></div>
<input type="hidden" name="idCard">
</div>
<div class="layui-form-mid layui-word-aux">建议尺寸:宽200像素*高200像素的jpg,jpeg,png图片</div>
</div>
@ -73,16 +99,14 @@
<div class="layui-form-item">
<label for="name" class="layui-form-label"><span style="color:red;">*</span>商户联系人:</label>
<div class="layui-input-inline">
<input type="text" name="name" id="name" lay-verType="tips" lay-verify="crftName2"
switch-tab="0" autocomplete="off" class="layui-input">
<input type="text" name="name" id="name" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label for="empowerPhone" class="layui-form-label"><span style="color:red;">*</span>联系电话:</label>
<div class="layui-input-inline">
<input type="text" name="empowerPhone" id="empowerPhone" lay-verType="tips" lay-verify="crftName2"
switch-tab="0" autocomplete="off" class="layui-input">
<input type="text" name="empowerPhone" id="empowerPhone" autocomplete="off" class="layui-input">
</div>
</div>
@ -123,12 +147,7 @@
</div>
</div>
</div>
<div class="layui-form-item ">
<label class="layui-form-label"></label>
<div class="layui-input-block" style="margin-left:10px;">
<div class="map-container" id="map-container"></div>
</div>
</div>
<div id="container" style="position: relative;z-index: 500;"></div>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="addSubmit" id="addSubmit" value="确认">
@ -137,19 +156,19 @@
<script src="__PUBLIC__/static/common/js/area.js"></script>
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key={$tx_map_key}"></script>
<script charset="utf-8" src="https://map.qq.com/api/gljs?v=1.exp&key={$tx_map_key}"></script>
<script>
layui.config({
base: "/static/lib/"
}).extend({
likeArea: "likeArea/likeArea",
txMap: "likeMap/txMap"
}).use(["form", "laydate", "likeArea", "txMap"], function(){
likeArea: "likeArea/likeArea"
}).use(["form", "laydate", "likeArea"], function(){
var $ = layui.$;
var form = layui.form;
var likeArea = layui.likeArea;
var laydate = layui.laydate;
var txMap = layui.txMap;
var likeupload = layui.upload;
form.on('select(bankType)', function(data){
if (data.value == 1) {
@ -170,72 +189,92 @@
});
});
// 上传商家LOGO
var uploadInst = likeupload.render({
elem: '#add-shop' //绑定元素
,url: "{:url('shop.LocalStore/uploadImage')}" //上传接口
,accept: 'images'
,data: {type: 'shop_logo'}
,exts: "jpg|png|jpeg"
,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
layer.load(); //上传loading
}
,done: function(res, index, upload){
if (res.code === 1) {
var template = '<div class="upload-image-div">';
template += '<img src="'+ res.data.file +'" alt="img">';
template += '<div class="del-upload-btn">x</div>';
$("#add-shop").parent().before(template)
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 "请填确认商家登录密码";
$("input[name='shopLogo']").val(res.data.file)
} else {
layer.msg('上传错误');
return false;
}
layer.closeAll('loading'); //关闭loading
}
,error: function(index, upload){
layer.closeAll('loading'); //关闭loading
}
});
// 上传商家营业执照
var uploadInst = likeupload.render({
elem: '#business-license' //绑定元素
,url: "{:url('shop.LocalStore/uploadImage')}" //上传接口
,accept: 'images'
,data: {type: 'bussines_license'}
,exts: "jpg|png|jpeg"
,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
layer.load(); //上传loading
}
,done: function(res, index, upload){
if (res.code === 1) {
var template = '<div class="upload-image-div">';
template += '<img src="'+ res.data.file +'" alt="img">';
template += '<div class="del-upload-btn">x</div>';
$("#business-license").parent().before(template)
$("input[name='businessLicense']").val(res.data.file)
} else {
layer.msg('上传错误');
return false;
}
layer.closeAll('loading'); //关闭loading
}
,error: function(index, upload){
layer.closeAll('loading'); //关闭loading
}
});
// 上传自拍照
var uploadInst = likeupload.render({
elem: '#self-photo' //绑定元素
,url: "{:url('shop.LocalStore/uploadImage')}" //上传接口
,accept: 'images'
,data: {type: 'self_photo'}
,exts: "jpg|png|jpeg"
,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
layer.load(); //上传loading
}
,done: function(res, index, upload){
if (res.code === 1) {
var template = '<div class="upload-image-div">';
template += '<img src="'+ res.data.file +'" alt="img">';
template += '<div class="del-upload-btn">x</div>';
$("#self-photo").parent().before(template)
$("input[name='idCard']").val(res.data.file)
} else {
layer.msg('上传错误');
return false;
}
layer.closeAll('loading'); //关闭loading
}
,error: function(index, upload){
layer.closeAll('loading'); //关闭loading
}
});
function switchTab(number) {
$('.layui-tab-card .layui-tab-title li').removeClass('layui-this');
@ -253,7 +292,74 @@
"", "", ""
);
txMap.init("", "");
$(document).on('click','.select-goods',function () {
layer.open({
type: 2
,title: '选择商品'
,content: '{:url("shop.LocalStore/user")}'
,area: ['90%', '90%']
,btn: ['确认', '取消']
,yes: function(index, layero){
var data = window["layui-layer-iframe" + index].callbackdata();
$('#shop_name').html(data[0].name)
$('#shop_id').val(data[0].id)
}
})
})
function initMap() {
//定义地图中心点坐标
var center = new TMap.LatLng(39.9088, 116.3987)
//定义map变量,调用 TMap.Map() 构造函数创建地图
var map = new TMap.Map(document.getElementById('container'), {
center: center,//设置地图中心点坐标
zoom: 17.2, //设置地图缩放级别
pitch: 43.5, //设置俯仰角
rotation: 45, //设置地图旋转角度
viewMode:'2D'
});
map.on("click", function (evt) {
var lat = evt.latLng.getLat().toFixed(6);
var lng = evt.latLng.getLng().toFixed(6);
console.log("您点击的的坐标是:"+ lat + "," + lng);
})
$(document).on("click", "#searchMap", function () {
var province_id = $("#province");
var city_id = $("#city");
var district_id = $("#district");
var shop_address = $("input[name='address']").val();
if(province_id.val() === null){
layer.open({icon:2,time:2000,content:"请选择省份"});
return;
}
if(city_id.val() === null){
layer.open({icon:2,time:2000,content:"请选择市"});
return;
}
if(district_id.val() === null){
layer.open({icon:2,time:2000,content:"请选择镇/区"});
return;
}
var address = province_id.find("option:selected").text() + city_id.find("option:selected").text() + district_id.find("option:selected").text() + shop_address;
like.ajax({
url: "{:url('shop.LocalStore/map')}",
data: {address},
type: "POST",
success:function(res) {
if(res.code === 1) {
map.setCenter(new TMap.LatLng(res.data.lat, res.data.lng));
$("input[name='longitude']").val(res.data.lng)
$("input[name='latitude']").val(res.data.lat)
}
}
});
});
}
initMap()
})
</script>

@ -114,7 +114,7 @@
var submit = layero.find("iframe").contents().find("#addSubmit");
iframeWindow.layui.form.on("submit(addSubmit)", function (data) {
like.ajax({
url: "{:url('shop.Category/add')}",
url: "{:url('shop.LocalStore/add')}",
data: data.field,
type: "POST",
success: function (res) {

@ -0,0 +1,106 @@
{layout name="layout1" /}
<div class="layui-fluid">
<div class="layui-card">
<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-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form-item type">
<div class="layui-inline">
<label class="layui-form-label">商品名称:</label>
<div class="layui-input-block">
<input type="text" name="goods_name" id="keyword" placeholder="请输入关键词" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layuiadmin-btn-goods {$view_theme_color}" lay-submit lay-filter="goods-search">查询</button>
</div>
</div>
</div>
<div class="layui-card-body">
<table id="goods-lists" lay-filter="goods-lists"></table>
<script type="text/html" id="goods-info">
<img src="{{d.image}}" style="height:60px;width: 60px" class="image-show"> {{d.name}}
</script>
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item layui-hide">
<input type="button" lay-submit lay-filter="select-submit" class="select-submit" id="select-submit" value="确认">
</div>
</div>
<style>
.layui-table-cell {
height: auto;
}
</style>
<script>
var table;
layui.config({
version:"{$front_version}",
base: '/static/lib/' //静态资源所在路径
}).use(['table','form'], function(){
var $ = layui.$
,form = layui.form
,element = layui.element;
//监听搜索
form.on('submit(goods-search)', function(data){
var field = data.field;
//执行重载
table.reload('goods-lists', {
where: field
});
});
//清空查询
form.on('submit(goods-clear-search)', function(){
$('#keyword').val(''); //清空输入框
$('#status_search').val(''); //清空输入框
form.render('select');
//刷新列表
table.reload('goods-lists', {
where: []
});
});
});
layui.define(['table', 'form'], function (exports) {
var $ = layui.$
, form = layui.form;
table = layui.table;
table.render({
id: 'goods-lists'
, elem: '#goods-lists'
, url: '{:url("shop.LocalStore/user")}' //模拟接口
, cols: [[
{type: 'radio'}
, {field: 'nickname', title: '用户名称'}
, {field: 'abs_avatar', title: '头像'}
]]
, page: true
, text: {none: '暂无数据!'}
, parseData: function (res) { //将原始数据解析成 table 组件所规定的数据
return {
"code": res.code,
"msg": res.msg,
"count": res.data.count, //解析数据长度
"data": res.data.lists, //解析数据列表
};
},
response: {
statusCode: 1
}
});
})
var callbackdata = function () {
var data = table.checkStatus('goods-lists').data
,index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
return data;
}
</script>

@ -0,0 +1,59 @@
<?php
namespace app\common\utils;
use app\common\server\storage\Driver as StorageDriver;
use think\facade\Config;
class UploadAliOSS
{
// 删除图片
public static function uploadImage($path = '')
{
if (!$path) {
return ['code' => -1, 'msg' => '缺少上传路径'];
} else {
$StorageDriver = new StorageDriver(self::config());
$StorageDriver->setUploadFile('file');
if (!$StorageDriver->upload($path)) {
return ['code' => -1, 'msg' => '上传错误'];
}
$fileName = $StorageDriver->getFileName();
if ($fileName) {
return ['code' => 1, 'msg' => '', 'data' => array('file' => Config::get('aliyunoss.domain') . $path . '/'. $fileName)];
}
return ['code' => -1, 'msg' => '上传失败'];
}
}
// 删除文件
public static function delFile($path, $file)
{
if (!$path) {
return ['code' => -1, 'msg' => '缺少上传路径'];
} else {
$file = $path . '/' . basename($file);
$StorageDriver = new StorageDriver(self::config());
$StorageDriver->delete($file);
}
return ['code' => 1, 'msg' => '删除成功'];
}
private static function config()
{
return [
"default" => "aliyun",
"engine" => [
"aliyun" => [
"bucket" => Config::get('aliyunoss.bucket'),
"access_key_id" => Config::get('aliyunoss.access_key_id'),
"access_key_secret" => Config::get('aliyunoss.access_key_secret'),
"domain" => Config::get('aliyunoss.domain'),
]
]
];
}
}