地址添加更新,选择记忆

feat/task1-c-wallet
gongfuxiang 2018-09-25 01:03:42 +08:00
parent c0c8a9b92b
commit 58b9822f1c
8 changed files with 503 additions and 87 deletions

View File

@ -3,6 +3,7 @@
namespace Home\Controller;
use Service\BuyService;
use Service\UserService;
/**
* 用户地址管理
@ -67,13 +68,88 @@ class UserAddressController extends CommonController
{
$data = array();
} else {
$data = M('Article')->find(I('id'));
$params = $_REQUEST;
$params['user'] = $this->user;
$data = UserService::UserAddressRow($params);
}
$this->assign('data', $data);
// 地区
$this->assign('data', $data['data']);
$this->display('SaveInfo');
}
/**
* [Save 用户地址保存]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-23T22:36:18+0800
*/
public function Save()
{
$params = $_POST;
$params['user'] = $this->user;
$ret = UserService::UserAddressSave($params);
$this->ajaxReturn($ret['msg'], $ret['code'], $ret['data']);
}
/**
* 删除地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-07-18
* @desc description
*/
public function Delete()
{
$params = $_POST;
$params['user'] = $this->user;
$ret = UserService::UserAddressDelete($params);
$this->ajaxReturn($ret['msg'], $ret['code'], $ret['data']);
}
/**
* 默认地址设置
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-07-18
* @desc description
*/
public function SetDefault()
{
// 请求参数
$params = [
[
'checked_type' => 'empty',
'key_name' => 'address_id',
'error_msg' => '地址ID不能为空',
]
];
$ret = params_checked($_POST, $params);
if($ret !== true)
{
$this->ajaxReturn($ret);
}
// 模型
$m = M('UserAddress');
// 开启事务
$m->startTrans();
// 先全部设置为0 再将当前设置为1
$all_status = $m->where(['user_id' => $this->user['id']])->save(['is_default'=>0]);
$my_status = $m->where(['user_id' => $this->user['id'], 'id'=>$_POST['address_id']])->save(['is_default'=>1]);
if($all_status && $my_status)
{
// 提交事务
$m->commit();
$this->ajaxReturn(L('common_operation_set_success'), 0);
} else {
// 回滚事务
$m->rollback();
$this->ajaxReturn(L('common_operation_delete_error'), -100);
}
}
}
?>

View File

@ -25,7 +25,7 @@
<notempty name="user_address_list">
<ul class="address-list">
<foreach name="user_address_list" item="address">
<li class="<if condition="isset($address['is_default']) and $address['is_default'] eq 1">address-default</if>">
<li class="<if condition="isset($address['is_default']) and $address['is_default'] eq 1">address-default</if>" id="data-list-{{$address.id}}">
<div class="address-left">
<div class="user DefaultAddr">
<span class="buy-address-detail">
@ -56,9 +56,9 @@
<div class="new-addr-btn">
<a href="#" class="hidden">设为默认</a>
<span class="new-addr-bar hidden">|</span>
<a href="#">编辑</a>
<a href="javascript:;" class="address-submit-save" data-url="{{:U('Home/UserAddress/SaveInfo', ['id'=>$address['id']])}}">编辑</a>
<span class="new-addr-bar">|</span>
<a href="javascript:void(0);" onclick="delClick(this);">删除</a>
<a href="javascript:;" class="address-submit-delete" data-url="{{:U('Home/UserAddress/Delete')}}" data-id="{{$address.id}}">删除</a>
</div>
</li>
</foreach>
@ -67,7 +67,7 @@
</div>
<!-- 物流 -->
<div class="business-item logistics">
<div class="business-item logistics" data-type="logistics">
<h3>选择物流方式</h3>
<notempty name="express_list">
<ul class="logistics-list">
@ -85,7 +85,7 @@
</div>
<!-- 支付方式 -->
<div class="business-item payment">
<div class="business-item payment" data-type="payment">
<h3>选择支付方式</h3>
<notempty name="payment_list">
<ul class="payment-list">

View File

@ -1,12 +1,12 @@
<div class="am-form-group region-linkage" data-url="{{:U('Home/Region/Index')}}">
<label class="block">{{:L('common_linkage_text')}}</label>
<select name="province" data-next="city" class="am-radius c-p chosen-select" data-placeholder="{{:L('common_linkage_province_text')}}" data-validation-message="{{:L('common_linkage_province_format')}}" required>
<select name="province" data-next="city" class="am-radius c-p chosen-select" data-placeholder="{{:L('common_linkage_province_text')}}" data-validation-message="{{:L('common_linkage_province_format')}}" data-value="<if condition="isset($data['province'])">{{$data.province}}<else />0</if>" required>
<option value="">{{:L('common_linkage_province_text')}}</option>
</select>
<select name="city" data-next="county" class="am-radius c-p chosen-select" data-placeholder="{{:L('common_linkage_city_text')}}" data-validation-message="{{:L('common_linkage_city_format')}}" required>
<select name="city" data-next="county" class="am-radius c-p chosen-select" data-placeholder="{{:L('common_linkage_city_text')}}" data-validation-message="{{:L('common_linkage_city_format')}}" data-value="<if condition="isset($data['city'])">{{$data.city}}<else />0</if>" required>
<option value="">{{:L('common_linkage_city_text')}}</option>
</select>
<select name="county" class="am-radius c-p chosen-select" data-placeholder="{{:L('common_linkage_county_text')}}" data-validation-message="{{:L('common_linkage_county_format')}}" required>
<select name="county" class="am-radius c-p chosen-select" data-placeholder="{{:L('common_linkage_county_text')}}" data-validation-message="{{:L('common_linkage_county_format')}}" data-value="<if condition="isset($data['county'])">{{$data.county}}<else />0</if>" required>
<option value="">{{:L('common_linkage_county_text')}}</option>
</select>
</div>

View File

