Commit f04132b3 authored by 龚双喜's avatar 龚双喜

更新公司、工艺、门店功能接口

parent e721b0b7
{"files":["public\\assets\\addons\\address\\js\\gcoord.min.js","public\\assets\\addons\\address\\js\\jquery.autocomplete.js"],"license":"regular","licenseto":"76395","licensekey":"2MfcH67yoYz0mXRC d+0LoAZ7JpfYmZaAhFjygQ==","domains":["loveisland.com"],"licensecodes":[],"validations":["9db0f71754eaf28b6977dfa030f22632"]}
\ No newline at end of file
<?php
namespace addons\address;
use think\Addons;
/**
* 地址选择
* @author [MiniLing] <[laozheyouxiang@163.com]>
*/
class Address extends Addons
{
/**
* 插件安装方法
* @return bool
*/
public function install()
{
return true;
}
/**
* 插件卸载方法
* @return bool
*/
public function uninstall()
{
return true;
}
}
require([], function () {
//绑定data-toggle=addresspicker属性点击事件
$(document).on('click', "[data-toggle='addresspicker']", function () {
var that = this;
var callback = $(that).data('callback');
var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
var lat_id = $(that).data("lat-id") ? $(that).data("lat-id") : "";
var lng_id = $(that).data("lng-id") ? $(that).data("lng-id") : "";
var zoom_id = $(that).data("zoom-id") ? $(that).data("zoom-id") : "";
var lat = lat_id ? $("#" + lat_id).val() : '';
var lng = lng_id ? $("#" + lng_id).val() : '';
var zoom = zoom_id ? $("#" + zoom_id).val() : '';
var url = "/addons/address/index/select";
url += (lat && lng) ? '?lat=' + lat + '&lng=' + lng + (input_id ? "&address=" + $("#" + input_id).val() : "") + (zoom ? "&zoom=" + zoom : "") : '';
Fast.api.open(url, '位置选择', {
callback: function (res) {
input_id && $("#" + input_id).val(res.address).trigger("change");
lat_id && $("#" + lat_id).val(res.lat).trigger("change");
lng_id && $("#" + lng_id).val(res.lng).trigger("change");
zoom_id && $("#" + zoom_id).val(res.zoom).trigger("change");
try {
//执行回调函数
if (typeof callback === 'function') {
callback.call(that, res);
}
} catch (e) {
}
}
});
});
});
<?php
return [
[
'name' => 'maptype',
'title' => '默认地图类型',
'type' => 'radio',
'content' => [
'baidu' => '百度地图',
'amap' => '高德地图',
'tencent' => '腾讯地图',
],
'value' => 'amap',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'zoom',
'title' => '默认缩放级别',
'type' => 'string',
'content' => [],
'value' => '11',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'lat',
'title' => '默认Lat',
'type' => 'string',
'content' => [],
'value' => '39.919990',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'lng',
'title' => '默认Lng',
'type' => 'string',
'content' => [],
'value' => '116.456270',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'baidukey',
'title' => '百度地图KEY',
'type' => 'string',
'content' => [],
'value' => '',
'rule' => '',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'amapkey',
'title' => '高德地图KEY',
'type' => 'string',
'content' => [],
'value' => '69aa96eb1edb864ef9eee57b7c68fe2c',
'rule' => '',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'amapsecurityjscode',
'title' => '高德地图安全密钥',
'type' => 'string',
'content' => [],
'value' => '060914856186e3ee9d0516381a288208',
'rule' => '',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'tencentkey',
'title' => '腾讯地图KEY',
'type' => 'string',
'content' => [],
'value' => '',
'rule' => '',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => 'coordtype',
'title' => '坐标系类型',
'type' => 'select',
'content' => [
'DEFAULT' => '默认(使用所选地图默认坐标系)',
'GCJ02' => 'GCJ-02',
'BD09' => 'BD-09',
],
'value' => 'DEFAULT',
'rule' => 'required',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => '',
],
[
'name' => '__tips__',
'title' => '温馨提示',
'type' => '',
'content' => [],
'value' => '请先申请对应地图的Key,配置后再使用',
'rule' => '',
'msg' => '',
'tip' => '',
'ok' => '',
'extend' => 'alert-danger-light',
],
];
<?php
namespace addons\address\controller;
use think\addons\Controller;
use think\Config;
use think\Hook;
class Index extends Controller
{
// 首页
public function index()
{
// 语言检测
$lang = $this->request->langset();
$lang = preg_match("/^([a-zA-Z\-_]{2,10})\$/i", $lang) ? $lang : 'zh-cn';
$site = Config::get("site");
// 配置信息
$config = [
'site' => array_intersect_key($site, array_flip(['name', 'cdnurl', 'version', 'timezone', 'languages'])),
'upload' => null,
'modulename' => 'addons',
'controllername' => 'index',
'actionname' => 'index',
'jsname' => 'addons/address',
'moduleurl' => '',
'language' => $lang
];
$config = array_merge($config, Config::get("view_replace_str"));
// 配置信息后
Hook::listen("config_init", $config);
// 加载当前控制器语言包
$this->view->assign('site', $site);
$this->view->assign('config', $config);
return $this->view->fetch();
}
// 选择地址
public function select()
{
$config = get_addon_config('address');
$zoom = (int)$this->request->get('zoom', $config['zoom']);
$lng = (float)$this->request->get('lng');
$lat = (float)$this->request->get('lat');
$address = $this->request->get('address');
$lng = $lng ?: $config['lng'];
$lat = $lat ?: $config['lat'];
$this->view->assign('zoom', $zoom);
$this->view->assign('lng', $lng);
$this->view->assign('lat', $lat);
$this->view->assign('address', $address);
$maptype = $config['maptype'];
if (!isset($config[$maptype . 'key']) || !$config[$maptype . 'key']) {
$this->error("请在配置中配置对应类型地图的密钥");
}
return $this->view->fetch('index/' . $maptype);
}
}
name = address
title = 地址位置选择插件
intro = 地图位置选择插件,可返回地址和经纬度
author = FastAdmin
website =
version = 1.1.8
state = 1
url = /addons/address
license = regular
licenseto = 76395
This diff is collapsed.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>地址选择器</title>
<link rel="stylesheet" href="__CDN__/assets/css/frontend.min.css"/>
<link rel="stylesheet" href="__CDN__/assets/libs/font-awesome/css/font-awesome.min.css"/>
<style type="text/css">
body {
margin: 0;
padding: 0;
}
#container {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
}
.confirm {
position: absolute;
bottom: 30px;
right: 4%;
z-index: 99;
height: 50px;
width: 50px;
line-height: 50px;
font-size: 15px;
text-align: center;
background-color: white;
background: #1ABC9C;
color: white;
border: none;
cursor: pointer;
border-radius: 50%;
}
.search {
position: absolute;
width: 400px;
top: 0;
left: 50%;
padding: 5px;
margin-left: -200px;
}
label.BMapLabel {
max-width: inherit;
padding: .75rem 1.25rem;
margin-bottom: 1rem;
background-color: white;
width: auto;
min-width: 22rem;
border: none;
box-shadow: 0 2px 6px 0 rgba(114, 124, 245, .5);
}
</style>
</head>
<body>
<div class="search">
<div class="input-group">
<input type="text" id="place" name="q" class="form-control" placeholder="输入地点"/>
<div id="searchResultPanel" style="border:1px solid #C0C0C0;width:150px;height:auto; display:none;"></div>
<span class="input-group-btn">
<button type="button" name="search" id="search-btn" class="btn btn-success">
<i class="fa fa-search"></i>
</button>
</span>
</div>
</div>
<div class="confirm">确定</div>
<div id="container"></div>
<script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak={$config.baidukey|default=''}"></script>
<script src="__CDN__/assets/libs/jquery/dist/jquery.min.js"></script>
<script src="__CDN__/assets/addons/address/js/gcoord.min.js"></script>
<script type="text/javascript">
$(function () {
var map, marker, point, fromtype, totype;
var zoom = parseInt("{$zoom}");
var address = "{$address|htmlentities}";
var lng = Number("{$lng}");
var lat = Number("{$lat}");
fromtype = "BD09";
totype = "{$config.coordtype|default='DEFAULT'}"
totype = totype === 'DEFAULT' ? "BD09" : totype;
if (lng && lat && fromtype !== totype) {
var result = gcoord.transform([lng, lat], gcoord[totype], gcoord[fromtype]);
lng = result[0] || lng;
lat = result[1] || lat;
}
var geocoder = new BMap.Geocoder();
var addPointMarker = function (point, addr) {
deletePoint();
addPoint(point);
if (addr) {
addMarker(point, addr);
} else {
geocoder.getLocation(point, function (rs) {
addMarker(point, rs.address);
});
}
};
var addPoint = function (point) {
lng = point.lng;
lat = point.lat;
marker = new BMap.Marker(point);
map.addOverlay(marker);
map.panTo(point);
};
var addMarker = function (point, addr) {
address = addr;
// var labelhtml = '<div class="info">地址:' + address + '<br>经度:' + point.lng + '<br>纬度:' + point.lat + '</div>';
var labelhtml = '<div class="info">地址:' + address + '</div>';
var label = new BMap.Label(labelhtml, {offset: new BMap.Size(16, 20)});
label.setStyle({
border: 'none',
padding: '.75rem 1.25rem'
});
marker.setLabel(label);
};
var deletePoint = function () {
var allOverlay = map.getOverlays();
for (var i = 0; i < allOverlay.length; i++) {
map.removeOverlay(allOverlay[i]);
}
};
var init = function () {
map = new BMap.Map("container"); // 创建地图实例
var point = new BMap.Point(lng, lat); // 创建点坐标
map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
map.centerAndZoom(point, zoom); // 初始化地图,设置中心点坐标和地图级别
var size = new BMap.Size(10, 20);
map.addControl(new BMap.CityListControl({
anchor: BMAP_ANCHOR_TOP_LEFT,
offset: size,
}));
if ("{$lng}" != '' && "{$lat}" != '') {
addPointMarker(point, address);
}
ac = new BMap.Autocomplete({"input": "place", "location": map}); //建立一个自动完成的对象
ac.addEventListener("onhighlight", function (e) { //鼠标放在下拉列表上的事件
var str = "";
var _value = e.fromitem.value;
var value = "";
if (e.fromitem.index > -1) {
value = _value.province + _value.city + _value.district + _value.street + _value.business;
}
str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;
value = "";
if (e.toitem.index > -1) {
_value = e.toitem.value;
value = _value.province + _value.city + _value.district + _value.street + _value.business;
}
str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
$("#searchResultPanel").html(str);
});
ac.addEventListener("onconfirm", function (e) { //鼠标点击下拉列表后的事件
var _value = e.item.value;
myValue = _value.province + _value.city + _value.district + _value.street + _value.business;
$("#searchResultPanel").html("onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue);
setPlace();
});
function setPlace(text) {
map.clearOverlays(); //清除地图上所有覆盖物
function myFun() {
var results = local.getResults();
var result = local.getResults().getPoi(0);
var point = result.point; //获取第一个智能搜索的结果
map.centerAndZoom(point, 18);
// map.addOverlay(new BMap.Marker(point)); //添加标注
if (result.type != 0) {
address = results.province + results.city + result.address;
} else {
address = result.address;
}
addPointMarker(point, address);
}
var local = new BMap.LocalSearch(map, { //智能搜索
onSearchComplete: myFun
});
local.search(text || myValue);
}
map.addEventListener("click", function (e) {
//通过点击百度地图,可以获取到对应的point, 由point的lng、lat属性就可以获取对应的经度纬度
addPointMarker(e.point);
});
//点击搜索按钮
$(document).on('click', '#search-btn', function () {
if ($("#place").val() == '')
return;
setPlace($("#place").val());
});
};
var close = function (data) {
var index = parent.Layer.getFrameIndex(window.name);
var callback = parent.$("#layui-layer" + index).data("callback");
//再执行关闭
parent.Layer.close(index);
//再调用回传函数
if (typeof callback === 'function') {
callback.call(undefined, data);
}
};
//点击确定后执行回调赋值
$(document).on('click', '.confirm', function () {
var zoom = map.getZoom();
var data = {lat: lat, lng: lng, zoom: zoom, address: address};
if (fromtype !== totype) {
var result = gcoord.transform([data.lng, data.lat], gcoord[fromtype], gcoord[totype]);
data.lng = (result[0] || data.lng).toFixed(5);
data.lat = (result[1] || data.lat).toFixed(5);
console.log(data, result, fromtype, totype);
}
close(data);
});
init();
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<title>地图位置(经纬度)选择插件</title>
<link rel="stylesheet" href="__CDN__/assets/css/frontend.min.css"/>
<link rel="stylesheet" href="__CDN__/assets/libs/font-awesome/css/font-awesome.min.css"/>
</head>
<body>
<div class="container">
<div class="bs-docs-section clearfix">
<div class="row">
<div class="col-lg-12">
<div class="page-header">
<h2>地图位置(经纬度)选择示例</h2>
</div>
<div class="bs-component">
<form action="" method="post" role="form">
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="address" placeholder="地址">
</div>
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="lng" placeholder="经度">
</div>
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="lat" placeholder="纬度">
</div>
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="zoom" placeholder="缩放">
</div>
<button type="button" class="btn btn-primary" data-toggle='addresspicker' data-input-id="address" data-lng-id="lng" data-lat-id="lat" data-zoom-id="zoom">点击选择</button>
</form>
</div>
<div class="page-header">
<h2 id="code">调用代码</h2>
</div>
<div class="bs-component">
<textarea class="form-control" rows="17">
<form action="" method="post" role="form">
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="address" placeholder="地址">
</div>
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="lng" placeholder="经度">
</div>
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="lat" placeholder="纬度">
</div>
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="zoom" placeholder="缩放">
</div>
<button type="button" class="btn btn-primary" data-toggle='addresspicker' data-input-id="address" data-lng-id="lng" data-lat-id="lat" data-zoom-id="zoom">点击选择</button>
</form>
</textarea>
</div>
<div class="page-header">
<h2>参数说明</h2>
</div>
<div class="bs-component" style="background:#fff;">
<table class="table table-bordered">
<thead>
<tr>
<th>参数</th>
<th>释义</th>
</tr>
</thead>
<tbody>
<tr>
<td>data-input-id</td>
<td>填充地址的文本框ID</td>
</tr>
<tr>
<td>data-lng-id</td>
<td>填充经度的文本框ID</td>
</tr>
<tr>
<td>data-lat-id</td>
<td>填充纬度的文本框ID</td>
</tr>
<tr>
<td>data-zoom-id</td>
<td>填充缩放的文本框ID</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!--@formatter:off-->
<script type="text/javascript">
var require = {
config: {$config|json_encode}
};
</script>
<!--@formatter:on-->
<script>
require.callback = function () {
define('addons/address', ['jquery', 'bootstrap', 'frontend', 'template'], function ($, undefined, Frontend, Template) {
var Controller = {
index: function () {
}
};
return Controller;
});
define('lang', function () {
return [];
});
}
</script>
<script src="__CDN__/assets/js/require.min.js" data-main="__CDN__/assets/js/require-frontend.min.js?v={$site.version}"></script>
</body>
</html>
This diff is collapsed.
...@@ -60,7 +60,7 @@ class Index extends Common ...@@ -60,7 +60,7 @@ class Index extends Common
'cdnurl' => cdnurl('', true), 'cdnurl' => cdnurl('', true),
'version' => $shopConfig['version'], 'version' => $shopConfig['version'],
'user_protocol' => $shopConfig['user_protocol'], 'user_protocol' => $shopConfig['user_protocol'],
'privacy_protocol' => $shopConfig['privacy_protocol'], 'privacy_protocol' => $shopConfig['privacy_protocol'],
'about_us' => $shopConfig['about_us'], 'about_us' => $shopConfig['about_us'],
'copyright' => $shopConfig['copyright'], 'copyright' => $shopConfig['copyright'],
'copytime' => $shopConfig['copytime'], 'copytime' => $shopConfig['copytime'],
...@@ -146,7 +146,6 @@ class Index extends Common ...@@ -146,7 +146,6 @@ class Index extends Common
} }
/** /**
* 发送验证码 * 发送验证码
* *
...@@ -223,10 +222,14 @@ class Index extends Common ...@@ -223,10 +222,14 @@ class Index extends Common
*/ */
public function ad() public function ad()
{ {
$ad = Ad::where(['status' => 'normal'])->order('id', 'desc')->find(); $ad = Ad::where(['status' => 'normal'])->field('title,video,link,skip_time,show_count')->order('id', 'desc')->find();
if (!$ad) {
$this->error('暂无数据');
}
$ad->show_count += 1;
$ad->save();
$this->success('获取成功', [ $this->success('获取成功', [
'ad' => $ad 'ad' => $ad->hidden(['show_count','updatetime'])->toArray()
]); ]);
} }
} }
<?php
namespace addons\shopro\controller\company;
use addons\shopro\controller\Common;
use addons\shopro\controller\traits\Util;
use app\common\model\shopro\Company as CompanyModel;
use app\common\model\shopro\CompanyTechnology;
use app\common\model\shopro\Store;
class Company extends Common
{
use Util;
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
/**
* 公司信息
* @return void
*/
public function index()
{
$company = CompanyModel::where('status', 'normal')->order('id', 'desc')->find();
if (!$company) {
return $this->error('暂无数据');
}
return $this->success('成功', $company->hidden(['id', 'status', 'createtime', 'updatetime'])->toArray());
}
/**
* 门店列表
* @return void
*/
public function store_list()
{
$page = $this->request->get('page') ?? 1; //页码
$limit = $this->request->get('limit') ?? 10; //每页显示条数
$storeList = Store::where('status', 'normal')
->field('id,store_name,store_logo,detail_address,phone,longitude,latitude,store_intro')
->order('weigh', 'desc')
->paginate(["page" => $page, "list_rows" => $limit]);
return $this->success('成功', $storeList);
}
/**
* 工艺列表
* @return void
*/
public function technology_list()
{
$page = $this->request->get('page') ?? 1; //页码
$limit = $this->request->get('limit') ?? 3; //每页显示条数
$technologyList = CompanyTechnology::where('status', 'normal')
->field('id,tech_name,tech_image,tech_desc')
->order('weigh', 'desc')
->paginate(["page" => $page, "list_rows" => $limit]);
return $this->success('成功', $technologyList);
}
}
\ No newline at end of file
<?php
namespace app\admin\controller\shopro;
use app\common\controller\Backend;
/**
* 公司管理
*
* @icon fa fa-circle-o
*/
class Company extends Backend
{
/**
* Company模型对象
* @var \app\admin\model\shopro\Company
*/
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\shopro\Company;
$this->view->assign("statusList", $this->model->getStatusList());
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
}
<?php
namespace app\admin\controller\shopro;
use app\common\controller\Backend;
use think\Log;
/**
* 店铺管理
*
* @icon fa fa-circle-o
*/
class Store extends Backend
{
/**
* Store模型对象
* @var \app\admin\model\shopro\Store
*/
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\shopro\Store;
$this->view->assign("statusList", $this->model->getStatusList());
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
public function add()
{
if (!$this->request->isAjax()) {
return $this->view->fetch();
}
$params = $this->request->post("row/a");
$data = [
'store_name' => $params['store_name'],
'store_logo' => $params['store_logo'],
'detail_address' => $params['detail_address'],
'phone' => $params['phone'],
'longitude' => $params['longitude'],
'latitude' => $params['latitude'],
'store_intro' => $params['store_intro'],
'business_hours' => $params['business_hours'],
'status' => $params['status'],
'weigh' => $params['weigh']
];
$this->model->create($data);
$this->success('添加成功');
}
}
<?php
namespace app\admin\controller\shopro\company;
use app\common\controller\Backend;
/**
* 公司技术工艺管理
*
* @icon fa fa-circle-o
*/
class Technology extends Backend
{
/**
* Technology模型对象
* @var \app\admin\model\shopro\company\Technology
*/
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\shopro\company\Technology;
$this->view->assign("statusList", $this->model->getStatusList());
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
}
<?php
return [
'Id' => 'ID',
'Company_name' => '公司名称',
'Company_logo' => '公司Logo',
'Company_bg_image' => '公司背景图',
'Company_slogan' => '品牌标语',
'Company_intro' => '公司简介/品牌理念',
'Technical_intro' => '技术工艺介绍',
'Status' => '状态',
'Createtime' => '创建时间',
'Updatetime' => '更新时间'
];
<?php
return [
'Id' => 'ID',
'Company_id' => '公司ID',
'Tech_name' => '工艺名称',
'Tech_image' => '工艺图片',
'Tech_desc' => '工艺描述',
'Weigh' => '权重',
'Status' => '状态',
'Createtime' => '创建时间',
'Updatetime' => '更新时间'
];
<?php
return [
'Id' => 'ID',
'Company_id' => '所属公司ID',
'Store_name' => '店铺名称',
'Store_logo' => '店铺Logo',
'Province' => '省份',
'City' => '城市',
'District' => '区县',
'Area' => '省市区',
'Detail_address' => '详细地址',
'Phone' => '联系电话',
'Longitude' => '经度',
'Latitude' => '纬度',
'Business_hours' => '营业时间',
'Store_intro' => '店铺简介',
'Status' => '状态',
'Weigh' => '权重',
'Createtime' => '创建时间',
'Updatetime' => '更新时间'
];
<?php
namespace app\admin\model\shopro;
use think\Model;
class Company extends Model
{
// 表名
protected $name = 'shopro_company';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'integer';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
protected $deleteTime = false;
// 追加属性
protected $append = [
'status_text'
];
public function getStatusList()
{
return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
}
public function getStatusTextAttr($value, $data)
{
$value = $value ?: ($data['status'] ?? '');
$list = $this->getStatusList();
return $list[$value] ?? '';
}
}
<?php
namespace app\admin\model\shopro;
use think\Log;
use think\Model;
class Store extends Model
{
// 表名
protected $name = 'shopro_store';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'integer';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
protected $deleteTime = false;
// 追加属性
protected $append = [
'status_text'
];
protected static function init()
{
self::afterInsert(function ($row) {
Log::info('初始化');
Log::info($row);
if (!$row['weigh']) {
$pk = $row->getPk();
$row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
}
});
}
public function getStatusList()
{
return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
}
public function getStatusTextAttr($value, $data)
{
$value = $value ?: ($data['status'] ?? '');
$list = $this->getStatusList();
return $list[$value] ?? '';
}
}
<?php
namespace app\admin\model\shopro\company;
use think\Model;
class Technology extends Model
{
// 表名
protected $name = 'shopro_company_technology';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'integer';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
protected $deleteTime = false;
// 追加属性
protected $append = [
'status_text'
];
protected static function init()
{
self::afterInsert(function ($row) {
if (!$row['weigh']) {
$pk = $row->getPk();
$row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
}
});
}
public function getStatusList()
{
return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
}
public function getStatusTextAttr($value, $data)
{
$value = $value ?: ($data['status'] ?? '');
$list = $this->getStatusList();
return $list[$value] ?? '';
}
}
<?php
namespace app\admin\validate\shopro;
use think\Validate;
class Company extends Validate
{
/**
* 验证规则
*/
protected $rule = [
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => [],
'edit' => [],
];
}
<?php
namespace app\admin\validate\shopro;
use think\Validate;
class Store extends Validate
{
/**
* 验证规则
*/
protected $rule = [
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => [],
'edit' => [],
];
}
<?php
namespace app\admin\validate\shopro\company;
use think\Validate;
class Technology extends Validate
{
/**
* 验证规则
*/
protected $rule = [
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => [],
'edit' => [],
];
}
<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">{:__('Company_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-company_name" data-rule="required" class="form-control" name="row[company_name]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_logo')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-company_logo" data-rule="required" class="form-control" size="50" name="row[company_logo]" type="text" value="">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-company_logo" class="btn btn-danger faupload" data-input-id="c-company_logo" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-company_logo"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-company_logo" class="btn btn-primary fachoose" data-input-id="c-company_logo" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-company_logo"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-company_logo"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_bg_image')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-company_bg_image" data-rule="required" class="form-control" size="50" name="row[company_bg_image]" type="text" value="">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-company_bg_image" class="btn btn-danger faupload" data-input-id="c-company_bg_image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-company_bg_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-company_bg_image" class="btn btn-primary fachoose" data-input-id="c-company_bg_image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-company_bg_image"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-company_bg_image"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_slogan')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-company_slogan" data-rule="required" class="form-control" name="row[company_slogan]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_intro')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-company_intro" class="form-control " rows="5" name="row[company_intro]" cols="50"></textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Technical_intro')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-technical_intro" class="form-control " rows="5" name="row[technical_intro]" cols="50"></textarea>
</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="normal"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</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-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>
<form id="edit-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">{:__('Company_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-company_name" data-rule="required" class="form-control" name="row[company_name]" type="text" value="{$row.company_name|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_logo')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-company_logo" data-rule="required" class="form-control" size="50" name="row[company_logo]" type="text" value="{$row.company_logo|htmlentities}">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-company_logo" class="btn btn-danger faupload" data-input-id="c-company_logo" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-company_logo"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-company_logo" class="btn btn-primary fachoose" data-input-id="c-company_logo" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-company_logo"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-company_logo"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_bg_image')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-company_bg_image" data-rule="required" class="form-control" size="50" name="row[company_bg_image]" type="text" value="{$row.company_bg_image|htmlentities}">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-company_bg_image" class="btn btn-danger faupload" data-input-id="c-company_bg_image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-company_bg_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-company_bg_image" class="btn btn-primary fachoose" data-input-id="c-company_bg_image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-company_bg_image"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-company_bg_image"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_slogan')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-company_slogan" data-rule="required" class="form-control" name="row[company_slogan]" type="text" value="{$row.company_slogan|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Company_intro')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-company_intro" class="form-control " rows="5" name="row[company_intro]" cols="50">{$row.company_intro|htmlentities}</textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Technical_intro')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-technical_intro" class="form-control " rows="5" name="row[technical_intro]" cols="50">{$row.technical_intro|htmlentities}</textarea>
</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="$row.status"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</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-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>
<div class="panel panel-default panel-intro">
<div class="panel-heading">
{:build_heading(null,FALSE)}
<ul class="nav nav-tabs" data-field="status">
<li class="{:$Think.get.status === null ? 'active' : ''}"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
{foreach name="statusList" item="vo"}
<li class="{:$Think.get.status === (string)$key ? 'active' : ''}"><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
{/foreach}
</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">
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('shopro/company/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
<a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('shopro/company/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
<a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('shopro/company/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
<div class="dropdown btn-group {:$auth->check('shopro/company/multi')?'':'hide'}">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
{foreach name="statusList" item="vo"}
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:" data-params="status={$key}">{:__('Set status to ' . $key)}</a></li>
{/foreach}
</ul>
</div>
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
data-operate-edit="{:$auth->check('shopro/company/edit')}"
data-operate-del="{:$auth->check('shopro/company/del')}"
width="100%">
</table>
</div>
</div>
</div>
</div>
</div>
<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">{:__('Tech_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tech_name" data-rule="required" class="form-control" name="row[tech_name]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Tech_image')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-tech_image" data-rule="required" class="form-control" size="50" name="row[tech_image]" type="text" value="">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-tech_image" class="btn btn-danger faupload" data-input-id="c-tech_image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-tech_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-tech_image" class="btn btn-primary fachoose" data-input-id="c-tech_image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-tech_image"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-tech_image"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Tech_desc')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tech_desc" data-rule="required" class="form-control" name="row[tech_desc]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-weigh" data-rule="required" class="form-control" name="row[weigh]" type="number" value="0">
</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="normal"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</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-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>
<form id="edit-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">{:__('Tech_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tech_name" data-rule="required" class="form-control" name="row[tech_name]" type="text" value="{$row.tech_name|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Tech_image')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-tech_image" data-rule="required" class="form-control" size="50" name="row[tech_image]" type="text" value="{$row.tech_image|htmlentities}">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-tech_image" class="btn btn-danger faupload" data-input-id="c-tech_image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-tech_image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-tech_image" class="btn btn-primary fachoose" data-input-id="c-tech_image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-tech_image"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-tech_image"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Tech_desc')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tech_desc" data-rule="required" class="form-control" name="row[tech_desc]" type="text" value="{$row.tech_desc|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-weigh" data-rule="required" class="form-control" name="row[weigh]" type="number" value="{$row.weigh|htmlentities}">
</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="$row.status"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</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-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>
<div class="panel panel-default panel-intro">
<div class="panel-heading">
{:build_heading(null,FALSE)}
<ul class="nav nav-tabs" data-field="status">
<li class="{:$Think.get.status === null ? 'active' : ''}"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
{foreach name="statusList" item="vo"}
<li class="{:$Think.get.status === (string)$key ? 'active' : ''}"><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
{/foreach}
</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">
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('shopro.company.technology/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
<a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('shopro.company.technology/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
<a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('shopro.company.technology/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
<div class="dropdown btn-group {:$auth->check('shopro.company.technology/multi')?'':'hide'}">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
{foreach name="statusList" item="vo"}
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:" data-params="status={$key}">{:__('Set status to ' . $key)}</a></li>
{/foreach}
</ul>
</div>
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
data-operate-edit="{:$auth->check('shopro.company.technology/edit')}"
data-operate-del="{:$auth->check('shopro.company.technology/del')}"
width="100%">
</table>
</div>
</div>
</div>
</div>
</div>
<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">{:__('Store_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-store_name" data-rule="required" class="form-control" name="row[store_name]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Store_logo')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-store_logo" data-rule="required" class="form-control" size="50" name="row[store_logo]" type="text">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-store_logo" class="btn btn-danger faupload" data-input-id="c-store_logo" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-store_logo"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-store_logo" class="btn btn-primary fachoose" data-input-id="c-store_logo" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-store_logo"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-store_logo"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Detail_address')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-detail_address" class="form-control" name="row[detail_address]" type="text">
<!-- 点击此按钮弹出地图选择器 -->
<button type="button" class="btn btn-primary" data-toggle='addresspicker' data-input-id="c-detail_address" data-lng-id="c-longitude" data-lat-id="c-latitude">点击选择地址</button>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Longitude')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-longitude" data-rule="required" class="form-control" readonly name="row[longitude]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Latitude')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-latitude" data-rule="required" class="form-control" readonly name="row[latitude]" type="text">
</div>
</div>
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Province')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">-->
<!-- <input id="c-province" data-rule="required" class="form-control" name="row[province]" type="text" value="">-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Area')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">-->
<!-- <div class='control-relative'><input id="c-area" data-rule="required" class="form-control" data-toggle="city-picker" name="row[area]" type="text" value=""></div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('District')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">-->
<!-- <input id="c-district" data-rule="required" class="form-control" name="row[district]" type="text" value="">-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Detail_address')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">-->
<!-- <input id="c-detail_address" data-rule="required" class="form-control" name="row[detail_address]" type="text" value="">-->
<!-- </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" data-rule="required" class="form-control" name="row[phone]" type="text" value="">
</div>
</div>
<!-- <div class="form-group">-->
<!-- <label class="control-label col-xs-12 col-sm-2">{:__('Business_hours')}:</label>-->
<!-- <div class="col-xs-12 col-sm-8">-->
<!-- <input id="c-business_hours" data-rule="required" class="form-control" name="row[business_hours]" type="text" value="">-->
<!-- </div>-->
<!-- </div>-->
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Store_intro')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-store_intro" class="form-control " rows="5" name="row[store_intro]" cols="50"></textarea>
</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="normal"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-weigh" data-rule="required" class="form-control" name="row[weigh]" type="number" value="0">
</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-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>
<form id="edit-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">{:__('Store_name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-store_name" data-rule="required" class="form-control" name="row[store_name]" type="text" value="{$row.store_name|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Store_logo')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-store_logo" data-rule="required" class="form-control" size="50" name="row[store_logo]" type="text" value="{$row.store_logo|htmlentities}">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-store_logo" class="btn btn-danger faupload" data-input-id="c-store_logo" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-store_logo"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-store_logo" class="btn btn-primary fachoose" data-input-id="c-store_logo" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-store_logo"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-store_logo"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Detail_address')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-detail_address" class="form-control" name="row[detail_address]" type="text" value="{$row.detail_address|htmlentities}">
<!-- 点击此按钮弹出地图选择器 -->
<button type="button" class="btn btn-primary" data-toggle='addresspicker' data-input-id="c-detail_address" data-lng-id="c-longitude" data-lat-id="c-latitude">点击选择地址</button>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Longitude')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-longitude" data-rule="required" class="form-control" readonly name="row[longitude]" type="text" value="{$row.longitude|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Latitude')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-latitude" data-rule="required" class="form-control" readonly name="row[latitude]" type="text" value="{$row.latitude|htmlentities}">
</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" data-rule="required" class="form-control" name="row[phone]" type="text" value="{$row.phone|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Store_intro')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-store_intro" class="form-control " rows="5" name="row[store_intro]" cols="50">{$row.store_intro|htmlentities}</textarea>
</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="$row.status"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-weigh" data-rule="required" class="form-control" name="row[weigh]" type="number" value="{$row.weigh|htmlentities}">
</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-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>
<div class="panel panel-default panel-intro">
<div class="panel-heading">
{:build_heading(null,FALSE)}
<ul class="nav nav-tabs" data-field="status">
<li class="{:$Think.get.status === null ? 'active' : ''}"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
{foreach name="statusList" item="vo"}
<li class="{:$Think.get.status === (string)$key ? 'active' : ''}"><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
{/foreach}
</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">
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('shopro/store/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
<a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('shopro/store/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
<a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('shopro/store/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
<div class="dropdown btn-group {:$auth->check('shopro/store/multi')?'':'hide'}">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
{foreach name="statusList" item="vo"}
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:" data-params="status={$key}">{:__('Set status to ' . $key)}</a></li>
{/foreach}
</ul>
</div>
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
data-operate-edit="{:$auth->check('shopro/store/edit')}"
data-operate-del="{:$auth->check('shopro/store/del')}"
width="100%">
</table>
</div>
</div>
</div>
</div>
</div>
<?php
namespace app\common\model\shopro;
use think\Model;
class Company extends Model
{
protected $name = 'shopro_company';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'integer';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
public function getStatusList()
{
return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
}
}
<?php
namespace app\common\model\shopro;
use think\Model;
class CompanyTechnology extends Model
{
protected $name = 'shopro_company_technology';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'integer';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
public function getStatusList()
{
return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
}
}
<?php
namespace app\common\model\shopro;
use think\Model;
class Store extends Model
{
protected $name = 'shopro_store';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'integer';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
public function getStatusList()
{
return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
}
}
/**
* @preserve
* gcoord 1.0.6, geographic coordinate library
* Copyright (c) 2024 Jiulong Hu <me@hujiulong.com>
*/
var gcoord=function(){"use strict";var r=function(){return r=Object.assign||function(r){for(var t,e=1,n=arguments.length;e<n;e++)for(var a in t=arguments[e])Object.prototype.hasOwnProperty.call(t,a)&&(r[a]=t[a]);return r},r.apply(this,arguments)};"function"==typeof SuppressedError&&SuppressedError;var t=Math.sin,e=Math.cos,n=Math.sqrt,a=Math.abs,o=Math.PI,i=6378245,u=.006693421622965823;function c(r,t){return r>=72.004&&r<=137.8347&&t>=.8293&&t<=55.8271}function f(r,c){var f,l,s,h=(s=300+(f=r-105)+2*(l=c-35)+.1*f*f+.1*f*l+.1*n(a(f)),s+=2*(20*t(6*f*o)+20*t(2*f*o))/3,(s+=2*(20*t(f*o)+40*t(f/3*o))/3)+2*(150*t(f/12*o)+300*t(f/30*o))/3),g=function(r,e){var i=2*r-100+3*e+.2*e*e+.1*r*e+.2*n(a(r));return i+=2*(20*t(6*r*o)+20*t(2*r*o))/3,i+=2*(20*t(e*o)+40*t(e/3*o))/3,i+2*(160*t(e/12*o)+320*t(e*o/30))/3}(r-105,c-35),M=c/180*o,v=t(M),p=n(v=1-u*v*v);return[h=180*h/(i/p*e(M)*o),g=180*g/(i*(1-u)/(v*p)*o)]}function l(r){var t=r[0],e=r[1];if(!c(t,e))return[t,e];var n=f(t,e);return[t+n[0],e+n[1]]}function s(r){var t=r[0],e=r[1];if(!c(t,e))return[t,e];for(var n=[t,e],o=n[0],i=n[1],u=l([o,i]),f=u[0]-t,s=u[1]-e;a(f)>1e-6||a(s)>1e-6;)f=(u=l([o-=f,i-=s]))[0]-t,s=u[1]-e;return[o,i]}var h=Math.sin,g=Math.cos,M=Math.atan2,v=Math.sqrt,p=3e3*Math.PI/180;function G(r){var t=r[0]-.0065,e=r[1]-.006,n=v(t*t+e*e)-2e-5*h(e*p),a=M(e,t)-3e-6*g(t*p);return[n*g(a),n*h(a)]}function d(r){var t=r[0],e=r[1],n=v(t*t+e*e)+2e-5*h(e*p),a=M(e,t)+3e-6*g(t*p);return[n*g(a)+.0065,n*h(a)+.006]}var S=180/Math.PI,y=Math.PI/180,P=6378137,b=20037508.342789244;function B(r){return[r[0]*S/P,(.5*Math.PI-2*Math.atan(Math.exp(-r[1]/P)))*S]}function C(r){var t=Math.abs(r[0])<=180?r[0]:r[0]-360*(r[0]<0?-1:1),e=[P*t*y,P*Math.log(Math.tan(.25*Math.PI+.5*r[1]*y))];return e[0]>b&&(e[0]=b),e[0]<-b&&(e[0]=-b),e[1]>b&&(e[1]=b),e[1]<-b&&(e[1]=-b),e}var D,E,m,w,I,W,k=Math.abs,J=[12890594.86,8362377.87,5591021,3481989.83,1678043.12,0],x=[75,60,45,30,15,0],L=[[1.410526172116255e-8,898305509648872e-20,-1.9939833816331,200.9824383106796,-187.2403703815547,91.6087516669843,-23.38765649603339,2.57121317296198,-.03801003308653,17337981.2],[-7.435856389565537e-9,8983055097726239e-21,-.78625201886289,96.32687599759846,-1.85204757529826,-59.36935905485877,47.40033549296737,-16.50741931063887,2.28786674699375,10260144.86],[-3.030883460898826e-8,898305509983578e-20,.30071316287616,59.74293618442277,7.357984074871,-25.38371002664745,13.45380521110908,-3.29883767235584,.32710905363475,6856817.37],[-1.981981304930552e-8,8983055099779535e-21,.03278182852591,40.31678527705744,.65659298677277,-4.44255534477492,.85341911805263,.12923347998204,-.04625736007561,4482777.06],[3.09191371068437e-9,8983055096812155e-21,6995724062e-14,23.10934304144901,-.00023663490511,-.6321817810242,-.00663494467273,.03430082397953,-.00466043876332,2555164.4],[2.890871144776878e-9,8983055095805407e-21,-3.068298e-8,7.47137025468032,-353937994e-14,-.02145144861037,-1234426596e-14,.00010322952773,-323890364e-14,826088.5]],j=[[-.0015702102444,111320.7020616939,0x60e374c3105a3,-0x24bb4115e2e164,0x5cc55543bb0ae8,-0x7ce070193f3784,0x5e7ca61ddf8150,-0x261a578d8b24d0,0x665d60f3742ca,82.5],[.0008277824516172526,111320.7020463578,647795574.6671607,-4082003173.641316,10774905663.51142,-15171875531.51559,12053065338.62167,-5124939663.577472,913311935.9512032,67.5],[.00337398766765,111320.7020202162,4481351.045890365,-23393751.19931662,79682215.47186455,-115964993.2797253,97236711.15602145,-43661946.33752821,8477230.501135234,52.5],[.00220636496208,111320.7020209128,51751.86112841131,3796837.749470245,992013.7397791013,-1221952.21711287,1340652.697009075,-620943.6990984312,144416.9293806241,37.5],[-.0003441963504368392,111320.7020576856,278.2353980772752,2485758.690035394,6070.750963243378,54821.18345352118,9540.606633304236,-2710.55326746645,1405.483844121726,22.5],[-.0003218135878613132,111320.7020701615,.00369383431289,823725.6402795718,.46104986909093,2351.343141331292,1.58060784298199,8.77738589078284,.37238884252424,7.45]];function q(r,t,e){var n=k(t)/e[9],a=e[0]+e[1]*k(r),o=e[2]+e[3]*n+e[4]*Math.pow(n,2)+e[5]*Math.pow(n,3)+e[6]*Math.pow(n,4)+e[7]*Math.pow(n,5)+e[8]*Math.pow(n,6);return[a*=r<0?-1:1,o*=t<0?-1:1]}function N(r){for(var t=r[0],e=r[1],n=[],a=0;a<x.length;a++)if(k(e)>x[a]){n=j[a];break}return q(t,e,n)}function O(r){for(var t=r[0],e=r[1],n=[],a=0;a<J.length;a++)if(e>=J[a]){n=L[a];break}return q(t,e,n)}function T(r,t){if(!r)throw new Error(t)}function A(r){return!!r&&"[object Array]"===Object.prototype.toString.call(r)}function F(r){return!isNaN(Number(r))&&null!==r&&!A(r)}function R(){for(var r=[],t=0;t<arguments.length;t++)r[t]=arguments[t];var e=r.length-1;return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];for(var a=e,o=r[e].apply(null,t);a--;)o=r[a].call(null,o);return o}}function U(r,t,e){if(void 0===e&&(e=!1),null!==r)for(var n,a,o,i,u,c,f,l,s=0,h=0,g=r.type,M="FeatureCollection"===g,v="Feature"===g,p=M?r.features.length:1,G=0;G<p;G++){c=(l=!!(f=M?r.features[G].geometry:v?r.geometry:r)&&"GeometryCollection"===f.type)?f.geometries.length:1;for(var d=0;d<c;d++){var S=0,y=0;if(null!==(i=l?f.geometries[d]:f)){var P=i.type;switch(s=!e||"Polygon"!==P&&"MultiPolygon"!==P?0:1,P){case null:break;case"Point":if(!1===t(u=i.coordinates,h,G,S,y))return!1;h++,S++;break;case"LineString":case"MultiPoint":for(u=i.coordinates,n=0;n<u.length;n++){if(!1===t(u[n],h,G,S,y))return!1;h++,"MultiPoint"===P&&S++}"LineString"===P&&S++;break;case"Polygon":case"MultiLineString":for(u=i.coordinates,n=0;n<u.length;n++){for(a=0;a<u[n].length-s;a++){if(!1===t(u[n][a],h,G,S,y))return!1;h++}"MultiLineString"===P&&S++,"Polygon"===P&&y++}"Polygon"===P&&S++;break;case"MultiPolygon":for(u=i.coordinates,n=0;n<u.length;n++){for(y=0,a=0;a<u[n].length;a++){for(o=0;o<u[n][a].length-s;o++){if(!1===t(u[n][a][o],h,G,S,y))return!1;h++}y++}S++}break;case"GeometryCollection":for(n=0;n<i.geometries.length;n++)if(!1===U(i.geometries[n],t,e))return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}!function(r){r.WGS84="WGS84",r.WGS1984="WGS84",r.EPSG4326="WGS84",r.GCJ02="GCJ02",r.AMap="GCJ02",r.BD09="BD09",r.BD09LL="BD09",r.Baidu="BD09",r.BMap="BD09",r.BD09MC="BD09MC",r.BD09Meter="BD09MC",r.EPSG3857="EPSG3857",r.EPSG900913="EPSG3857",r.EPSG102100="EPSG3857",r.WebMercator="EPSG3857",r.WM="EPSG3857"}(W||(W={}));var z={WGS84:{to:(D={},D[W.GCJ02]=l,D[W.BD09]=R(d,l),D[W.BD09MC]=R(N,d,l),D[W.EPSG3857]=C,D)},GCJ02:{to:(E={},E[W.WGS84]=s,E[W.BD09]=d,E[W.BD09MC]=R(N,d),E[W.EPSG3857]=R(C,s),E)},BD09:{to:(m={},m[W.WGS84]=R(s,G),m[W.GCJ02]=G,m[W.EPSG3857]=R(C,s,G),m[W.BD09MC]=N,m)},EPSG3857:{to:(w={},w[W.WGS84]=B,w[W.GCJ02]=R(l,B),w[W.BD09]=R(d,l,B),w[W.BD09MC]=R(N,d,l,B),w)},BD09MC:{to:(I={},I[W.WGS84]=R(s,G,O),I[W.GCJ02]=R(G,O),I[W.EPSG3857]=R(C,s,G,O),I[W.BD09]=O,I)}};var H=r(r({},W),{CRSTypes:W,transform:function(r,t,e){if(T(!!r,"The args[0] input coordinate is required"),T(!!t,"The args[1] original coordinate system is required"),T(!!e,"The args[2] target coordinate system is required"),t===e)return r;var n=z[t];T(!!n,"Invalid original coordinate system: ".concat(t));var a=n.to[e];T(!!a,"Invalid target coordinate system: ".concat(e));var o=typeof r;if(T("string"===o||"object"===o,"Invalid input coordinate type: ".concat(o)),"string"===o)try{r=JSON.parse(r)}catch(c){throw new Error("Invalid input coordinate: ".concat(r))}var i=!1;A(r)&&(T(r.length>=2,"Invalid input coordinate: ".concat(r)),T(F(r[0])&&F(r[1]),"Invalid input coordinate: ".concat(r)),r=r.map(Number),i=!0);var u=a;return i?u(r):(U(r,(function(r){var t;t=u(r),r[0]=t[0],r[1]=t[1]})),r)}});return H}();
\ No newline at end of file
/*
jQuery autoComplete v1.0.7
Copyright (c) 2014 Simon Steinberger / Pixabay
GitHub: https://github.com/Pixabay/jQuery-autoComplete
License: http://www.opensource.org/licenses/mit-license.php
*/
(function ($) {
$.fn.autoComplete = function (options) {
var o = $.extend({}, $.fn.autoComplete.defaults, options);
// public methods
if (typeof options == 'string') {
this.each(function () {
var that = $(this);
if (options == 'destroy') {
$(window).off('resize.autocomplete', that.updateSC);
that.off('blur.autocomplete focus.autocomplete keydown.autocomplete keyup.autocomplete');
if (that.data('autocomplete'))
that.attr('autocomplete', that.data('autocomplete'));
else
that.removeAttr('autocomplete');
$(that.data('sc')).remove();
that.removeData('sc').removeData('autocomplete');
}
});
return this;
}
return this.each(function () {
var that = $(this);
// sc = 'suggestions container'
that.sc = $('<div class="autocomplete-suggestions ' + o.menuClass + '"></div>');
that.data('sc', that.sc).data('autocomplete', that.attr('autocomplete'));
that.attr('autocomplete', 'off');
that.cache = {};
that.last_val = '';
that.updateSC = function (resize, next) {
that.sc.css({
top: that.offset().top + that.outerHeight() - (that.sc.css("position") == "fixed" ? $(window).scrollTop() : 0),
left: that.offset().left,
width: that.outerWidth()
});
if (!resize) {
that.sc.show();
if (!that.sc.maxHeight) that.sc.maxHeight = parseInt(that.sc.css('max-height'));
if (!that.sc.suggestionHeight) that.sc.suggestionHeight = $('.autocomplete-suggestion', that.sc).first().outerHeight();
if (that.sc.suggestionHeight)
if (!next) that.sc.scrollTop(0);
else {
var scrTop = that.sc.scrollTop(), selTop = next.offset().top - that.sc.offset().top;
if (selTop + that.sc.suggestionHeight - that.sc.maxHeight > 0)
that.sc.scrollTop(selTop + that.sc.suggestionHeight + scrTop - that.sc.maxHeight);
else if (selTop < 0)
that.sc.scrollTop(selTop + scrTop);
}
}
}
$(window).on('resize.autocomplete', that.updateSC);
that.sc.appendTo('body');
that.on('click', function () {
if ($(this).val().length > 0 && that.sc.is(":hidden")) {
setTimeout(function () {
that.sc.show();
}, 100);
}
});
that.sc.on('mouseleave', '.autocomplete-suggestion', function () {
$('.autocomplete-suggestion.selected').removeClass('selected');
});
that.sc.on('mouseenter', '.autocomplete-suggestion', function () {
$('.autocomplete-suggestion.selected').removeClass('selected');
$(this).addClass('selected');
});
that.sc.on('mousedown click', '.autocomplete-suggestion', function (e) {
var item = $(this), v = item.data('val');
if (v || item.hasClass('autocomplete-suggestion')) { // else outside click
that.val(v);
o.onSelect(e, v, item);
that.sc.hide();
}
return false;
});
that.on('blur.autocomplete', function () {
try {
over_sb = $('.autocomplete-suggestions:hover').length;
} catch (e) {
over_sb = 0;
} // IE7 fix :hover
if (!over_sb) {
that.last_val = that.val();
that.sc.hide();
setTimeout(function () {
that.sc.hide();
}, 350); // hide suggestions on fast input
} else if (!that.is(':focus')) setTimeout(function () {
that.focus();
}, 20);
});
if (!o.minChars) that.on('focus.autocomplete', function () {
that.last_val = '\n';
that.trigger('keyup.autocomplete');
});
function suggest(data) {
var val = that.val();
that.cache[val] = data;
if (data.length && val.length >= o.minChars) {
var s = '';
if (data.length > 0) {
s += typeof o.header === 'function' ? o.header.call(data, o, that) : o.header;
for (var i = 0; i < data.length; i++) s += o.renderItem(data[i], val);
s += typeof o.footer === 'function' ? o.footer.call(data, o, that) : o.footer;
}
that.sc.html(s);
that.updateSC(0);
} else
that.sc.hide();
}
that.on('keydown.autocomplete', function (e) {
// down (40), up (38)
if ((e.which == 40 || e.which == 38) && that.sc.html()) {
var next, sel = $('.autocomplete-suggestion.selected', that.sc);
if (!sel.length) {
next = (e.which == 40) ? $('.autocomplete-suggestion', that.sc).first() : $('.autocomplete-suggestion', that.sc).last();
that.val(next.addClass('selected').data('val'));
} else {
next = (e.which == 40) ? sel.next('.autocomplete-suggestion') : sel.prev('.autocomplete-suggestion');
if (next.length) {
sel.removeClass('selected');
that.val(next.addClass('selected').data('val'));
} else {
sel.removeClass('selected');
that.val(that.last_val);
next = 0;
}
}
that.updateSC(0, next);
return false;
}
// esc
else if (e.which == 27) that.val(that.last_val).sc.hide();
// enter or tab
else if (e.which == 13 || e.which == 9) {
var sel = $('.autocomplete-suggestion.selected', that.sc);
if (sel.length && that.sc.is(':visible')) {
o.onSelect(e, sel.data('val'), sel);
setTimeout(function () {
that.sc.hide();
}, 20);
}
}
});
that.on('keyup.autocomplete', function (e) {
if (!~$.inArray(e.which, [13, 27, 35, 36, 37, 38, 39, 40])) {
var val = that.val();
if (val.length >= o.minChars) {
if (val != that.last_val) {
that.last_val = val;
clearTimeout(that.timer);
if (o.cache) {
if (val in that.cache) {
suggest(that.cache[val]);
return;
}
// no requests if previous suggestions were empty
for (var i = 1; i < val.length - o.minChars; i++) {
var part = val.slice(0, val.length - i);
if (part in that.cache && !that.cache[part].length) {
suggest([]);
return;
}
}
}
that.timer = setTimeout(function () {
o.source(val, suggest)
}, o.delay);
}
} else {
that.last_val = val;
that.sc.hide();
}
}
});
});
}
$.fn.autoComplete.defaults = {
source: 0,
minChars: 3,
delay: 150,
cache: 1,
menuClass: '',
header: '',
footer: '',
renderItem: function (item, search) {
// escape special characters
search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
var re = new RegExp("(" + search.split(' ').join('|') + ")", "gi");
return '<div class="autocomplete-suggestion" data-val="' + item + '">' + item.replace(re, "<b>$1</b>") + '</div>';
},
onSelect: function (e, term, item) {
}
};
}(jQuery));
\ No newline at end of file
define([], function () { define([], function () {
if (Config.modulename == 'admin' && Config.controllername == 'index' && Config.actionname == 'index') { require([], function () {
//绑定data-toggle=addresspicker属性点击事件
$(document).on('click', "[data-toggle='addresspicker']", function () {
var that = this;
var callback = $(that).data('callback');
var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
var lat_id = $(that).data("lat-id") ? $(that).data("lat-id") : "";
var lng_id = $(that).data("lng-id") ? $(that).data("lng-id") : "";
var zoom_id = $(that).data("zoom-id") ? $(that).data("zoom-id") : "";
var lat = lat_id ? $("#" + lat_id).val() : '';
var lng = lng_id ? $("#" + lng_id).val() : '';
var zoom = zoom_id ? $("#" + zoom_id).val() : '';
var url = "/addons/address/index/select";
url += (lat && lng) ? '?lat=' + lat + '&lng=' + lng + (input_id ? "&address=" + $("#" + input_id).val() : "") + (zoom ? "&zoom=" + zoom : "") : '';
Fast.api.open(url, '位置选择', {
callback: function (res) {
input_id && $("#" + input_id).val(res.address).trigger("change");
lat_id && $("#" + lat_id).val(res.lat).trigger("change");
lng_id && $("#" + lng_id).val(res.lng).trigger("change");
zoom_id && $("#" + zoom_id).val(res.zoom).trigger("change");
try {
//执行回调函数
if (typeof callback === 'function') {
callback.call(that, res);
}
} catch (e) {
}
}
});
});
});
if (Config.modulename == 'admin' && Config.controllername == 'index' && Config.actionname == 'index') {
require.config({ require.config({
paths: { paths: {
'vue3': "../addons/shopro/libs/vue", 'vue3': "../addons/shopro/libs/vue",
......
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'shopro/company/index' + location.search,
add_url: 'shopro/company/add',
edit_url: 'shopro/company/edit',
del_url: 'shopro/company/del',
multi_url: 'shopro/company/multi',
import_url: 'shopro/company/import',
table: 'shopro_company',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
fixedColumns: true,
fixedRightNumber: 1,
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'company_name', title: __('Company_name'), operate: 'LIKE'},
{field: 'company_logo', title: __('Company_logo'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
{field: 'company_bg_image', title: __('Company_bg_image'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
{field: 'company_slogan', title: __('Company_slogan'), operate: 'LIKE'},
{field: 'status', title: __('Status'), searchList: {"normal":__('Normal'),"hidden":__('Hidden')}, formatter: Table.api.formatter.status},
{field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
{field: 'updatetime', title: __('Updatetime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'shopro.company.technology/index' + location.search,
add_url: 'shopro.company.technology/add',
edit_url: 'shopro.company.technology/edit',
del_url: 'shopro.company.technology/del',
multi_url: 'shopro.company.technology/multi',
import_url: 'shopro.company.technology/import',
table: 'shopro_company_technology',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'weigh',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'tech_name', title: __('Tech_name'), operate: 'LIKE'},
{field: 'tech_image', title: __('Tech_image'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
{field: 'tech_desc', title: __('Tech_desc'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
{field: 'weigh', title: __('Weigh'), operate: false},
{field: 'status', title: __('Status'), searchList: {"normal":__('Normal'),"hidden":__('Hidden')}, formatter: Table.api.formatter.status},
{field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
{field: 'updatetime', title: __('Updatetime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'shopro/store/index' + location.search,
add_url: 'shopro/store/add',
edit_url: 'shopro/store/edit',
del_url: 'shopro/store/del',
multi_url: 'shopro/store/multi',
import_url: 'shopro/store/import',
table: 'shopro_store',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'weigh',
fixedColumns: true,
fixedRightNumber: 1,
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'store_name', title: __('Store_name'), operate: 'LIKE'},
{field: 'store_logo', title: __('Store_logo'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
{field: 'detail_address', title: __('Detail_address'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
{field: 'phone', title: __('Phone'), operate: 'LIKE'},
{field: 'longitude', title: __('Longitude'), operate:'BETWEEN'},
{field: 'latitude', title: __('Latitude'), operate:'BETWEEN'},
{field: 'status', title: __('Status'), searchList: {"normal":__('Normal'),"hidden":__('Hidden')}, formatter: Table.api.formatter.status},
{field: 'weigh', title: __('Weigh'), operate: false},
{field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
{field: 'updatetime', title: __('Updatetime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment