Compare commits

3 Commits

Author SHA1 Message Date
Zhukj
2a1f33323c chore:修改readme.md小程序和快应用发布说明文档 2026-01-24 16:51:31 +08:00
Zhukj
b441c46993 chore:更新小程序发布说明文档 2026-01-24 11:19:53 +08:00
8df59abd03 fix(关注/足迹): 优化交互逻辑 2026-01-07 11:35:28 +08:00
13 changed files with 192 additions and 117 deletions

View File

@@ -19,5 +19,10 @@ export const lang = {
currencySymbol: '¥', currencySymbol: '¥',
submit: 'Submit', submit: 'Submit',
searchTip: 'Please enter search keywords' searchTip: 'Please enter search keywords'
} },
login: 'Login/Register',
loginTips: 'Click to login and enjoy more exciting information',
toLogin: 'Go to login',
toGoodsCategoryPage: 'Go shopping',
} }

View File

@@ -21,6 +21,10 @@ export const lang = {
searchTip: '请输入搜索关键词' searchTip: '请输入搜索关键词'
}, },
login: '登录/注册',
loginTpis: '点击登录 享受更多精彩信息',
toLogin: '去登录',
toGoodsCategoryPage: '去逛逛',
waitpay: '待付款', waitpay: '待付款',
waitsend: '待发货', waitsend: '待发货',

View File

