1:内容梗概
ShopXO是款非常优秀的开源商城软件。为了让商城更加适合没有网站管理经验的人使用,我优化了手机和电脑端的商城后台。修复了小程序的一些BUG,并做了一些其他优化。使用飞鹅打印机,接收新订单推送通知和订单打印。利用微信认证的公众号,在有新订单时,通过公众号给微信推送新订单消息。
特别说明:此篇文章建议有一定前后端基础的朋友阅读,否则,你在按照本文修改你的网站时,可能由于我在写作时,将某个环节遗漏,而导致你的网站无法做到像我修改后一样的结果。此时,会得不偿失。同时,若你对本文内容有任何疑问,欢迎你通过邮箱与我联系。邮箱几乎每天一看。
在进行下面修改时,建议你先将你的网站压缩打包,保存一下。避免操作失误无法修复。如果你的修改在达到理想效果后,建议你都进行一下保存操作
2:商城后台优化
2.1 优化说明
优化说明:
- 手机端显示商品缩率图
- 直接点击价格,弹出价格修改框,快速改价。
- 隐藏“查看更多”按钮。(给缩略图让空间)
对比:
优化后点击商品价格改价:
2.2 优化工作
核心代码:替换原有的价格显示样式,并添加一个js控制的弹窗。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <td > <button class="am-btn am-btn-success price-changed am-btn-xs am-radius" data-id="{{$v.id}}" data-url="{{:MyUrl('admin/goods/pricechanged')}}" id="doc-prompt-toggle{{$v.id}}" >{{$v.price}}</button> <div class="am-modal am-modal-prompt" tabindex="-1" id="my-prompt{{$v.id}}"> <div class="am-modal-dialog"> <div class="am-modal-hd">{{$v.title}}</div> <div class="am-modal-bd"> <img src="{{$v['images']}}" class="am-radius" style="width:100%"/> <input type="number" class="am-modal-prompt-input" pattern="^([0-9]{1}\d{0,6})(\.\d{1,2})?$" data-validation-message="请填写有效的销售金额" placeholder="{{$v.price}}">元 </div> <div class="am-modal-footer"> <span class="am-modal-btn" data-am-modal-cancel>取消</span> <span class="am-modal-btn" data-am-modal-confirm>提交</span> </div> </div> </div>
{{if !empty($v['original_price']) and $v['original_price'] gt 0}} <br /><span class="am-badge am-radius">原价 {{$v.original_price}}</span> {{/if}} </td>
|
完整index.html
代码链接:https://github.com/xieqifei/shopxo/blob/master/application/admin/view/default/goods/index.html
将此链接中的代码下载下来,替换原后台商品管理的html代码。替换你的网站根目录/application/admin/view/default/goods/index.html
。
- 修改js文件,实现点击价格,弹出对话框,提交发送post请求修改数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
$(document).on('click','.price-changed', function() { var tag = $(this); var id = tag.attr('data-id'); var $my_prompt='#my-prompt'+id; var url = tag.attr('data-url'); var field = tag.attr('data-field') || ''; $($my_prompt).modal({ relatedElement: this, onConfirm: function(data) { price=data['data']; if(id == undefined || url == undefined) { Prompt('参数配置有误'); return false; } $.ajax({ url:url, type:'POST', dataType:"json", timeout:tag.attr('data-timeout') || 30000, data:{"id":id, "price":price, "field":field}, success:function(result) { if(result.code == 0) { Prompt(result.msg, 'success'); tag.html(price); } else { Prompt(result.msg); } }, error:function(xhr, type) { Prompt('网络异常出错'); } }); }, onCancel: function() { } }); });
|
以上代码加入到common.js文件中,或者下载我的commonjs完全替换这个文件
替换你的网站/public/static/common/js/common.js
完整代码:https://github.com/xieqifei/shopxo/blob/master/public/static/common/js/common.js
- 在Goods控制器里新建一个控制器函数PriceChanged()。实现接收POST数据。
在application/admin/controller/Goods.php
里添加下面的代码。或者完全替换为我的Goods.php
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
public function PriceChanged() { if(!IS_AJAX) { return $this->error('非法访问'); } $filename="a.txt"; $handle=fopen($filename,"a+"); $str=fwrite($handle,"test\n"); fclose($handle); $params = input('post.'); $params['admin'] = $this->admin; $params['field'] = 'price'; return GoodsService::GoodsPriceUpdate($params); }
|
替换你的网站/application/admin/controller/Goods.php
完整的Goods.php代码:https://github.com/xieqifei/shopxo/blob/master/application/admin/controller/Goods.php
将以下代码添加到你的网站/application/service/GoodsService.php
,或者下载我的GoodsService.php
文件,完全替换它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
public static function GoodsPriceUpdate($params = []) { $p = [ [ 'checked_type' => 'empty', 'key_name' => 'id', 'error_msg' => '操作id有误', ], [ 'checked_type' => 'empty', 'key_name' => 'field', 'error_msg' => '未指定操作字段', ], [ 'checked_type' => 'between', 'key_name' => 'price', 'checked_data' => [0,5000], 'error_msg' => '价格不能小于0,大于5000', ], ]; $ret = ParamsChecked($params, $p); if($ret !== true) { return DataReturn($ret, -1); } if(Db::name('Goods')->where(['id'=>intval($params['id'])])->update([$params['field']=>number_format($params['price'],2),'min_price'=>number_format($params['price'],2),'max_price'=>number_format($params['price'],2), 'upd_time'=>time()])&&Db::name('GoodsSpecBase')->where(['goods_id'=>intval($params['id'])])->update([$params['field']=>number_format($params['price'],2)])) { return DataReturn('操作成功'); } return DataReturn('操作失败', -100); }
|
完整GoodsService.php
地址:https://github.com/xieqifei/shopxo/blob/master/application/service/GoodsService.php
替换你的网站/application/service/GoodsService.php
打开ShopXO网站后台你的网站网址/admin.php
添加权限:
点击保存。至此商品后台优化已经完成。
3:WX小程序优化
3.1 优化说明
优化内容:
- 修改首页导航栏上传图片,显示太小
- 修改分类无法查看一级分类。
修改前后对比
3.2 优化工作
- 打开小程序源代码,找到
components
->icon-nav
替换icon-nav.wxml
内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <view wx:if="{{propData.length > 0}}"> <view class="data-list"> <view class="items" wx:for="{{propData}}" wx:key="key"> <view wx:if="{{item.bg_color==='#FFFFFF'}}" class="items-content" data-value="{{item.event_value}}" data-type="{{item.event_type}}" bindtap="navigation_event" style="background-color:#fff;padding:0;height:110rpx;width:110rpx;border-radius:0%"> <image src="{{item.images_url}}" mode="aspectFit" style="width:110rpx;height:110rpx"/> </view> <view wx:else class="items-content" data-value="{{item.event_value}}" data-type="{{item.event_type}}" bindtap="navigation_event" style="background-color:{{item.bg_color}};"> <image src="{{item.images_url}}" mode="aspectFit" style=""/> </view> <view class="title">{{item.name}}</view> </view> </view> </view>
|
代码逻辑:当检测到导航栏背景颜色为白色时,设置图片上一层View标签的内边距padding 为0(原为20rpx)高宽设置为110rpx。并且将图片高宽均增加40rpx(原为70rpx),弥补内边距。
- 修改
icon-nav.wxss
文件
1 2 3 4 5
| .data-list .items image { width: 60rpx ; height: 60rpx ; margin-top: 5rpx; }
|
将原来的高宽后面的!important
去掉,为了使步骤1中内联的高宽样式生效。
最后,特别注意:你在网站后台修改导航栏图片时,必须设置导航栏背景色为白色。不设置或者设置为其他颜色,则采用默认的样式。此时图片会比较小。
修改导航栏:你的网站/admin.php
->手机端管理
->首页导航
,修改导航栏
确保颜色代码为#FFFFFF
完全替换小程序源代码中pages
->goods-category
->goods-category.wxml
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <view class='left-nav'> <block wx:for="{{data_list}}" wx:key="key"> <view class='items {{item.active || ""}}' data-index="{{index}}" bindtap='nav_event'> <text>{{item.name}}</text> </view> </block> </view> <view class='right-content bg-white'> <view class="content-items" data-value="{{data_first_class['id']}}" bindtap="category_event"> <view class="text single-text">全部</view> </view> <block wx:if="{{data_content.length > 0}}"> <block wx:for="{{data_content}}" wx:key="keys" wx:for-item="v"> <view class="content-items" data-value="{{v.id}}" bindtap="category_event"> <image wx:if="{{(v.icon || null) != null}}" src="{{v.icon}}" mode="aspectFit" class="icon" /> <view class="text single-text">{{v.name}}</view> </view> </block> </block> </view>
<view wx:if="{{data_list.length == 0 && data_list_loding_status != 0}}"> <import src="/pages/common/nodata.wxml" /> <template is="nodata" data="{{status: data_list_loding_status}}"> </template> </view>
|
修改pages
->goods-category
->goods-category.js
中部分代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| nav_event(e) { var index = e.currentTarget.dataset.index; var temp_data = this.data.data_list; for(var i in temp_data) { temp_data[i]['active'] = (index == i) ? 'nav-active' : ''; } this.setData({ data_list: temp_data, data_first_class: temp_data[index], data_content: temp_data[index]['items'], }); },
|
编译运行,即修改完毕。
有个小bug,打开分类页面,第一个一级分类的“全部”,在第一次打开时,会指向全部商品,而不是一级分类的商品。切换到第二个一级分类,再回来,此时点击“全部”,就变正常了。。后续再修复吧。
4:新订单通知推送
新订单推送,是为了方便商家,接收各个端下单消息。通常,通常都是使用短信和邮箱方式来接收消息,但是邮箱接收效率太低。短信又需要收费。
这里我们使用两种及时的推送方式,第一种,飞鹅打印机。入住美团、饿了么的商家,通常都会购买这个打印机,因为他是全平台的,而且可以调用它的API接口,自定义打印内容。
第二种,微信公众号推送。当网站后台接收到新订单,即通过微信公众号的模板消息功能,向指定微信推送新订单消息。
当然如果你具备一些编程知识,还可以自己写个程序,向下单的用户推送订单的进展。(开发一个插件,调用订单的相关钩子。)
为了减少工作量,消息通知,是在原有插件新订单提醒
基础上进行的修改。新的插件具有了除邮箱和短信以外的公众号和飞鹅打印功能。