Compare commits
No commits in common. 'master' and 'main' have entirely different histories.
@ -1,17 +1,132 @@
|
|||||||
# npm 构建产物
|
# ---> Node
|
||||||
miniprogram_npm/
|
# Logs
|
||||||
dist/
|
logs
|
||||||
build/
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
.pnpm-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
# node_modules
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
node_modules/
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
# 缓存文件
|
# Snowpack dependency directory (https://snowpack.dev/)
|
||||||
npm-debug.log*
|
web_modules/
|
||||||
yarn-error.log*
|
|
||||||
*.lock
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional stylelint cache
|
||||||
|
.stylelintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variable files
|
||||||
|
.env
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
.env.local
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
.parcel-cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
.cache/
|
||||||
|
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# vuepress v2.x temp and cache directory
|
||||||
|
.temp
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# Docusaurus cache and generated files
|
||||||
|
.docusaurus
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
.tern-port
|
||||||
|
|
||||||
|
# Stores VSCode versions used for testing VSCode extensions
|
||||||
|
.vscode-test
|
||||||
|
|
||||||
|
# yarn v2
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.pnp.*
|
||||||
|
|
||||||
# 开发工具临时文件
|
|
||||||
.project
|
|
||||||
.idea/
|
|
||||||
.vscode/
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
// app.js
|
|
||||||
const { isAuthenticated } = require('./utils/token');
|
|
||||||
|
|
||||||
App({
|
|
||||||
onLaunch() {
|
|
||||||
// 展示本地存储能力
|
|
||||||
const logs = wx.getStorageSync('logs') || []
|
|
||||||
logs.unshift(Date.now())
|
|
||||||
wx.setStorageSync('logs', logs)
|
|
||||||
|
|
||||||
// 登录
|
|
||||||
wx.login({
|
|
||||||
success: res => {
|
|
||||||
// 发送 res.code 到后台换取 openId, sessionKey, unionId
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// 检查token有效性并自动跳转
|
|
||||||
this.checkTokenAndRedirect();
|
|
||||||
},
|
|
||||||
|
|
||||||
globalData: {
|
|
||||||
userInfo: null
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 检查token有效性并自动跳转到相应页面
|
|
||||||
*/
|
|
||||||
checkTokenAndRedirect() {
|
|
||||||
if (isAuthenticated()) {
|
|
||||||
console.log('用户已认证,跳转到首页');
|
|
||||||
// 如果用户已经登录,跳转到首页
|
|
||||||
wx.switchTab({
|
|
||||||
url: '/pages/index/index',
|
|
||||||
fail: (error) => {
|
|
||||||
console.error('跳转到首页失败:', error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
console.log('用户未认证,跳转到登录页');
|
|
||||||
// 如果用户未登录,跳转到登录页
|
|
||||||
wx.redirectTo({
|
|
||||||
url: '/pages/login/login',
|
|
||||||
fail: (error) => {
|
|
||||||
console.error('跳转到登录页失败:', error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
{
|
|
||||||
"pages": [
|
|
||||||
"pages/login/login",
|
|
||||||
"pages/index/index",
|
|
||||||
"pages/category/category",
|
|
||||||
"pages/mine/mine"
|
|
||||||
],
|
|
||||||
"window": {
|
|
||||||
"backgroundTextStyle": "light",
|
|
||||||
"navigationBarBackgroundColor": "#fff",
|
|
||||||
"navigationBarTitleText": "底部TabBar示例",
|
|
||||||
"navigationBarTextStyle": "black"
|
|
||||||
},
|
|
||||||
"tabBar": {
|
|
||||||
"color": "#dbdbdb",
|
|
||||||
"selectedColor": "#fff",
|
|
||||||
"backgroundColor": "#FF9966",
|
|
||||||
"borderStyle": "black",
|
|
||||||
"list": [
|
|
||||||
{
|
|
||||||
"pagePath": "pages/index/index",
|
|
||||||
"text": "首页",
|
|
||||||
"iconPath": "img/tab/home_active.png",
|
|
||||||
"selectedIconPath": "img/tab/home.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pagePath": "pages/category/category",
|
|
||||||
"text": "分类",
|
|
||||||
"iconPath": "img/tab/category_active.png",
|
|
||||||
"selectedIconPath": "img/tab/category.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pagePath": "pages/mine/mine",
|
|
||||||
"text": "我的",
|
|
||||||
"iconPath": "img/tab/mine_active.png",
|
|
||||||
"selectedIconPath": "img/tab/mine.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"requiredPrivateInfos": ["getLocation"],
|
|
||||||
"permission": {
|
|
||||||
"scope.userLocation": {
|
|
||||||
"desc": "你的位置信息将用于获取当前位置并在地图上显示"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"componentFramework": "glass-easel",
|
|
||||||
"sitemapLocation": "sitemap.json",
|
|
||||||
"lazyCodeLoading": "requiredComponents"
|
|
||||||
}
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
/**app.wxss**/
|
|
||||||
.container {
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 200rpx 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "wxapp",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"node_modules/@vant/weapp": {
|
|
||||||
"version": "1.11.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/@vant/weapp/-/weapp-1.11.7.tgz",
|
|
||||||
"integrity": "sha512-Rwn9BBnb4kHSV4XmvBicwtd42J+amEUfnFDcXJsGNPNX4a9c/DoT6YLsm4X1wB2+sQbdiQsbFBLAvGRBxCkD8g==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/ant-design-mini": {
|
|
||||||
"version": "0.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ant-design-mini/-/ant-design-mini-0.0.1.tgz",
|
|
||||||
"integrity": "sha512-pMtB6VUth5FVaSKho/rl7oDTrYl3cuuckDrEkDeTwqdiylfe2nm5OOomWg+oujpl8XV/SCpUOqmRybfBDOjXDg==",
|
|
||||||
"license": "ISC"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "ant-design-mini",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"description": "ant-design-mini",
|
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "liumin",
|
|
||||||
"license": "ISC"
|
|
||||||
}
|
|
||||||
@ -1 +0,0 @@
|
|||||||
console.log('hello world')
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "wxapp",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"": {
|
|
||||||
"name": "wxapp",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"@vant/weapp": "^1.11.7",
|
|
||||||
"ant-design-mini": "^0.0.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {}
|
|
||||||
},
|
|
||||||
"node_modules/@vant/weapp": {
|
|
||||||
"version": "1.11.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/@vant/weapp/-/weapp-1.11.7.tgz",
|
|
||||||
"integrity": "sha512-Rwn9BBnb4kHSV4XmvBicwtd42J+amEUfnFDcXJsGNPNX4a9c/DoT6YLsm4X1wB2+sQbdiQsbFBLAvGRBxCkD8g==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/ant-design-mini": {
|
|
||||||
"version": "0.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ant-design-mini/-/ant-design-mini-0.0.1.tgz",
|
|
||||||
"integrity": "sha512-pMtB6VUth5FVaSKho/rl7oDTrYl3cuuckDrEkDeTwqdiylfe2nm5OOomWg+oujpl8XV/SCpUOqmRybfBDOjXDg==",
|
|
||||||
"license": "ISC"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "wxapp",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "app.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"keywords": [],
|
|
||||||
"author": "YuLeYuan",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"@vant/weapp": "^1.11.7",
|
|
||||||
"ant-design-mini": "^0.0.1"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://bdgit.educoder.net/pq54ntls9/nodejs-wxapp-learning.git"
|
|
||||||
},
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
// pages/category/category.js
|
|
||||||
Page({
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面的初始数据
|
|
||||||
*/
|
|
||||||
data: {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面加载
|
|
||||||
*/
|
|
||||||
onLoad(options) {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面初次渲染完成
|
|
||||||
*/
|
|
||||||
onReady() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面显示
|
|
||||||
*/
|
|
||||||
onShow() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面隐藏
|
|
||||||
*/
|
|
||||||
onHide() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面卸载
|
|
||||||
*/
|
|
||||||
onUnload() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面相关事件处理函数--监听用户下拉动作
|
|
||||||
*/
|
|
||||||
onPullDownRefresh() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面上拉触底事件的处理函数
|
|
||||||
*/
|
|
||||||
onReachBottom() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户点击右上角分享
|
|
||||||
*/
|
|
||||||
onShareAppMessage() {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"usingComponents": {}
|
|
||||||
}
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
<!--pages/category/category.wxml-->
|
|
||||||
<text>pages/category/category.wxml</text>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
/* pages/category/category.wxss */
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
// pages/home/home.js
|
|
||||||
Page({
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面的初始数据
|
|
||||||
*/
|
|
||||||
data: {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面加载
|
|
||||||
*/
|
|
||||||
onLoad(options) {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面初次渲染完成
|
|
||||||
*/
|
|
||||||
onReady() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面显示
|
|
||||||
*/
|
|
||||||
onShow() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面隐藏
|
|
||||||
*/
|
|
||||||
onHide() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生命周期函数--监听页面卸载
|
|
||||||
*/
|
|
||||||
onUnload() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面相关事件处理函数--监听用户下拉动作
|
|
||||||
*/
|
|
||||||
onPullDownRefresh() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 页面上拉触底事件的处理函数
|
|
||||||
*/
|
|
||||||
onReachBottom() {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户点击右上角分享
|
|
||||||
*/
|
|
||||||
onShareAppMessage() {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"usingComponents": {}
|
|
||||||
}
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
<!--pages/home/home.wxml-->
|
|
||||||
<text>pages/home/home.wxml</text>
|
|
||||||
<view>
|
|
||||||
|
|
||||||
</view>
|
|
||||||
@ -1 +0,0 @@
|
|||||||
/* pages/home/home.wxss */
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"usingComponents": {},
|
|
||||||
"enablePullDownRefresh": true,
|
|
||||||
"backgroundTextStyle": "dark"
|
|
||||||
}
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
<!--pages/index/index.wxml-->
|
|
||||||
<view class="container">
|
|
||||||
<!-- 页面标题 -->
|
|
||||||
<view class="header">
|
|
||||||
<text class="title">商品列表</text>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 加载状态 -->
|
|
||||||
<view wx:if="{{loading}}" class="loading-container">
|
|
||||||
<text>加载中...</text>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 错误状态 -->
|
|
||||||
<view wx:elif="{{hasError}}" class="error-container">
|
|
||||||
<text class="error-msg">{{errorMsg}}</text>
|
|
||||||
<button bindtap="getProductList" class="retry-btn">重新加载</button>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 商品列表 -->
|
|
||||||
<view wx:else class="product-list">
|
|
||||||
<view
|
|
||||||
wx:for="{{productList}}"
|
|
||||||
wx:key="id"
|
|
||||||
class="product-item"
|
|
||||||
bindtap="onProductTap"
|
|
||||||
data-product="{{item}}"
|
|
||||||
>
|
|
||||||
<image
|
|
||||||
src="{{item.imageUrl || 'https://via.placeholder.com/200x200'}}"
|
|
||||||
class="product-image"
|
|
||||||
mode="aspectFill"
|
|
||||||
lazy-load="{{true}}"
|
|
||||||
/>
|
|
||||||
<view class="product-info">
|
|
||||||
<text class="product-name">{{item.name}}</text>
|
|
||||||
<text class="product-price">¥{{item.price}}</text>
|
|
||||||
<text class="product-description">{{item.description}}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 空状态 -->
|
|
||||||
<view wx:if="{{productList.length === 0}}" class="empty-state">
|
|
||||||
<text>暂无商品</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
@ -1,110 +0,0 @@
|
|||||||
/* pages/index/index.wxss */
|
|
||||||
|
|
||||||
.container {
|
|
||||||
padding: 20rpx;
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
padding: 20rpx 0;
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 20rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 36rpx;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-container,
|
|
||||||
.error-container {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
height: 200rpx;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-container {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-msg {
|
|
||||||
color: #ff4d4f;
|
|
||||||
margin-bottom: 20rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.retry-btn {
|
|
||||||
background-color: #1890ff;
|
|
||||||
color: white;
|
|
||||||
border-radius: 8rpx;
|
|
||||||
padding: 10rpx 20rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-list {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-item {
|
|
||||||
display: flex;
|
|
||||||
background: white;
|
|
||||||
margin-bottom: 20rpx;
|
|
||||||
border-radius: 12rpx;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-image {
|
|
||||||
width: 200rpx;
|
|
||||||
height: 200rpx;
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-info {
|
|
||||||
flex: 1;
|
|
||||||
padding: 20rpx;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-name {
|
|
||||||
font-size: 32rpx;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #333;
|
|
||||||
margin-bottom: 10rpx;
|
|
||||||
display: block;
|
|
||||||
/* 限制一行显示,超出省略 */
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-price {
|
|
||||||
font-size: 32rpx;
|
|
||||||
color: #ff6b35;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 10rpx;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-description {
|
|
||||||
font-size: 26rpx;
|
|
||||||
color: #666;
|
|
||||||
display: block;
|
|
||||||
/* 限制两行显示,超出省略 */
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-state {
|
|
||||||
text-align: center;
|
|
||||||
padding: 100rpx 0;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"navigationBarTitleText": "登录",
|
|
||||||
"enablePullDownRefresh": false,
|
|
||||||
"usingComponents": {
|
|
||||||
"van-field": "@vant/weapp/field/index",
|
|
||||||
"van-button": "@vant/weapp/button/index"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
<view class="login-container">
|
|
||||||
<!-- Vant 输入框:账号/手机号 -->
|
|
||||||
<van-field
|
|
||||||
v-model="{{account}}"
|
|
||||||
label="账号"
|
|
||||||
placeholder="请输入账号/手机号"
|
|
||||||
border="{{true}}"
|
|
||||||
bind:change="handleAccountInput"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Vant 输入框:密码(加密显示) -->
|
|
||||||
<van-field
|
|
||||||
v-model="{{password}}"
|
|
||||||
label="密码"
|
|
||||||
type="password"
|
|
||||||
placeholder="请输入密码"
|
|
||||||
border="{{true}}"
|
|
||||||
bind:change="handlePasswordInput"
|
|
||||||
clearable="{{true}}"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Vant 按钮组 -->
|
|
||||||
<view class="btn-group">
|
|
||||||
<van-button
|
|
||||||
type="primary"
|
|
||||||
size="large"
|
|
||||||
bind:click="handleLogin"
|
|
||||||
style="flex:1;margin-right:10rpx;"
|
|
||||||
>登录</van-button>
|
|
||||||
<van-button
|
|
||||||
type="default"
|
|
||||||
size="large"
|
|
||||||
bind:click="handleReset"
|
|
||||||
style="flex:1;"
|
|
||||||
>重置</van-button>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
.login-container {
|
|
||||||
padding: 40rpx 30rpx;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 20rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-group {
|
|
||||||
display: flex;
|
|
||||||
margin-top: 30rpx;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"navigationBarTitleText": "地图定位",
|
|
||||||
"usingComponents": {}
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
<view class="container">
|
|
||||||
<!-- 地图组件 - 占满全屏 -->
|
|
||||||
<map
|
|
||||||
id="myMap"
|
|
||||||
longitude="{{longitude}}"
|
|
||||||
latitude="{{latitude}}"
|
|
||||||
scale="{{scale}}"
|
|
||||||
markers="{{markers}}"
|
|
||||||
style="width: 100%; height: 100%;">
|
|
||||||
</map>
|
|
||||||
|
|
||||||
<!-- 悬浮定位按钮 -->
|
|
||||||
<button class="locate-btn" bindtap="getCurrentLocation">定位当前位置</button>
|
|
||||||
</view>
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
.container{
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.locate-btn {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 40rpx;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
z-index: 999;
|
|
||||||
padding: 20rpx 40rpx;
|
|
||||||
background-color: #007aff;
|
|
||||||
color: white;
|
|
||||||
border-radius: 10rpx;
|
|
||||||
border: none;
|
|
||||||
font-size: 32rpx;
|
|
||||||
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2);
|
|
||||||
min-width: 200rpx;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"compileType": "miniprogram",
|
|
||||||
"libVersion": "3.14.2",
|
|
||||||
"packOptions": {
|
|
||||||
"ignore": [],
|
|
||||||
"include": []
|
|
||||||
},
|
|
||||||
"setting": {
|
|
||||||
"coverView": true,
|
|
||||||
"es6": true,
|
|
||||||
"postcss": true,
|
|
||||||
"minified": true,
|
|
||||||
"enhance": true,
|
|
||||||
"showShadowRootInWxmlPanel": true,
|
|
||||||
"babelSetting": {
|
|
||||||
"ignore": [],
|
|
||||||
"disablePlugins": [],
|
|
||||||
"outputPath": ""
|
|
||||||
},
|
|
||||||
"compileWorklet": false,
|
|
||||||
"uglifyFileName": false,
|
|
||||||
"uploadWithSourceMap": true,
|
|
||||||
"packNpmManually": true,
|
|
||||||
"packNpmRelationList": [
|
|
||||||
{
|
|
||||||
"packageJsonPath": "./package.json",
|
|
||||||
"miniprogramNpmDistDir": "./"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"useCompilerPlugins": [],
|
|
||||||
"minifyWXSS": true,
|
|
||||||
"minifyWXML": true,
|
|
||||||
"localPlugins": false,
|
|
||||||
"condition": false,
|
|
||||||
"swc": false,
|
|
||||||
"disableSWC": true,
|
|
||||||
"disableUseStrict": false
|
|
||||||
},
|
|
||||||
"condition": {},
|
|
||||||
"editorSetting": {
|
|
||||||
"tabIndent": "auto",
|
|
||||||
"tabSize": 2
|
|
||||||
},
|
|
||||||
"appid": "wx9bfeebe2956c4c5b",
|
|
||||||
"simulatorPluginLibVersion": {}
|
|
||||||
}
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
|
|
||||||
"rules": [{
|
|
||||||
"action": "allow",
|
|
||||||
"page": "*"
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
const formatTime = date => {
|
|
||||||
const year = date.getFullYear()
|
|
||||||
const month = date.getMonth() + 1
|
|
||||||
const day = date.getDate()
|
|
||||||
const hour = date.getHours()
|
|
||||||
const minute = date.getMinutes()
|
|
||||||
const second = date.getSeconds()
|
|
||||||
|
|
||||||
return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const formatNumber = n => {
|
|
||||||
n = n.toString()
|
|
||||||
return n[1] ? n : `0${n}`
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
formatTime
|
|
||||||
}
|
|
||||||