@@ -103,7 +103,7 @@
}, },
"router" : { "router" : {
"mode" : "history", "mode" : "history",
"base" : "/hwappx/common/" "base" : "/hwappx/2811/"
}, },
"title" : "", "title" : "",
"devServer" : { "devServer" : {

View File

@@ -199,9 +199,12 @@
</block> </block>
<block v-else> <block v-else>
<view class="cart-empty"> <view class="cart-empty">
<ns-empty text="购物车为空" subText="赶紧去逛逛, 购买心仪的商品吧" :isIndex="Boolean(storeToken)"></ns-empty> <ns-empty text="购物车为空" subText="赶紧去逛逛, 购买心仪的商品吧" :isIndex="Boolean(storeToken)"
<button type="primary" size="mini" class="button mini" v-if="!storeToken" :emptyBtn="{ text: $lang('toGoodsCategoryPage'), url: '/pages_goods/category' }"></ns-empty>
@click="toLogin">去登录</button> <button type="primary" size="mini" class="button mini" v-if="!storeToken" @click="toLogin">{{
$lang('toLogin')
}}</button>
</view> </view>
</block> </block>
<ns-goods-recommend ref="goodrecommend" route="cart"></ns-goods-recommend> <ns-goods-recommend ref="goodrecommend" route="cart"></ns-goods-recommend>

View File

@@ -1,4 +1,7 @@
import common from './common.js';
export default { export default {
mixins: [common],
data() { data() {
return { return {
cartData: [], // 购物车 cartData: [], // 购物车
@@ -444,9 +447,6 @@ export default {
// }); // });
} }
}, },
toLogin() {
this.$refs.login.open();
},
// 重置编辑状态 // 重置编辑状态
resetEditStatus() { resetEditStatus() {
if (this.cartData.length) { if (this.cartData.length) {

View File

@@ -0,0 +1,8 @@
export default {
methods: {
// 跳转至登录页
toLogin() {
this.$refs.login.open();
},
}
}

View File

@@ -1,8 +1,7 @@
<template> <template>
<view :style="themeColor"> <view :style="themeColor">
<mescroll-uni ref="mescroll" @getData="getData" class="member-point" :size="8" @listenRefresh="listenRefresh" <mescroll-uni ref="mescroll" @getData="getData" class="member-point" :size="8" @listenRefresh="listenRefresh">
v-if="storeToken"> <block class="goods_list" slot="list">
<view class="goods_list" slot="list">
<block v-if="collectionList.length > 0"> <block v-if="collectionList.length > 0">
<view class="goods_li margin-top" v-for="(item, index) in collectionList" :key="index" <view class="goods_li margin-top" v-for="(item, index) in collectionList" :key="index"
@click.stop="toDetail(item)"> @click.stop="toDetail(item)">
@@ -30,9 +29,15 @@
</view> </view>
</block> </block>
<!-- 第一个列表为空时 --> <!-- 第一个列表为空时 -->
<ns-empty v-if="collectionList.length == 0 && isShowEmpty" text="暂无关注的商品" :isIndex="false"></ns-empty> <view class="collection-empty" v-else>
<ns-goods-recommend ref="goodsRecommend"></ns-goods-recommend> <ns-empty v-if="collectionList.length == 0 && isShowEmpty" text="暂无关注的商品"
:isIndex="Boolean(storeToken)" :emptyBtn="{ text: $lang('toGoodsCategoryPage'), url: '/pages_goods/category' }"></ns-empty>
<button type="primary" size="mini" class="button mini" v-if="!storeToken"
@click="toLogin">{{ $lang('toLogin') }}</button>
</view> </view>
<ns-goods-recommend ref="goodsRecommend"></ns-goods-recommend>
</block>
</mescroll-uni> </mescroll-uni>
<ns-login ref="login"></ns-login> <ns-login ref="login"></ns-login>
<loading-cover ref="loadingCover"></loading-cover> <loading-cover ref="loadingCover"></loading-cover>
@@ -40,11 +45,11 @@
</template> </template>
<script> <script>
import common from './public/js/common.js';
import collection from './public/js/collection.js'; import collection from './public/js/collection.js';
export default { export default {
mixins: [collection], mixins: [common, collection],
data() { data() {
return {}; return {};
}, },
@@ -53,7 +58,7 @@ export default {
if (this.$refs.mescroll) this.$refs.mescroll.refresh(); if (this.$refs.mescroll) this.$refs.mescroll.refresh();
} else { } else {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.login.open('/pages_tool/member/collection'); this.$refs.loadingCover.hide();
}); });
} }
}, },

View File

@@ -3,9 +3,9 @@
<view class="head-wrap" v-if="storeToken"> <view class="head-wrap" v-if="storeToken">
<text @click="manageFootprint">{{ manage ? '完成' : '管理' }}</text> <text @click="manageFootprint">{{ manage ? '完成' : '管理' }}</text>
</view> </view>
<mescroll-uni ref="mescroll" @getData="getListData" top="110rpx" v-if="storeToken"> <mescroll-uni ref="mescroll" @getData="getListData" top="110rpx">
<block slot="list"> <block slot="list">
<view class="goods-list single-column" v-if="goodsList.length"> <view class="goods-list single-column" v-if="goodsList.length > 0">
<view v-for="(item, index) in goodsList" :key="index"> <view v-for="(item, index) in goodsList" :key="index">
<view class="datetime">{{ datetime(item) }}</view> <view class="datetime">{{ datetime(item) }}</view>
<view class="goods-item" :class="{ manage: manage }"> <view class="goods-item" :class="{ manage: manage }">
@@ -45,7 +45,11 @@
</view> </view>
</view> </view>
</view> </view>
<view v-else><ns-empty text="暂无浏览过的商品"></ns-empty></view> <view class="footprint-empty" v-else>
<ns-empty text="暂无浏览过的商品" :isIndex="Boolean(storeToken)" :emptyBtn="{ text: $lang('toGoodsCategoryPage'), url: '/pages_goods/category' }"></ns-empty>
<button type="primary" size="mini" class="button mini" v-if="!storeToken"
@click="toLogin">{{ $lang('toLogin') }}</button>
</view>
<view class="bottom-wrap" v-if="goodsList.length && manage"> <view class="bottom-wrap" v-if="goodsList.length && manage">
<view class="all-election" @click="allElection"> <view class="all-election" @click="allElection">
@@ -65,7 +69,10 @@
<script> <script>
var dateList = []; var dateList = [];
import common from './public/js/common.js';
export default { export default {
mixins: [common],
data() { data() {
return { return {
goodsList: [], goodsList: [],
@@ -81,7 +88,7 @@ export default {
if (this.$refs.mescroll) this.$refs.mescroll.refresh(); if (this.$refs.mescroll) this.$refs.mescroll.refresh();
} else { } else {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.login.open('/pages_tool/member/footprint'); this.$refs.loadingCover.hide();
}); });
} }
}, },
@@ -108,9 +115,7 @@ export default {
if (res.code == 0 && res.data) { if (res.code == 0 && res.data) {
newArr = res.data.list; newArr = res.data.list;
} else { } else {
this.$util.showToast({ console.log(`后台服务器返回的信息:${msg}`);
title: msg
});
} }
mescroll.endSuccess(newArr.length); mescroll.endSuccess(newArr.length);
//设置列表数据 //设置列表数据

View File

@@ -99,3 +99,24 @@
box-sizing: border-box; box-sizing: border-box;
margin-top: 50rpx; margin-top: 50rpx;
} }
.collection-empty {
text-align: center;
padding: 140rpx $padding 80rpx $padding;
image {
width: 380rpx;
}
button {
min-width: 300rpx;
margin-top: 100rpx;
height: 70rpx;
line-height: 70rpx !important;
font-size: $font-size-base;
border-radius: 50rpx;
&.visit-the {
font-weight: bold;
}
}
}

View File

@@ -2,6 +2,27 @@
margin-top: 100rpx; margin-top: 100rpx;
} }
.footprint-empty {
text-align: center;
padding: 140rpx $padding 80rpx $padding;
image {
width: 380rpx;
}
button {
min-width: 300rpx;
margin-top: 100rpx;
height: 70rpx;
line-height: 70rpx !important;
font-size: $font-size-base;
border-radius: 50rpx;
&.visit-the {
font-weight: bold;
}
}
}
.lineheight-clear { .lineheight-clear {
} }