@ -3,7 +3,7 @@
<!-- conntent start -->
<div class="am-g my-content">
<!-- form start -->
<form class="am-form form-validation" method="post" action="{{:U('Home/User/Login')}}" request-type="ajax-fun" request-value="ViewModalBack">
<form class="am-form form-validation" method="post" action="{{:U('Home/UserAddress/Save')}}" request-type="ajax-fun" request-value="ViewModalBack">
<div class="am-form-group">
<label>{{:L('useraddress_name_text')}}</label>
<input type="text" name="name" placeholder="{{:L('useraddress_name_text')}}" minlength="2" maxlength="16" data-validation-message="{{:L('useraddress_name_format')}}" class="am-radius" <present name="data"> value="{{$data.name}}"</present> required />
@ -16,8 +16,16 @@
<include file="Lib/RegionLinkage" />
<div class="am-form-group">
<label>{{:L('useraddress_address_text')}}</label>
<input type="text" name="address" class="am-radius" minlength="1" maxlength="80" placeholder="{{:L('useraddress_address_text')}}" data-validation-message="{{:L('useraddress_address_format')}}" <present name="data"> value="{{$data.address}}"</present> required />
<div class="am-form-group am-input-group am-input-group-sm">
<input type="hidden" name="lng" id="form-lng" <notempty name="data"> value="{{$data.lng}}"</notempty> />
<input type="hidden" name="lat" id="form-lat" <notempty name="data"> value="{{$data.lat}}"</notempty> />
<input type="text" name="address" id="form-address" placeholder="{{:L('useraddress_address_text')}}" minlength="2" maxlength="80" data-validation-message="{{:L('useraddress_address_format')}}" class="am-radius" <notempty name="data"> value="{{$data.address}}"</notempty> required />
<span class="am-input-group-btn">
<button class="am-btn am-btn-default am-radius" type="button" id="map-location-submit"><span class="am-icon-map-marker"></span> {{:L('common_location_submit')}}</button>
</span>
</div>
</div>
<div id="map" data-level="17" class="am-form-group" style="width: 100%; height: 260px;"></div>
<div class="am-form-group">
<label>{{:L('useraddress_alias_text')}}</label>
@ -42,22 +50,58 @@
<include file="Public/Footer" />
<!-- footer end -->
<!-- map -->
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak={{:MyC('common_baidu_map_ak')}}"></script>
<script type="text/javascript">
// 返回处理
function ViewModalBack(e)
$(function()
{
// 百度地图API功能
var map = new BMap.Map("map", {enableMapClick:false});
var level = $('#map').data('level') || 16;
var point = new BMap.Point(<if condition="!empty($data['lng'])">{{$data['lng']}}<else />116.400244</if>,<if condition="!empty($data['lat'])">{{$data['lat']}}<else />39.92556</if>);
map.centerAndZoom(point, level);
/* 添加控件 */
var navigationControl = new BMap.NavigationControl({
// 靠左上角位置
anchor: BMAP_ANCHOR_TOP_LEFT,
// LARGE类型
type: BMAP_NAVIGATION_CONTROL_LARGE,
});
map.addControl(navigationControl);
/* 创建标注 */
var marker = new BMap.Marker(point); // 创建标注
map.addOverlay(marker); // 将标注添加到地图中
marker.enableDragging(); // 可拖拽
marker.addEventListener("dragend", function(e) {
map.panTo(e.point);
$('#form-lng').val(e.point.lng);
$('#form-lat').val(e.point.lat);
});
/* 设置版权控件位置 */
var cr = new BMap.CopyrightControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT});
map.addControl(cr); //添加版权控件
var bs = map.getBounds(); //返回地图可视区域
cr.addCopyright({id: 1, content: "<div class='map-copy'><span>拖动红色图标直接定位</span></div>", bounds:bs});
});
// 返回处理
function ViewModalBack(e)
{
if(e.code == 0)
{
if(e.code == 0)
$.AMUI.progress.done();
Prompt(e.msg, 'success');
setTimeout(function()
{
$.AMUI.progress.done();
Prompt(e.msg, 'success');
setTimeout(function()
{
parent.location.reload();
}, 1500);
} else {
$('form.form-validation').find('button[type="submit"]').button('reset');
$.AMUI.progress.done();
Prompt(e.msg);
}
parent.location.reload();
}, 1500);
} else {
$('form.form-validation').find('button[type="submit"]').button('reset');
$.AMUI.progress.done();
Prompt(e.msg);
}
}
</script>

View File

