后端(Java) —— 端口 18080(8080 被本机占用)
cd F:\shop\java-rewrite\yoshop-java
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=18080"
yoshop.auth.mode=redis(默认,见 application.yml):真实登录校验,登录态存 Redis--yoshop.auth.mode=off:临时跳过登录校验(本地调试前端时用)spring.data.redis,key 前缀 yoshop:store:token:,TTL 7 天SERVER__PORT 会覆盖配置端口,启动时务必显式带 --server.port=18080前端(Vue) —— 端口 8120
cd F:\shop\yoshop2.0-store
NODE_OPTIONS=--openssl-legacy-provider ./node_modules/.bin/vue-cli-service serve
Windows cmd 下用
yarn serve亦可(package.json 已带--openssl-legacy-provider)。
访问 http://localhost:8120 ,用后台账号登录。
| 文件 | 改动 | 原因 |
|---|---|---|
public/config.js |
BASE_API → /api/store |
改走 devServer 代理,避免跨域;原线上地址保留为注释 |
vue.config.js |
devServer.proxy 增加 /api → http://localhost:18080 |
代理把 /api/store/goods/list 转发成 /store/goods/list |
两个文件均留有 .bak 备份,要切回线上 PHP 直接 cp public/config.js.bak public/config.js。
请求走向
浏览器 http://localhost:8120/store/goods/list
→ axios baseURL=/api/store,拼成 /api/store/goods/list
→ webpack devServer 代理,去掉 /api
→ http://localhost:18080/store/goods/list
| 接口 | 说明 | 与线上 PHP 对比 |
|---|---|---|
POST /store/passport/login |
账号密码登录,bcrypt 校验(PHP password_verify 对应 Java BCrypt.checkpw),写 7 天登录态 |
参数/错误文案一致 |
POST /store/passport/logout |
删除登录态 | — |
GET /store/store.user/info |
登录后第一个请求,返回 userInfo + roles | 0 差异 |
GET /store/home/data |
后台首页统计(概览/统计/待办/7 日走势) | 0 差异 |
已有:/store/goods/list(0 差异)、/store/goods/detail(0 差异)。
第 2 批(商城信息、分类、文件库、地区、会员、订单、设置、内容、营销等 34 个接口)已完成, 逐字段校验 28/28 PASS,详见
接口实现进度-第2批.md。第 3 批(权限-角色/管理员、商城地址、页面装修、帮助中心、文章分类、文章,共 21 个接口,含增删改) 已完成,页面装修 2/2 PASS、写接口 62 项断言全通过,详见
接口实现进度-第3批.md。第 4 批(商品新增/编辑含多规格、上下架、删除、基础信息、按 ID 取列表、规格列表、图片/视频上传, 共 9 个接口)已完成:写接口 42 项断言全通过,读接口 7/7 逐字段 0 差异,详见
接口实现进度-第4批.md。 进度:151 个接口已实现 91 个。
[1] 无 token 访问商品列表 → 401 请先登录后再访问
[2] 错误密码登录 → 500 登录失败, 用户名或密码错误
[3] 不存在的用户 → 500 登录失败, 该用户不存在或已删除
[4] 有效 token + 商品列表 → 200,8 条商品
[5] 有效 token + 用户信息 → 200,字段与 PHP 逐一对齐
[6] 有效 token + 首页数据 → 200,字段与 PHP 逐一对齐
[7] 经 8120 代理访问以上三个接口 → 全部 200,链路通
checkPrivilege 未实现。Java 端只校验登录态,不校验角色对具体 API 的权限(PHP 会查 store_api 表)。上线前必须补。java-rewrite/runtime/cache,PHP 生产环境的缓存文件在云服务器 47.121.25.205,两边互不相通。双跑期如需共用登录,要共享目录。192.168.1.177/shop 与线上 PHP 库之间是 PHP → 本地的单向同步。
影响:写接口只能用「库内断言 + Java 读回」验证;上线前必须把 application.yml 的数据源指向线上主库,否则后台改的数据在线上不生效。第 9 批已完成 app/admin 模块全部业务接口(23 个,controller/initialize 为 PHP 基类钩子不实现),
详见 接口实现进度-第9批-admin.md。
POST /admin/passport/login,body {"username":"admin","password":"***"} → {userId, token}yoshop:admin:token:{token},值=管理员 JSON(不含 password),TTL 7 天/store/** 走 StoreAuthInterceptor,/admin/** 走 AdminAuthInterceptor;
拿商家 token 访问 /admin/** 一律 401/admin/store/{index,recycle,recovery,edit,move,add}、/admin/store.api/{index,add,edit,delete}、
/admin/store.menu/{index,info,add,edit,set_apis,delete}、/admin/admin.user/{detail,renew}、
/admin/setting.{cache, science, timer}/.../admin/store/recovery 是「移入回收站」、/admin/store/move 是「移出回收站」(PHP 原有命名)python tools/test_admin_api.py(需服务在 18080,并假定 admin 口令为 123456;
测试时是临时改库内的 bcrypt 哈希跑完再还原,平时请勿依赖该口令)vue.config.js devServer /api → http://127.0.0.1:18080,pathRewrite '/api': '/admin';
public/config.js 的 BASE_API: '/api'(生产改回实际域名)。currentPage、userInfo.adminUserId 等)。store.menu/setApis 前端按驼峰调用,Java 端 /admin/store.menu/setApis 与 /set_apis 两个路径都支持。客户端 api 共 74 个接口,已全部实现(四批),详见 接口实现进度-第10批-api.md 起至
接口实现进度-第13批-api.md。
/api/**,与 PHP 的 /index.php?s=/api/xxx 对应platform(MP-WEIXIN / H5)、Access-Token(用户 token,可无)/api/setting/data、/api/store/data 里的 setting 与 PHP 一致——
库内缺项时按 common\model\store\Setting::defaultData() 补默认值(PHP 的 getAll() 是
resetOptions(defaultData, data))。当前库只有 register / sms / trade 三项,所以
appTheme / pageCategoryTemplate / points / recharge / customer 都来自默认值;
缺了这层补齐,客户端读 pageCategoryTemplate.style 会得到 undefined(分类页空白)yoshop:api:token:{token},值=用户 ID;/api/** 只解析不拦截,
需登录的接口(购物车、订单、用户中心、售后、充值、收银台等)由接口内部判定并返回 401「请先登录后再访问」/api/passport/login(手机号 + 短信验证码,自动注册)、/api/passport/loginMpWx(小程序一键登录)、
/api/passport/loginMpWxMobile(小程序授权手机号);返回 {userId, token},token 有效期 30 天application.yml 的 yoshop.sms.verify-code: false(默认),
手机号登录时 smsCode 随便填、不填都能登录;接入短信平台后改 true 即恢复
严格校验(空值报「短信验证码不能为空」+ Redis 比对次数 + 用后即焚),无需改代码。
uniapp 登录页的本地校验也已同步放开(pages/login/components/main.vue 的 SUBMIT_LOGIN 分支)。
注:/api/user/bindMobile(绑定手机号)不在该开关范围内,仍会校验真实验证码/api/captcha/image 返回 {base64, key, md5}(Redis yoshop:api:captcha:{key},TTL 1800 秒);
/api/captcha/sendSmsCaptcha 校验图形验证码后按手机号每日限 10 次
(Redis yoshop:api:sms:send:{mobile}),验证码写入 yoshop:api:sms:{mobile} → {"code","times"};
短信通道未接入,验证码只落缓存并在日志里打印 [sms] ... code=xxxxxx,本地联调可看日志或直接读 Redis/api/cashier/orderInfo(订单 + 用户 + 该客户端可用支付方式)、/api/cashier/orderPay、
/api/cashier/tradeQuery;余额支付已完整实现(扣余额、写明细、置订单已付款、累计销量)/api/notify/wechatV2(XML)、/api/notify/wechatV3(JSON)、/api/notify/alipay(表单);
交易记录查找与支付成功分发(商城订单 / 余额充值)已实现,验签未接入:
库内没有支付模板(未配置商户)时跳过验签直接处理,一旦存在支付模板即拒绝回调{total, perPage, currentPage, lastPage, data}python tools/test_api_batch1.py(首页 / 店铺 / 地区 / 文章 / 商品 / 营销,53 项)python tools/test_api_batch2.py(购物车 / 结算下单 / 订单 / 评价 / 地址,97 项)python tools/test_api_batch3.py(用户中心 / 优惠券 / 明细 / 售后 / 充值 / 上传,99 项)python tools/test_api_batch4.py(验证码 / 登录 / 收银台 / 支付回调,73 项;
yoshop.sms.verify-code: true 时为 77 项,脚本会自动按开关选择断言)python tools/test_uniapp_contract.py(uniapp 真实 {form:...} 结构:setting / 验证码 / 登录 / userInfo,9 项)