View File

@@ -25,7 +25,7 @@ export default {
}, },
async: false, async: false,
}).then((res) => { }).then((res) => {
let newArr = res.data.list; let newArr = res.data?.list || [];
for (var i = 0; i < newArr.length; i++) { for (var i = 0; i < newArr.length; i++) {
newArr[i].composite_score = Math.floor((parseFloat(newArr[i].shop_desccredit) + parseFloat(newArr[i].shop_servicecredit) + parseFloat(newArr[i].shop_deliverycredit)) / 3).toFixed(1); newArr[i].composite_score = Math.floor((parseFloat(newArr[i].shop_desccredit) + parseFloat(newArr[i].shop_servicecredit) + parseFloat(newArr[i].shop_deliverycredit)) / 3).toFixed(1);
} }

View File

@@ -0,0 +1,8 @@
export default {
methods: {
// 跳转至登录页
toLogin() {
this.$refs.login.open();
}
}
}

165
readme.md
View File

@@ -1,7 +1,5 @@
# 小程序及快应用前端源码 # 小程序及快应用前端源码
来源于外包提供的源代码,"0731xcx20微信小程序(1).zip"
## 项目说明 ## 项目说明
@@ -9,7 +7,7 @@
## 开发说明 ## 开发说明
1. 源码基于Vue2版本scss采用node-sass进行编译输出。 源码基于Vue2版本scss采用dart-sass进行编译输出。
## 开发调试说明 ## 开发调试说明
@@ -18,7 +16,7 @@
应用访问等关键参数的配置来源于 `./common/js/config.js` 应用访问等关键参数的配置来源于 `./common/js/config.js`
### 小程序调试
@@ -26,93 +24,90 @@
### 小程序发布 ### 小程序发布
基本操作步骤:
1. 使用HBuilderX打开项目
2. 选择菜单栏 "发行" -> "小程序-微信",进行发布构建
3. 然后在终端进入项目根目录,执行 `npm run mp-weixin` 手动输出构建包。例如mp-weixin-2025-10-31-1761881054836.zip
4. 然后将mp-weixin-2025-10-31-1761881054836发给微信开发定制客户技术人员
5. 定制客户技术人员可以修改解压后修改项目根目录下的site.js进行针对客户的信息配置然后使用微信开发者工具打开发布后的代码进行上传发布
参照:`common\js\config.js` 文件内容说明:
```js
// 发行版本,配置说明
let releaseCfg = undefined;
try {
if (site) {
releaseCfg = {
baseUrl: site.baseUrl,
imgDomain: site.baseUrl,
h5Domain: site.baseUrl,
uniacid: site.uniacid,
}
}
} catch (e) {}
// 调试版本,配置说明
const devCfg = {
// 商户ID
uniacid: 460, //825
//api请求地址
baseUrl: 'https://xcx30.5g-quickapp.com/',
// 图片域名
imgDomain: 'https://xcx30.5g-quickapp.com/',
// H5端域名
h5Domain: 'https://xcx30.5g-quickapp.com/',
// // api请求地址
// baseUrl: 'https://tsaas.liveplatform.cn/',
// // 图片域名
// imgDomain: 'https://tsaas.liveplatform.cn/',
// // H5端域名
// h5Domain: 'https://tsaas.liveplatform.cn/',
// api请求地址
// baseUrl: 'http://saas.cn/',
// // 图片域名
// imgDomain: 'http://saas.cn/',
// // H5端域名
// h5Domain: 'http://saas.cn/',
};
var config = {
/**
* 1.开发调试模式
* 去掉注释 ...devCfg;
* 注释掉 ...releaseCfg,
* 2.发行/发布模式,例如通过`HBuilder>发行>小程序微信`的时候,原理
* 然后将 `import site from "../site.js";`追加到 `unpackage\dist\build\mp-weixin\common\vendor.js` 文件内容开头部分
* 然后将 site.js 文件放到 `unpackage\dist\build\mp-weixin\` 目录下面
*/
...(releaseCfg ?? devCfg),
// 腾讯地图key #### 基本操作步骤:(通用版/定制化版)
mpKey: 'TUHBZ-CNWKU-UHAVP-GZQ26-HNZFO-3YBF4',
#### 【前置准备】
1. 在项目根目录打开终端安装依赖“npm install”已有依赖可跳过此步骤
#### 【发布构建】
2. 使用HBuilderX打开项目
3. 选择菜单栏「发行」 → 「小程序-微信」→ 「发行」,等待构建完成。(⚠️注:底部控制台弹出"请在微信小程序开发者工具中点击上传"后再执行下一步);
4. 打开资源管理器→项目根目录,右键选择「在终端中打开」,执行"npm run mp-weixin"命令并回车;
5. 找到项目根目录 /unpackage/dist/build 下生成的 mp-weixin 压缩包
💡例如mp-weixin-2026-01-23-1769152056146.zip;同时该目录下会生成未压缩的 mp-weixin 目录。
#### 【验证与重命名】
6. 打开该目录下同时生成未压缩的 mp-weixin 目录找到site.js文件将文件内的uniacid值改为当前客户编号2812并保存
7. 打开微信开发者工具导入「mp-weixin」目录点击「编译」在开发者工具控制台验证有无报错以及能否返回对应客户的业务数据
8. 确保无误后将生成的mp-weixin的压缩包重命名格式为定制化-客户编号-域名-mp-weixin-当前日期-生成编号.zip。
***(📌通用版无需重命名)***
💡例如custom-2812-xcx.aigc-quickapp.com-mp-weixin-2026-01-22-1769152056146.zip
🚫压缩包命名禁止包含 / \ : * ? " < > | 等特殊字符。
#### 【交付与最终发布】🔍🔍
9. 将重命名后的文件发送给技术人员; ***(📌通用版直接将生成的 mp-weixin 压缩包直接发送给技术人员)***
10. 技术人员操作:解压压缩包 → 确认site.js中的uniacid为客户编号 → 用微信开发者工具导入解压后的代码目录 → 编译验证无误后 → 上传发布。
//客服地址
webSocket: '{{$webSocket}}',
//本地端主动给服务器ping的时间, 0 则不开启 , 单位秒
pingInterval: 1500,
// 版本号
version: '1.0'
};
export default config;
```
### 快应用发布 ### 快应用发布
1. 使用HBuilderX打开项目
2. 选择菜单栏 "发行" -> "快应用",进行发布构建
3. 使用快应用开发者工具打开发布后的代码进行上传发布 #### 基本操作(通用版/定制化版)
#### 【发布构建】
1. 使用HBuilderX打开项目
2. 打开项目根目录的manifest.json文件切换至可视化配置界面依次点击「Web 配置」→「运行的基础配置」,修改路径中的客户编号;***(📌通用版保留原有/hwappx/common/***
💡例如:/hwappx/2811/其中2811为定制化版客户编号
3. 选择菜单栏「发行」 → 「自定义发行」 →「H5-xcx.aigc-quickapp.com」先修改以下配置
网站标题:快应用
网站域名当前客户域名示例xcx.aigc-quickapp.com
确认后点击「发行」等待构建完成。
⚠️注:底部控制台弹出“项目 lucky_shop 导出Web成功路径为D:\项目文件\项目根目录\unpackage\dist\build\web”后再执行下一步
💡例如:项目 lucky_shop 导出Web成功路径为D:\0.项目源码\lucky_shop\unpackage\dist\build\web
4. 按控制台提示的路径找到web目录将该目录下所有文件手动打包成一个.zip压缩包仅打包文件不包含外层web目录
#### 【重命名】
5. 按版本类型规范重命名压缩包:
📌通用版hwappx-common-域名-时间.zip
例如: hwappx-common-xcx.aigc-quickapp.com-2026-01-24.zip
📌定制化:客户名称-定制化---hwappx-客户编号-域名-时间.zip
例如POCT检测分析平台-定制化---hwappx-2811-xcx.aigc-quickapp.com-2026-01-24.zip
🚫压缩包命名禁止包含 / \ : * ? " < > | 等特殊字符
#### 【交付与最终发布】🔍🔍
6. 将重命名后的压缩包发送给运维人员;
7. 运维人员操作:
① 解压压缩包;
② 打开快应用开发者工具,导入解压后的代码目录;
③ 验证代码无报错后,执行上传发布操作。