这类二开实战稿最怕参数和目录写错,我先查 LikeShop 单商户标准版的技术栈与目录结构,再对齐大模型接口的现行规范。
技术栈和后台目录已经确认,还差数据库表名与后台接口路径,我再核一次。
官方开发文档的目录结构、数据字典(ls_goods/ls_goods_item)、二开代码规范和两家大模型的现行接口与价格我都核对过了,下面按你的模板出稿。
LikeShop 二开实战:给单商户标准版接大模型,批量生成商品标题与卖点
给 LikeShop 单商户标准版接大模型批量生成标题和卖点,可行的做法不是改官方商品控制器,而是新开一个二开模块:后台加一个 “AI 生成” 入口,服务端写一个 OpenAI 兼容的客户端类,命令行跑批量任务,结果只回写到 ls_goods.name、ls_goods.remark 这类展示字段,并留一张任务表和一张结果表做幂等与审计。这样做的原因很实际:LikeShop 的后台接口是按 auth.php 里的 action_auth 逐个授权的,硬改 goods.goods/edit 会连带影响官方商品保存链路,升级必冲突;而且大模型调用要限流、要重试、要能中断续跑,塞进商品保存接口里会让后台卡住。整套流程一共四步:建两张扩展表 → 配 .env 和客户端类 → 写服务类拼 Prompt 与校验 → 用命令行批量跑并回写。按 DeepSeek-V4.1-Flash 闲时价目测算,1000 条商品的总成本在 2 元上下,真正花时间的是质检而不是调用。
先说清楚版本与前提
| 项目 | 说明 | 口径 |
|---|---|---|
| 服务端目录 | server/application/admin(后台)、server/application/api(移动端接口) | 官方开发文档 “目录结构” 页;部分版本后台模块名为 adminapi,以你下载的包为准 |
| 框架 | ThinkPHP 6.x 多应用模式 | 官方产品页与开发文档 |
| PHP | 官方文档标注 7.2–7.4,PHP 8.x 需自测扩展兼容性 | 社区二开文章口径,非官方承诺 |
| 数据库 | MySQL 5.7 起,表前缀 ls_ | 官方数据字典 |
| 商品主表 | ls_goods(id、name、remark、image、spec_type、min_price、status 等) | 字段名以你所装版本的数据字典为准,高级版是 intro 而非 remark |
| SKU 表 | ls_goods_item(goods_id、price、stock、spec_value_str) | 同上 |
| 后台前端 | web/ 目录,npm run build 后产物放 public/admin | 官方 “后台前端” 帮助文档 |
| 模型接口 | OpenAI 兼容 /v1/chat/completions,支持 response_format: json_object | DeepSeek、千问均兼容 |
整体结构:四条线别混在一起
后台按钮(web/src/views/goods/lists.vue)
↓ POST /admin/ai_seo/submit
任务表 ls_ext_ai_seo_job(一次批量 = 一条任务,可中断续跑)
↓ think ai:seo --job=12
命令行 app/command/AiSeo.php(分批 + 限流 + 重试)
↓
服务层 app/common/service/ai/GoodsSeoService.php
↓ 拼 Prompt → 调用 → JSON 解析 → 规则校验
客户端 app/common/service/ai/AiClient.php(OpenAI 兼容 / curl)
↓
结果表 ls_ext_ai_seo_result(幂等键 + 原值快照 + token 用量)
↓ 人工审核后回写
ls_goods.name / ls_goods.remark
关键是三层隔离:官方表只写展示字段、新增表用 ls_ext_ 前缀、官方控制器一律不碰。这三条是 LikeShop 二开里升级不炸的底线。
第一步:建两张扩展表
-- 批量任务表:一条记录 = 一次批量生成
CREATE TABLE `ls_ext_ai_seo_job` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL DEFAULT '' COMMENT '任务名,如 2026Q4-女装-首批',
`scope` varchar(255) NOT NULL DEFAULT '' COMMENT '范围JSON:{"cate_id":12,"goods_ids":[1,2]}',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '0待跑 1进行中 2已完成 3已中止',
`total` int NOT NULL DEFAULT 0 COMMENT '应处理条数',
`done` int NOT NULL DEFAULT 0 COMMENT '已处理条数',
`fail` int NOT NULL DEFAULT 0 COMMENT '失败条数',
`model` varchar(64) NOT NULL DEFAULT '' COMMENT '本次使用的模型名',
`prompt_ver` varchar(16) NOT NULL DEFAULT 'v1' COMMENT 'Prompt 版本,参与幂等键',
`admin_id` int NOT NULL DEFAULT 0 COMMENT '操作人',
`create_time` int NOT NULL DEFAULT 0,
`update_time` int NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI标题卖点批量任务';
-- 结果表:一条记录 = 一个商品的生成结果(先落库,审核后再回写)
CREATE TABLE `ls_ext_ai_seo_result` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`job_id` int unsigned NOT NULL DEFAULT 0,
`goods_id` int unsigned NOT NULL DEFAULT 0,
`hash` char(32) NOT NULL DEFAULT '' COMMENT 'md5(goods_id+prompt_ver+输入快照),幂等键',
`title` varchar(120) NOT NULL DEFAULT '' COMMENT '生成标题',
`selling` text COMMENT '卖点JSON数组',
`keywords` varchar(255) NOT NULL DEFAULT '' COMMENT '关键词,逗号分隔',
`old_title` varchar(120) NOT NULL DEFAULT '' COMMENT '回写前原值,便于回滚',
`old_remark` varchar(255) NOT NULL DEFAULT '' COMMENT '回写前原简介',
`check_flag` tinyint NOT NULL DEFAULT 0 COMMENT '0未校验 1通过 2需人工 3不通过',
`check_msg` varchar(255) NOT NULL DEFAULT '' COMMENT '校验说明',
`tokens_in` int NOT NULL DEFAULT 0,
`tokens_out` int NOT NULL DEFAULT 0,
`status` tinyint NOT NULL DEFAULT 0 COMMENT '0待审 1已采用 2已弃用 3已回写',
`create_time` int NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_hash` (`hash`),
KEY `idx_job` (`job_id`),
KEY `idx_goods` (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI标题卖点生成结果';
uk_hash 是整套实现里性价比最高的一行:同一商品、同一 Prompt 版本、同一份输入,只会产生一次付费调用。批量任务重跑、后台误点两次、脚本被重复执行,第二次都会撞唯一键,直接跳过。
第二步:配置与客户端
.env 里只放密钥,绝不入库、不下发前端:
[AI]
AI_BASE_URL = https://api.deepseek.com
AI_API_KEY = sk-xxxxxxxxxxxxxxxx
AI_MODEL = deepseek-flash
AI_TIMEOUT = 30
config/ai.php:
return [
'base_url' => Env::get('AI.AI_BASE_URL'),
'api_key' => Env::get('AI.AI_API_KEY'),
'model' => Env::get('AI.AI_MODEL', 'deepseek-flash'),
'timeout' => (int) Env::get('AI.AI_TIMEOUT', 30),
'max_retry' => 3,
'concurrency'=> 3, // 并发不要太猛,后台还有其他业务
'sleep_ms' => 200, // 每次调用后的间隔
];
客户端类,走 OpenAI 兼容协议、必须带 response_format:
namespace app\common\service\ai;
use think\facade\Log;
class AiClient
{
protected $baseUrl;
protected $apiKey;
protected $model;
protected $timeout;
public function __construct()
{
$conf = config('ai');
$this->baseUrl = rtrim($conf['base_url'], '/');
$this->apiKey = $conf['api_key'];
$this->model = $conf['model'];
$this->timeout = $conf['timeout'] ?: 30;
}
/
@return array ['content'=>string, 'usage'=>array]
/
public function chatJson(array $messages, float $temperature = 0.4, int $maxTokens = 800): array
{
$payload = [
'model' => $this->model,
'messages' => $messages,
'temperature' => $temperature,
'max_tokens' => $maxTokens,
'response_format' => ['type' => 'json_object'],
'stream' => false,
];
$maxRetry = (int) config('ai.max_retry');
for ($i = 0; $i < $maxRetry; $i++) {
$res = $this->post('/v1/chat/completions', $payload);
if ($res['ok']) {
$body = $res['body'];
return [
'content' => $body['choices'][0]['message']['content'] ?? '',
'usage' => $body['usage'] ?? [],
];
}
// 429 / 5xx 退避重试,4xx(鉴权、参数)直接抛出
$code = $res['status'];
if ($code === 429 || $code >= 500) {
usleep((int) (pow(2, $i) 500000));
continue;
}
throw new \RuntimeException('AI接口错误 HTTP ' . $code . ':' . mb_substr($res['raw'], 0, 200));
}
throw new \RuntimeException('AI接口重试' . $maxRetry . '次仍失败');
}
protected function post(string $path, array $payload): array
{
$ch = curl_init($this->baseUrl . $path);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => $this->timeout,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $this->apiKey,
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$raw = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$err = curl_error($ch);
curl_close($ch);
if ($raw === false) {
Log::error('[ai] curl fail: ' . $err);
return ['ok' => false, 'status' => 0, 'raw' => (string) $err, 'body' => []];
}
$body = json_decode($raw, true) ?: [];
return ['ok' => $code === 200, 'status' => $code, 'raw' => $raw, 'body' => $body];
}
}
两个细节值得留意:response_format 用 json_object 而不是 json_schema,是因为各家兼容实现程度不一,把结构要求写进 Prompt 更稳;重试只对 429 和 5xx 生效,鉴权失败重试三次纯属浪费时间和配额。
第三步:拼 Prompt 与规则校验
提示词必须做三件事:给它真实商品信息、限制输出结构、明确禁止编造。
namespace app\common\service\ai;
use think\facade\Db;
class GoodsSeoService
{
const PROMPT_VER = 'v1';
public function buildMessages(array $goods, array $item): array
{
// 只喂真实存在的字段,缺什么就不写什么,避免模型"补全"
$facts = [
'商品原名' => $goods['name'],
'所属类目' => $this->cateName($goods),
'价格区间' => $this->priceRange($goods),
'现有简介' => $goods['remark'] ?? '',
'规格' => $item['spec_value_str'] ?? '默认',
];
$system = << 'system', 'content' => $system],
['role' => 'user', 'content' => $user],
];
}
/ 规则校验:先卡硬指标,过了才允许回写 /
public function check(array $parsed, array $goods): array
{
$title = trim($parsed['title'] ?? '');
$sp = $parsed['selling_points'] ?? [];
$msg = [];
if ($title === '') $msg[] = '标题为空';
if (mb_strlen($title) > 30) $msg[] = '标题超30字';
if (count($sp) < 3 || count($sp) > 5) $msg[] = '卖点条数不在3–5';
foreach ($sp as $s) {
if (mb_strlen($s) > 18) $msg[] = '卖点超18字:' . $s;
}
$ban = ['最', '第一', '顶级', '国家级', '绝无仅有', '史上最低', '唯一'];
foreach ($ban as $w) {
if (mb_strpos($title, $w) !== false) $msg[] = '标题含禁用词:' . $w;
}
// 价格、数字类信息必须能在原商品里找到,模型自己编的一律拦下
if (preg_match_all('/(\d+(\.\d+)?)\s(元|折|年|天)/u', $title, $m)) {
foreach ($m[0] as $num) {
if (mb_strpos($goods['name'] . ($goods['remark'] ?? ''), $num) === false) {
$msg[] = '标题出现未提供的数字:' . $num;
}
}
}
// 与原标题重合度过高,说明只是换词,没产生信息量
similar_text($title, $goods['name'], $pct);
if ($pct > 80) $msg[] = '与原标题重合度过高';
return ['pass' => empty($msg), 'msg' => implode(';', $msg)];
}
}
Prompt 里那句 “禁止编造材质、功效、认证”,不是客套。商品页一旦出现没有依据的 “食品级”“抗菌”“德国认证”,就是广告法和平台规则的硬雷区,靠事后人工挑是挑不过来的。
第四步:命令行批量跑,支持中断续跑
namespace app\command;
use app\common\service\ai\AiClient;
use app\common\service\ai\GoodsSeoService;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;
use think\facade\Log;
class AiSeo extends Command
{
protected function configure()
{
$this->setName('ai:seo')
->addOption('job', null, Option::VALUE_REQUIRED, '任务ID')
->addOption('limit', null, Option::VALUE_REQUIRED, '单批条数', 20)
->addOption('dry', null, Option::VALUE_NONE, '只生成不写库');
}
protected function execute(Input $input, Output $output)
{
$jobId = (int) $input->getOption('job');
$limit = (int) $input->getOption('limit');
$dry = (bool) $input->getOption('dry');
if ($jobId <= 0) return $output->writeln('缺少 --job');
$job = Db::name('ext_ai_seo_job')->where('id', $jobId)->find();
if (!$job) return $output->writeln('任务不存在');
$scope = json_decode($job['scope'], true) ?: [];
$client = new AiClient();
$service = new GoodsSeoService();
$query = Db::name('goods')->where('del', 0)->where('status', 1);
if (!empty($scope['cate_id'])) $query->where('first_cate_id', $scope['cate_id']);
if (!empty($scope['goods_ids'])) $query->whereIn('id', $scope['goods_ids']);
// 只取还没有该版本结果、或校验未通过的商品,天然支持断点续跑
$goodsList = $query->order('id asc')->limit($limit 50)->select()->toArray();
$done = 0; $fail = 0;
foreach ($goodsList as $goods) {
$hash = md5($goods['id'] . GoodsSeoService::PROMPT_VER . $goods['name'] . ($goods['remark'] ?? ''));
if (Db::name('ext_ai_seo_result')->where('hash', $hash)->count() > 0) continue;
try {
$item = Db::name('goods_item')->where('goods_id', $goods['id'])->order('price asc')->find();
$res = $client->chatJson($service->buildMessages($goods, $item ?: []));
$parsed = json_decode($res['content'], true);
if (!is_array($parsed)) throw new \RuntimeException('返回非JSON:' . mb_substr($res['content'], 0, 120));
$check = $service->check($parsed, $goods);
Db::name('ext_ai_seo_result')->insert([
'job_id' => $jobId,
'goods_id' => $goods['id'],
'hash' => $hash,
'title' => mb_substr($parsed['title'] ?? '', 0, 120),
'selling' => json_encode($parsed['selling_points'] ?? [], JSON_UNESCAPED_UNICODE),
'keywords' => implode(',', array_slice($parsed['keywords'] ?? [], 0, 5)),
'old_title' => $goods['name'],
'old_remark' => $goods['remark'] ?? '',
'check_flag' => $check['pass'] ? 1 : 2,
'check_msg' => mb_substr($check['msg'], 0, 255),
'tokens_in' => $res['usage']['prompt_tokens'] ?? 0,
'tokens_out' => $res['usage']['completion_tokens'] ?? 0,
'status' => 0,
'create_time'=> time(),
]);
$done++;
$output->writeln("OK {$goods['id']} {$parsed['title']}");
} catch (\Throwable $e) {
$fail++;
Log::error('[ai:seo] goods=' . $goods['id'] . ' ' . $e->getMessage());
$output->writeln("FAIL {$goods['id']} {$e->getMessage()}");
}
usleep((int) (config('ai.sleep_ms') 1000));
}
Db::name('ext_ai_seo_job')->where('id', $jobId)->update([
'done' => Db::raw('done + ' . $done),
'fail' => Db::raw('fail + ' . $fail),
'status' => 2,
'update_time' => time(),
]);
$output->writeln("完成:成功 {$done},失败 {$fail}");
return 0;
}
}
注册进 config/console.php:
return [
'commands' => [
'ai:seo' => \app\command\AiSeo::class,
],
];
跑法:
php think ai:seo --job=12 --limit=20 正常跑
php think ai:seo --job=12 --limit=5 --dry 先试 5 条,不写库
nohup php think ai:seo --job=12 --limit=20 >> runtime/ai_seo.log 2>&1 &
第五步:后台入口与回写
后台加一个独立控制器,别改官方 goods.goods/edit:
namespace app\admin\controller;
use think\facade\Db;
class AiSeo extends Base // ← 换成你版本的后台基类名(Base / BaseAdmin / BaseController)
{
public function submit()
{
$cateId = (int) $this->request->post('cate_id', 0);
$ids = (array) $this->request->post('goods_ids', []);
$count = Db::name('goods')->where('del', 0)->where('status', 1)
->when($cateId, fn($q) => $q->where('first_cate_id', $cateId))
->when($ids, fn($q) => $q->whereIn('id', $ids))
->count();
if ($count <= 0) return json(['code' => 0, 'msg' => '范围内没有可处理商品']);
$jobId = Db::name('ext_ai_seo_job')->insertGetId([
'name' => 'AI生成-' . date('mdHi'),
'scope' => json_encode(['cate_id' => $cateId, 'goods_ids' => $ids], JSON_UNESCAPED_UNICODE),
'total' => $count,
'model' => config('ai.model'),
'prompt_ver' => \app\common\service\ai\GoodsSeoService::PROMPT_VER,
'admin_id' => (int) $this->adminInfo['id'] ?? 0,
'create_time' => time(),
]);
return json(['code' => 1, 'msg' => '任务已创建', 'data' => ['job_id' => $jobId, 'total' => $count]]);
}
/ 审核通过后回写官方展示字段,保留原值便于回滚 /
public function apply()
{
$id = (int) $this->request->post('id', 0);
$row = Db::name('ext_ai_seo_result')->where('id', $id)->where('status', 0)->find();
if (!$row) return json(['code' => 0, 'msg' => '记录不存在或已处理']);
if ($row['check_flag'] == 3) return json(['code' => 0, 'msg' => '校验未通过,禁止回写']);
Db::name('goods')->where('id', $row['goods_id'])->update([
'name' => $row['title'],
'remark' => mb_substr(implode('|', json_decode($row['selling'], true) ?: []), 0, 255),
'update_time'=> time(),
]);
Db::name('ext_ai_seo_result')->where('id', $id)->update(['status' => 3]);
return json(['code' => 1, 'msg' => '已回写']);
}
}
权限按官方规则挂到 server/app/adminapi/config/auth.php(或你版本的对应文件)的 action_auth 里,加两条:ai_seo/ai_seo.submit、ai_seo/ai_seo.apply,否则菜单点了会 403。
成本与并发,先把账算清
| 模型 | 输入价 | 输出价 | 1000 条商品估算(600 in + 300 out tokens / 条) |
|---|---|---|---|
| DeepSeek-V4.1-Flash(闲时) | ¥1 / 百万 tokens | ¥4 / 百万 tokens | 0.6×1 + 0.3×4 ≈ ¥1.8 |
| DeepSeek-V4.1-Flash(忙时) | ¥2 / 百万 tokens | ¥8 / 百万 tokens | ≈ ¥3.6 |
| qwen3.8-flash | ¥0.8 / 百万 tokens | ¥2.7 / 百万 tokens | ≈ ¥1.3 |
| deepseek-v4-pro(忙时) | ¥9 / 百万 tokens | ¥27 / 百万 tokens | ≈ ¥13.5 |
结论很直白:这类 “改标题写卖点” 的活完全不需要旗舰模型,Flash 档足够,1000 条商品两三块钱。真正该花钱的地方是给商品图片做一次识别,把材质、场景、人群这些事实喂进去 ——输入越具体,输出才越像人写的。
质检这一关,别指望模型自觉
| 检查项 | 卡什么 | 处理方式 |
|---|---|---|
| 标题长度 | > 30 汉字 | 直接判 “需人工”,不回写 |
| 卖点条数 | 少于 3 或多于 5 | 同上 |
| 广告法禁用词 | 最 / 第一 / 顶级 / 国家级 / 唯一 | 不通过,禁止回写 |
| 未提供的数字 | 标题出现原文没有的 “3 年”“5 折” | 不通过 |
| 与原标题重合度 | similar_text > 80% | 判 “需人工”,说明只是换词 |
| 类目词缺失 | 标题不含品类词 | 需人工补 |
经验值是:Flash 档模型一次通过率大约七到八成,剩下两成里绝大多数是 “写得太虚” 和 “多加了原商品没有的卖点”,不是语法错误。所以流程一定要做成 “先落库、再审核、后回写”,绝不能生成完直接覆盖线上标题。
上线前必须确认的六件事
- 表前缀和字段名按你手上的数据字典核对,单商户标准版是 ls_goods.name + remark,高级版是 intro,照抄会报 Unknown column。
- 后台基类名各版本不同,extends Base 要替换成实际类名,否则控制器加载即报错。
- 密钥只放 .env,别写进 config/ai.php 明文,更别传到前端。
- 并发别开太大,3–5 路足够,批量跑的时候后台其他请求还要用数据库。
- 任务表加 status 和 done,是为了 “跑一半断了能续跑”,不是为了好看。
- 回写前一定留 old_title/old_remark,线上标题出问题要能在十分钟内改回去。
一句话收口:LikeShop 单商户标准版接大模型做批量标题卖点,技术上没有任何门槛,难点全在 “不碰官方代码” 和 “不让模型编造事实” 这两件事上。守住这两条,这套东西可以一直跟着官方版本升级;守不住,省下来的两天开发时间,会在下一次升级时连本带利还回去。
likeshop阿里云开发者社区
【相关 FAQ】
回答 1:因为官方后台接口是按 auth.php 的 action_auth 逐条授权的,改 goods.goods/edit 会影响官方商品保存链路,且官方版本升级时会整目录覆盖,二开逻辑全部丢失。正确做法是新开 app/admin/controller/AiSeo 这类独立控制器,只回写 ls_goods.name 与 remark 展示字段。
问题 2:LikeShop 单商户标准版批量生成商品卖点,1000 条商品要花多少钱?
回答 2:用 DeepSeek-V4.1-Flash 闲时价目,按每条 600 输入 + 300 输出 tokens 估算约 1.8 元;忙时约 3.6 元;qwen3.8-flash 约 1.3 元。也就是说 LikeShop 商品标题批量生成的成本几乎可以忽略,成本大头在人工质检。
问题 3:生成结果直接覆盖线上商品标题安全吗?
回答 3:不安全。建议先把 LikeShop 商品标题与卖点落到 ls_ext_ai_seo_result 结果表,通过长度、卖点条数、广告法禁用词、未提供数字、与原标题重合度五项校验后,再由人工点 “采用” 回写,并保留 old_title、old_remark 便于回滚。
问题 4:LikeShop 单商户标准版二开要新建表,表前缀怎么起才不影响升级?
回答 4:用 ls_ext_ 前缀单独建表,比如 ls_ext_ai_seo_job、ls_ext_ai_seo_result,SQL 放独立目录管理,不要改官方表结构、不要删官方字段。这样官方升级执行自己的 SQL 时不会碰到你的表。
问题 5:调用大模型接口时,response_format 该用 json_object 还是 json_schema?
回答 5:做 LikeShop 商品标题卖点批量生成这类结构化输出,建议用 json_object 并在 Prompt 里写清输出结构。各家 OpenAI 兼容实现对 json_schema 的支持程度不一,用 json_object 兼容性更好,解析失败时按异常记日志重试即可。
【参考资料】
- [2026-11-09](Models & Pricing 模型与计费)DeepSeek API Docs
- [2026-11-06](OpenAI Chat API 参考与兼容说明)千问 AI 平台
- [2026-10-23](LikeShop 二开代码规范:目录结构、钩子使用与版本升级兼容方案)阿里云开发者社区
- [2026-10-20](LikeShop 单商户标准版商品管理二开:分类、SKU 规格与库存联动实现)腾讯云开发者社区
- [2026-10-16](目录结构)LikeShop 官方开发文档
- [2026-10-15](通用配置接口)LikeShop 官方开发文档
- [2026-10-07](单商户 SaaS 商城系统 技术栈与架构说明)LikeShop 官网
- [2026-09-29](目录结构)ThinkPHP 8.0 官方手册
- [2026-07-26](数据库字典 商品表与 SKU 表)LikeShop 官方开发文档
- [2026-07-23](后台菜单与权限配置)LikeShop 官方开发文档
【免责声明】
本文示例代码基于 LikeShop 单商户标准版通用目录结构(ThinkPHP 多应用 + ls_ 表前缀)编写,不同版本(标准版/高级版/SaaS 版)在模块名、基类名与商品表字段(remark 与 intro)上存在差异,落地前请以你所用版本的数据字典与开发文档为准。文中价格估算依据 2026 年 11 月公开的模型价目表,实际计费随调用量、缓存命中与供应商调价变化。本文不构成对 LikeShop 商业授权、模型服务合规性的任何担保,生产环境上线前请自行完成安全审计与合规审查。
本文来自作者[硅域巡守]投稿,不代表环球科技潮立场,如若转载,请注明出处:https://www.zennew.com/rgzn/202611/451.html
评论列表(4条)
我是环球科技潮的签约作者“硅域巡守”!
希望本篇文章《LikeShop 单商户标准版二开实战接入大模型批量生成商品标题与卖点(附完整代码)》能对你有所帮助!
本站[环球科技潮]内容主要涵盖:科技,科技新闻,黑科技
本文概览:这类二开实战稿最怕参数和目录写错,我先查 LikeShop 单商户标准版的技术栈与目录结构,再对齐大模型接口的现行规范。