@ -57,6 +57,47 @@ class UserService
return DataReturn(L('common_operation_success'), 0, $data);
}
/**
* [UserAddressRow 获取地址详情]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-23T23:19:25+0800
* @param array $params [description]
*/
public static function UserAddressRow($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => '地址id不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'user',
'error_msg' => '用户信息有误',
],
];
$ret = params_checked($params, $p);
if($ret !== true)
{
return DataReturn($ret);
}
// 获取用户地址
$params['where'] = [
'id' => intval($params['id']),
];
$ret = self::UserAddressList($params);
if(!empty($ret['data'][0]))
{
$ret['data'] = $ret['data'][0];
}
return $ret;
}
/**
* 用户默认地址
* @author Devil
@ -91,5 +132,149 @@ class UserService
}
return $ret;
}
/**
* [UserAddressSave 用户地址保存]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-23T22:28:31+0800
* @param [array] $params [输入参数]
*/
public static function UserAddressSave($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'name',
'error_msg' => '姓名不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'tel',
'error_msg' => '联系电话不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'province',
'error_msg' => '省不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'city',
'error_msg' => '城市不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'county',
'error_msg' => '区/县不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'address',
'error_msg' => '详细地址不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'user',
'error_msg' => '用户信息有误',
],
];
$ret = params_checked($params, $p);
if($ret !== true)
{
return DataReturn($ret);
}
$m = M('UserAddress');
if(!empty($params['id']))
{
$where = ['user_id' => $params['user']['id'], 'id'=>$params['id']];
$temp = $m->where($where)->find();
}
// 操作数据
$is_default = intval(I('is_default', 0));
$data = [
'name' => I('name', '', '', $params),
'alias' => I('alias', '', '', $params),
'tel' => I('tel', '', '', $params),
'province' => I('province', '', '', $params),
'city' => I('city', '', '', $params),
'county' => I('county', '', '', $params),
'address' => I('address', '', '', $params),
'is_default' => $is_default,
'lng' => floatval(I('lng')),
'lat' => floatval(I('lat')),
];
// 默认地址处理
if($is_default == 1)
{
$m->where(['user_id'=>$params['user']['id'], 'is_default'=>1])->save(['is_default'=>0]);
}
// 添加/更新数据
if(empty($temp))
{
$data['user_id'] = $params['user']['id'];
$data['add_time'] = time();
if($m->add($data) > 0)
{
return DataReturn(L('common_operation_add_success'), 0);
} else {
return DataReturn(L('common_operation_add_error'));
}
} else {
$data['upd_time'] = time();
if($m->where($where)->save($data))
{
return DataReturn(L('common_operation_update_success'), 0);
} else {
return DataReturn(L('common_operation_update_error'));
}
}
}
/**
* [UserAddressDelete 用户地址删除]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-23T23:55:51+0800
* @param [array] $params [输入参数]
*/
public static function UserAddressDelete($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => '地址id不能为空',
],
[
'checked_type' => 'empty',
'key_name' => 'user',
'error_msg' => '用户信息有误',
],
];
$ret = params_checked($params, $p);
if($ret !== true)
{
return DataReturn($ret);
}
// 软删除数据
$where = ['user_id' => $params['user']['id'], 'id'=>$params['id']];
$data = ['is_delete_time' => time()];
if(M('UserAddress')->where($where)->save($data))
{
return DataReturn(L('common_operation_delete_success'), 0);
} else {
return DataReturn(L('common_operation_delete_error'), -100);
}
}
}
?>

View File

