应好多技术小伙伴的邀请,来团科技会不间断地将Lt-Store来团云店小程序商城的一些核心技术要点做一些简单的教程,和小伙伴们共勉。来团科技是一家有着10年软件开发经验的创新性互联网科技公司,也愿意和各位朋友一起探索技术发展。
来团智慧商业小程序零代码开发平台,多行业适配。无需代码,拖拽式设计,轻松打造订货商城、会员制商城、分销商城及小程序官网。不仅能满足通用需求,还支持定制化,从页面布局到功能模块,随心定制,助您快速搭建专属商业小程序,抢占市场先机。
LtStore 采用经典的 前后端分离 架构:
┌─────────────────────────────────────────────────────────────────────────┐
│ 小程序前端 (wxapp) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ pages/goods/index.js │ │
│ │ App._get('goods/detail', {goods_id: 1}, res => {...}) │ │
│ └───────────────────────────┬─────────────────────────────────────┘ │
└──────────────────────────────┼────────────────────────────────────────────┘
│ HTTP请求
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 后端 (source) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ URL: https://domain.com/index.php?s=/api/goods/detail │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ api/controller/Goods.php -> detail() │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ api/model/Goods.php -> getDetails() │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
当小程序调用 App._get('goods/detail', {...}) 时,实际发送的请求URL为:
https://域名/index.php?s=/api/goods/detail&goods_id=1&wxapp_id=10001&token=xxx
URL 解析遵循以下规则:
| URL参数 | 解析结果 |
|---|---|
s=/api |
模块 (module) = api |
goods |
控制器 (controller) = Goods |
detail |
操作/方法 (action) = detail |
goods_id=1 |
传入的参数 |
文件映射关系:
| URL部分 | 文件路径 |
|---|---|
api |
source/application/api/ |
Goods |
source/application/api/controller/Goods.php |
detail |
source/application/api/controller/Goods.php 中的 detail() 方法 |
web/index.php 是整个应用的入口:
<?php
// [ 应用入口文件 ]
// 定义运行目录
define('WEB_PATH', __DIR__ . '/');
// 定义应用目录
define('APP_PATH', WEB_PATH . '../source/application/');
// 加载框架引导文件
require APP_PATH . '../thinkphp/start.php';
ThinkPHP 会根据 URL 参数自动解析并加载对应的控制器。
小程序全局定义在 wxapp/app.js,封装了网络请求方法:
// wxapp/app.js 第28行
api_root: siteinfo.siteroot + 'index.php?s=/api/',
// wxapp/app.js 第169-220行
_get(url, data, success, fail, complete, check_login) {
wx.showNavigationBarLoading();
let _this = this;
// 1. 构造请求参数
data = data || {};
data.wxapp_id = _this.getWxappId(); // 小程序ID
// 2. 构造GET请求
let request = () => {
data.token = wx.getStorageSync('token'); // 用户登录令牌
wx.request({
url: _this.api_root + url, // 完整URL = api_root + 'goods/detail'
header: {
'content-type': 'application/json'
},
data: data, // 请求参数 {goods_id, wxapp_id, token}
// 3. 成功回调处理
success(res) {
if (res.statusCode !== 200 || typeof res.data !== 'object') {
_this.showError('网络请求出错');
return false;
}
if (res.data.code === -1) {
// 登录态失效,重新登录
wx.hideNavigationBarLoading();
_this.doLogin(2);
} else if (res.data.code === 0) {
// 业务错误
_this.showError(res.data.msg, () => {
fail && fail(res);
});
return false;
} else {
// 请求成功
success && success(res.data);
}
},
// 4. 失败回调处理
fail(res) {
_this.showError(res.errMsg, () => {
fail && fail(res);
});
},
// 5. 完成回调
complete(res) {
wx.hideNavigationBarLoading();
complete && complete(res);
},
});
};
// 6. 判断是否需要验证登录
check_login ? _this.doLogin(request) : request();
}
| 参数名 | 来源 | 说明 |
|---|---|---|
url |
传入 | API接口名称,如 goods/detail |
goods_id |
传入 | 业务参数,商品ID |
wxapp_id |
自动添加 | 小程序ID,用于识别多小程序 |
token |
自动添加 | 用户登录令牌,用于身份验证 |
// wxapp/pages/goods/index.js 第74行
App._get('goods/detail', {
goods_id: options.id
}, res => {
// res.data = { code: 1, msg: 'success', data: {...} }
that.setData({ detail: res.data.detail });
});
所有API返回统一JSON格式:
{
"code": 1, // 1=成功, 0=业务错误, -1=登录态失效
"msg": "success", // 提示信息
"data": { // 业务数据
"detail": {...},
"cart_total_num": 0
}
}
// source/application/api/controller/Goods.php
namespace apppicontroller;
use apppimodelGoods as GoodsModel;
use apppimodelCart as CartModel;
use apppicontrollerBase;
class Goods extends Base
{
/**
* 商品详情
* @param int $goods_id 商品ID
*/
public function detail($goods_id)
{
// 获取用户信息(false表示不强制登录)
$user = $this->getUser(false);
// 获取商品详情
$model = new GoodsModel;
$goods = $model->getDetails($goods_id, $this->getUser(false));
if ($goods === false) {
return $this->renderError($model->getError() ?: '商品信息不存在');
}
// 返回成功数据
return $this->renderSuccess([
'detail' => $goods, // 商品详情
'cart_total_num' => $user ? (new CartModel($user))->getTotalNum() : 0,
]);
}
}
所有API控制器都继承自 api/controller/Base,提供了常用方法:
// source/application/api/controller/Base.php
namespace apppicontroller;
use appcommonmodelUser as UserModel;
class Base extends hinkController
{
protected $user; // 当前登录用户
/**
* 获取当前用户
* @param bool $is_force 是否强制登录
* @return UserModel|false
*/
protected function getUser($is_force = true)
{
// 从请求头获取token
$token = $this->request->header('token')
?? $this->request->param('token');
if (empty($token)) {
if ($is_force) {
$this->renderError('请先登录');
}
return false;
}
// 从缓存/数据库验证token
$userId = Cache::get('token_' . $token);
if (!$userId) {
if ($is_force) {
$this->renderError('登录已失效');
}
return false;
}
// 获取用户信息
$user = UserModel::get($userId);
$this->user = $user;
return $user;
}
/**
* 返回成功JSON
* @param mixed $data 数据
* @param array $msg 提示信息
*/
protected function renderSuccess($data = [], $msg = [])
{
return json([
'code' => 1,
'msg' => $msg['success'] ?? 'success',
'data' => $data
]);
}
/**
* 返回错误JSON
* @param string $msg 错误信息
*/
protected function renderError($msg = '')
{
return json([
'code' => 0,
'msg' => $msg,
'data' => []
]);
}
}
┌──────────────────────────────────────────────────────────────────────────┐
│ 小程序前端 │
│ │
│ 1. pages/goods/index.js │
│ App._get('goods/detail', {goods_id: 1}, res => {...}) │
│ │
│ 2. app.js _get() │
│ - 拼接URL: api_root + 'goods/detail' │
│ - 添加参数: wxapp_id, token │
│ - 发送wx.request请求 │
└────────────────────────────────┬─────────────────────────────────────────┘
│ HTTP请求
│ https://domain.com/index.php?s=/api/goods/detail
│ &goods_id=1&wxapp_id=10001&token=xxx
▼
┌──────────────────────────────────────────────────────────────────────────┐
│ 后端 │
│ │
│ 3. 入口: web/index.php │
│ 加载 thinkphp/start.php │
│ │
│ 4. 路由解析 │
│ URL: /api/goods/detail │
│ → module=api, controller=Goods, action=detail │
│ │
│ 5. 控制器: api/controller/Goods.php │
│ public function detail($goods_id) │
│ - $this->getUser(false) 获取用户 │
│ - GoodsModel::getDetails() 获取商品 │
│ - $this->renderSuccess() 返回JSON │
│ │
│ 6. 模型: api/model/Goods.php │
│ public function getDetails($goods_id, $user) │
│ - 查询商品基础信息 │
│ - 查询SKU规格价格 │
│ - 计算会员价格 (如果有用户) │
│ - 返回完整商品数据 │
└────────────────────────────────┬─────────────────────────────────────────┘
│ HTTP响应
│ {code: 1, msg: "success", data: {...}}
▼
┌──────────────────────────────────────────────────────────────────────────┐
│ 小程序前端 │
│ │
│ 7. wx.request success回调 │
│ - res.data.code === 1 │
│ - success(res.data) 触发业务回调 │
│ │
│ 8. pages/goods/index.js │
│ that.setData({ detail: res.data.detail }) │
│ - 更新页面数据 │
│ - 触发页面渲染 │
└──────────────────────────────────────────────────────────────────────────┘
项目使用的是 PATH_INFO 模式,配置如下:
// source/application/config.php
// 开启路由
'url_route_on' => true,
// 路由配置文件
'route_config_file' => ['route'],
// URL参数分隔符
'url_param_type' => 0,
默认路由规则:
| URL格式 | 解析 |
|---|---|
/module/controller/action |
模块/控制器/操作 |
/controller/action |
当前模块/控制器/操作 |
/action |
当前控制器/操作 |
所以 /api/goods/detail 会解析为:
application/api/)application/api/controller/Goods.php)detail() 方法)// 小程序端调用
App._get('goods/getRecommend', {
goods_id: 1,
page: 1
}, res => {
console.log(res.data.list);
});
// source/application/api/controller/Goods.php 中添加
/**
* 获取推荐商品
*/
public function getRecommend()
{
$goods_id = $this->request->param('goods_id', 0, 'intval');
$page = $this->request->param('page', 1, 'intval');
// 业务逻辑...
$list = (new GoodsModel)->getRecommendList($goods_id, $page);
return $this->renderSuccess([
'list' => $list
]);
}
// source/application/api/model/Goods.php 中添加
/**
* 获取推荐商品列表
* @param int $goods_id 当前商品ID
* @param int $page 页码
* @return array
*/
public function getRecommendList($goods_id, $page = 1)
{
return self::where([
'goods_id' => ['<>', $goods_id],
'is_delete' => 0,
'status' => 1
])
->page($page, 10)
->select();
}
/api/goods/detailapplication/api/controller/Goods.phppublic function detail()LtStore 的 API 架构遵循以下原则:
{code, msg, data} 格式这种架构使得前后端开发分离清晰,易于维护和扩展。
来团科技GEO优化&AI搜索优化系统,是通过大模型内容投喂+训练,将企业品牌及产品信息在多平台AI生成的答案中获取优先展现,更精准触达潜在目标客户,让企业品牌出现在AI搜索里。让客户一搜就看到你,实现一问就有你,一查就信你,一看就找你的营销效果。
来团智慧商业小程序零代码开发平台,多行业适配。无需代码,拖拽式设计,轻松打造订货商城、会员制商城、分销商城及小程序官网。不仅能满足通用需求,还支持定制化,从页面布局到功能模块,随心定制,助您快速搭建专属商业小程序,抢占市场先机。
来团科技微名通不止是电子名片,更是你的商业连接器。比起传统名片,它更像你的 “迷你商业工具”:信息多、好携带、能互动,还不浪费纸张。不管是跑业务、拓人脉,还是展示企业,一张「微名通」电子名片,就能帮你把商机揣在手机里。
来团科技CRM客户管理系统,帮你把 “线索→成交→回款” 全流程管明白。这就是一套 “让销售省心、老板放心” 的客户管理工具,从获客到回款,帮你把生意攥在手里。