@ -671,6 +671,60 @@ function FomatFloat(value, pos)
return s_x;
}
/**
* [DataDelete 数据删除]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-24T08:24:58+0800
* @param {[object]} e [当前元素对象]
*/
function DataDelete(e)
{
var id = e.data('id');
var url = e.data('url');
var title = e.data('title') || '温馨提示';
var msg = e.data('msg') || '删除后不可恢复、确认操作吗?';
AMUI.dialog.confirm({
title: title,
content: msg,
onConfirm: function(options)
{
if((id || null) == null || (url || null) == null)
{
Prompt('参数配置有误');
} else {
// 请求删除数据
$.ajax({
url:url,
type:'POST',
dataType:"json",
timeout:10000,
data:{"id":id},
success:function(result)
{
if(result.code == 0)
{
Prompt(result.msg, 'success');
// 成功则删除数据列表
$('#data-list-'+id).remove();
} else {
Prompt(result.msg);
}
},
error:function(xhr, type)
{
Prompt('网络异常出错');
}
});
}
},
onCancel: function(){}
});
}
// 公共数据操作
$(function()
@ -704,48 +758,7 @@ $(function()
*/
$(document).on('click', '.submit-delete', function()
{
var id = $(this).data('id');
var url = $(this).data('url');
var title = $(this).data('title') || '温馨提示';
var msg = $(this).data('msg') || '删除后不可恢复、确认操作吗?';
AMUI.dialog.confirm({
title: title,
content: msg,
onConfirm: function(options)
{
if((id || null) == null || (url || null) == null)
{
Prompt('参数配置有误');
} else {
// 请求删除数据
$.ajax({
url:url,
type:'POST',
dataType:"json",
timeout:10000,
data:{"id":id},
success:function(result)
{
if(result.code == 0)
{
Prompt(result.msg, 'success');
// 成功则删除数据列表
$('#data-list-'+id).remove();
} else {
Prompt(result.msg);
}
},
error:function(xhr, type)
{
Prompt('网络异常出错');
}
});
}
},
onCancel: function(){}
});
DataDelete($(this));
});
/**
@ -1071,6 +1084,16 @@ $(function()
});
});
/**
* [RegionNodeData 地区联动]
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2018-09-23T22:00:30+0800
* @param {[int]} value [数据值]
* @param {[string]} name [当前节点name名称]
* @param {[string]} next_name [下一个节点名称数据渲染节点]
*/
function RegionNodeData(value, name, next_name)
{
if(value != null)
@ -1086,9 +1109,15 @@ $(function()
{
/* html拼接 */
var html = '';
var value = $('.region-linkage select[name='+next_name+']').data('value') || 0;
for(var i in result.data)
{
html += '<option value="'+result.data[i]['id']+'">'+result.data[i]['name']+'</option>';
html += '<option value="'+result.data[i]['id']+'"';
if(value != 0 && value == result.data[i]['id'])
{
html += ' selected ';
}
html += '>'+result.data[i]['name']+'</option>';
}
/* 下一级数据添加 */
@ -1137,7 +1166,22 @@ $(function()
});
if($('.region-linkage select').length > 0)
{
// 省初始化
RegionNodeData(0, 'province', 'province');
// 市初始化
var value = $('.region-linkage select[name=province]').data('value') || 0;
if(value != 0)
{
RegionNodeData(value, 'city', 'city');
}
// 区/县初始化
var value = $('.region-linkage select[name=city]').data('value') || 0;
if(value != 0)
{
RegionNodeData(value, 'county', 'county');
}
}
// 根据字符串地址获取坐标位置
@ -1160,14 +1204,15 @@ $(function()
var map = new BMap.Map("map", {enableMapClick:false});
var point = new BMap.Point(116.331398,39.897445);
map.centerAndZoom(point,12);
var level = $('#map').data('level') || 16;
map.centerAndZoom(point, level);
// 创建地址解析器实例
var myGeo = new BMap.Geocoder();
// 将地址解析结果显示在地图上,并调整地图视野
myGeo.getPoint(address, function(point) {
if (point) {
map.centerAndZoom(point, 16);
map.centerAndZoom(point, level);
var navigationControl = new BMap.NavigationControl({
// 靠左上角位置
anchor: BMAP_ANCHOR_TOP_LEFT,

View File

@ -1,7 +1,7 @@
.hidden { display: none !important;}
.address-default { display:block !important;}
/*地址管理*/
.concent h3,.business-item h3{border-bottom: 2px solid #e7c3c8; margin-top:15px;}
.concent h3,.business-item h3{border-bottom: 3px solid #e3e3e3; margin-top:15px;}
h3 { font-size: 14px;font-weight: 700;}
.address h3 { border-bottom:none;}
ul.address-list li{display:none;width:100%;padding:10px;position: relative;min-height:80px;}
@ -26,7 +26,7 @@ ul.logistics-list li.selected i.icon-active, ul.payment-list li.selected i.icon-
line-height: 0;
right: 0px;
bottom: 0px;
background: url(../images/sys_item_selected.gif) no-repeat right bottom;
background: url(../Images/sys_item_selected.gif) no-repeat right bottom;
}
.business-item ul { padding: 10px 3px 5px 5px;}
.business-item ul li { float: left; cursor: pointer; padding: 5px; border: 1px solid #eee; }
@ -132,8 +132,8 @@ ul.address-list, .business-item ul { overflow: hidden; }
.link-list{margin:0px auto;}
/*地址管理*/
.address ul{margin-top:10px ;}
ul.address-list li{display:block; width: calc(33% - 5px);height: 150px;float: left;background-image: url(../images/peraddbg.png); background-repeat: no-repeat; background-size: 100% 100%; margin:0 10px 10px 0 ;padding:10px;}
ul.address-list li.address-default{background-image: url(../images/peraddressbg.png);}
ul.address-list li{display:block; width: calc(33% - 5px);height: 150px;float: left;background-image: url(../Images/peraddbg.png); background-repeat: no-repeat; background-size: 100% 100%; margin:0 10px 10px 0 ;padding:10px;}
ul.address-list li.address-default{background-image: url(../Images/peraddressbg.png);}
ul.address-list li:nth-child(3n) { margin-right: 0; }
.address-left{ width:100%;position: relative;}
.th .td-inner{padding-left:0 ;}
@ -169,7 +169,7 @@ ul.address-list, .business-item ul { overflow: hidden; }
.address { margin-top: 10px; padding-top: 10px; }
.address, .buy-message { border-top: 1px solid #eee; }
.address .control { display: none; }
.address-default {background: url(../images/peraddress.png) repeat-x; background-position: bottom; }
.address-default {background: url(../Images/peraddress.png) repeat-x; background-position: bottom; }
ul.address-list li { padding: 0 5px; min-height: 65px; }
.business-item ul li { width: calc(50% - 6px); }

View File

@ -1,24 +1,90 @@
$(function() {
var store = $.AMUI.store;
if(!store.enabled)
{
alert('Local storage is not supported by your browser. Please disable "Private Mode", or upgrade to a modern browser.');
} else {
// 选择缓存key
var store_address_key = 'store-buy-address-selected-index';
var store_logistics_key = 'store-lbuy-ogistics-selected-index';
var store_payment_key = 'store-buy-payment-selected-index';
}
$(function()
{
// 选中处理
if(store.enabled)
{
// 地址
var store_address_value = store.get(store_address_key);
if(store_address_value !== undefined)
{
$('ul.address-list li').eq(store_address_value).addClass('address-default').siblings().removeClass('address-default');
}
// 快递
var store_logistics_value = store.get(store_logistics_key);
if(store_logistics_value !== undefined)
{
$('ul.logistics-list li').eq(store_logistics_value).addClass('selected');
}
// 快递
var store_payment_value = store.get(store_payment_key);
if(store_payment_value !== undefined)
{
$('ul.payment-list li').eq(store_payment_value).addClass('selected');
}
}
// 地址选择
$('ul.address-list li').click(function() {
$(this).addClass("address-default").siblings().removeClass("address-default");
$('ul.address-list li').click(function()
{
$(this).addClass('address-default').siblings().removeClass('address-default');
store.set(store_address_key, $(this).index());
});
// 混合列表选择
$('.business-item ul li').on('click', function() {
$('.business-item ul li').on('click', function()
{
var type = $(this).parents('.business-item').data('type') || null;
var temp_store_key = null;
switch(type)
{
case 'payment' :
temp_store_key = store_payment_key;
break;
case 'logistics' :
temp_store_key = store_logistics_key;
break;
}
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
if(temp_store_key != null)
{
store.remove(temp_store_key);
}
} else {
$(this).addClass('selected').siblings("li").removeClass('selected');
$(this).addClass('selected').siblings('li').removeClass('selected');
if(temp_store_key != null)
{
store.set(temp_store_key, $(this).index());
}
}
});
// 弹出地址选择
$('.address-submit').on('click', function()
$('.address-submit-save').on('click', function(e)
{
ModalLoad($(this).data('url'), '地址管理', 'popup-modal-address', 'common-address-modal');
// 阻止事件冒泡
e.stopPropagation();
});
// 阻止事件冒泡
$('.address-submit-delete').on('click', function(e)
{
DataDelete($(this));
e.stopPropagation();
});